CSS3支持3D轉換,與3D轉換有關的屬性有:html
transform:向元素應用 2D或3D 轉換。瀏覽器
transform-origin:改變被轉換元素的位置。ide
transform-style:規定被嵌套元素如何在3D空間中顯示。函數
perspective:規定 3D 元素的透視效果。oop
perspective-origin:規定 3D 元素的底部位置。學習
backface-visibility 定義元素在不面對屏幕時是否可見。動畫
在transform屬性設置中,可以使用的3D轉換函數主要有:spa
matrix3d(n,n, n,n,n,n ,n,n,n ,n,n,n, n,n,n,n ):定義3D轉換,使用16個值的 4x4 矩陣。3d
translate3d(x,y,z):定義3D平移動轉換。code
translateX(x):定義3D沿X軸平移轉換。
translateY(y) :定義3D沿Y軸平移轉換。
translateZ(z) :定義3D沿Z軸平移轉換。
scale3d(x,y,z) :定義 3D 縮放轉換。
rotate3d(x,y,z,angle):定義 3D 旋轉。
rotateX(angle):定義沿 X 軸的 3D 旋轉。
rotateY(angle) :定義沿 Y 軸的 3D 旋轉。
rotateZ(angle) :定義沿 Z 軸的 3D 旋轉。
perspective(n) 定義 3D 轉換元素的透視視圖。
學習和利用3D轉換,能夠繪製立體化的圖形。
一個立方體有前、後、左、右、上、下共六個面,可在頁面中定義立方體以下:
<div class="cube">
<div class="front">front</div>
<div class="back">back</div>
<div class="top">top</div>
<div class="bottom">bottom</div>
<div class="left">left</div>
<div class="right">right</div>
</div>
爲立方體cube及六個面定義樣式規則,每一個面進行適當的平移和旋轉,能夠繪製出一個3D立方體。編寫的HTML文件以下。
<!DOCTYPE html> <html> <head> <title>一個簡單的3D立方體</title> <style> .container { margin: 0 auto; width: 400px; height:400px; background:#d8d8d8; border: 4px solid rgba(255, 0, 0, 0.9); border-radius: 10%; } .cube { position: relative; width: 200px; top:80px; left:80px; transform-style:preserve-3d; perspective: 800px; perspective-origin: -50% -100px; } .cube div { position: absolute; width: 200px; height: 200px; background: rgba(255,255,255,0.1); box-shadow: inset 0 0 30px rgba(125,125,125,0.8); text-align: center; line-height: 200px; font-weight:bold; text-shadow:-1px 1px 5px #f60; color:#fff; font-family: sans-serif; text-transform: uppercase; font-size:30px; } .front { transform: translateZ(100px); } .back { transform: translateZ(-100px) rotateY(180deg); } .left { transform:rotateY(270deg) translateX(-100px); transform-origin: center left; } .right { transform:rotateY(-270deg) translateX(100px); transform-origin: top right; } .top { transform:rotateX(-90deg) translateY(-100px); transform-origin: top center; } .bottom { transform:rotateX(90deg) translateY(100px); transform-origin: bottom center; } </style> </head> <body> <div class="container"> <div class="cube"> <div class="front">front</div> <div class="back">back</div> <div class="top">top</div> <div class="bottom">bottom</div> <div class="left">left</div> <div class="right">right</div> </div> </div> </body> </html>
在瀏覽器中打開包含這段HTML代碼的html文件,能夠顯示如圖1所示的立方體。
圖1 一個簡單的3D立方體
去掉圖1中立方體各面上的文字,分別以紅色、橙色、黃色、綠色、青色和藍色表示六個面,而且定義關鍵幀,使得立方體旋轉起來。編寫的HTML文件以下。
<!DOCTYPE html> <html> <head> <title>旋轉的3D立方體</title> <style> .container { margin: 0 auto; width: 400px; height:400px; background:#d8d8d8; border: 4px solid rgba(255, 0, 0, 0.9); border-radius: 10%; } .cube { width: 200px; height: 200px; margin: 100px auto; position: relative; transform-style: preserve-3d; animation: anim 8s linear infinite; } .cube div { width: 100%; height: 100%; position: absolute; } .front { background: rgba(255, 0, 0, 0.3); transform: translateZ(100px); } .back { background: rgba(255, 0, 255, 0.3); transform: translateZ(-100px); } .left { background-color: rgba(255, 255, 0, 0.3); transform-origin: left; transform: rotateY(90deg) translateX(-100px); } .right { background: rgba(0, 255, 0, 0.3); transform-origin: right; transform: rotateY(90deg) translateX(100px); } .top { background: rgba(255, 0, 255, 0.3); transform: rotateX(90deg) translateZ(100px); } .bottom { background: rgba(0, 0, 255, 0.3); transform: rotateX(-90deg) translateZ(100px); } @keyframes anim { 0% { transform: rotateX(0deg) rotateY(0deg); } 100% { transform: rotateX(360deg) rotateY(360deg);} } </style> </head> <body> <div class="container"> <div class="cube"> <div class="front"></div> <div class="back"></div> <div class="top"></div> <div class="bottom"></div> <div class="left"></div> <div class="right"></div> </div> </div> </body> </html>
在瀏覽器中打開包含這段HTML代碼的html文件,能夠呈現出如圖2所示的動畫效果。
圖2 旋轉的立方體
在立方體的每一個面上用線性漸變(Linear Gradients)給背景加上3*3的方格圖形,構成一個3D魔方。
一個對象背景用線性漸變填充的調用格式爲:
background: linear-gradient(direction, color-stop1, color-stop2, ...);
設頁面中有<div class="box"></div>,若爲.box定義樣式規則以下:
.box
{
position: relative;
height:200px;
width: 200px;
background: linear-gradient(to right, red , blue);
}
可在頁面中顯示如圖3所示的圖形。
圖3 紅藍色線性漸變
若修改background屬性的設置爲:
background: linear-gradient(to right, red,orange,yellow,green,blue,indigo,violet);
可在頁面中顯示如圖4所示的圖形。
圖4 七彩漸變圖
若定義.box定義樣式規則以下:
.box
{
position: relative;
height:200px;
width: 200px;
background: repeating-linear-gradient(to right,
#BC8F8F 0, #BC8F8F 2px,
#FF1493 2px, #FF1493 66px,
#BC8F8F 66px );
}
.box:before
{
content: "";
position: absolute;
width: 200px;
height: 200px;
transform: rotate(90deg);
background: repeating-linear-gradient(to right,
#BC8F8F 0,#BC8F8F 2px,
transparent 2px, transparent 66px,
#BC8F8F 66px );
}
可在頁面中顯示如圖5所示的圖形。
圖5 3*3方格圖
將圖5所示的方格繪製到立方體的六個面上,造成一個魔方。定義關鍵幀,使得魔方旋轉起來。
編寫的HTML文件以下。
<!DOCTYPE html> <html> <head> <title>3D魔方</title> <style> .container { margin: 0 auto; width: 400px; height:400px; background:#d8d8d8; border: 4px solid rgba(255, 0, 0, 0.9); border-radius: 10%; } .cube { position: relative; margin: 100px auto; width: 200px; height: 200px; transform-style: preserve-3d; animation: rotateCube 8s linear infinite; } @keyframes rotateCube { 0% { transform: rotateX(0) rotateY(0); } 100% { transform: rotateX(360deg) rotateY(360deg); } } .side { position: absolute; width: 200px; height: 200px; } .side:before { content: ""; position: absolute; width: 200px; height: 200px; transform: rotate(90deg); background: repeating-linear-gradient(to right, #BC8F8F 0,#BC8F8F 2px, transparent 2px, transparent 66px, #BC8F8F 66px ); } .front { transform: translateZ(100px); background: repeating-linear-gradient(to right, #BC8F8F 0, #BC8F8F 2px, #8B008B 2px, #8B008B 66px, #BC8F8F 66px ); } .back { transform: translateZ(-100px); background: repeating-linear-gradient(to right, #BC8F8F 0, #BC8F8F 2px, #6495ED 2px, #6495ED 66px, #BC8F8F 66px ); } .left { transform: translateX(-100px) rotateY(90deg); background: repeating-linear-gradient(to right, #BC8F8F 0, #BC8F8F 2px, #FFD700 2px, #FFD700 66px, #BC8F8F 66px ); } .right { transform: translateX(100px) rotateY(90deg); background: repeating-linear-gradient(to right, #BC8F8F 0, #BC8F8F 2px, #FF1493 2px, #FF1493 66px, #BC8F8F 66px ); } .top { transform: translateY(-100px) rotateX(90deg); background: repeating-linear-gradient(to right, #BC8F8F 0, #BC8F8F 2px, #00FF7F 2px, #00FF7F 66px, #BC8F8F 66px); } .bottom { transform: translateY(100px) rotateX(90deg); background: repeating-linear-gradient(to right, #BC8F8F 0, #BC8F8F 2px, #FFFAFA 2px, #FFFAFA 66px, #BC8F8F 66px); } </style> </head> <body> <div class="container"> <div class="cube"> <div class="side front"></div> <div class="side back"></div> <div class="side left"></div> <div class="side right"></div> <div class="side top"></div> <div class="side bottom"></div> </div> </div> </body> </html>
在瀏覽器中打開包含這段HTML代碼的html文件,能夠呈現出如圖6所示的動畫效果。
圖6 旋轉的魔方
有了從簡單立方體到3D魔方的製做經驗,下面咱們再來製做一個3D木箱。主要是製做出形象的木箱面板。
設頁面中有<div class='side'></div>,爲.side定義樣式規則以下:
.side
{
width: 160px;
height: 160px;
position: relative;
margin: 100px auto;
padding: 16px;
background-color: #d07f2c;
outline: 1px solid #a66523;
box-sizing: border-box;
}
.side:before, .side:after
{
content: '';
display: block;
width: 16px;
height: 100%;
position: absolute;
outline: 1px solid #a66523;
top: 0;
}
.side:before
{
left: 0;
}
.side:after
{
right: 0;
}
可在頁面中顯示如圖7所示的圖形。
圖7 面板(1)
若修改.side的樣式規則爲:
.side
{
display: block;
width: 160px;
height: 160px;
overflow: hidden;
position: relative;
border: 1px solid #a66523;
box-sizing: border-box;
}
.side:before, .side:after
{
content: '';
display: block;
width: 150%;
height: 20%;
top: 50%;
left: 50%;
transform-origin: 0% 0%;
position: absolute;
outline: 1px solid #a66523;
background-color: #c87a2a;
}
.side:before
{
transform: rotate(45deg) translate(-50%, -50%);
}
.side:after
{
transform: rotate(-45deg) translate(-50%, -50%);
}
可在頁面中顯示如圖8所示的圖形。
圖8 面板(2)
把圖8的圖形放入圖7中,兩者組合起來能夠獲得如圖9所示的面板。
圖9 木箱面板
製做好了面板,咱們就能夠製做出3D木箱,並讓它旋轉起來。編寫的HTML文件以下。
<!DOCTYPE html> <html> <head> <title>旋轉的3D小木箱</title> <style> .container { margin: 0 auto; width: 400px; height: 400px; border: 4px solid rgba(255, 0, 0, 0.9); background:#d8d8d8; border-radius: 10%; } .crate { width: 160px; height: 160px; position: relative; margin: 100px auto; transform-style: preserve-3d; animation: crate-spin 10s linear infinite; } .side { width: 100%; height: 100%; position: absolute; transform-style: preserve-3d; padding: 16px; background-color: #d07f2c; outline: 1px solid #a66523; box-sizing: border-box; } .side:before, .side:after { content: ''; display: block; width: 16px; height: 100%; position: absolute; outline: 1px solid #a66523; top: 0; } .side:before { left: 0; } .side:after { right: 0; } .side-inner { display: block; width: 100%; height: 100%; overflow: hidden; position: relative; border: 1px solid #a66523; box-sizing: border-box; } .side-inner:before, .side-inner:after { content: ''; display: block; width: 150%; height: 20%; top: 50%; left: 50%; transform-origin: 0% 0%; position: absolute; outline: 1px solid #a66523; background-color: #c87a2a; } .side-inner:before { transform: rotate(45deg) translate(-50%, -50%); } .side-inner:after { transform: rotate(-45deg) translate(-50%, -50%); } .crate .side .side-inner span { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 10; font-size: 80px; font-family: "Cooper Black", serif; color: #f6f632; } .top { transform: translateY(-80px) rotateX(90deg); } .bottom { transform: translateY(80px) rotateX(90deg); } .left { transform: translateX(-80px) rotateY(-90deg); } .right { transform: translateX(80px) rotateY(90deg); } .front { transform: translateZ(80px); } .back { transform: translateZ(-80px) rotateY(180deg); } @keyframes crate-spin { from { transform: rotateX(-20deg) rotateY(0deg); } to { transform: rotateX(-20deg) rotateY(-360deg); } } </style> </head> <body> <div class="container"> <div class='crate'> <div class='side top'> <div class='side-inner'></div> </div> <div class='side bottom'> <div class='side-inner'></div> </div> <div class='side left'> <div class='side-inner'> <span>A</span> </div> </div> <div class='side right'> <div class='side-inner'> <span>C</span> </div> </div> <div class='side front'> <div class='side-inner'> <span>B</span> </div> </div> <div class='side back'> <div class='side-inner'> <span>D</span> </div> </div> </div> </div> </body> </html>
在瀏覽器中打開包含這段HTML代碼的html文件,能夠呈現出如圖10所示的動畫效果。
圖10 旋轉的小木箱