`
yiminghe
  • 浏览: 1466278 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

cubic-bezier 模拟实现

 
阅读更多

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 向量

 

将向量拆开表示即为:

 

y= (1-t)^3*p0y + 3*(1-t)^2*t*p1y + 3*(1-t)*t^2p2y + t^3p3y


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) ,因此公式可简化为

 

var ax = 3 * p1x - 3 * p2x + 1,
      bx = 3 * p2x - 6 * p1x,
      cx = 3 * p1x;

var ay = 3 * p1y - 3 * p2y + 1,
      by = 3 * p2y - 6 * p1y,
      cy = 3 * p1y;

y= ((ay * t + by) * t + cy ) * t

x= ((ax * t + bx) * t + cx ) * t
  

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

计算

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

 

 

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

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

求 t

首先需要根据公式

 

var ax = 3 * p1x - 3 * p2x + 1,
      bx = 3 * p2x - 6 * p1x,
      cx = 3 * p1x;

x= ((ax * t + bx) * t + cx ) * t
  

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

求 y

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

 

var ay = 3 * p1y - 3 * p2y + 1,
      by = 3 * p2y - 6 * p1y,
      cy = 3 * p1y;

y= ((ay * t + by) * t + cy ) * t
  

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

使用对比

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

 

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

 

效果对比:

 

cubic-bezier in kissy

 

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

 

easing for kissy

 

 

 

 

 

 

 

  • 大小: 1.8 KB
  • 大小: 12 KB
分享到:
评论
1 楼 chenbinqun 2013-12-02  
    

相关推荐

    cubic-bezier-timeout:使用一系列间隔调用您的回调,例如使用 CSS3 cube-bezier-timeout

    三次贝塞尔曲线(Cubic Bezier)在计算机图形学中是一种强大的工具,特别是在动画和过渡效果中。在CSS3中,它可以用来定义自定义的缓动函数,为元素的动画提供更加平滑、自然的过渡效果。`cubic-bezier-timeout`是一...

    css3弹力球动画animation属性制作3D弹力球弹跳动画效果

    animation-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1); /* ease */ ``` 4. `animation-delay`: 定义动画开始前的等待时间。例如,如果希望动画在2秒后开始: ```css animation-delay: 2s; ``` 5. `...

    css animation贝塞尔曲线运动模拟

    这里的`easeInOut`是一个预定义的缓动函数,可以被`cubic-bezier()`替换以实现定制。通过调整四个参数,可以创造出各种不同的速度感,比如快速开始然后慢速结束,或者慢速开始后快速结束。 在HTML文件`animation的...

    弹出窗口_Elastic Transition

    弹性过渡,是CSS3中的一种动画技术,利用`cubic-bezier()`函数实现非线性的过渡效果。这种效果模拟了物理世界中的弹性运动,比如弹簧振动,使元素在移动、缩放、旋转等变换时显得更加自然和真实。弹性过渡可以为按钮...

    jquery animate动画持续运动的实例

    在提供的实例中,`animate` 被用来实现一个元素(`.box01 .fingers`)的持续左右运动,这种效果在网页交互设计中常用于模拟动态效果,如按钮点击反馈、加载指示等。 首先,我们需要理解 `animate` 方法的基本语法:...

    python实现贝塞尔(Bezier)曲线画法

    **Python实现贝塞尔曲线画法** 贝塞尔曲线是一种在计算机图形学中广泛使用的参数曲线,它具有平滑、连续的性质,常用于动画、游戏开发、CAD设计等领域。Python作为一种强大的编程语言,提供了多种方式来实现贝塞尔...

    纯css3 transform制作弹簧动画特效

    `animation-timing-function`用于控制动画的速度曲线,这里使用了`cubic-bezier()`函数来定制一个非线性的时间函数,以模拟弹簧的回弹效果。通过调整四个参数,我们可以得到更真实的弹簧感觉。 此外,我们还可以...

    CSS3跳动的弹簧网页特效.rar

    特别要注意的是,`cubic-bezier()`函数用于自定义速度曲线,参数代表四个控制点的x坐标值,它们定义了动画的速度变化。在上面的例子中,`(0.25, 0.46, 0.45, 0.94)`是一组常见的缓入缓出曲线,模拟弹簧的弹跳效果。 ...

    支持抖动的HTML图片墙特效.rar

    `cubic-bezier`函数定义了一个非线性的速度曲线,使得动画在开始和结束时缓慢,中间加速,模拟出更自然的抖动效果。 在实际应用中,还可以结合JavaScript进行扩展,比如添加点击图片后放大显示的功能。这通常通过...

    js-实现广告弹窗通知公告带动画效果.zip

    这种效果可以通过调整时间函数来实现,比如使用`cubic-bezier`函数来定制非线性的时间曲线,或者利用`requestAnimationFrame`来控制每一帧的变化。 在JS中,我们可以通过改变元素的CSS属性(如`transform`或`...

    百度鼠标经过图片抖动javascript效果

    `cubic-bezier(.36,.07,.19,.97)`是缓动函数,用于控制动画的速度曲线,使其看起来更自然。 在实际项目中,你可以根据需求调整动画的持续时间(`0.82s`)、缓动函数和关键帧的具体数值,以达到理想的效果。 综上所...

    2次及3次bezier曲线绘制源码

    贝塞尔(Bezier)曲线是一种在计算机图形学中广泛使用...通过运行`bezier2.m`和`bezier3.m`,用户可以在MATLAB环境中输入控制点,生成相应的Bezier曲线图像,这在图形设计、模拟和动画制作等场景下具有很高的实用价值。

    SVG+CSS3实现的弹性跳动动画特效源码.zip

    弹性跳动的效果可能通过`animation-timing-function`属性实现,比如设置为`cubic-bezier()`来模拟物理世界的弹性运动。 此外,压缩包中的"使用须知.txt"文件很可能是提供了关于如何运行和修改这些源代码的指南。...

    移动设备上任意元素在屏幕内惯性弹动

    在`touchend`事件后,我们可以根据这些数据计算出一个减速曲线,通常可以使用缓动函数(如ease-out或cubic-bezier)来模拟物体在失去外力后的自然减速过程。然后,通过改变CSS的transform属性,如translateX或...

    下落切换幻灯片

    在CSS中,我们可以使用`cubic-bezier()`函数定义非线性的时间曲线,模拟物体落地后的反弹行为。这需要对贝塞尔曲线有一定的理解,以精确控制动画的速度变化。此外,像GreenSock Animation Platform (GSAP)这样的专业...

    纯CSS3实现烟囱冒烟的圣诞小屋动画效果源码.zip

    6. **CSS3弹性动效(Cubic Bezier Curves)**:为了使动画更加自然,可能还会使用自定义的缓动函数,比如使用`cubic-bezier()`来定义烟雾升起的速度曲线,使其看起来更加流畅和真实。 7. **CSS3 层叠上下文...

    html5实现输入框字数限制提示抖动效果.zip

    animation: shake 0.82s cubic-bezier(.36,.07,.19,.97) both; } ``` 这段CSS定义了一个名为“shake”的动画,使元素在X轴上进行往复移动,模拟抖动效果。然后在JavaScript中,我们可以根据输入框的字数状态,动态...

    css3牛顿摇摆球碰撞动画特效

    - 牛顿的碰撞定律在这里可能通过CSS3的弹性动效(`animation-timing-function: cubic-bezier()`)来模拟,调整参数可以控制小球碰撞时的弹性,使动画更加逼真。 5. **事件监听与JavaScript交互**: - 虽然标签为...

    jquery+css3实现图标震动效果

    animation: shake 0.82s cubic-bezier(.36,.07,.19,.97) both; } @keyframes shake { 10%, 90% { transform: translate3d(-1px, 0, 0); } 20%, 80% { transform: translate3d(2px, 0, 0); } 30%, 50%, 70% ...

    8种炫酷CSS3鼠标滑过图片标题动画特效

    8. **弹跳效果**:标题在鼠标滑过时产生弹跳动画,这需要巧妙运用`animation`和`cubic-bezier`函数定制非线性运动曲线,模拟真实物理世界的弹性效果。 以上每种特效都需要熟练掌握CSS3的关键属性,如`transition`、...

Global site tag (gtag.js) - Google Analytics