DOM元素类名操作

作者 杜梦杰 日期 2017-02-20
DOM元素类名操作

前言

类名操作是前端工程师编码过程中最频繁的操作之一,关于类名的操作基本可以总结为以下四种:

  1. addClass: 为指定的dom元素添加样式
  2. removeClass: 删除指定dom元素的样式
  3. toggleClass: 如果存在(不存在),就删除(添加)一个样式
  4. hasClass: 判断样式是否存在

jQuery

最简单的方式当然是直接引入万能的jQuery。

jQuery中有addClass(),removeClass(),toggleClass(),hasClass()四种方法,而且兼容性非常好。

原生JS

当然并不是所有人都喜欢使用jQuery的,并且在一些场景下引入jQuery并不是很合适。所以下面这种方法就使用原生JS来实现。

//hasClass()
function hasClass(obj, cls) {
return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
}
//addClass()
function addClass(obj, cls) {
if (!this.hasClass(obj, cls)) obj.className += " " + cls;
}
//removeClass()
function removeClass(obj, cls) {
if (hasClass(obj, cls)) {
var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
obj.className = obj.className.replace(reg, ' ');
}
}
//toggleClass()
function toggleClass(obj,cls){
if(hasClass(obj,cls)){
removeClass(obj, cls);
}else{
addClass(obj, cls);
}
}

轻量级脚本

如果你比较懒,不想手写的话,可以引入一个轻量级脚本——classie.js

classie.js是一个非常强大的超级轻量级脚本,它允许您很容易添加、删除、切换,和检查DOM中的类。 classie.js 带给你简单的实用性, 不会让我们的脚本变得臃肿。毕竟它仅仅只有82行代码, 1.872 kb大小。

使用方法

classie.has( element, 'my-class' ) // returns true/false
classie.add( element, 'my-new-class' ) // add new class
classie.remove( element, 'my-unwanted-class' ) // remove class
classie.toggle( element, 'my-class' ) // toggle class

附上Github主页地址。

HTML5 classList

如果你点开classie.js的Github主页会发现该项目已经停止更新了,项目作者推荐大家使用全新的HTML5 API——classList

FireFox浏览器和Chrome浏览器对classList的支持性都很好,至于IE浏览器,从IE10才开始支持。在手机端,需要Android 3+或 iOS Safari 5.1+。

以上四种方法在classList中对应的分别是:add(),remove(),toggle(),contains()

除了这四个,还有:

  • length 属性,表示元素类名的个数,只读;
  • item() 支持一个参数,为类名的索引,返回对应的类名。

最佳方案

如果项目依赖jQuery的话,那就直接使用jQuery的相关方法。在其他情况下呢,推荐大家使用classie.js

首先,非常轻量,仅仅只有82行代码, 1.872 kb大小。

其次,兼容性好,能做到classList做不到的。

最后,性能很好,如果看classie.js的源码会发现它是优先使用classList的。