← jQuery position()方法:获取元素相对父级的定位坐标 jQuery hasClass()方法深度解析与实战 →

jQuery addClass()方法:给元素动态添加类名的正确方式

原创 2026-04-30 jQuery 已有人查阅

操作 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-atheme-btheme-ctheme-d,每条显示不同背景色。currentClass 参数虽然这里没用到,但在需要读取元素已有的 class 做判断的场景里很有用,比如“如果已有某类名就加 A,否则加 B”。

为什么不用 attr() 操作 class

有些初学者会这样写来添加类名:

$("p").attr("class", "highlight");

这行代码会把 <p> 上原有的所有 class 全部抹掉,替换成 highlight。如果元素之前有 introcontent 等类名,统统消失,关联的样式也会丢失。

正确的做法是:

  • 添加类名用 addClass()

  • 移除类名用 removeClass()

  • 切换类名用 toggleClass()

它们都是针对 class 属性做精细化的增量操作,不会破坏现有样式体系。

多个类名的添加规范

写多个类名时直接空格隔开,写法很直觉:

$("div").addClass("card shadow rounded");

这样 div 会同时拥有三个类名。注意不要写成逗号分隔,逗号在 JavaScript 里是语法错误。也不要习惯性在前面加 .,因为 addClass() 的参数就是纯类名,不是 CSS 选择器。

本节课程知识要点:给元素添加类名前,先确认你是在“追加”还是在“切换”。如果只是临时高亮或状态标记,用 addClass() 和 removeClass() 配对使用;如果是开关式效果,直接用 toggleClass() 更省代码。不要用 attr('class', ...) 去追加类名,那是在替换整个 class 属性。

个人经验:关于类名管理和性能

在大型项目里,CSS 类名往往承载了样式和状态双重含义。我自己的习惯是,样式类名由 CSS 模块负责,行为类名(如 is-activeis-validhas-error)由 JavaScript 通过 addClass() 来管理。两者命名上用前缀区分,代码清晰,维护起来也方便。

频繁调用 addClass() 做动画或高频交互时,虽然不是性能瓶颈,但如果一个操作要同时加多个类名,尽量合并到一次调用里:

// 推荐:一次调用加三个类名
$el.addClass("fade-in show animated");

// 不推荐:三次分开调用
$el.addClass("fade-in");
$el.addClass("show");
$el.addClass("animated");

合并调用可以减少 DOM 读写次数,也避免触发多次样式重计算。虽然浏览器有一定优化,但养成这个习惯对代码整洁度有好处。

← jQuery position()方法:获取元素相对父级的定位坐标 jQuery hasClass()方法深度解析与实战 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号