css3 的动画让 html 页面变得生机勃勃,但是如何用好动画是一门艺术,接下来我来以一个demo为例,来练习css3 animation。

我们先详细了解一下animation 这个属性。

animation-name

这是一个必填的选项,否则无法指定要执行哪一个动画。

animation-duration

属性定义动画完成一个周期所需要的时间,以秒或毫秒计,如果不写的话,动画将无法执行。

animation-timing-function

动画速度曲线(默认ease),这个属性稍微复杂一些,它规定了这个动画在哪个时间执行的快,那个时间执行的慢。属性定义了一些常用的速度曲线,下面是一些例子:

linear // 动画从头到尾的速度是相同的
ease // 动画以低速开始,然后加快,在结束前变慢
ease-in // 动画以低速开始
ease-out // 动画以低速结束
ease-in-out // 动画以低速开始和结束
cubic-bezier(n,n,n,n) // cubic-bezier 是二阶贝塞尔曲线,4个值都在[0,1]之间取,前两个值组成一个点,后两个值组成一个点。

animation-delay

规定在动画开始之前的延迟时间(默认0),同样以秒或毫秒计。

animation-iteration-count

动画播放次数(默认1),可以是任意正整数或者无限次数 infinite。

animation-direction

动画是否方向播放(默认normal)

normal // 每个动画周期正向播放
reverse // 每个动画周期反向播放
alternate // 奇数周期正向播放,偶数周期方向播放
alternate-reverse // 偶数周期方向播放,奇数周期正向播放

animation

animation 是animation动画的简写,可以将以上6个属性写在一起。既:

animation: name duration timing-function delay iteration-count direction;

我们将animation基础知识复习了一遍,接下来我们用一个小例子感受一下animation 的魅力。我们先看一下这个 animation-demo。这个demo主要有四处用到了 animation动画。

第一处是当横屏时 ( window.innerHeight < window.innerWidth ) 出现竖屏提示

这里运用动画的有三处,第一个是手机的旋转,第二个和第三个是对号错号的缩放。下面上代码

html部分

<div class="phone">
<img src="img/phone.png"/>
<i class="yes"></i>
<i class="no"></i>
</div>

css部分

.phone {position: absolute;left: 50%;top: 100px;transform: translateX(-50%)}
.phone img {position: relative;animation: rotate_phone 5s ease-in-out infinite}
.phone .yes {position: absolute;left: 50%;top: 50%;display: inline-block;width: 40px;height: 30px;
background-image: url("../img/yes.png");animation: scale_yes 5s ease infinite}
.phone .no {position: absolute;left: 50%;top: 50%;display: inline-block;width: 40px;height: 30px;
background-image: url("../img/no.png");animation: scale_no 5s ease infinite}
@keyframes rotate_phone {
0% {transform: rotate(0deg)}
15% {transform: rotate(0deg)}
35% {transform: rotate(-90deg)}
65% {transform: rotate(-90deg)}
85% {transform: rotate(0deg)}
100% {transform: rotate(0deg)}
}
@keyframes scale_yes {
0% {transform: translate(-50%,-50%) scale(1);}
22% {transform: translate(-50%,-50%) scale(1);}
24% {transform: translate(-50%,-50%) scale(0);}
52% {transform: translate(-50%,-50%) scale(0);}
80% {transform: translate(-50%,-50%) scale(0);}
82% {transform: translate(-50%,-50%) scale(1.3);}
84% {transform: translate(-50%,-50%) scale(0.8);}
86% {transform: translate(-50%,-50%) scale(1.1);}
88% {transform: translate(-50%,-50%) scale(0.9);}
90% {transform: translate(-50%,-50%) scale(1);}
100% {transform: translate(-50%,-50%) scale(1);}
}
@keyframes scale_no {
0% {transform: translate(-50%,-50%) scale(0);}
30% {transform: translate(-50%,-50%) scale(0);}
32% {transform: translate(-50%,-50%) scale(1.3);}
34% {transform: translate(-50%,-50%) scale(0.8);}
36% {transform: translate(-50%,-50%) scale(1.1);}
38% {transform: translate(-50%,-50%) scale(0.9);}
40% {transform: translate(-50%,-50%) scale(1);}
72% {transform: translate(-50%,-50%) scale(1);}
74% {transform: translate(-50%,-50%) scale(0);}
100% {transform: translate(-50%,-50%) scale(0);}
}

这段代码的精髓所在就是如何协调配合好这三个动画。那么怎么协调呢?先拿手机旋转来说,我设置的动画运动的时间比上总时间为2:5,即在100%中,有60%的时间是不动的,这样一来我们可以分配30%的时间在竖着的手机动画上,30%的时间在横着的手机动画上。我的思路首先会想到下面这样的代码:

0% {transform: rotate(0deg)}
50% {transform: rotate(-90deg)}
100% {transform: rotate(0deg)}

然后分析50%的时候是横屏(rotate: -90deg),横屏时间占30%,分别向左右各延伸15%,即35%~65%,在循环动画中0%其实就是100%,都可以看作是竖屏(rotate: 0deg)的时间中心,因此竖屏时间范围从0%~15%和85%~100%。所以得到 rotate_phone 动画。接下来我们以错号(scale_no)的缩放动画为例作分析,

