CSS3动画,为你带来极致的视觉体验!

HTML5学堂:随着网络的发展,浏览器具有更强的渲染与高级代码的执行能力。所以在当前,大量的动画效果由原来的JavaScript制作正慢慢的被CSS3所替代,究其原因在于CSS3的性能会比JS的性能来的好,并且CSS3动画为用户带来了强大而又震撼的效果,为开发者带来了简单的书写方式。

本文主要内容

1、前言

2、实现动画的前奏

3、CSS3动画的语法

4、实例解析

5、总结

1、前言

CSS3属性中有关于制作动画的三个属性:Transform、Transition、Animation;之前一起学习了Transform和Transition,让我们可以对元素实现一些基本的动画效果。这些我想足以让大家稍微惊讶了一下,今天我们趁着这个热劲继续第三个动画属性Animation。

单从Animation字面上的意思,就知道是“动画”的意思。但CSS3中的Animation只应用在页面上已存在的DOM元素上,而且跟Flash和JavaScript以及jQuery制作出来的动画效果又不一样,因为使用CSS3的Animation制作动画可以省去复杂的js、jQuery代码。

当然CSS3也有一点不足,我们运用Animation能创建自己想要的一些动画效果,但是有时会有卡顿现象。所以如果想要制作比较好的动画,建议大家还是使用CSS3与js相结合的书写方式。

2、实现动画的前奏

在开始介绍Animation之前有必要先来了解一个特殊的东西,那就是"Keyframes",我们把它叫做“关键帧”。下面我们就一起来看看这个“Keyframes”是什么东西。

前面在使用transition制作一个简单的transition效果时,包括了初始属性和最终属性,一个开始执行动作时间和一个延续动作时间以及动作的变换速率。其实这些值都只是一个中间值,如果我们要控制的更细一些,比如说要第一个时间段执行什么动作,第二个时间段执行什么动作。这样再用Transition就很难实现了,所以此时也需要这样的一个“关键帧”来控制。

而CSS3的Animation就是由“keyframes”这个属性来实现这样的效果。下面我们一起先来看看Keyframes:

Keyframes具有其自己的语法规则,它的命名是由"@keyframes"开头,后面紧接着是这个“动画的名称”加上一对花括号“{}”,括号中就是一些不同时间段样式规则,有点像我们css的样式写法一样。

对于一个"@keyframes"中的样式规则是由多个百分比构成的,如“0%”到"100%"之间,可以在这个规则中创建多个百分比,分别在每一个百分比中给需要有动画效果的元素加上不同的属性,从而让元素达到一种在不断变化的效果,比如说移动、改变元素颜色、位置、大小、形状等。

不过有一点需要注意的是,可以使用“from”和“to”来代表一个动画是从哪开始,到哪结束。也就是说这个 "from"就相当于"0%",而"to"相当于"100%"。值得一说的是,关键帧中的数值段必须是百分数,如果不是百分数,这个keyframes是无效的,不会起任何作用。因为keyframes的单位只接受百分比值。

Keyframes可以指定任何顺序排列来决定Animation动画变化的关键位置。其具体语法规则如下:

@keyframes IDENT {
    0% {
        Prop: Prop value;
    }
    Percentage {
        Prop: Prop value;
    }
    100% {
        Prop: Prop value;
    }
}

代码解析:IDENT是一个动画名称,建议语义化一点更好。Percentage是百分比值,可以添加许多个这样的百分比。Prop为CSS的属性名,比如说left、background等,Prop value就是相对应属性的属性值。

值得一提的是,from和to分别对应的是0%和100%。

3、CSS3动画的语法

CSS3的Animation类似于Transition属性,都是随着时间改变元素的属性值。主要区别是Transition需要触发一个事件(hover事件或click事件等)才会随时间改变其CSS属性;而Animation在不需要触发任何事件的情况下也可以显式的随着时间变化来改变元素CSS的属性值,从而达到一种动画的效果。

这样就可以直接在一个元素中调用Animation的动画属性,基于这一点,CSS3的Animation就需要明确的动画属性值,这也就是回到上面所说的,我们需要keyframes来定义不同时间的CSS属性值,以达到元素在不同时间段变化的效果。

