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
分享到:
相关推荐
三次贝塞尔曲线(Cubic Bezier)在计算机图形学中是一种强大的工具,特别是在动画和过渡效果中。在CSS3中,它可以用来定义自定义的缓动函数,为元素的动画提供更加平滑、自然的过渡效果。`cubic-bezier-timeout`是一...
animation-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1); /* ease */ ``` 4. `animation-delay`: 定义动画开始前的等待时间。例如,如果希望动画在2秒后开始: ```css animation-delay: 2s; ``` 5. `...
这里的`easeInOut`是一个预定义的缓动函数,可以被`cubic-bezier()`替换以实现定制。通过调整四个参数,可以创造出各种不同的速度感,比如快速开始然后慢速结束,或者慢速开始后快速结束。 在HTML文件`animation的...
弹性过渡,是CSS3中的一种动画技术,利用`cubic-bezier()`函数实现非线性的过渡效果。这种效果模拟了物理世界中的弹性运动,比如弹簧振动,使元素在移动、缩放、旋转等变换时显得更加自然和真实。弹性过渡可以为按钮...
在提供的实例中,`animate` 被用来实现一个元素(`.box01 .fingers`)的持续左右运动,这种效果在网页交互设计中常用于模拟动态效果,如按钮点击反馈、加载指示等。 首先,我们需要理解 `animate` 方法的基本语法:...
**Python实现贝塞尔曲线画法** 贝塞尔曲线是一种在计算机图形学中广泛使用的参数曲线,它具有平滑、连续的性质,常用于动画、游戏开发、CAD设计等领域。Python作为一种强大的编程语言,提供了多种方式来实现贝塞尔...
`animation-timing-function`用于控制动画的速度曲线,这里使用了`cubic-bezier()`函数来定制一个非线性的时间函数,以模拟弹簧的回弹效果。通过调整四个参数,我们可以得到更真实的弹簧感觉。 此外,我们还可以...
特别要注意的是,`cubic-bezier()`函数用于自定义速度曲线,参数代表四个控制点的x坐标值,它们定义了动画的速度变化。在上面的例子中,`(0.25, 0.46, 0.45, 0.94)`是一组常见的缓入缓出曲线,模拟弹簧的弹跳效果。 ...
`cubic-bezier`函数定义了一个非线性的速度曲线,使得动画在开始和结束时缓慢,中间加速,模拟出更自然的抖动效果。 在实际应用中,还可以结合JavaScript进行扩展,比如添加点击图片后放大显示的功能。这通常通过...
这种效果可以通过调整时间函数来实现,比如使用`cubic-bezier`函数来定制非线性的时间曲线,或者利用`requestAnimationFrame`来控制每一帧的变化。 在JS中,我们可以通过改变元素的CSS属性(如`transform`或`...
`cubic-bezier(.36,.07,.19,.97)`是缓动函数,用于控制动画的速度曲线,使其看起来更自然。 在实际项目中,你可以根据需求调整动画的持续时间(`0.82s`)、缓动函数和关键帧的具体数值,以达到理想的效果。 综上所...
贝塞尔(Bezier)曲线是一种在计算机图形学中广泛使用...通过运行`bezier2.m`和`bezier3.m`,用户可以在MATLAB环境中输入控制点,生成相应的Bezier曲线图像,这在图形设计、模拟和动画制作等场景下具有很高的实用价值。
弹性跳动的效果可能通过`animation-timing-function`属性实现,比如设置为`cubic-bezier()`来模拟物理世界的弹性运动。 此外,压缩包中的"使用须知.txt"文件很可能是提供了关于如何运行和修改这些源代码的指南。...
在`touchend`事件后,我们可以根据这些数据计算出一个减速曲线,通常可以使用缓动函数(如ease-out或cubic-bezier)来模拟物体在失去外力后的自然减速过程。然后,通过改变CSS的transform属性,如translateX或...
在CSS中,我们可以使用`cubic-bezier()`函数定义非线性的时间曲线,模拟物体落地后的反弹行为。这需要对贝塞尔曲线有一定的理解,以精确控制动画的速度变化。此外,像GreenSock Animation Platform (GSAP)这样的专业...
6. **CSS3弹性动效(Cubic Bezier Curves)**:为了使动画更加自然,可能还会使用自定义的缓动函数,比如使用`cubic-bezier()`来定义烟雾升起的速度曲线,使其看起来更加流畅和真实。 7. **CSS3 层叠上下文...
animation: shake 0.82s cubic-bezier(.36,.07,.19,.97) both; } ``` 这段CSS定义了一个名为“shake”的动画,使元素在X轴上进行往复移动,模拟抖动效果。然后在JavaScript中,我们可以根据输入框的字数状态,动态...
- 牛顿的碰撞定律在这里可能通过CSS3的弹性动效(`animation-timing-function: cubic-bezier()`)来模拟,调整参数可以控制小球碰撞时的弹性,使动画更加逼真。 5. **事件监听与JavaScript交互**: - 虽然标签为...
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. **弹跳效果**:标题在鼠标滑过时产生弹跳动画,这需要巧妙运用`animation`和`cubic-bezier`函数定制非线性运动曲线,模拟真实物理世界的弹性效果。 以上每种特效都需要熟练掌握CSS3的关键属性,如`transition`、...