0% {transform: translate(-50%,-50%) scale(0);}
30% {transform: translate(-50%,-50%) scale(0);}
32% {transform: translate(-50%,-50%) scale(1.3);}
34% {transform: translate(-50%,-50%) scale(0.8);}
36% {transform: translate(-50%,-50%) scale(1.1);}
38% {transform: translate(-50%,-50%) scale(0.9);}
40% {transform: translate(-50%,-50%) scale(1);}
72% {transform: translate(-50%,-50%) scale(1);}
74% {transform: translate(-50%,-50%) scale(0);}
100% {transform: translate(-50%,-50%) scale(0);}

动画首先到达横屏的时候为 rotate_phone 动画的35%部分,我是以35%为错号缩放动画的中心时间,以2%为一个时间段(根据自己的需求),缩放程度先大后小scale(1.3)=>scale(0.8)=>scale(1.1)=>scale(0.9)=>scale(1)这里只是粗略的表示。正号的部分就是将错号的部分+50%或者-50%就可以了。超过100%的部分或者少于0%的部分在重新换算成0%~100%,比如72% => 22%。因此得到 scale_yes 动画

0% {transform: translate(-50%,-50%) scale(1);}
22% {transform: translate(-50%,-50%) scale(1);}
24% {transform: translate(-50%,-50%) scale(0);}
80% {transform: translate(-50%,-50%) scale(0);}
82% {transform: translate(-50%,-50%) scale(1.3);}
84% {transform: translate(-50%,-50%) scale(0.8);}
86% {transform: translate(-50%,-50%) scale(1.1);}
88% {transform: translate(-50%,-50%) scale(0.9);}
90% {transform: translate(-50%,-50%) scale(1);}
100% {transform: translate(-50%,-50%) scale(1);}

第二处是主页背景颜色的变换动画

这个动画比较简单,就是背景颜色的变换,颜色我是借助 Ant Design 的颜色设计。下面贴代码

