使用css3的动画模拟太阳系恒星公转

本文介绍使用css3的animation画一个太阳系恒星公转的动画,再加以改进,讨论如何画椭圆的运行轨迹。然后分析京东和人人网使用animation的实际案例,最后结合css3的clip-path做一些比较特别的动画。

太阳系最终的效果图如下:

css3的animation是通过关键帧的形式做出来的,首先设定一个动画的运行时间,然后在这个时间轴上的若干位置处插入关键帧,浏览器根据关键帧设定的内容做过渡动画。animation一般结合transform属性进行制作。以一个简单的例子说明,以一个div,让其从左到右运动,如下图左所未(需要点下图片播放)

先用css画出静态的图,然后再加动画的属性。整个工程完整的代码见这个Demo。html如下:

<div class='space'>
    <div class='wheel'>
        <span class='line'></span>
     </div>
</div>

在轮子wheel加一个动画的属性,

.wheel{
animation: move 3s linear infinite;
}

这个的意思是动画的名字是move,时间轴是3s,速度是匀速,播放次数无限。然后move的关键帧keyframes如下:

@keyframes move{
100%{
            transform: translateX(350px);
        }
    }

即播放到末尾的时候,向X轴右移350px。在0%的时候值0,100%的时候值为350px,时间为3s,还有一个速度曲线的属性,根据这些信息做过渡动画。如果指定速度为线性linear,则动画的过渡效果是匀速的,对于上面来说就是匀速右移。默认的速度曲线为ease,就是渐进和渐出,中间播放比较快。

然后再给轮子添加一个滚动的效果rotate,用运行的距离除以轮子的周长得出需要滚动多少圈,即375 / (25 * 3.1415926 *
2) * 360 = 859.4度,也就是在这个区间向右移动的同时加上自转的效果,所以给transform添加多一个rotate的属性。

transform: translateX(350px) rotate(859.4deg);

这样就可以了:

这就是css3的animation动画,结合transform的大小、旋转、位移、斜切,通过两三行代码,便可做出很多有趣的效果。

接下来讨论太阳系的制作,跟上面不同的地方是行星是围绕着太阳转的,而轮子是围绕着自己的圆心转的,也就是说他们转的基点不同。可以看出,transform的基点默认是本身的中心center,所以我们要改变行星的进行转换的中心点transform-origin。完整的Demo。太阳系的html结构如下:

    <div class="galaxy">
        <div class='sun'></div>
        <div class='mercury'></div>
        <div class='venus'></div>
        <div class='earth'></div>
    </div>

太阳位于div
galaxy的中间,让其它行星位于太阳的右边排成一条线。设置galaxy的width和height都为1300px。sun图片的大小为100px*100px,所以sun的left值和top值都为(1300
- 100) / 2 =
600px,这样sun就位于中间位置。设置水星mercury的left值为700px,top为625px,这样水星就位于太阳偏右的位置。然后再设置transform-origin:

transform-origin: -50px 25px;

transform-origin的原点是作用的元素左上角位置,所以往左移(700 - 1300 / 2) = 50px,往下移60 / 2 = 30px(60为水星高度),水星转换的基点就变成了太阳的中心,在此基础上进行旋转:

animation: rotation 2.4s linear infinite;
@keyframes rotation{
    to{
        transform: rotate(1turn);
    }
}

注意这里改变了同义的属性,0%和100%分别换成from和to,360deg换成1turn。

其它的行星,也按照这种方法进行设置,计算稍微繁琐。公转的周期以地球10s为基准,其它按比例换算。这样就可以做出一个太阳系公转的图,原理很简单,效果却很好。

注意到行星运行的轨迹其实是椭圆形的,上面是用了正圆形。因此,下面讨论如何做一个椭圆的运行轨迹。查看完整的Demo。效果图如下:

上面的椭圆在Y轴上被压扁了,可以考虑在Y轴上添加一个位移变换,原理如下图所示,首先将地球的初始位置放到椭圆和其短轴的交点处,然后transform-origin设置为半径为800px的圆心的位置,但运行时间为50%即到初始位置对面的时候,插入一个关键帧:做一个位移转换,向y轴负方向移动200px,这样就可以形成一个半椭圆的轨迹,到了100%的时候逐渐恢复为初始值0,跟前面的半椭圆相反,就可以完成一个完整的椭圆轨迹。

需要在earth的外面包一层div,用来设置translateY的效果,因为这个效果的时间曲线需要设置为ease-in-out渐进渐出的效果,让椭圆运行起来更加的顺畅,如果不设置的话渲染出来的动画会不太像椭圆轨迹。html的结构如下:

