6-4 3D旋转特效(中)
本节编程练习不计算学习进度,请电脑登录imooc.com操作

3D旋转特效(中)

通过rotateY设置的元素都会挤在同一个点上,需要拉开空间

三张图都在需要分布在不同的方向,呈现出一个圆形包围,这里可以采用translateZ处理。translateZ()函数是沿着垂直的Z轴方向平移,它可以让3D空间由前往后运作。假设自己作为观察者,观察着电脑屏幕上的某个元素,translateZ函数的正向值(越来越大的值)令元素更靠近观察者,负向值则远离观察者。

translateZ的计算公式

可以通过translateZ改变元素的透视距离,那么到底应该设置多少合适呢?

我们只需要求出边界到中心的距离,让3个图片围成一个圆形,那么每一个面的角度就是120°,长度是200px。换句话说一个面是有2个60°的直边三角形组成的。那么每一个直边三角形就是100px了,translateZ是直径距离,所以需要算出直边三角形的"邻边"距离

100 / Math.tan(60 / 180 * Math.PI) ≈ 57

实际上,我们会根据这个57px的距离会有一定的浮动,当然最终可以转化成rem去计算了

旋转原理

布局完成后旋转就比较简单了,只需要控制父节点的rotateY角度变化就可以了,注意因为是3张图,所以每次变化的角度应该是120°,这样才能保持每张图旋转的角度的正确性。具体可以参考右边代码的实现

任务

在index.html文件代码32中行填入任务代码

给id=spinner的元素设置rotateY属性, 角度是传入的angle变量,变化的时间是1秒

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  6. <title>圣诞主题</title>
  7. <style type="text/css">
  8. * {
  9. margin: 0;
  10. padding: 0;
  11. }
  12. </style>
  13. </head>
  14.  
  15. <body>
  16. <div id="carousel" style="perspective: 500px; position: absolute; left: 6.8rem; top: 4.5rem;">
  17. <figure id="spinner" style="width: 4rem; transform-style: preserve-3d;">
  18. <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>
  19. <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>
  20. <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>
  21. </figure>
  22. </div>
  23. <button>点击旋转</button>
  24. <script src="http://libs.baidu.com/jquery/1.9.1/jquery.js"></script>
  25. <script type="text/javascript">
  26.  
  27. var count = 0;
  28. var rotate = 120
  29. var angle;
  30. $("button").on("click", function() {
  31. angle = (count++) * rotate + 360
  32. //?
  33. })
  34.  
  35.  
  36. //rem设置
  37. ;(function(doc, win) {
  38. var docEl = doc.documentElement,
  39. resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
  40. recalc = function() {
  41. var clientWidth = docEl.clientWidth;
  42. if (!clientWidth) return;
  43. docEl.style.fontSize = 20 * (clientWidth / 320) + 'px';
  44. //宽与高度
  45. document.body.style.height = clientWidth * (900 / 1440) + "px"
  46. };
  47. win.addEventListener(resizeEvt, recalc, false);
  48. doc.addEventListener('DOMContentLoaded', recalc, false);
  49. })(document, window);
  50. </script>
  51. </body>
  52.  
  53. </html>
  54.  
下一节