article {height: 100%;width: 100%;position: relative;animation: change_color 10s ease-in-out infinite;overflow: hidden}
@keyframes change_color {
0% {}
8% {background-color: #ffa39e;}
12% {}
28% {background-color: #b7eb8f;}
32% {}
48% {background-color: #ffadd2;}
52% {}
68% {background-color: #adc6ff;}
72% {}
88% {background-color: #ffe58f;}
92% {}
100% {background-color: #ffa39e;}
}

第三处是转盘的转动

首先先把这个圆盘放在中间,这个不在动画范围而且比较简单就不多说。中间的指针是130px * 155px的,但是这里注意我们不能将指针图片中心与转盘中心重合,因为这个图片不是正方形,我们要把指针圆形的中心与转盘中心重合,我使用了绝对定位,这里使用calc计算属性(存在兼容性问题)解决上面重合问题。

css部分

article .disc .disc-box .zz {position: absolute;left: calc(50% - 65px);top: calc(50% - 90px);transform: rotate(0deg);transition: all 8s cubic-bezier(0.25, 0.46, 0.45, 0.94);transform-origin: 65px 90px}

js部分

$('.zz').css('transform','rotate(3000deg)')

这里使用点击事件来出发事件改变样式。

第四部分是四边运动的文字

这部分比较简单,看代码就懂,其中两个稍微麻烦的点就是将四个文字盒子通过旋转平移到四个边,再有就是要先得到一个重复单元文字的长度。下面贴代码。

html部分

<div class="move">
<div class="top pp">
<p>
GUOZHIQIANG GUOZHIQIANG GUOZHIQIANG GUOZHIQIANG GUOZHIQIANG
</p>
</div>
<div class="right pp">
<p>
GUOZHIQIANG GUOZHIQIANG GUOZHIQIANG GUOZHIQIANG GUOZHIQIANG
</p>
</div>
<div class="bottom pp">
<p>
GUOZHIQIANG GUOZHIQIANG GUOZHIQIANG GUOZHIQIANG GUOZHIQIANG
</p>
</div>
<div class="left pp">
<p>
GUOZHIQIANG GUOZHIQIANG GUOZHIQIANG GUOZHIQIANG GUOZHIQIANG
</p>
</div>
</div>

css部分

.move .pp {height: 80px;position: absolute;overflow: hidden;left:;top:;}
.move .top {width: calc(100vw - 80px);transform: translate(0px, 0px);}
.move .bottom {width: calc(100vw - 80px);transform: translate(80px, calc(100vh - 80px)) rotate(180deg);}
.move .right {width: calc(100vh - 80px);transform: translate(100vw, 0px) rotate(90deg);transform-origin: 0px 0px;}
.move .left {width: calc(100vh - 80px);transform: translate(0px, 100vh) rotate(-90deg);transform-origin: 0px 0px;}
.move .pp p {height: 80px;line-height: 80px;font-size: 50px;color: #000;animation: move 1.5s linear infinite;}
@keyframes move {
from {transform: translate(-422px, 0px);}
to {transform: translate(0px, 0px);}
}

注意move动画这里的 -422px 就是一个重复单元文字的长度,既 "GUOZHIQIANG   "的长度。

但这里css动画就看完了,代码很简单,这里是码云地址 https://gitee.com/guo_zq/color.git,喜欢请点赞哦。

转载请注明:CSS3 animation 练习

CSS3 animation 练习的更多相关文章

  1. 实现了一个百度首页的彩蛋——CSS3 Animation简介

    在百度搜索中有这样一个彩蛋:搜索“旋转”,“跳跃”,“反转”等词语,会出现相应的动画效果(搜索“反转”后的效果).查看源码可以发现,这些效果正是通过CSS3的animation属性实现的. 实现这个彩 ...

  2. css3 animation实现风车转动

    项目中经常有用到动画效果,比如Loading.风车转动等等.最简单的办法是使用gif,但是gif在半透明背景下有白边,体验不友好,好在现在可以使用css3的anmiation来实现动画效果,极大的提升 ...

  3. css3 animation动画特效插件的巧用

    这一个是css3  animation动画特效在线演示的网站 https://daneden.github.io/animate.css/ 下载 animate.css文件,文件的代码很多,不过要明白 ...

  4. CSS3 Animation Cheat Sheet:实用的 CSS3 动画库

    CSS3 Animation Cheat Sheet 是一组预设的动画库,为您的 Web 项目添加各种很炫的动画.所有你需要做的是添加样式表到你的网站,为你想要添加动画效果的元素应用预制的 CSS 类 ...

  5. css3 animation 属性众妙

    转自:凹凸实验室(https://aotu.io/notes/2016/11/28/css3-animation-properties/) 本文不会详细介绍每个 css3 animation 属性(需 ...

  6. css3 animation动画技巧

    一,css3 animation动画前言 随着现在浏览器对css3的兼容性越来越好,使用css3动画来制作动画的例子也越来越广泛,也随着而来带来了许多的问题值得我们能思考.css3动画如何让物体运动更 ...

  7. 第四十一课:CSS3 animation详解

    animation是css3的另一个重要的模块,它成型比transition晚,吸取了Flash的关键帧的理念,实用性高. animation是一个复合样式,它可以细分为8个更细的样式. (1)ani ...

  8. CSS3 animation 与JQ animate()的区别

    CSS3 与 JQ 根本区别 css3 animation与jQuery animate()区别在于实现机制不同 C3和JQ 完成动画的优缺点 1.css3中的过渡和animation动画都是基于cs ...

  9. CSS3(animation, trasfrom)总结

    CSS3(animation, trasfrom)总结 1. Animation 样式写法: 格式: @-浏览器内核-keyframes 样式名 {} 标准写法(chrome safari不支持 @k ...

随机推荐

  1. Django知识点汇总

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  2. Web Penetration Testing

    1.国外使用的一款在线工具,对web的信息收集很有帮助 地址http://archive.org  , WayBack Machine 主界面如下:对百度存档的历史信息进行查询. 2.IP地址归属信息 ...

  3. python(8):面向对象编程

    有三种程序类型: (1)面向过程:按照一定的逻辑顺序,一步步垒代码 (2)面向函数:对用常用的计算,建立函数避免重复 (3)面向对象: 函数的集合,对函数进行分类和封装 (一) 抽象 抽象: 哈巴狗, ...

  4. zoj3471 状态压缩dp基础

    /* dp[S]表示状态S下的最大收益,0表示没有了,1表示还在 */ #include<bits/stdc++.h> using namespace std; <<],mp[ ...

  5. shell 判断文件夹或文件是否存在

    文件夹不存在则创建 if [ ! -d "/data/" ];then mkdir /data else echo "文件夹已经存在" fi 文件存在则删除 i ...

  6. go包之logrus显示日志文件与行号

    前言: logrus是go中比较好的一个log模块.github上的很多开源项目都在使用这个模块, 我在写这个博文时, github上的logrus的stars数已经有8214了.最近在用这个模块时, ...

  7. java函数式编程之Supplier

    原创 2016年12月25日 10:02:52 标签: 函数式编程 / java 3250 描述:Supplier< T>接口没有入参,返回一个T类型的对象,类似工厂方法. 源码: pub ...

  8. C++ Primer 笔记——基本内置类型

    1.算术类型分为两类:整型和浮点型.算术类型的尺寸在不同机器上有所差别,下表列出了C++标准规定的尺寸的最小值.同时允许编译器赋予这些类型更大的尺寸. 一个char的大小和一个机器字节一样. 一个in ...

  9. python is和==的区别

    # ==和is # ==用来判断值是否相等# is是用看来判断是不是指定了同一个东西,判断是不是指向了同一个地址等 a = [11,22,33]b = [11,22,33] a == b # True ...

  10. Hadoop Shell命令(基于linux操作系统上传下载文件到hdfs文件系统基本命令学习)

    Apache-->hadoop的官网文档命令学习:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html FS Shell 调用文件系统( ...