再谈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 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
随机推荐
- Maven 构建Spring-Boot工程报错
Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.5.6.RELEASE:repackage ...
- Python--Get and Post
#python3 get and post 简单封装 from urllib import request, parse import json def RequestMethod(methodR, ...
- Piwik网站访问统计软件安装
Piwik是一个PHP和MySQL的开放源代码的Web统计软件. 它给你一些关于你的网站的实用统计报告,比如网页浏览人数, 访问最多的页面, 搜索引擎关键词等等… Piwik拥有众多不同功能的插件,你 ...
- PHP使用 DOMDocument创建和解析xml文件
<!-- DOMDocument生成XML文件 --><?php//声明一个DOMDocument对象$_doc=new DOMDocument('1.0', 'utf-8'); / ...
- Python代码样例列表
扫描左上角二维码,关注公众账号 数字货币量化投资,回复“1279”,获取以下600个Python经典例子源码 ├─algorithm│ Python用户推荐系统曼哈顿算法实现.py│ ...
- 前端开发 - JavaScript - 总结
一.JavaScript的特征 javaScript是一种web前端的描述语言,也是一种基于对象(object)和事件驱动(Event Driven)的.安全性好的脚本语言.它运行在客户端从而减轻服务 ...
- 不得不知的Excel技巧
1.超链接 选中一个格右击选择超链接. 2.求和 选择一个格点击开始中的求和按钮并拖动求和区域. 3.冻结 冻结一行,选择一行区域,选择开始菜单中的冻结窗格. 冻结上面的行和左边的行,选择夹角的格并点 ...
- js 获取Array数组 最大值 最小值
https://stackoverflow.com/questions/1669190/find-the-min-max-element-of-an-array-in-javascript // 错误 ...
- pandas_datareader.data 和 fix_yahoo_finance 获取金融数据
参考:https://zhuanlan.zhihu.com/p/35360694 1.获取数据 #定义所需要的数据 gafataDict={"谷歌":"GOOG" ...
- Flask之flask-script
简介 Flask-Scropt插件为在Flask里编写额外的脚本提供了支持.这包括运行一个开发服务器,一个定制的Python命令行,用于执行初始化数据库.定时任务和其他属于web应用之外的命令行任务的 ...