我们从一个有transition的CSS class开始: .has-transition { -webkit-transition: margin-left 1s ease-out; -moz-transition: margin-left 1s ease-out; -o-transition: margin-left 1s ease-out; transition: margin-left 1s ease-out; } 然后进行实现: //我们的元素默认有"has-transition"属性 var $targetElem = $('#targetElemId'); //删除包含transition的class $targetElem.removeClass('has-transition'); // 当包含transition的class已经没了的时候,改变元素属性 $targetElem.css('margin-left', 100); // 再将包含transition的class添加回来 $targetElem.addClass('has-transition'); // 改变元素属性 $targetElem.css('margin-left', 50); 上面的实现没有按照期望的运行。所有的修改都被浏览器缓存了,只在上面这段代码的最后才会执行。我们需要的是一次强制重排,我们可以通过进行以下修改来实现: //删除包含transition的class $(this).removeClass('has-transition'); // 改变元素属性 $(this).css('margin-left', 100); //触发一次强制重排,从而使变化了的class或属性能够立即执行。 $(this)[0].offsetHeight; // offsetHeight仅仅是个例子,其他的属性也可以奏效。 // 再将包含transition的class添加回来 $(this).addClass('has-transition'); // 改变元素属性 $(this).css('margin-left', 50); 现在这段代码如我们所期望的运行了。 实际的优化建议汇总了一些有用的信息,我建议以下几点:
div * {...} // bad .list li {...} // bad .list-item {...} // good #list .list-item {...} // good
想了解更多的细节,可以看一下这些文章: 希望这篇文章能够对你有所帮助! 原文链接: frontendbabel 翻译: 伯乐在线 - Moejser |