<div class='planet'>
        <div class='origin-circle'></div>
        <div class='sun'></div>
        <div class='track'></div>
        <div class='moveY'>
            <div class='earth'></div>
        </div>
</div>

给moveY添加一个translateY的动画,其它的一样。

.moveY{
animation: moveY 2s ease-in-out infinite alternate;
}
@keyframes moveY{
to{
transform: translateY(-200px);
}
}

注意这里将moveY的周期设置为旋转的一半,同时使用了一个transition-direction为alternate的属性,alternate意为交替,效果等同于

@keyframes moveY{
    0%,100%{
       transform: translateY(0px);
    }
50%{
transform: translateY(-200px);
}
}

(未完待续。。。)

作者:佚名

来源:51CTO

时间: 2024-08-30 23:06:10

使用css3的动画模拟太阳系恒星公转的相关文章

css3+html5实现太阳系行星公转动画实例

模拟太阳系行情公转动画最终的效果图如下: css3的animation是通过关键帧的形式做出来的,首先设定一个动画的运行时间,然后在这个时间轴上的若干位置处插入关键帧,浏览器根据关键帧设定的内容做过渡动画.animation一般结合transform属性进行制作.以一个简单的例子说明,以一个div,让其从左到右运动,如下图左所未(需要点下图片播放) 先用css画出静态的图,然后再加动画的属性.整个工程完整的代码见这个Demo.html如下: <div class='space'>     &l

8款帅酷的HTML5/CSS3 3D动画、图片、菜单应用

今天要给大家分享8款帅酷的HTML5/CSS3应用,它们中包括很酷的HTML5 3D动画应用,也包括实用的CSS3图片.菜单.进度条等插件,一起来看看吧. 1.HTML5 Canvas火焰燃烧动画 如同掉落的火球这次要分享的是一款超级绚丽的HTML5火焰动画,画面上是一个熊熊燃烧的小火球,小球燃烧的火焰非常逼真,会比较消耗CPU.另外这个动画是在HTML5 Canvas上实现的,修改起来也非常灵活.之前也分享过几款HTML5火焰动画,像这款HTML5 Canvas火焰闪烁动画. html5-ca

css3常用动画+动画库

一.animates.css animate.css是来自dropbox的工程师Daniel Eden开发的一款CSS3的动画效果小类库.包含了60多款不同类型的CSS3动画,包括:晃动,闪动,各种淡出淡出效果,如果你想快速的整合各种CSS3动画特效的话,使用它即可方便的实现.   查看演示: https://daneden.github.io/animate.css/  github地址: https://github.com/daneden/animate.css  二.magic.css动

css3 loading: 3款漂亮的CSS3 Loading动画实例教程

HTML第1个例子中的HTML标记非常简单,我们在页面上创建了一个ul列表标记,并在其内部创建了几个div来控制它的总体进度动画,代码如下: 12345678910111213141516171819202122 <ul id="progress">    <li>    <div id="layer1" class="ball"></div> <!-- layer1 control dela

CSS3展现精彩的动画效果 css3的动画属性

文章简介:因为CSS3,动画将一切皆有可能. 热火朝天的css3无疑吸引了很多前端开发者的眼球,然而在css3中的动画属性则是新功能中的主打招牌,说到css3的动画属性不得不让人想起这三个属性:Transform﹑Transition﹑Animation. transform属性虽然看起来可以实现动画的效果,但本质其实是静态的,说白一点其实就是一个图形的变形工具:而transition属性是一个简单 的动画属性,操作起来非常的简单:在这里主要为大家介绍Animations属性,这是个名副其实的动

3款漂亮的CSS3 Loading动画实例教程

   HTML 第1个例子中的HTML标记非常简单,我们在页面上创建了一个ul列表标记,并在其内部创建了几个div来控制它的总体进度动画,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <ul id="progress">     <li>     <div id="layer1" class="ball"></div>

CSS3简单动画

css3的动画确实非常绚丽!浏览器兼容性很重要!. 分享两个小动画 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus"> <meta name="Author" content=&quo

javascript-js加css3实现动画问题。。

问题描述 js加css3实现动画问题.. 第一个:::: function slideList(){ var downY = 0; var step = 1/4; var nowIndex = 0; var nextorprevIndex = 0; $li.on('touchstart',function(ev){ var touch = ev.originalEvent.changedTouches[0]; downY = touch.pageY; nowIndex = $(this).ind

用POP动画模拟真实秒钟摆动效果

用POP动画模拟真实秒钟摆动效果 静态图: 动画图: 此处用到了POP中的Spring系列动画,现提供源码如下: SecondClockView.h 与 SecondClockView.m // // SecondClockView.h // YouXianMingClock // // Created by YouXianMing on 14-10-12. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import <