成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇文章帶你用 CSS 繪制一個3D掘金 logo

開發 前端
像這種比較規則的圖形還能簡單通過CSS應付一下,如果有一些不規則的,或者有曲面,那就不太好實現了,而且高光也無法真正模擬出來,像這種情況還是建議通過Three.js這樣專業的圖形處理庫才行。

嘗試一下用 CSS 繪制簡單的 3d 圖形,比如一個掘金 logo?

圖片

相比 2d 繪制,3d 有哪些需要注意的小細節呢?一起看看吧

一、金字塔形/四棱錐形

除去挖空部分,整個外形其實是一個金字塔形,或者叫四棱錐形(四角錐)。

圖片

一共有5個面,所以我們可以準備5個元素。

<juejin>
<pane a></pane>
<pane b></pane>
<pane c></pane>
<pane d></pane>
<bottom></bottom>
</juejin>

其中,bottom表示底部的正方形,其余4個表示側面4個三角形。

首先先從正方體開始。

注意,需要呈現 3d 視覺,需要添加transform-style: preserve-3d,先繪制一個側面。

juejin{
--s: 200px;
position: relative;
width: var(--s);
height: var(--s);
transform-style: preserve-3d;
perspective: 3000px;
transform: rotateX(calc( .3 * -90deg)) rotateY(calc( .1 * 90deg));
}
pane{
position: absolute;
inset: 13.3% 0 0;
transform-origin: center bottom;
}
pane[a]{
background-color: #368dff;
transform: translate3d(0, 0, calc(var(--s) * -0.5));
}

效果如下:

圖片

用同樣的方式,繪制出4個側面。

pane[b]{
background-color: #368dff;
transform: translate3d(0, 0, calc(var(--s) * 0.5));
}
pane[c]{
background-color: #1e80ff;
transform: translate3d(calc(var(--s) * -0.5), 0, 0) rotateY(90deg);
}
pane[d]{
background-color: #1e80ff;
transform: translate3d(calc(var(--s) * 0.5), 0, 0) rotateY(90deg);
}

效果如下:

圖片

然后,將4個側面裁剪成三角形,用clip-path就行了。

pane{
/**/
clip-path: polygon(50% 0, 100% 100%, 0 100%);
}

效果如下:

圖片

最后,將4個側面沿著底部旋轉一個角度,使其合并在一起,由于大小完全一樣,底部又是正方形,傾斜角度自然也相同,這里就不通過數學計算了,直接用一個 CSS 變量去實時比對。

juejin{
/**/
--deg: 35.3deg;
}
pane[a]{
/**/
transform: translate3d(0, 0, calc(var(--s) * -0.5)) rotateX(calc(var(--deg) * -1));
}
pane[b]{
/**/
transform: translate3d(0, 0, calc(var(--s) * 0.5)) rotateX(var(--deg));
}
pane[c]{
/**/
transform: translate3d(calc(var(--s) * -0.5), 0, 0) rotateY(90deg) rotateX(calc(var(--deg) * -1));
}
pane[d]{
/**/
transform: translate3d(calc(var(--s) * 0.5), 0, 0) rotateY(90deg) rotateX(var(--deg));
}

效果如下:

圖片

這樣就得到了一個金字塔形/四棱錐形。

圖片

二、側邊鏤空和橫截面處理

前面得到了一個完整的四棱錐,現在需要先將側面鏤空。

這里有兩種方式,第一,可以用透明和不透明的漸變填充,這樣透明的部分就是鏤空的了;還有一種方式,用??mask??遮罩,也能輕易的實現。

pane{
/* */
-webkit-mask: linear-gradient(to bottom, red 50%, transparent 0) 0 0/ 100% 40%;
}

效果如下:

圖片

但是現在還是看著像紙片一樣,需要將截斷的幾個面都封起來,我們再加一個標簽,用兩個偽元素將頂部覆蓋。

<juejin>
<!-- -->
<top></top>
</juejin>
top{
position: absolute;
inset: 0;
background-color: #1677f7;
transform: translate3d(0, calc(var(--s) * 0.36), 0) rotateX(90deg) scale(.8);
transform-style: preserve-3d;
box-shadow: inset 0 0 calc(var(--s) * 0.3) rgb(255 255 255 / 45%);
}
top::before{
content: '';
position: absolute;
inset: 0;
background-color: inherit;
transform: translate3d(0, 0, calc(var(--s) * 0.285)) scale(.5);
box-shadow: inherit;
}

當然,這里需要多多調整一下細節,確保橫截面的大小和位置剛好吻合。

圖片

同樣還有底部的截面。

bottom::before,
bottom::after{
content: '';
position: absolute;
inset: 0;
background-color: inherit;
transform: translate3d(0, 0, calc(var(--s) * 0.285)) scale(.595);
box-shadow: inherit;
}
bottom::after{
transform: translate3d(0, 0, calc(var(--s) * 0.568)) scale(.195)
}

