如何畫3D旋轉效果或者衛星圍繞旋轉效果,固然這個也是工做中的一個任務,我在網上翻了一下,並無找到相似的東西,因此寫下來仍是費了一番功夫,所以我把它拿出來記錄一下,固然替換了一部份內容。好了,話很少說,進入正題。javascript
咱們都知道,瀏覽器是一個平面的視覺效果,如何在一個平面上看出立體的3D效果呢,其實就是一個視覺差的問題。那咱們就從一個平面視覺效果一步一步畫出立體的3D效果來。我仍是先把效果放出來吧,點擊預覽(終版)css
衛星的軌跡通常都是圓的或者橢圓的,咱們就先以一個圓形的軌跡爲例。html
很是簡單,就是畫一個圓形的軌跡,而後利用弧度公式計算出每一個衛星在軌跡上的位置。好比:java
三個衛星,弧度就是 var radian =2 * Math.PI /360 *60,更多的衛星就同理計算弧度web
它們三個組成的三角形邊長就是:var langWidth = Math.sin(radian) * rWidth瀏覽器
利用勾股定理是否是就能夠計算出每一個衛星的位置了。 如今咱們把樣式加上,就能夠看到旋轉的衛星了。平面效果; 如代碼中所示,咱們在13s內,讓整個div自轉一週(360度),爲了兼容更多的瀏覽器,因此寫了一大坨,若是不明白能夠看一下 CSS3 之動畫及兼容性調優
涉及的知識點: 動畫的過程拆分,三角形邊長位置計算sass
.r1{ animation:rotate 13s linear infinite; -webkit-animation:rotate 13s linear infinite; -moz-animation:rotate 13s linear infinite; -o-animation:rotate 13s linear infinite; } @keyframes rotate{ 0%{ transform:rotate(0deg)skew(0deg)scale(1); -ms-transform:rotate(0deg)skew(0deg)scale(1); -moz-transform:rotate(0deg)skew(0deg)scale(1); -webkit-transform:rotate(0deg)skew(0deg)scale(1); -o-transform:rotate(0deg)skew(0deg)scale(1); } 100%{ transform:rotate(360deg)skew(0deg)scale(1); -ms-transform:rotate(360deg)skew(0deg)scale(1); -moz-transform:rotate(360deg)skew(0deg)scale(1); -webkit-transform:rotate(360deg)skew(0deg)scale(1); -o-transform:rotate(360deg)skew(0deg)scale(1); } }
如今咱們要把這個平面的圓形以一條直徑爲轉軸,旋轉76度,是否是就了一點點的立體感受了。其實它仍是一個平面,爲何能看到立體的感受呢? 由於咱們都知道一個遠小近大的道理:當衛星轉向內圈的時候,咱們讓球體逐漸變大;當衛星轉向外圈的時候,咱們讓球體逐漸變小,這樣就會產生一個遠近景深的效果,也就產生了立體的感受。app
涉及的知識點:3D 元素距視圖的距離(perspective),圖形的角度處理立體的旋轉效果有了,可是咱們的眼睛其實沒法分辨哪一個是內圈,哪一個是外圈,咱們須要在中間放一個參照物來告訴咱們的眼睛,哪一個在前,哪一個在後。這樣,一個完整的衛星圍繞旋轉效果就出來了。動畫
涉及的知識點:讓轉換的子元素保留3D轉換(transform-style: preserve-3d;)什麼意思呢,就是讓兩個元素能夠保持相對的立體空間效果。好比,土星圖片和衛星軌道平面是垂直的,須要用這個屬性來保持這個的空間效果。<body> <div class="star-animate"> <div class="out_circle"> <div class="nav_circle r1"> <img class="center-img1" src={require("Images/animateList/1/star.png")}/> <div class="img_top img"> <img src={require("Images/animateList/1/star1.png")}/> </div> <div class="img_bottom img"> <img src={require("Images/animateList/1/star2.png")}/> </div> <div class="img_bottom2 img"> <img src={require("Images/animateList/1/star3.png")}/> </div> </div> </div> </div> </body>