CSS實現3D效果:立方體

最終效果以下bash



首先要給3D的元素準備一個「舞臺」,由於頁面自己是平面的,並不能展現出3D的效果。動畫

經過設置透視距離,就至關於把這個區域變成了一個能表現出近大遠小的「3D舞臺」,在其內部就能夠去作3D效果了。spa

<div class="container">
</div>複製代碼

.container {
  height: 500px;
  background: #eee;
  perspective: 500px;   /* 設置透視距離 */
}複製代碼


舞臺搭好,演員上場,在container中加入一個盒子用來作正方體。設置寬高並定位到舞臺中央,添加一個邊框方便看到位置,設置transform-style屬性,他的做用是容許box這個盒子的子元素進行3d變換3d

<div class="container">
  <div class="box">
  </div>
</div>複製代碼

.box {
  width: 200px;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  border: 1px solid #000;
  transform-style: preserve-3d;
}複製代碼


正方體有六面,在box中添加六個div用來作他的六個面。code

將六個面兩兩一組分爲a, b , c三組方便描述:a1爲離咱們最近的‘前面’,a2就是與a1相對離咱們最遠的‘背面‘,b1爲左側的面,b2爲右側面,c1爲頂部,c2爲底部(參考文章頂部效果圖)orm

<div class="container">
  <div class="box">
    <div class="a1">a1</div>  <!-- 前 -->
    <div class="a2">a2</div>  <!-- 後 -->
    <div class="b1">b1</div>  <!-- 左 -->
    <div class="b2">b2</div>  <!-- 右 -->
    <div class="c1">c1</div>  <!-- 上 -->
    <div class="c2">c2</div>  <!-- 下 -->
  </div>
</div>複製代碼

將六個面都定位到box的正中心,設置寬高,並把文本居中cdn

.box div {  
  width: 200px;  
  height: 200px;
  position: absolute;
  text-align: center;
  line-height: 200px;
  font-size: 30px;
}複製代碼

此時的六個面至關因而重疊在x軸爲0,y軸爲0,z軸也爲0的地方(x和y軸在屏幕上分別表現爲左右和上下,z軸表示視覺上與咱們的距離遠近)blog


上面咱們將每一個面的寬高都設置爲200px,也就是相對的兩個面之間的距離應該是200px。animation

先來設置a1面,沿z軸向前移動100px,也就是向咱們靠近100px,同時給每一個面都加上一個透明的顏色方便看效果string

.a1 {
  background: rgba(0, 0, 255, 0.5);
  transform: translateZ(100px);
}複製代碼

而後將a2面沿z軸向後移動100px,也就是相對咱們變遠100px

.a2 {
  background: rgba(0, 0, 255, 0.5);
  transform: translateZ(-100px);
}複製代碼

這樣原本重疊的兩個面,一個靠近100px,一個變遠100px,兩個面之間恰好200px距離

另外還應該將a2沿y軸旋轉180度,也就是翻個面,將有字的這一面對着外面

.a2 {
  background: rgba(0, 0, 255, 0.5);
  transform: translateZ(-100px) rotateY(180deg);
}複製代碼

此時已經看出3d效果生效了,由於近大遠小的原理,雖然都是200px的長寬,離咱們更近的a1面比box的邊框要大出一圈,而較遠的a2則要小一圈


再來設置b1,b1是左側的面,沿x軸左移100px, 而後沿y軸旋轉-90度,將寫字的正面朝向左側

.b1 {
  background: rgba(0, 255, 0, 0.5);
  transform: translateX(-100px) rotateY(-90deg);
}複製代碼

相對的,b2就是右移100px,旋轉正90度

.b2 {
  background: rgba(0, 255, 0, 0.5);
  transform: translateX(100px) rotateY(90deg);
}複製代碼


繼續設置c1,c1是頂部的面,因此沿y軸上移100px,而後沿x軸旋轉90度

.c1 {
  background: rgba(255, 0, 0, 0.5);
  transform: translateY(-100px) rotateX(90deg);
}複製代碼

相對的,c2爲底部,沿y軸下移100px,而後沿x軸旋轉-90度

.c2 {
  background: rgba(255, 0, 0, 0.5);
  transform: translateY(100px) rotateX(-90deg);
}複製代碼


此時這個3D的立方體已經完成了,爲了能看出更明顯的立體效果,再加一些變化

回到.box的樣式,將邊框去除,而後增長一點角度的傾斜

.box {
  width: 200px;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%) rotateZ(10deg) rotateX(-30deg);
  /* border: 1px solid #000; */
  transform-style: preserve-3d;
}複製代碼


最後添加一個旋轉的動畫

.box {
  width: 200px;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%) rotateZ(10deg) rotateX(-30deg);
  /* border: 1px solid #000; */
  transform-style: preserve-3d;
  animation: run 5s linear;
  animation-iteration-count: infinite;
}

@keyframes run {
  0% {
    transform: translate(-50%, -50%) rotateZ(10deg) rotateX(-30deg) rotateY(0);
  }
  50% {
    transform: translate(-50%, -50%) rotateZ(10deg) rotateX(-30deg) rotateY(180deg);
  }
  100% {
    transform: translate(-50%, -50%) rotateZ(10deg) rotateX(-30deg) rotateY(360deg);
  }
}複製代碼

相關文章
相關標籤/搜索