您好,登錄后才能下訂單哦!
這篇文章主要介紹“css如何實現(xiàn)一個3D效果的魔方”,在日常操作中,相信很多人在css如何實現(xiàn)一個3D效果的魔方問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”css如何實現(xiàn)一個3D效果的魔方”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在 3D 空間中轉(zhuǎn)換最重要幾個形態(tài)的是平移,旋轉(zhuǎn)與縮放,接下來將會介紹與制作一個 3D 效果立方體相關(guān)的 CSS 屬性及函數(shù)。
transform-style
perspective
backface-visibility
一個立方體,必然存在于一個 3D 空間,首先需要使用 CSS 指明該立方體處于 3D 空間中。
.cube {
transform-style: preserve-3d;
}
通過 CSS 的屬性值 transform-style: preserve-3d
可以設(shè)置該元素的所有子元素都處于 3D 空間。
在科幻小說三體中,云天明講了三個故事,其中講到有一個深水王子,無論你在遠處看還是近處看,他都一般高,不會受距離增減的影響,不符合我們現(xiàn)實中「近大遠小」的透視規(guī)律。
正是有了透視距離,現(xiàn)實世界的事物才會有層次感,而在 CSS 的 3D 世界里,也有一個屬性代表透視距離。
.cube {
perspective: 800px;
// 觀察者眼睛位于上邊看的全面
perspective-origin: 150% -150%;
}
與二維平面不同,在 3D 空間中多了一個 Z 軸
,而與 Z 軸
垂直的平面構(gòu)成了 Z 平面,即我們在 2D 方向上能夠看到的這個平面。
perspective
定義了觀察者眼睛與 Z=0
平面(即投影面)的距離,來制造一種空間感。
perspective
最小可設(shè)置為 1px,當它值越小時,物體在投影面上越大。如下圖所示
perspective-origin
代表觀察者眼睛的位置,默認居中
.cube {
transform: translate3d(x, y, z);
}
translate3d(x, y, z)
定義了元素在 3D 空間沿坐標系的平移,而如果只在單軸上平移,則可以使用獨立的 API。
translateX(x)
:
translate3d(x, 0, 0)
translateY(y)
:
translate3d(0, y, 0)
translateZ(z)
:
translate3d(0, 0, z)
當作 Z 軸方向平移時,正值代表離用戶越來越近,即在視覺效果上它會越來越大。負值則相反。具體視覺效果可參考 MDN 文檔。
一種他們在三維坐標系下的正方向如下所示:
translateZ | MDN[1]
.cube {
transform: rotate3d(x, y, z, a);
}
rotate3d
定義了元素在 3D 空間的旋轉(zhuǎn),旋轉(zhuǎn)相比平移來說,它要多一個指標:「旋轉(zhuǎn)軸,它根據(jù)從原點出發(fā)的向量 [x, y, z]
來確定旋轉(zhuǎn)軸?!?/strong>
[x, y, z]
坐標自然由 rotate3d(x, y, z, a)
來指定,那如何確定原點呢?
原點坐標由屬性 transform-origin
來指定,如果只有前兩個值代表在 2D 平面,如果有三個值代表在 3D 空間。
?你可以通過圍繞各個坐標軸旋轉(zhuǎn) 180 度,來確定原點坐標
?
.cube {
transform-origin: 100px 100px 100px;
}
可以通過對一個立方體的旋轉(zhuǎn)對 rotate3d
有直觀的了解
在正常狀態(tài)下,各面數(shù)字如下
rotateX(180deg)
沿 X 軸旋轉(zhuǎn) 180 度后,位面 2 面對用戶
rotateZ(180deg)
沿 Z 軸旋轉(zhuǎn) 180 度后,位面 1 面對用戶,但是翻轉(zhuǎn)了過來
通過 MDN 文檔也可以對各個轉(zhuǎn)換有更直觀的了解
對 CSS 3D 方面的屬性及值進行熟悉之后,就能夠很容易地畫出一個立方體。
一個立方體由六個面組成,分別使用 Up
,Down
,Left
,Right
,Front
,Back
的首字母進行表示。使用 html
描述它的結(jié)構(gòu)如下
<div class="cube-container">
<div class="cube">
<div class="face face-up">U</div>
<div class="face face-down">D</div>
<div class="face face-left">L</div>
<div class="face face-right">R</div>
<div class="face face-front">F</div>
<div class="face face-back">B</div>
</div>
</div>
.cube-container
: 為立方體提供布局,使之處于屏幕中心位置.cube
: 表示該立方體容器.face
: 表示該立方體的六個面在 .cube
選擇器中聲明一個 3D 空間,指定 perspective
與 transform-style
屬性
.cube {
perspective: 1500px;
transform-style: preserve-3d;
}
為了立方體的美觀,優(yōu)雅及調(diào)試方便,對立方體加入一些 3D 無關(guān)的樣式: 關(guān)于布局,顯示及色彩
為立方體提供一個 100px/100px
大小的容器,并處于屏幕正中,并且立方體每一面的字也垂直居中
$ width: 100px;
.cube-container {
display: flex;
justify-content: center;
align-items: center;
height: 500px;
}
.cube {
width: $width;
height: $width;
margin: $width;
}
.face {
background: #f60;
display: flex;
justify-content: center;
align-items: center;
font-size: 2em;
color: #fff;
}
接下來對六個面做絕對定位,并且根據(jù)目標位置做適當?shù)钠揭婆c旋轉(zhuǎn)即可組成立方體。
$width: 100px;
.face {
width: $width;
height: $width;
position: absolute;
&.face-up {
transform: rotateX(90deg) translateZ($width / 2);
}
&.face-down {
transform: rotateX(-90deg) translateZ($width / 2);
}
&.face-left {
transform: rotateY(-90deg) translateZ($width / 2);
}
&.face-right {
transform: rotateY(90deg) translateZ($width / 2);
}
&.face-front {
transform: translateZ($width / 2);
}
&.face-back {
transform: rotateX(180deg) translateZ($width / 2);
}
}
效果圖如下
全部代碼如下
codepen[6]
此時 3D 空間的立方體已經(jīng)成形,為了更加形象,我決定給它一個動畫。
下列 CSS 動畫使它繞著向量 [1, 1, 0]
永無停歇地旋轉(zhuǎn)。
@keyframes rotate {
0% {
transform: rotate3d(0, 0, 0, 0);
}
100% {
transform: rotate3d(1, 1, 0, 360deg);
}
}
.cube {
animation: rotate 2s linear reverse infinite;
}
效果圖如下所示
魔方由 27 個小塊組成,通過 translate3d
對 27 個小立方塊進行位移,即可得到一個魔方,代碼如下所示
mixin coordinate() {
@for $x from 1 through 3 {
@for $y from 1 through 3 {
@for $z from 1 through 3 {
.cube-#{$x}-#{$y}-#{$z} {
transform: translate3d(($x - 2) * $width, ($y - 2) * $width, ($z - 2) * $width);
}
}
}
}
}
@include coordinate();
到此,關(guān)于“css如何實現(xiàn)一個3D效果的魔方”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。