如何使用JavaScript控制CSS Animations和Transitions

Zach邮件跟我说上Stack Overflow这类的论坛,他經常碰到一些关于JavaScript控制CSS 动画的问题又提供给我几个例子。我很早就打算写一些关于这方面的文章所以很高兴让Zach提出来并促使我写了这個教程。

有时候Web开发人员认为CSS的动画比JavaScript的动画更难理解虽然CSS动画有其局限性,但它的性能比大多数JavaScript库更加高效因为它可以借助硬件加速啊!其效果绝对可以超出我们的预期。

CSS 和再加上点JavaScript就可以实现硬件加速动画而且其交互效果比大多数JavaScript库更高效。
So,让我们快点开始吧!尛伙伴们都等不及了!

被应用于元素指定的属性变化时该属性经过一段时间逐渐的过渡到最终需要的值;而只是在应用时执行之前定义恏的操作,它提供更细粒度的控制

在这篇文章中,我们将分别针对上述内容进行讲解

在编程论坛中,关于transition(过渡)的触发和暂停有无数的疑问使用JavaScript可以很容易的解决这些疑问。

触发元素的transiton(过渡)切换元素的类名可以触发该元素的transition(过渡)

暂停元素的transition(过渡), 在你想要暂停过渡点用和getPropertyValue获取该元素相应的CSS属性值,然后设置该元素的对应的CSS属性等于你刚才获取到的CSS属性值

以下是该方法的一个例子。

同样的技术可以鼡在更高级的方法上下面的例子也是通过改变类名来触发元素的transition(过渡),但这次可以跟踪当前的缩放率

注意我们这次改变的是的值。有許多不同的CSS属性可以应用到过渡和动画中。关于CSS transitions(过渡)Rodney Rehm也写了一篇非常不错的文章,

使用CSS“回调函数”

一些最有用但鲜为人知JavaScript技巧,僦是利用监听Dom事件控制CSS

目前使用这些事件还需要添加浏览器前缀所以在这个演示中,我们使用由Craig Buckler开发的叫PrefixedEvent的方法该方法的参数有element(元素),type(类型)和callback(回调)来实现跨浏览器的兼容这里是他的。这里是关于通过判断动画名称来判断触发哪个事件

这个演示想实现当鼠标悬浮时停圵动画,并放大心型图案

纯CSS版本在鼠标悬停时会跳一下,除非你在恰当的时机鼠标移上去不然它会在扩大到最终悬停状态之前先跳到┅个特定状态。JavaScript版本就非常流畅它在应用新的放大状态之前先让动画完成,这样鼠标悬停时就不会跳动

当你想在动画执行过程中暂停,并且接下来让动画接着执行这时CSS的属性是非常有用的。你可以可以通过JavaScript像这样更改CSS(注意你的前缀):

然而当使用animation-play-state让CSS 动画暂停时动画中嘚元素变形也会以相同的方式被阻止。你不能使这种变形暂停在某个状态使它变形,使它恢复更不用期望它能从新的变形状态中恢复箌流畅运行。为了实现这些控制我们需要做一些更复杂的工作。

不幸的是在这个阶段没有办法获得当前CSS动画关键帧的“完成百分比”。最好的获取近似值的方法是使用setInterval 函数在动画过程中迭代100次它的本质是:动画持续的时间(单位是毫秒)/100。例如如果动画时长4秒,则得到嘚setInterval的执行时间是每40ms(4000 / 100)

这种做法很不理想,因为函数实际运行频率要远少于每40ms我发现将它设为39ms更准确。但这个也不是好实现因为它依赖於浏览器,并非所有浏览器下都能得到很完美效果

获取当前动画的CSS属性值

在理想的情况下,我们选择一个使用CSS动画的元素删除该元素當前动画再给它添加个新的动画,让它可以从当前状态开始新的动画但是现实情况却很复杂。

下面我们就有一个演示用来测试获取和妀变CSS动画”中间流”的技术。该动画让一个元素沿一个圆形路径移动起始位置在圆形的顶部中心(或称为“十二点”)位置。当按钮被单击時元素的起始位置变成元素当前移动到的位置。元素会沿着之前相同的路径继续移动只是现在“起始”的位置变成了你按下按钮时元素移动到的位置。通过在动画的第一关键帧把元素的颜色变成红色来表示元素动画起始点位置发生了改变。

我们需要很深入才能完成!峩们要进入的样式表本身找到原有动画

你可以用document.styleSheets来获取与页面关联的样式表的集合,然后通过for循环取得具体的样式表以下是如何使用JavaScript來找到一个特定动画值的CSSKeyFrameRules对象:

这里keys是一个包含所有动画关键帧数值的数组。

改变实际的动画(终于!)

在循环动画演示过程中我们需偠两个变量:一个用来跟踪从最近的起始位置开始移动了多少度,另一个用来跟踪从原来的起始位置开始移动了多少度我们可以使用setInterval函數(在环形移动度数时消耗的时间)改变第一个变量。然后我们可以使用下面的代码当单击该按钮时更新第二个变量。

然后我们可以使用以丅函数在之前我们获得的关键帧数组里,找出与当前总百分比值最接近的关键帧值

要获得新动画第一关键帧的位置值,我们可以使用JavaScript嘚方法然后我们根据这个值,删除原来的关键帧定义重新定义该关键帧。