效果如下:

圖片

三、其他光影細節和鼠標跟隨效果

首先是底部的投影,這是通過??filter: blur??實現的,可以讓整個場景更具空間感。

juejin::after{
position: absolute;
content: '';
width: var(--s);
height: var(--s);
top: 80%;
background-color: rgba(0, 0, 0, 0.1);
transform: rotateX(90deg) scale(1.2);
filter: blur(20px);
}

圖片

然后是截面的高光處理,這里是通過內陰影實現的,讓整體光影看著更加自然,就像上方有光線一樣

top{
/**/
box-shadow: inset 0 0 calc(var(--s) * 0.3) rgb(255 255 255 / 45%);
}

圖片

最后是鼠標跟隨效果,這里是通過 CSS 變量實現的,通過 JS 獲取鼠標的相對位置,然后通過 CSS 變量 傳遞,實時改變 transform 的旋轉角度。

juejin{
/* */
transform: rotateX(calc( (var(--y) - 0.3) * -90deg)) rotateY(calc( (var(--x) - 0.3) * 90deg));
}

JS 監聽mousemove就可以了。

document.body.addEventListener('mousemove', function(ev){
document.body.style.setProperty('--x', ev.clientX / document.body.offsetWidth)
document.body.style.setProperty('--y', ev.clientY / document.body.offsetHeight)
})

這樣就得到了文章開頭所示效果:

圖片

四、總結一下

總的來說,繪制這樣一個的 3d 圖形還是比較輕松的,下面總結一下

  1. 添加transform-style: preserve-3d才能呈現 3d 視覺。
  2. 掘金 logo 整體上是一個金字塔形,或者叫四棱錐形(四角錐)。
  3. 整個繪制就是通過translate3d、rotate3d等基礎操作組合而成。
  4. 鏤空部分可以通過漸變填充,或者mask遮罩實現。
  5. 橫截面需要多多調整一下細節,確保橫截面的大小和位置剛好吻合。
  6. 為了讓整個模型更加真實,需要添加合理的高光和投影。
  7. 鼠標跟隨效果可以通過 CSS 變量傳遞實現。

當然,像這種比較規則的圖形還能簡單通過CSS應付一下,如果有一些不規則的,或者有曲面,那就不太好實現了,而且高光也無法真正模擬出來,像這種情況還是建議通過three.js這樣專業的圖形處理庫才行。

責任編輯:姜華 來源: 前端偵探
相關推薦

2022-12-14 08:03:27

CSS變量前端

2021-05-31 09:30:36

Css前端CSS 特效

2020-11-03 19:18:28

CSS對齊文本

2021-01-25 05:39:54

Css前端Border

2021-04-07 06:11:37

Css前端CSS定位知識

2021-01-15 18:37:49

CSS3Filters視覺

2020-11-17 11:10:21

CSS選擇器HTML

2022-02-21 09:44:45

Git開源分布式

2021-06-30 00:20:12

Hangfire.NET平臺

2023-05-12 08:19:12

Netty程序框架

2021-01-20 05:31:29

CSS3Filters圖像

2020-12-18 05:40:37

CSS clearHtml

2020-11-27 08:51:29

CSSOpacity透明度

2023-06-28 15:04:59

CSSHTML

2021-05-20 09:02:59

CSS單位長度

2023-08-01 14:34:12

HTMLCSS

2022-02-15 09:31:43

透明度CSS

2022-03-04 09:31:41

CSS前端屬性選擇器

2021-05-18 08:30:42

JavaScript 前端JavaScript時

2021-03-09 14:04:01

JavaScriptCookie數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级毛片成人免费看a | 国产久 | 欧美视频免费 | 国产精品一区久久久 | 91视频网| 97色伦网 | 亚洲欧美日韩精品久久亚洲区 | 亚洲国产一区视频 | caoporn地址| av电影手机版 | 成年精品 | 亚洲欧美在线一区 | 国产激情在线观看 | 神马影院一区二区三区 | 欧美激情啪啪 | 日韩欧美1区2区 | 久久国产一区二区三区 | 欧美精品中文字幕久久二区 | 国产黄色大片在线观看 | 人人干超碰 | 亚洲精品日韩欧美 | 久久综合久久综合久久综合 | 国产乱码久久久久久 | 99视频免费播放 | 国产 日韩 欧美 中文 在线播放 | 午夜在线视频一区二区三区 | av免费入口 | 亚洲成人中文字幕 | 看a网站 | 福利视频日韩 | 精品九九 | 九九色综合 | 国产欧美日韩 | 日韩免费视频一区二区 | 亚洲欧美日韩中文字幕一区二区三区 | 尤物在线精品视频 | 亚洲视频中文字幕 | 国产一区二区三区在线 | 午夜精品一区二区三区在线播放 | 国产人成精品一区二区三 | 蜜桃在线一区二区三区 |