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强大的动画效果animate使用说明及浏览器兼容介绍
Jan 09 HTML / CSS
用CSS3写的模仿iPhone中的返回按钮
Apr 04 HTML / CSS
浅析css3中matrix函数的使用
Jun 06 HTML / CSS
CSS3实现内凹圆角的实例代码
May 04 HTML / CSS
纯CSS3实现的井字棋游戏
Nov 25 HTML / CSS
HTML5几个设计和修改的页面范例分享
Sep 29 HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
Mar 20 HTML / CSS
详解WebSocket跨域问题解决
Aug 06 HTML / CSS
使用canvas来完成线性渐变和径向渐变的功能的方法示例
Jul 25 HTML / CSS
h5页面唤起app如果没安装就跳转下载(iOS和Android)
Jun 03 HTML / CSS
CSS3点击按钮圆形进度打钩效果的实现代码
Mar 30 HTML / CSS
Html5调用企业微信的实现
Apr 16 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 日期加减的类,很不错
2009/10/10 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
javascript Xml增删改查(IE下)操作实现代码
2009/01/30 Javascript
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
2013/08/02 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
2014/12/29 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
2017/02/05 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
Python 数据结构之队列的实现
2017/01/22 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
python函数定义和调用过程详解
2020/02/09 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
请解释virtual关键字的含义
2015/06/17 面试题
linux面试题参考答案(9)
2015/01/07 面试题
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
公司出纳岗位职责
2013/12/07 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
2015教师节通讯稿
2015/07/20 职场文书
《坐井观天》教学反思
2016/02/18 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android