CSS3 animation ? steps 函数详解


Posted in HTML / CSS onAugust 30, 2019

这几天在看一些 css3 动画的源码实现时,发现 css 代码的 animation 当中有一个比较陌生的单词 steps ,在源码中是这么写的:

animation: thunder 2s steps(1, end) infinite;

查阅相关资料后发现 steps 函数是 animation-timing-function 属性的一个值,那这个函数相较于其他值比如 ease , linear 的区别在哪里呢。

steps

在查阅相关资料后才发现自己之前对 animation-timing-function 了解不够充分,实际上 animation-timing-function 的 function 指的是 steps() 和  cubic-bezier( ) 即贝塞尔曲线函数这两个函数,像 linear , ease 这些值其实是   cubic-bezier() 函数的特殊值, steps() 函数同样也有两个特殊值: step-start step-end 。在了解这些前提后,下面来具体分析 steps 函数的作用。

实际上 steps 函数和   cubic-bezier 函数分别对应动画的两种形式:跳跃式和连贯式。回顾平常我们是怎么使用  cubic-bezier 函数的:

div {
  animation: move 1s linear infinite alternate;
}
@keyframes move {
  0% {
    margin-left: 0;
  }
  30% {
    margin-left: 50px;
  }
  100% {
    margin-left: 100px;
  }
}

我们只需要在 @keyframes 中定义关键帧, cubic-bezier 函数会帮助我们在关键帧之间补帧使其成为流畅的动画,但有时候我们不希望动画连贯的播放,而是跳跃式的播放,那我们就需要借助 steps 函数了。

steps函数接收两个参数: number 和 position 。 number 是正整数, position 有两个值: start 和 end 。前面我们提到 steps 的两个特殊值: step-start 和 step-end ,实际上它们分别代表 steps(1, start) 和 steps(1, end) 。那这两个参数分别代表什么含义呢?

number: number 表示动画被分成了多少段,比如上述例子表示 div 从 0px 移动到 100px 的这一整段过程一共被分成 4 段。

position: position 参数可选,默认为 end 。 start 与 end 的含义是什么呢,我的理解是: number 会将整个动画过程分成多段或者说多个周期, start 表示动画的状态会在每个周期的起始点瞬间完成变化,而 end 则表示动画的状态会在每个周期的结束点瞬间完成变化。这里附上 W3C 官方文档上的一张图片:

CSS3 animation ? steps 函数详解 

上图的坐标系中,x轴代表时间,y轴代表动画的进度,在这张图中我们需要注意的是实心圆点,实心圆点表示的是动画所处的状态。我们来看第一张图,它表示的是 steps(1, start) 。根据前面的解释,整段动画将会作为一段也就是只有一个周期,而指定了 start 参数使得动画会在周期的起始点状态发生改变,所以我们可以看到第一个实心圆点的坐标为 (0,1) 。对于第二张图片,由于指定了 end ,所以动画的状态会在周期的结束点突变,因此对应两个实心圆点的坐标为 (0,0) 和 (1,1) 。下面的 steps(3, start) 和 steps(3, end) 也是同样的道理,这里就不具体分析了。

接下来为了更加直观的感受 steps 函数的作用,举几个例子来加深理解:

这里先举一个连贯动画来作为参考,部分代码如下:

div {
  width: 100px;
  height: 100px;
  background-color: red;
  animation: move 2s linear;
}
@keyframes move {
  0% {
    margin-left: 0;
  }
  100% {
    margin-left: 200px;
  }
}

效果如下:

CSS3 animation ? steps 函数详解 

可以看到红方块是经过 2s 匀速运动到终点,然后回到起始位置

接下来是 steps(1, start) 的例子:

div {
  width: 100px;
  height: 100px;
  background-color: red;
  animation: move 2s step-start;
}

效果如下:

CSS3 animation ? steps 函数详解 

可以看到在我点击刷新的一瞬间方块就到达了终点,然后经过 2s 后回到起始位置

再来看看 steps(1, end) 的例子:

div {
  width: 100px;
  height: 100px;
  background-color: red;
  animation: move 2s step-end;
}

效果如下:

CSS3 animation ? steps 函数详解 

可以看到当点击刷新时方块并没有运动,这是因为方块会在 2s 后瞬间移动到 200px 的位置,然后动画结束,回到起始位置,由于这个过程特别快,肉眼是看不到的,所以看上去就好像方块没有运动。如果想要停留在终点只需要给 div 加上 animation-fill-mode: forwards 即可。

我们再来看看分成多段的情况,首先 start 分成多段:

div {
  width: 100px;
  height: 100px;
  background-color: red;
  animation: move 4s steps(4, start);
}

效果如下:

CSS3 animation ? steps 函数详解 

上述例子我们将 4s 动画分成 4 个周期,方块会在每个周期起始点也就是 0s ,1s ,2s ,3s 处发生位移,从上述效果图我们也可以看出,在我点击刷新瞬间就完成了一次状态变化,然后在 3s 后达到终点,在终点待了 1s 到动画结束,回到起始位置。

再来看 end 分成多段的情况:

div {
  width: 100px;
  height: 100px;
  background-color: red;
  animation: move 4s steps(4, end);
}

效果如下:

CSS3 animation ? steps 函数详解 

指定 end 会使动画状态在每个周期的结束点发生变化,对应例子就是在 1s ,2s ,3s ,4s 处发生变化。从上述效果图我们也可以看出方块在我点击刷新的 1s 后开始运动,在 4s 方块移动到终点的瞬间由于动画结束的原因又移动到起始位置,所以会产生方块好像没有移动到终点的错觉。

总结

以上所述是小编给大家介绍的CSS3 animation – steps 函数详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

HTML / CSS 相关文章推荐
灵活运用CSS3特性绘制简易版围棋效果
Sep 28 HTML / CSS
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
Apr 16 HTML / CSS
利用SVG和CSS3来实现一个炫酷的边框动画
Jul 22 HTML / CSS
使用CSS3 制作一个material-design 风格登录界面实例
Dec 12 HTML / CSS
Grid 宫格常用布局的实现
Jan 10 HTML / CSS
Css3实现无缝滚动防抖
Sep 14 HTML / CSS
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
Apr 08 HTML / CSS
用HTML5实现鼠标滚轮事件放大缩小图片的功能
Jun 25 HTML / CSS
phonegap常用事件总结(必看篇)
Mar 31 HTML / CSS
微信端html5页面调用分享接口示例
Mar 14 HTML / CSS
详解Html5页面实现下载文件(apk、txt等)的三种方式
Oct 22 HTML / CSS
AmazeUI 按钮交互的实现示例
Aug 24 HTML / CSS
移动端适配 使px自动转换rem
Aug 26 #HTML / CSS
CSS3 毛玻璃效果
Aug 14 #HTML / CSS
详解css position 5种不同的值的用法
Jul 30 #HTML / CSS
CSS Houdini实现动态波浪纹效果
Jul 30 #HTML / CSS
使用css实现android系统的loading加载动画
Jul 25 #HTML / CSS
使用CSS3实现input多选框自定义样式的方法示例
Jul 19 #HTML / CSS
详解css3中 text-fill-color属性
Jul 08 #HTML / CSS
You might like
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
PyMongo安装使用笔记
2015/04/27 Python
Ubuntu安装Jupyter Notebook教程
2017/10/18 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
python+numpy+matplotalib实现梯度下降法
2018/08/31 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
计算机专业自我鉴定
2013/10/15 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
2015年医院科室工作总结范文
2015/05/26 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
浅析Python OpenCV三种滤镜效果
2022/04/11 Python