下面引用一张W3C官网对于CSS3的Animation对属性变化的过程示意图:

从上图中可以看出Animation和Transition一样有自己相对应的属性,那么在Animation主要有以下几种属性:动画名称(animation-name)动画持续时间(animation-duration)动画的速度曲线(animation-timing-function)动画延迟时间(animation-delay)动画播放次数(animation-iteration-count)动画播放方向(animation-direction)。下面分别来看看这几个属性的使用情况:

1)animation-name

语法:

animation-name: none | IDENT ;

取值说明:

animation-name:是用来定义一个动画的名称。其主要有两个值:none为默认值,当值为none时,将没有任何动画效果;IDENT是由Keyframes创建的动画名,换句话说此处的IDENT要和Keyframes中的IDENT一致,如果不一致,将不能实现任何动画效果。

2)animation-duration

语法:

animation-duration: time;

取值说明:

animation-duration:是用来指定元素播放动画所持续的时间长。取值:time为数值,单位为s(秒),其默认值为“0”。这个属性跟transition中的transition-duration使用方法是一样的。

3)animation-timing-function

语法:

animation-timing-function:ease | linear | ease-in | ease-out | ease-in-out;

取值说明:

animation-timing-function:是指元素根据时间的推进来改变属性值的变换速率,说得简单点就是动画的播放方式。它和transition中的transition-timing-function一样,具有以下几种变换方式:ease、linear、ease-in、ease-out、ease-in-out。具体的使用大家可以去查看——CSS3过渡,不再为JS动画而犯愁这篇文章。

4)animation-delay

语法:

animation-delay: time;

取值说明:

animation-delay:是用来指定元素动画开始时间。取值为time为数值,单位为s(秒),其默认值也是0。

5)animation-iteration-count

语法:

animation-iteration-count: infinite | number;

取值说明:

animation-iteration-count:是用来指定元素播放动画的循环次数。其可以取值number为数字,其默认值为“1”;infinite为无限次数循环。

6)animation-direction

语法:

animation-direction: normal | alternate;

取值说明:

animation-direction:是用来指定元素动画播放的方向。其只有两个值,默认值为normal。如果设置为normal时,动画的每次循环都是向前播放;另一个值是alternate,它的作用是,动画播放在第偶数次向前播放,第奇数次向反方向播放。

7)属性值合并书写

上面分别介绍了Animation中的各个属性的语法和取值,那么综合上面的内容可以给Animation属性一个速记法,如下图所示:

4、实例展示

结合之前的CSS3变形,使用动画实现无限旋转的效果,如下:

HTML代码如下:

<!-- 案例的结构 -->
<div class="wrap">
    <div><a href="###" title="HTML+CSS">HTML+CSS</a></div>
    <div><a href="###" title="JavaScript">JavaScript</a></div>
    <div><a href="###" title="HTML+CSS">HTML+CSS</a></div>
    <div><a href="###" title="JavaScript">JavaScript</a></div>
    <div><a href="###" title="JavaScript">JavaScript</a></div>
    <div><a href="###" title="HTML+CSS">HTML+CSS</a></div>
</div>

对应的CSS样式效果如下:

