再谈CSS动画 - 说点不知道的(一)贝塞尔曲线
今天重新翻看《CSS 揭秘》“过渡与动画”一章,并把该章代码重新敲了一遍,代码托管在我的Github,在此总结一些心得。
动画的奥秘
在网页中添加动画的目的是让用户有更加优质的用户体验,为了达到目标,我们需要让动画满足两点目标:
- 意料之外
- 情理之中
其中,意料之外是指动画要让用户感到新奇有趣,最好是产生惊喜(这归功于好的设计灵感),而情理之中是指动画要符合用户的直觉,具体来说,就是动画需要符合用户对物理世界物体运动规律的心智模型,这需要Web开发者来实现。
如何做到呢?终于进入正题了,答案是通过以下两点:
- 回弹效果:物体运动不会突然终止,会因为惯性而继续向前运动一段距离;
- 缓动曲线(又名贝塞尔曲线):指定动画在整段时间中以怎样的速率推进;
代码库中的“弹跳动画”Demo说明了如何通过以上两点创建逼真的小球掉落动画。
对于回弹效果是我们在做动画时需要想到的一点,而使用缓动曲线可以让我们很好的实现回弹效果,在CSS中,设定缓动曲线的方式如下:
animation-timing-function: cubic-bezier(.87, .11, 1, .81);
这里讲解一下animation-timing-function属性,用来指定动画的运动速率,有一下几个值:ease(default),ease-in,ease-out,ease-in-out和上面提到的自定义函数。
你一定还是不明白缓动曲线是什么,别急,看下面这张图:

这基本上是animation-timing-function: ease的贝塞尔曲线图,它的横坐标为时间,纵坐标是进程,从图中我们可以得出这样的结论:“如果动画整个持续时间为2秒,那么在动画开始1秒(一半时间)时,整个动画已经完成了80%”。
停下,闭上眼,深呼吸,想想看在这种曲线下我们的动画会经历怎样的过程,答案是它一开始会非常快,然后逐渐慢下来。
有点感觉了吗?(如果没有的话请多对照着上图图,脑子里想象小球掉落的画面。)
看到这里,我已经默认你已经明白设置缓动曲线对于做出逼真动画的意义了,那么接下来的问题便是如何做到,毕竟cubic-bezier函数看起来一点都不好设置。
放轻松,拿上我给你的这个轮子,在贝塞尔函数的海洋中兴风作浪吧:cubic-bezier。
再多说几句:贝塞尔曲线
如果你像我一样不满足上面的内容,那就跟我一起讨论一下cubic-beizer这个函数里的四个值分别是什么?我们回到刚才那张图:

注意,我为这张图添加了坐标单位,无论横轴还是纵轴,原点的值都是0,而终点的坐标值都是1,顺便一提,这个贝塞尔曲线转换为CSS属性为:
transition-timing-function: cubic-bezier(.21, .07, .41, 1)
发现了吗,前两个参数值分别是起始锚点的横,纵坐标,后两个参数分别是终止锚点的横,纵坐标。什么?你问我锚点是什么,这个就说来话长了,而且我认为没有什么说明的意义,反正你知道了还是要用我给你的工具生成这四个坐标的。
但是,注意,我可以这样设置一个贝塞尔曲线:
transition-timing-function: cubic-bezier(.76, -0.68, .68, 1.56)
这个设置对应的贝塞尔曲线图如下:

