3D旋轉(zhuǎn)特效(中)
通過rotateY設(shè)置的元素都會擠在同一個(gè)點(diǎn)上,需要拉開空間

三張圖都在需要分布在不同的方向,呈現(xiàn)出一個(gè)圓形包圍,這里可以采用translateZ處理。translateZ()函數(shù)是沿著垂直的Z軸方向平移,它可以讓3D空間由前往后運(yùn)作。假設(shè)自己作為觀察者,觀察著電腦屏幕上的某個(gè)元素,translateZ函數(shù)的正向值(越來越大的值)令元素更靠近觀察者,負(fù)向值則遠(yuǎn)離觀察者。
translateZ的計(jì)算公式
可以通過translateZ改變元素的透視距離,那么到底應(yīng)該設(shè)置多少合適呢?
我們只需要求出邊界到中心的距離,讓3個(gè)圖片圍成一個(gè)圓形,那么每一個(gè)面的角度就是120°,長度是200px。換句話說一個(gè)面是有2個(gè)60°的直邊三角形組成的。那么每一個(gè)直邊三角形就是100px了,translateZ是直徑距離,所以需要算出直邊三角形的"鄰邊"距離
100 / Math.tan(60 / 180 * Math.PI) ≈ 57
實(shí)際上,我們會根據(jù)這個(gè)57px的距離會有一定的浮動,當(dāng)然最終可以轉(zhuǎn)化成rem去計(jì)算了
旋轉(zhuǎn)原理
布局完成后旋轉(zhuǎn)就比較簡單了,只需要控制父節(jié)點(diǎn)的rotateY角度變化就可以了,注意因?yàn)槭?張圖,所以每次變化的角度應(yīng)該是120°,這樣才能保持每張圖旋轉(zhuǎn)的角度的正確性。具體可以參考右邊代碼的實(shí)現(xiàn)
任務(wù)
在index.html文件代碼32中行填入任務(wù)代碼
給id=spinner的元素設(shè)置rotateY屬性, 角度是傳入的angle變量,變化的時(shí)間是1秒
- ?不會了怎么辦
-
$("#spinner")
.css({
"transform": "rotateY(-" + angle + "deg)",
"transition":"1s"
})
.css({
"-moz-transform": "rotateY(-" + angle + "deg)",
"-moz-transition":"1s"
})
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>圣誕主題</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div id="carousel" style="perspective: 500px; position: absolute; left: 6.8rem; top: 4.5rem;">
<figure id="spinner" style="width: 4rem; transform-style: preserve-3d;">
<figure style="width:4rem;transform:rotateY(0deg) translateZ(2.5rem);position:absolute;"><img src="http://img1.sycdn.imooc.com//5662e29a0001905a14410901.png" style="width:100%;height:100%;"></figure>
<figure style="width:4rem;transform: rotateY(120deg) translateZ(2.5rem) scaleY(.9);position:absolute;"><img src="http://img1.sycdn.imooc.com//5662e2960001f16314410901.png" style="width:100%;height:100%;"></figure>
<figure style="width:4rem;transform: rotateY(240deg) translateZ(2.5rem) scaleY(.9);position:absolute;"><img src="http://img1.sycdn.imooc.com//5662e26f00010dea14410901.png" style="width:100%;height:100%;"></figure>
</figure>
</div>
<button>點(diǎn)擊旋轉(zhuǎn)</button>
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.js"></script>
<script type="text/javascript">
var count = 0;
var rotate = 120
var angle;
$("button").on("click", function() {
angle = (count++) * rotate + 360
//?
})
//rem設(shè)置
;(function(doc, win) {
var docEl = doc.documentElement,
resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
recalc = function() {
var clientWidth = docEl.clientWidth;
if (!clientWidth) return;
docEl.style.fontSize = 20 * (clientWidth / 320) + 'px';
//寬與高度
document.body.style.height = clientWidth * (900 / 1440) + "px"
};
win.addEventListener(resizeEvt, recalc, false);
doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);
</script>
</body>
</html>
請驗(yàn)證,完成請求
由于請求次數(shù)過多,請先驗(yàn)證,完成再次請求