接下来我们需要把圆的度数值转换成相应的百分比值。我們可以通过第一关键帧的位置值与3.6简单的相乘得到(因为100 * 3.6 = 360)

最后,我们基于上面获得变量创建新的规则每个规则之间有45度的差值,是因为峩们在绕圈过程中拥有八个不同的关键帧360(一个圆的度数)除以845

然后我们通过setInterval重置当前百分比值来使它可以再次运行注意上面使用的昰WebKit前缀,为了使它兼容更多的浏览器我们需要做一些UA的嗅探来确定采用哪个前缀:

如果你想进一步研究,可以访问Russell Uresti在和

正如我们所看箌的,使用JavaScript可以很方便的操作CSS transitions(过渡)如果使用CSS animations(动画)最终没能得到想要的结果,你可以试着把它变成CSS transitions(过渡)来实现从CSS代码来看他们大约有相哃的代码量,但使用transiton可以更容易地设置和编辑

关于我们的旋转演示,有一个小技巧就是用x来分别乘以transition-durationrotation(译者:分别包括X轴和Y轴的旋转值)然后你需要使用样式类来触发这个动画,因为如果你在元素上直接改变这些属性将不会有过渡效果。你需要给元素添加类名来触发过渡(模拟动画)

在我们的例子中,我们在页面加载时实现:

但是这个过程可能有些混乱尤其对于那些刚刚开始使用CSS animations(动画)的。

想获取更多CSS矩陣的信息请(虽然帮助不太大),可以让你操作矩阵的值或关于这个。

实现这个技巧的方法可以从找到

在开始编码前,就思考和规劃过渡或动画如何执行应该是减少你的问题和达到你想要的效果的最佳途径。好过你在遇到问题时google搜索解决方案!虽然在这篇文章中总結的技术和技巧不一定是你在项目中创建动画的最佳方案,但值得你尝试着了解一下(师兄我也只能帮到这里了……)

比如这个小例孓仅通过HTML和CSS就解决了问题,你可能开始会想着使用JavaScript去解决

我们想让一个不停旋转的图形当鼠标悬停时反方向旋转。你可能跳过这篇文章講解的内容直接使用animationIteration事件来实现这个动画然而,一个更有效更好的方案是是使用CSS和添加内容元素

技巧是获取旋转图形旋转速度x,当鼠標悬停时让其父元素以2x的速度反方向旋转(在相同的位置)。两个方向的旋转相互作用最终得到想要的反向旋转的效果。

你可能会感兴趣嘚相关东东

  • :用于管理CSS动画的强大小工具
  • 通过使用JavaScript获取样式表可以更改当前CSS animation的值,但操作比较复杂
  • 处理CSS矩阵比较痛苦,尤其对于初学者來说
  • 思考应该做什么和规划如何做,是动画编码的关键
}
本篇文章给大家带来的内容是关於css3动画属性之Transitions属性与Animations属性的功能实现 有一定的参考价值,有需要的朋友可以参考一下希望对你有所帮助。

在CSS3中Transitions功能通过将元素的某個属性从一个属性值在指定的时间内平滑过渡到另一个属性值来实现动画功能。

property:表示对哪个属性进行平滑过渡

duration:表示在多久时间内完荿属性值得平滑过渡。

timing-function:表示通过什么方法进行平滑过渡

指定变换动画特效延迟多久后开始执行。可以用秒单位或毫秒单位指定属性值

(6)使用Transitions功能同时平滑过渡多个属性值

(7)移动、旋转等动画效果

只能指定属性的开始值与终点值,然后再这两个属性值之间实现平滑過渡不能实现更为复杂的动画效果。

与Transitions功能相同都是通过改变元素的属性值来实现动画效果。

区别:Animations功能通过定义多个关键帧以及定義每个关键帧中元素的属性值来实现更为复杂的动画效果

(3)创建关键帧的集合

(4)创建关键帧的代码(类似如下)

40%{ 本关键帧中的样式玳码 }

(40%表示改帧位于整个动画过程中的40%处,开始帧为0%结束帧为100%)

(5)在元素的样式中使用该关键帧的集合

animation-delay:用于指定延迟多少秒或毫秒後开始执行动画。

animation-direction:用于指定动画的执行方向可指定属性值包括:

  • normal:初始值(动画执行完毕后返回初始状态)

  • alternate:交替更换动画的执行方姠

  • reverse:反方向执行动画

  • alternate-reverse:从反方向开始交替更改动画的执行方向

(7)在一行样式代码中定义animation动画时采用如下所示的书写方式

animation:keyframe的名称 动画的執行时长 动画的实现方法 延迟多少秒后开始执行动画 动画的执行次数 动画的执行方向;

(8)实现多个属性值同时改变的动画

只需只在各关鍵帧中同时指定这些属性值就可以了。

在动画开始时与结束时以同样速度进行改变
动画开始时速度很然后速度沿曲线值进行加快
动画開始时速度很,然后速度沿曲线值进行放慢
动画开始时速度很然后速度沿曲线值进行加快,然后再沿曲线值进行放慢
动画开始时速喥很然后速度沿曲线值进行加快,然后再沿曲线值进行放慢

通过在开始帧与结束帧中改变页面的opacity属性的属性值来实现页面的淡入效果

以上就是css3动画属性之Transitions属性与Animations属性的功能实现的详细内容,更多请关注Gxlcms其它相关文章!

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信