溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

css如何實現(xiàn)一個3D效果的魔方

發(fā)布時間:2021-12-18 10:08:01 來源:億速云 閱讀:250 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“css如何實現(xiàn)一個3D效果的魔方”,在日常操作中,相信很多人在css如何實現(xiàn)一個3D效果的魔方問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”css如何實現(xiàn)一個3D效果的魔方”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

css如何實現(xiàn)一個3D效果的魔方  

3D 相關(guān) CSS 屬性及函數(shù)

在 3D 空間中轉(zhuǎn)換最重要幾個形態(tài)的是平移,旋轉(zhuǎn)與縮放,接下來將會介紹與制作一個 3D 效果立方體相關(guān)的 CSS 屬性及函數(shù)。

  • transform-style
  • perspective
  • backface-visibility 

3D 空間

一個立方體,必然存在于一個 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 平面(即投影面)的距離,來制造一種空間感。

css如何實現(xiàn)一個3D效果的魔方  

perspective 最小可設(shè)置為 1px,當它值越小時,物體在投影面上越大。如下圖所示

css如何實現(xiàn)一個3D效果的魔方  

perspective-origin 代表觀察者眼睛的位置,默認居中

css如何實現(xiàn)一個3D效果的魔方  
 

平移與坐標系: translate3d()

.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 文檔。

一種他們在三維坐標系下的正方向如下所示:

css如何實現(xiàn)一個3D效果的魔方  

translateZ | MDN[1]

 

旋轉(zhuǎn)與原點: rotate3d() 與 transform-origin

.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ù)字如下

css如何實現(xiàn)一個3D效果的魔方  
 

rotateX(180deg)

沿 X 軸旋轉(zhuǎn) 180 度后,位面 2 面對用戶

css如何實現(xiàn)一個3D效果的魔方  
 

rotateZ(180deg)

沿 Z 軸旋轉(zhuǎn) 180 度后,位面 1 面對用戶,但是翻轉(zhuǎn)了過來

css如何實現(xiàn)一個3D效果的魔方  

通過 MDN 文檔也可以對各個轉(zhuǎn)換有更直觀的了解

  • rotateX | MDN     [2]
  • rotateY | MDN     [3]
  • rotateZ | MDN     [4]
  • transform-origin | MDN     [5]
 

一個立方體

對 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 空間,指定 perspectivetransform-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);
 }
}
 

效果圖如下

css如何實現(xiàn)一個3D效果的魔方  

全部代碼如下

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;
}
 

效果圖如下所示

css如何實現(xiàn)一個3D效果的魔方  
 

來畫一個魔方

魔方由 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>

向AI問一下細節(jié)

免責聲明:本站發(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)容。

css
AI