body {
    /*视角*/
    -webkit-perspective: 2000px;
}
.wrap {
    position: relative;
    width: 500px;
    height: 500px;
    margin: 0 auto;
    /*声明3D样式*/
    -webkit-transform-style: preserve-3d;
    /*实现旋转的动画*/
    -webkit-animation: circumgyrate 15s linear infinite;
}
/*定义旋转关键帧*/
@-webkit-keyframes "circumgyrate" {
    0% {
        -webkit-transform: rotateY(0deg);
    }
    100% {
        -webkit-transform: rotateY(360deg);
    }
}
.wrap div {
    position: absolute;
    left: 150px;
    top: 150px;
    width: 200px;
    height: 200px;
    line-height: 200px;
    text-align: center;
    -webkit-border-radius: 30px;
    /*实现阴影呼吸的动画*/
    -webkit-animation: colorchange 2s ease infinite alternate;
}
/*定义每个模块外层的阴影关键帧*/
@-webkit-keyframes "colorchange" {
    0% {
        box-shadow: 0px 0px 5px 5px rgba(251, 255, 202, 0.1);
    }
    100% {
        box-shadow: 0px 0px 15px 10px rgba(236, 253, 19, 0.5);
    }
}
.wrap div a {
    display: block;
    width: 200px;
    height: 200px;
    text-decoration: none;
}
/*六边形的每一个内角为60度*/
.wrap div:nth-child(1) {
    background: #b0ca53;
    -webkit-transform: rotateY(60deg) rotateZ(30deg) translateZ(300px);
}
.wrap div:nth-child(2) {
    background: #a0dae4;
    -webkit-transform: rotateY(120deg) rotateZ(30deg) translateZ(300px);
}
.wrap div:nth-child(3) {
    background: #f48996;
    -webkit-transform: rotateY(180deg) rotateZ(30deg) translateZ(300px);
}
.wrap div:nth-child(4) {
    background: #7ed3f0;
    -webkit-transform: rotateY(240deg) rotateZ(30deg) translateZ(300px);
}
.wrap div:nth-child(5) {
    background: #f8aa96;
    -webkit-transform: rotateY(300deg) rotateZ(30deg) translateZ(300px);
}
.wrap div:nth-child(6) {
    background: #13b27b;
    -webkit-transform: rotateY(360deg) rotateZ(30deg) translateZ(300px);
}

实现的效果如下图所示:

5、总结

到目前为止,通过对CSS3的系列介绍,完成常规效果开发中所会用到的很多方法,如:阴影、变形、过渡、动画等等。当然,CSS3的使用方法还远不止这些,大家可以多去做了解与查看。

原文发布于微信公众号 - HTML5学堂(h5course-com)

原文发表时间:2016-12-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏非典型技术宅

简单放置一张图片,实现放大缩小旋转效果1 image和imageView的区别2 创建控件显示到view上的标准步骤3 CGRectOffset函数的含义4 小飞机-监听四个按钮的点击事件(代码)5

993
来自专栏熊二哥

Html与CSS快速入门03-CSS基础应用

这部分是html细节知识的学习。 ? ? 边框、填充、对齐和浮动 这部分将主要介绍使用CSS控制整个Web页面的各个方面,通常来说,会使用margin(外部)...

1898
来自专栏cnblogs

如何写好css系列之button

      现代前端行业的发展,如果你在css的时候,还没有利用一些预编译工具,是否觉得自己太low了。但你是否考虑过搭建一套自己前端框架。可能你会想这是否有必...

1837
来自专栏Coco的专栏

谈谈一些有趣的CSS题目(十六)-- 奇妙的 background-clip: text

1424
来自专栏前端新视界

关于 CSS 反射倒影的研究思考

原文:The State of CSS Reflections 译者:nzbin 友情提示:由于演示 demo 的兼容性,推荐火狐浏览。该文章篇幅较长,内容庞杂...

2549
来自专栏超然的博客

响应式图像

将picture元素和srcset,sizes属性纳入html5规范,新规范意在解决:

521
来自专栏C/C++基础

简单电子相册视频制作的步骤和要点

1.套用AE模板,找到图片,按住alt将自己的图片拖拉到工作区,将原来的例图覆盖,在按alt+E制作影片,输出为avi格式的视频;

841
来自专栏落花落雨不落叶

【被玩坏的博客园】之canvas装饰博客园侧边栏

992
来自专栏web前端

HTML+CSS基础

第一章 一、样式      1、行间样式,代码不可维护,不推荐      2、内联样式,不可重用,不推荐      3、外联样式,可重用,可维护,推荐     ...

1809
来自专栏marsggbo

”盒模型“之如何防止边框和内边距把元素撑开

在我们讨论宽度的时候,我们应该讲下与它相关的一个重点知识:盒模型。当你设置了元素的宽度,实际展现的元素却能够超出你的设置:因为元素的边框和内边距会撑开元素。看下...

1816

扫描关注云+社区