您真的需要jQuery吗? 有时-特别是如果您想使用jQuery 1.x支持IE6 / 7/8。 但是,现代浏览器API现在提供了我们在jQuery中理所当然的许多功能。 在本文中,我们将研究与CSS相关的方法。
类操作
最常见的jQuery任务之一是将类应用于特定元素:
$("#myelement").addClass("myclass");
我们可以在本地JavaScript中实现相同的目的:
document.getElementById("myelement").className = "myclass";
这不是全部故事:
- jQuery可以将类应用于任意数量的节点。
- jQuery将新类追加到现有的类定义中,但是本机示例将覆盖它们。
在本机JavaScript中, className
属性只是一个字符串。 因此,我们需要一个函数来复制jQuery的工作方式,例如
function addClass(node, class) {
if (!node.length) node = [node];
for (var n = 0, m = node.length; n < m; n++) {
if ((" " + node[n].className + " ").indexOf(" "+class+" ") >= 0) {
node.className += " " + class;
}
}
}
// apply myclass to all nodes
addClass(document.getElementById("myelement"), "myclass");
尽管此代码比jQuery更快更小,但我们正在复制库中已有的内容-毫无意义。
幸运的是,现代浏览器现在提供了一个新的classList属性,该属性实现了DOMTokenList —应用于节点的所有类的类似数组的集合。 可以使用以下属性:
- length —应用的类名称的数量
- item( index ) —特定索引处的类名称
- contains( class ) —如果节点应用了该类,则返回true
- add( class ) —将新类应用于节点
- remove( class ) —从节点移除一个类
- toggle( class ) —删除或添加一个类(如果分别应用或不应用)
我们可以优先于笨拙的className属性使用它:
document.getElementById("myelement").classList.add("myclass");
IE9以外的大多数浏览器都支持classList。 幸运的是,可以使用一些垫片,这些垫片可以有条件地加载到该浏览器中。
样式操纵
jQuery提供了许多应用特定样式的方法,例如
$("#myelement").css({
color: "#c00",
backgroundColor: "#eee",
width: "200px",
height: "100px",
borderColor: "#f00"
});
本机等效项:
var m = document.getElementById("myelement"), c = m.style;
c.color = "#c00";
c.backgroundColor = "#eee";
c.width = "200px";
c.height = "100px";
c.borderColor = "#f00";
使用缓存的选择器进行了10,000次以上的迭代,jQuery代码在6,670毫秒内执行。 本机JavaScript花费了330毫秒-快了20倍。
当然,除非需要以某种方式计算值,否则都不应该使用。 在CSS中定义一类样式,然后将其名称应用于元素,效率更高。
动画
jQuery提供了开箱即用的各种动画效果,包括滑动和淡入淡出。 本机JavaScript可以更快,但是这无关紧要: CSS3动画同时击败了两者 。
我最初对CSS3动画持怀疑态度。 它永远无法提供细粒度的控制(例如,在N帧后停止动画)并侵犯了JavaScript的行为责任。 但是,好处多于缺点:
- CSS3动画由浏览器处理; 它总是比JavaScript执行更快。
- CSS3动画易于使用,所需的代码也少得多。
- CSS3提供了诸如3D转换之类的效果,仅在JavaScript中这是不切实际的,即使并非不可能。
IE9及以下版本不会产生效果,但是它们可以正常降级, IE10应该在几个月内成为主导版本 。
CSS3精灵永远不会消失。 如果您仍在现代浏览器中将jQuery或JavaScript用于DOM动画,则可能是在浪费时间。
也就是说,JavaScript可用于在CSS3动画开始,停止或继续进行下一个迭代时使用相应的animationstart
, animationend
和animationiteration
对CSS3动画做出反应。 有关更多信息,请参阅如何在JavaScript中捕获CSS3动画事件 。
在我的下一篇文章中,我们将通过查看事件,Ajax和实用程序函数来完成本系列。
From: https://www.sitepoint.com/jquery-vs-raw-javascript-2-css3-animation/