关于.animate()函数与css3中transition合用失效问题

在写自己项目的时候遇到了这样的一个效果,左侧菜单按钮点击弹出菜单的同时,菜单按钮变成 × 状。(参考关键字:汉堡按钮 http://www.htmleaf.com/Demo/201506232094.html

大概就是下面gif中的动画效果:

大致的动画效果如下

1. 第一条横线(div)rotate -45deg

2. 第二条横线渐进消失

3. 第三条横线 rotate 45deg

像之前链接里面用纯 CSS3 实现的效果,改变元素 :hover 的 CSS 样式表就行。

因为现在是用点击触发动画效果,所以想到了 jQuery 中 .animate() 函数和 CSS3 中 transition 合用的方式。很自然的写法就是下面这种:(测试环境是Chrome浏览器)

1 $("a").on(‘click‘, function(event) {
2   event.preventDefault();
3   $("div:last-child").animate(
4   {
5     ‘transition‘: ‘rotate(45deg)‘
6   }, 1000);
7 });    

然而并没有效果。百度了下,没有比较好的解决方式。

但是大家都普遍表示不要将 .animate() 函数和 CSS3 的 transition 合用。

然后在Stack Overflow上找到了详细的解答,链接贴出来:http://stackoverflow.com/questions/5462275/animate-element-transform-rotate

下面对这个答案进行了整理和汇总。

1. .animate() 和 transition 仍旧合用

首先需要明确的是,animate() 函数不能操作非数字表示的 CSS 属性变化。

CSS 样式使用 DOM 名称(比如 "fontSize")来设置,而非 CSS 名称(比如 "font-size"),同时可以使用 "+=" 或 "-=" 来创建相对动画。

这里还是使用 .animate() 和 transition 合用,然而 rotate(45deg) 并非数字表示的值,而是字符串。所以这里需要使用 .animate() 函数中的step函数部分,先贴代码:

 1 @keyframes rotateR {
 2   from {
 3     -moz-transform: translateY(0px) rotate(0);
 4     -ms-transform: translateY(0px) rotate(0);
 5     -webkit-transform: translateY(0px) rotate(0);
 6     transform: translateY(0px) rotate(0);
 7   }
 8   to {
 9     -moz-transform: translateY(7px) rotate(45deg);
10     -ms-transform: translateY(7px) rotate(45deg);
11     -webkit-transform: translateY(7px) rotate(45deg);
12     transform: translateY(7px) rotate(45deg);
13   }
14 }
1 $("div:last-child").animate({ textIndent: 0}, {
2         step: function(now, fx){
3             $(this).css(‘-webkit-animation‘, ‘rotateL 1s cubic-bezier(0.5, 0.2, 0.2, 1) forwards‘);
4             $(this).css(‘-ms-animation‘, ‘rotateL 1s cubic-bezier(0.5, 0.2, 0.2, 1) forwards‘);
5             $(this).css(‘animation‘, ‘rotateL 1s cubic-bezier(0.5, 0.2, 0.2, 1) forwards‘);
6         },
7         duration: ‘slow‘
8     }, 1000);

这里的 step 函数很好理解,就是每步动画执行完成之后调用的函数。

动画效果就是实质上就是每一段时间(很短)变化画面,这个 step 函数就是每段时间所调用的函数。

使用其中的 step() 函数可以避免指定 CSS 样式的局限,这里作为记录。

附上讲解 .animate() 函数的链接:http://www.css88.com/jqapi-1.9/animate/

2. 不使用 .animate() 函数,采用 .addClass() 函数

之前印象深刻的是,中外网友都普遍表示不要将 .animate() 函数和 CSS3 的 transition 合用。

所以有个答主提出了下面的回答,按照答主的答案,我把代码贴出来:

 1 div:last-child.rotateL-addClass{
 2     -webkit-transition:all 1s ease-in-out;
 3     -moz-transition:all 1s ease-in-out;
 4     -o-transition:all 1s ease-in-out;
 5     -ms-transition:all 1s ease-in-out;
 6     transition:all 1s ease-in-out;
 7     -moz-transform: translateY(-7px) rotate(-45deg);
 8     -ms-transform: translateY(-7px) rotate(-45deg);
 9     -webkit-transform: translateY(-7px) rotate(-45deg);
10     transform: translateY(-7px) rotate(-45deg);
11 }
1 $("div:last-child").removeClass(‘rotateL-addClass‘);

这个答主所强调的一点是,jQuery 所实现的动画效果是以牺牲CPU为代价的。

尤其是当出现大量元素同时执行动画效果的时候,会带来意想不到的结果,相比于这个,浏览器原生支持的 CSS 样式就变得更加优秀。

这里在留个链接,是国外关于这两者执行效率进行测试的情况: http://css3.bradshawenterprises.com/blog/jquery-vs-css3-transitions/

(里面主要提到 CSS 的动画效果无论是在大量元素的基数上还是在颜色变化的效果中,都有更好的效率)

3. 可以使用 jQuery 的插件

没有仔细研究过,留个地址,有兴趣的同学可以看看:https://github.com/puppybits/QTransform

结语

一个右侧菜单栏出现的效果折腾了一下午,自己水平还是有问题。

给自己的网站宣传下:www.witness23.info

建设之中,还希望大家多多指教。⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

时间: 2024-10-10 22:18:57

关于.animate()函数与css3中transition合用失效问题的相关文章

css3中transition和display的坑

不知道大家做css3动画的时候遇到过这种情景没? 用opacity实现淡入淡出的效果.噢!good!一切正常 给个栗子: <!DOCTYPE html> <html> <meta charset="uft-8"> <head> <style> .div1{ background: red; } .div2 { width:100px; height:100px; background:blue; transition:opac

CSS3中transition、transform傻傻分不清楚

css属性很多,无论是字母的拼写还是字面上的意思,很多人都容易混淆,包括我在内,也时不时需要去看看到底是咋回事,是不是也混淆过你- 下面列举几个最容易混淆的属性: http://www.imooc.com/article/details/id/79030 原文地址:https://www.cnblogs.com/aorange/p/12237738.html

css3 中的transition和transform

我以前始终都把他搞反,或者是混淆.现在可以稍微小结下. Transition:CSS3中处理动画的一个样式:只涉及动画起始和终止两个状态.如果涉及到一个动画的各个时间或者状态,那就必须要用到的另外一个样式: Animate. Transition有四个过渡属性: transition-property /*指定动画执行的样式变化*/ transition-duration /*动画需要执行的时间*/ transition-timing-function /*平滑过渡的函数:*/ transiti

CSS3中动画属性transform、transition和animation

Transform:变形 在网页设计中,CSS被习惯性的理解为擅长表现静态样式,动态的元素必须借助于javascript才可以实现,而CSS3的出现改变了这一思维方式.CSS3除了增加革命性的创新功能外,还提供了对动画的支持,可以用来实现旋转.缩放.平移.扭曲和过渡效果等等,这些功能再一次证明了CSS3功能的强大和无限潜能. CSS3实现元素变形的基础来源于新增的transform属性,该属性可用于实现元素的旋转.缩放.平移.扭曲等效果.目前webkit内核支持-webkit-transform

聊聊CSS3中的transition

W3C标准中对CSS3的transition是这样描述的: CSS的transition允许CSS的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击,获得焦点,被点击或对元素任何改变中触发,并圆滑地以动画效果改变CSS的属性值.简洁点说就是当元素从一种样式变换为另一种样式时为元素添加效果. transition主要有***四个属性***,那这四个属性怎么记呢?变换的话总得有变换的属性名吧,知道是要哪个属性变,还得有变换的持续时间吧,持续时间里还得有变换速率吧,是先快后慢呢还是先慢后快呢

css3中的transition渐变过渡属性的认识.

css3新增的属性transition可以让元素产生动画效果: 用法(兼容代码): -webkit-transition:property(属性样式) duration(过渡时间) timing-function过渡模式(5种过渡模式效果) -moz-transition:property(属性样式) duration(过渡时间) timing-function过渡模式(5种过渡模式效果) -o-transition:property(属性样式) duration(过渡时间) timing-fu

CSS3中的动画,animation、transition和transform属性的运用

CSS3中使用animation属性,可以不适用JavaScript而制作动画,运用的好,可以做到很多漂亮的效果,最近有空,来摸索一下animation的使用,做几个demo玩玩 animation属性的介绍 animation属性能够改变元素的位置和各种css属性 animation 属性是一个简写属性,用于设置六个动画属性: animation-name 需要绑定到选择器的keyframe的名称(由@keyframe自定义在下边) animation-duration 规定完成动画花费的时间

CSS3中的transition

W3C标准中对CSS3的transition是这样描述的: CSS的transition允许CSS的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击,获得焦点,被点击或对元素任何改变中触发,并圆滑地以动画效果改变CSS的属性值.简洁点说就是当元素从一种样式变换为另一种样式时为元素添加效果. transition主要有***四个属性***,那这四个属性怎么记呢?变换的话总得有变换的属性名吧,知道是要哪个属性变,还得有变换的持续时间吧,持续时间里还得有变换速率吧,是先快后慢呢还是先慢后快呢

css3中的变形(transform)、过渡(transtion)、动画(animation)

Transform字面上就是变形,改变的意思.在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix.下面我们一起来看看CSS3中transform的旋转rotate.扭曲skew.缩放scale和移动translate具体如何实现,老样子,我们就从transform的语法开始吧.是构成transtion和animation的基础. 语法: transform : none | <transform-func