CSS3 贝塞尔曲线实现

cubic-bezier 曲线是 css3 动画的一个重要基石。另一个为 steps (ease 等都是 cubic-bezier 的特殊形式),css3 中的 cubic_bezier 曲线限制了首尾两控制点的位置,通过调整中间两控制点的位置可以灵活得到常用的动画效果,同时 canvas 也进行了相应的支持,也存在相应的工具可以根据想要的曲线得到对应 cubic bezier 曲线的控制点参数。

而 ie(6-9) 却没有相应的支持,为了能在各个平台得到一致的动画效果,则不可避免要在 ie 上通过定时器沿着指定控制点参数的 cubic bezier 曲线来手动更新动画对象的数值.

模拟实现

公式

cubic-bezier 公式不是简单的 y= x 公式,而是引入了第三个变量 t,由于动画中关键在于计算比例,即在总时间的某个时间点百分比得到相应的值相对于最终值的比例,那么只需要得到 0,1 区间的曲线即可。 而 [x,y] -> [0,1] 内的曲线则是通过 t 在 0,1 内连续变化而得到:

其中 P0, P1 ,P2, P3 都为两维 xy 向量

将向量拆开表示即为:

Java代码  

  1. y= (1-t)^3*p0y + 3*(1-t)^2*t*p1y + 3*(1-t)*t^2p2y + t^3p3y
  2. x= (1-t)^3*p0x + 3*(1-t)^2*t*p1x + 3*(1-t)*t^2p2x + t^3p3x

而 css3 所用的 cubic bezier 已经限定死 p0 = (0,0) , p3= (1,1) ,因此公式可简化为

Java代码  

  1. var ax = 3 * p1x - 3 * p2x + 1,
  2. bx = 3 * p2x - 6 * p1x,
  3. cx = 3 * p1x;
  4. var ay = 3 * p1y - 3 * p2y + 1,
  5. by = 3 * p2y - 6 * p1y,
  6. cy = 3 * p1y;
  7. y= ((ay * t + by) * t + cy ) * t
  8. x= ((ax * t + bx) * t + cx ) * t

为了提高效率以及减少计算精度丢失公式进一步经过了 Horner ‘s method 变化。

计算

css3 中某个限定了特定控制参数的 cubic -bezier 曲线如下所示:

动画所做的事情就是把 x 轴当做时间比例,根据曲线得到 y 轴对应的值,并更新到动画对象中去.

即转化为以下问题:如何根据上述公式在已知 x 的情况下如何得到 y.

求 t

首先需要根据公式

Java代码  

  1. var ax = 3 * p1x - 3 * p2x + 1,
  2. bx = 3 * p2x - 6 * p1x,
  3. cx = 3 * p1x;
  4. x= ((ax * t + bx) * t + cx ) * t

在已知 x 的情况下求 t,即经典的多项式求参问题,首先可以通过 newton method 尝试求出 t 的值,若不行(可能性很小)则可通过可靠但慢速的二分法求值.

求 y

上步得到 t 后则可以带入另一个 y 公式求得最终值 y

Java代码  

  1. var ay = 3 * p1y - 3 * p2y + 1,
  2. by = 3 * p2y - 6 * p1y,
  3. cy = 3 * p1y;
  4. y= ((ay * t + by) * t + cy ) * t

上述解法也是源自 webkit webcore c++ 原生实现.

使用对比

在传入动画的 easing 设置时,可以传入 css3 cubic-bezier 的语法格式或者直接传入特定的曲线设置(ease-in ease-out).

Js代码  

  1. $(‘#xx‘).animate({
  2. left:500
  3. },{
  4. duration: 2,
  5. easing: ‘cubic-bezier(1,0.22,0,0.84)‘ // ‘ease-in‘
  6. });

效果对比:

cubic-bezier in kissy

通过对比即可发现,ease-out 和以前 js 实现的简单二次曲线 easeOut 还是有明显的不同,并且 js 实现和 css3 原生几乎效果完全一样(效率可能稍微低了些),更多自带曲线对比可见:

easing for kissy

时间: 2024-10-19 12:45:45

CSS3 贝塞尔曲线实现的相关文章

css3 贝塞尔曲线动画

上面图标初始加载的时候,呈:奇数从左上淡现,偶数车左下呈现. <div> <ul class="trantion" v-for="(item,index) in dataLI" @click="handelIdex(index)"> <li :class="'trantiones'+ (intx == index ? 'actives' : '')">{{item.name}}</li

css3贝塞尔曲线

