css3模拟行星环绕恒星旋转的动效

2017年5月11日

一、描述

模仿行星绕着恒星旋转的动效


二、原 SVG 方案

一开始我选择使用了 SVG 方案去完成这个动效:

  • 椭圆轨道使用 <path> 标签绘制,行星小球使用 <circle> 标签绘制;
  • 不断地从 <path> 标签中,获取定位信息(X,Y),并更新行星小球的位置;

获取 <path> X,Y 值:

var l = path.getTotalLength()
var p = path.getPointAtLength(t * l) // 其中 t 为 0 到 1 的值
var x = p.x;
var y = p.y;

弊端:
由于每个行星小球,实际上是根据 <path> 轨道中每个点的位置,重新来定位的。所以当行星小球的速度越慢,越容易看出“抖动”的情况。整体动画不顺滑,因此使用 CSS3 特性来重新调整这个动效。

三、CSS3 方案

1. HTML 布局

<div class="galaxy">
   // 轨道
    <div class="orbit">
        // 行星
        <div class="planet">
           // 文案
            <span class="name">行星</span>
        </div>
    </div>
</div>

2. 轨道 360° 自转

首先让轨道沿着 Z 轴 360° 循环旋转。

@keyframes orbit-rotate {
  0% {
    transform: rotateZ(0deg); }

  100% {
    transform: rotateZ(-360deg); } 
}

3. 倾斜轨道,渲染立体感觉

transform: rotateX(80deg);

80° 是个视觉上的“平面”角度,若真的设置 90°的话,在页面上便什么也看不到了。

注意到此时行星也“扁”了。

4. 把行星“立”起来,且添加自转

@keyframes self-rotate {
  0% {
    transform: rotateX(-90deg) rotateY(360deg); }

  100% {
    transform: rotateX(-90deg) rotateY(0deg); } 
}

5. 行星自转与轨道自转同时进行,且速率保持一致。

即两个 animation 都保持 animation-durationanimation-timing-function 等的参数一致。

那么行星小球就会永远把正切面展示在前方了。

四、总结

与原 SVG 方案相比,新的 CSS3 方案解决了行星小球在转动时的“抖动”问题,同时在 HTML 标签以及 JS 方面,都大大精简了代码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 迷于设计,沉于动效。由于笔者对动效交互很感兴趣,遂著此文。希望能对大家有一点帮助。动图较多,建议 Wifi 下浏览...
    求愚阅读 3,559评论 0 29
  • 12年研究生毕业进入国内一家顶尖互联网企业,从事数据仓库开发和研究工作。一直以来,工作谈不上激情,更没有成就感。每...
    qingfeng阅读 279评论 1 2
  • 夏紫晴阅读 839评论 0 0
  • 今晚在我表演完配乐诗朗诵的最后一首后,乔躺在我身上睡熟了。端祥着他心满意足的神情,感受着他平缓流畅的呼吸,我...
    dodobaby阅读 363评论 0 2
  • 1、线上学习 个人体会 今天听到一句很经典的话“99%的复制就是100%的不复制”,这句话说得有些绕口,但...
    葆婴USANA廖瑜阅读 163评论 0 0