看到了吗,贝塞尔曲线的一部分突破了坐标系,我们的函数参数值也出现了负值与大于1的值,这又会发生什么?
答案是动画会在超出坐标系的范围里继续运动相应的量,如果你希望小球最终掉落至300px,那么在曲线超出纵轴的范围内,小球掉落的距离要大于300px(具体取决于偏离纵轴的程度)。
知道这个有什么用呢?答案是知道这个原理可以帮助我们节省一些回弹动画,通过这个原理,我们可以在贝塞尔曲线函数层面上实现简单的“回弹效果”,具体可以参考代码仓库中“弹性过渡”Demo。
再谈CSS动画 - 说点不知道的(一)贝塞尔曲线的更多相关文章
- 过渡与动画 - 缓动效果&基于贝塞尔曲线的调速函数
难题 给过渡和动画加上缓动效果是一种常见的手法(比如具有回弹效果的过渡过程)是一种流行的表现手法,可以让界面显得更加生动和真实:在现实世界中,物体A点到B点往往也是不完全匀速的 以纯技术的角度来看,回 ...
- 再谈CAAnimation动画
CAAnimaton动画分为CABasicAnimation & CAKeyframeAnimation CABasicAnimation动画, 顾名思义就是最基本的动画, 老规矩先上代码: ...
- css3动画贝塞尔曲线cubic-bezier,css3动画的五种情况
当大家开始做css3动画的时候,了解贝塞尔曲线就成了不可或缺的.“贝赛尔曲线”是由法国数学家Pierre Bézier所发明,由此为计算机矢量图形学奠定了基础.它的主要意义在于无论是直线或曲线都能在数 ...
- 你所不知道的 CSS 动画技巧与细节
怕标题起的有点大,下述技巧如果你已经掌握了看看就好,欢迎斧正,本文希望通过介绍一些 CSS 不太常用的技巧,辅以一些实践,让读者可以更加深入的理解掌握 CSS 动画. 废话少说,直接进入正题,本文提到 ...
- mui初级入门教程(四)— 再谈webview,从小白变“大神”!
文章来源:小青年原创发布时间:2016-06-05关键词:mui,html5+,webview转载需标注本文原始地址: http://zhaomenghuan.github.io/#!/blog/20 ...
- 运动曲线提升CSS动画效果
原文链接 译文\译者鞠大宝 先有UI动画,然后才会有好的UI动画.好的动画会让人惊叹“哇哦!”——因为页面看上去很流畅.很漂亮,最重要的是,自然,一点都不会让人觉得不和谐或者僵硬死板.如果你经常逛Dr ...
- 谈谈一些有趣的CSS题目(十四)-- 纯 CSS 方式实现 CSS 动画的暂停与播放!
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- 没那么难,谈CSS的设计模式
没那么难,谈CSS的设计模式 来源: 灵感的小窝 发布时间: 2016-09-09 16:46 阅读: 8949 次 推荐: 27 原文链接 [收藏] 什么是设计模式? 曾有人调侃, ...
- 纯 CSS 方式实现 CSS 动画的暂停与播放!
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
随机推荐
- hibernate的日期映射
2. 映射 Java 的时间, 日期类型 1). 两个基础知识: I. 在 Java 中, 代表时间和日期的类型包括: java.util.Date 和 java.util.Calendar. 此外, ...
- GROUP_CONCAT 拼接顺序
用 group_concat 拼接后的顺序 group_concat(id order by id) 里面id更新需要更换
- 使用 postMessage + iframe 实现跨域通信
一.postMessage window.postMessage() 方法可以安全地实现跨源通信.通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(44 ...
- c 整数运算
一.无符号加法(形式的模运算,无符号加法等价于计算模2w 的和) 示例:非负数 x 和 y 位数: w(8位机) 范围: 0 <= x,y <= 2w -1 结果:0 <= x+y ...
- Hbase优化方案
1.预分区设计 真正存储数据的是region要维护一个区间段的rowkey startRow~endRowkey ->手动设置预分区 create 'user_p','info','partit ...
- PDO 指南
简介 前面咱已经见过MySQLi了,现在咱一起来看看PDO类.PDO是PHP Data Objects的缩写,它被描述为“在PHP中访问数据库的轻量级,兼容性的接口”.尽管它的名字不咋好听,但PDO是 ...
- 【MFC系列】MFC快速设置控件文本字体、大小、颜色、背景
以静态文本为例,分享一下怎么修改文本字体.大小.颜色.背景等参数.其他文本.控件等可参照修改. 1.修改字体.大小 这个很简单,首先在Dlg类中声明一个CFont类型的成员变量: 然后在类的初始化函数 ...
- ftp 服务器搭建
一.安装 yum -y install vsftpd //通过yum来安装vsftpd chkconfig vsftpd on //设置为开机启动 vi /etc/vsftpd/vsftpd.conf ...
- Spark 2.2 DataFrame的一些算子操作
Spark Session中的DataFrame类似于一张关系型数据表.在关系型数据库中对单表或进行的查询操作,在DataFrame中都可以通过调用其API接口来实现. 可以参考,Scala提供的Da ...
- python中的编解码小结
在用python27写文件或者上传文件时遇到这样一个问题:.在网上搜了下说加入以下三行代码可以解决: import sys reload(sys) sys.setdefaultencoding('ut ...