http://yisibl.github.io/cubic-bezier/#.17,.67,.94,.53 前言 在了解 cubic-bezier 之前,你需要对 CSS3 中的动画效果有所认识,它是 animation-timing-function 和 transition-timing-function 中一个重要的内容. 本体 简介 cubic-bezier 又称三次贝塞尔,主要是为 animation 生成速度曲线的函数,规定是 cubic-bezier(<x1>, <y1&g

cubic-bezier贝塞尔曲线css3动画工具

今天在一本叫<HTML5触摸界面设计与开发>上看到一个做弹跳球的复杂动画效果,首先加速下降,停止,然后弹起时逐渐减速.是用cubic-bezier贝塞尔曲线来完成的.所以特地去学习了一下关于cubic-bezier贝塞尔曲线. cubic-bezier比较少用,因为PC端中,有浏览器不兼容.但是手机端中,可以使用并带来炫酷的动画及体验. 缓动函数:http://www.xuanfengge.com/easeing/easeing/ cubic-bezier:http://cubic-bezie

贝塞尔曲线与CSS3动画、SVG和canvas的应用

简介 贝塞尔曲线是可以做出很多复杂的效果来的,比如弹跳球的复杂动画效果,首先加速下降,停止,然后弹起时逐渐减速的效果. 使用贝塞尔曲线常用的两个网址如下: 缓动函数:http://www.xuanfengge.com/easeing/easeing/ cubic-bezier:http://cubic-bezier.com/ 如何用贝塞尔曲线画曲线 一个标准的3次贝塞尔曲线需要4个点:起始点.终止点(也称锚点)以及两个相互分离的中间点. 无论SVG, Canvas还是CSS3动画,都牵扯到这4个

css3动画——常用的贝塞尔曲线

最近在做css3动画的时候感觉默认的几种动画缓动效果已经不足够满足要求了,所以想起整理一下贝塞尔常用的一些曲线,用于以后使用 曲线参考:http://cubic-bezier.com/,http://easings.net/zh-cn# 常用的贝塞尔曲线如下: ps:并不是所有的缓动函数都有贝塞尔曲线,jquer 的easing的大部分是有的,但是变化比较剧烈的几种就没有了 $easeInSine: cubic-bezier(0.47, 0, 0.745, 0.715); $easeOutSin

JS模拟CSS3动画-贝塞尔曲线

一.什么是贝塞尔曲线 1962年,法国工程师皮埃尔·贝塞尔(Pierre Bézier),贝塞尔曲线来为为解决汽车的主体的设计问题而发明了贝塞尔曲线.如今,贝赛尔曲线是计算机图形学中相当重要的一种曲线,它能过优雅地模拟人手绘画出的线.它通过控制曲线上的点(起始点.终止点以及多个参考点)来创造.编辑图形.其中起重要作用的是位于曲线中央的控制线.这条线是虚拟的,中间与贝塞尔曲线交叉,两端是控制端点.移动两端的端点时贝塞尔曲线改变曲线的曲率(弯曲的程度):移动中间点(也就是移动虚拟的控制线)时,贝塞尔

CSS3动画常用贝塞尔曲线-效果演示

CSS与贝塞尔曲线 CSS3动画常用贝塞尔曲线实现更加自然,物理感的动画. 列举了一些常见的贝塞尔曲线数值,用于做动画的存档. .a1{ animation: stretch 1s cubic-bezier(0.39, 0.575, 0.565, 1) infinite; } .a2{ animation: stretch 1s cubic-bezier(0.55, 0.055, 0.675, 0.19) infinite; } .a3{ animation: stretch 1s cubic-

深度掌握SVG路径path的贝塞尔曲线指令

一.数字.公式.函数.变量,哦,NO! 又又一次说起贝塞尔曲线(英语:Bézier curve,维基百科详尽中文释义戳这里),我最近在尝试实现复杂的矢量图形动画,发现对贝塞尔曲线的理解馒头那么厚,是完全不能承受富有创意的创作的,至少得有我当年追我老婆的脸皮厚才行. 然而,瞅瞅维基百科上的释义,或者其他一些相关的技术文章,总是离不开各种公式,一大堆变量……例如下面维基截图缩略图: 完全是数学爱好者的菜啊!我想,要是让UI设计师们去学习这些东西,估计还不如一刀来个痛快的! 这就是爱好领域与能力掌握的

【转~】初识贝塞尔曲线(B&#233;zier curve)

本文图文大多转自http://www.html-js.com/article/1628 QAQ我居然去扒维基,,,看不懂啊,,,我要去补数学,,, 在做变形小鸡的时候用到CSS3 transition-timing-function 属性,其语法如下: transition-timing-function: linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n); 总而言之可以用cubic-bezier(n,n,n,n)的形式