再谈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 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
随机推荐
- Struts2中获取Web元素request、session、application对象的四种方式
我们在学习web编程的时候,一般都是通过requet.session.application(servletcontext)进行一系列相关的操作,request.session.和applicatio ...
- HDFS基本操作的API
一.从hdfs下载文件到windows本地: package com.css.hdfs01; import java.io.IOException; import java.net.URI; impo ...
- 【tensorflow】
运行计算图 session.run() https://blog.csdn.net/sinat_39372048/article/details/80868168 赋值 tf.assign() tf. ...
- Spring-BeanFactory容器
Spring的BeanFactory容器 这是Spring中最简单地容器,它主要的功能是为依赖注入(DI)提供支持.这个容器接口在org.springframework.beans.factory.B ...
- oracle入门(5)——java连接oracle数据库
[本文介绍] 前面几篇说了那么多,最终还没讲到如何用java连接数据库,本文实用一点,讲讲如何连接数据库. [java连接oracle数据库] 1.导入jdbc驱动:看到这里,就忙着上网找驱动?不,安 ...
- 005-Shell echo命令
一.概述 Shell 的 echo 指令,用于字符串的输出.命令格式: echo string 可以使用echo实现更复杂的输出格式控制. 1.显示普通字符串: echo "It is a ...
- Oracle优化-SQL_TRACE
思维导图 Oracle优化10-SQL_TRACE解读 Oracle优化11-10046事件 概述 当我们想了解一条SQL或者是PL/SQL包的运行情况时,特别是当他们的性能非常差时,比如有的时候看起 ...
- Numpy包简单介绍
详细介绍可以看Numpy帮助,也有很多资料,此文仅是一个简述性质的集成文章 1.简介 Numpy是Python的一个扩展包,语法和Matlab有很多相似之处.它支持高维数组和矩阵运算,也提供了许多数组 ...
- centos7 vim显示行号
CentOS7下可能有n个账户,让vim显示行号有两种方法:仅让当前用户显示行号和让所有用户显示行号 一.仅让当前用户显示行号 输入命令:vim ~/.vimrc 写入:set nu 保存:wq ...
- 查看电脑已经连过的wifi密码
用下面两条命令可以完成 查看当前系统已经保存的网络 netsh wlan show profiles 查看wifi指定密码 netsh wlan show profiles name="wi ...