操作 CSS 类名是前端开发里频率相当高的一个动作。点击按钮切换样式、表单验证后高亮输入框、导航菜单选中状态切换,这些效果背后都在做同一件事:给 DOM 元素添加或移除 class。jQuery 把这个操作封装得非常简洁,addClass() 就是其中之一。
我自己刚学 jQuery 的时候,习惯直接用 $el.attr('class', '新类名') 来改样式,结果把元素上原有的 class 全给覆盖掉了,页面样式瞬间崩坏。后来才养成用 addClass() 和 removeClass() 的习惯——它们只操作你指定的类名,不影响其他已有的 class。
addClass() 的核心用途
addClass() 方法只做一件事:给选中元素添加一个或多个类名,不删除原有类名。
这个方法直接操作元素的 class 属性,但它不会覆盖已有的 class 值,而是在现有基础上追加。如果添加的类名已经存在于元素上,不会重复添加,jQuery 内部做了去重处理。
支持一次性添加多个类名,用空格分隔即可:
$("p").addClass("highlight active");
这样会给 <p> 元素同时加上 highlight 和 active 两个 class。
两种语法形式
1. 直接添加类名
$(selector).addClass(classname)
classname 是必填参数,指定要添加的一个或多个类名,多个类名之间用空格隔开。
2. 用回调函数动态返回类名
$(selector).addClass(function(index, currentClass) {
return classname;
})
回调函数接收两个参数:
-
index:当前元素在 jQuery 中的索引位置,从 0 开始 -
currentClass:当前元素已有的 class 属性值(字符串)
函数 return 的值会作为要添加的类名。这种方式适合需要根据元素当前状态或位置动态计算类名的场景。
参数说明一览
| 参数 | 说明 |
|---|---|
| classname | 必填,要添加的一个或多个类名,多个用空格分隔 |
| function(index, currentClass) | 可选,返回要添加类名的回调函数 |
| index | 元素在中的索引位置 |
| currentClass | 元素当前的 class 属性值字符串 |
实战示例:给第一个段落添加样式类
一个简单直观的例子,点击按钮后第一个 <p> 标签获得高亮样式:
<h1>页面标题</h1>
<p>这是第一段文字。</p>
<p>这是第二段文字。</p>
<button id="add-style">给第一段添加高亮类名</button>
.highlight {
font-size: 180%;
color: #e63946;
font-weight: bold;
}
$(document).ready(function(){
$("#add-style").click(function(){
$("p:first").addClass("highlight");
});
});
第一次点击后,第一段文字变红变大,再点一次不会有变化——因为 class 已经存在,jQuery 不会重复添加。其他段落不受任何影响,它们原有的 class 也不变。这就是 addClass() 和 attr('class', ...) 的本质区别:追加而非覆盖。
实战示例:用回调函数根据索引添加不同类名
实际项目里有时需要给一组元素添加不同的类名,比如为列表项轮流分配样式。回调函数就派上用场了:
<ul id="item-list">
<li>列表项 A</li>
<li>列表项 B</li>
<li>列表项 C</li>
<li>列表项 D</li>
</ul>
<button id="apply-classes">批量添加类名</button>
.theme-a { background-color: #ffd700; }
.theme-b { background-color: #87ceeb; }
.theme-c { background-color: #90ee90; }
.theme-d { background-color: #dda0dd; }
$(document).ready(function(){
$("#apply-classes").click(function(){
$("#item-list li").addClass(function(index, currentClass){
// 根据索引返回不同类名
return "theme-" + String.fromCharCode(97 + index);
});
});
});
点击按钮后,四个 <li> 分别被加上 theme-a、theme-b、theme-c、theme-d,每条显示不同背景色。currentClass 参数虽然这里没用到,但在需要读取元素已有的 class 做判断的场景里很有用,比如“如果已有某类名就加 A,否则加 B”。
为什么不用 attr() 操作 class
有些初学者会这样写来添加类名:
$("p").attr("class", "highlight");
这行代码会把 <p> 上原有的所有 class 全部抹掉,替换成 highlight。如果元素之前有 intro、content 等类名,统统消失,关联的样式也会丢失。
正确的做法是:
-
添加类名用
addClass() -
移除类名用
removeClass() -
切换类名用
toggleClass()
它们都是针对 class 属性做精细化的增量操作,不会破坏现有样式体系。
多个类名的添加规范
写多个类名时直接空格隔开,写法很直觉:
$("div").addClass("card shadow rounded");
这样 div 会同时拥有三个类名。注意不要写成逗号分隔,逗号在 JavaScript 里是语法错误。也不要习惯性在前面加 .,因为 addClass() 的参数就是纯类名,不是 CSS 选择器。
本节课程知识要点:给元素添加类名前,先确认你是在“追加”还是在“切换”。如果只是临时高亮或状态标记,用 addClass() 和 removeClass() 配对使用;如果是开关式效果,直接用 toggleClass() 更省代码。不要用 attr('class', ...) 去追加类名,那是在替换整个 class 属性。
个人经验:关于类名管理和性能
在大型项目里,CSS 类名往往承载了样式和状态双重含义。我自己的习惯是,样式类名由 CSS 模块负责,行为类名(如 is-active、is-valid、has-error)由 JavaScript 通过 addClass() 来管理。两者命名上用前缀区分,代码清晰,维护起来也方便。
频繁调用 addClass() 做动画或高频交互时,虽然不是性能瓶颈,但如果一个操作要同时加多个类名,尽量合并到一次调用里:
// 推荐:一次调用加三个类名
$el.addClass("fade-in show animated");
// 不推荐:三次分开调用
$el.addClass("fade-in");
$el.addClass("show");
$el.addClass("animated");
合并调用可以减少 DOM 读写次数,也避免触发多次样式重计算。虽然浏览器有一定优化,但养成这个习惯对代码整洁度有好处。