← jQuery单选框操作全指南:选中、取值、验证与联动 jQuery星级评分组件:点击与悬停两种交互实现 →

jQuery实现“展开更多 / 收起”功能

原创 2026-05-01 jQuery 已有人查阅

在内容较长的页面中,一次性展示全部文本会让页面显得臃肿,也不利于用户快速浏览信息的框架。“展开更多”和“收起”这种交互模式,可以在紧凑的预览和完整的详细内容之间灵活切换,常见于文章摘要、课程介绍、产品描述等场景。

用 jQuery 实现这个效果的核心思路很直接:将超出预览范围的内容放在一个默认隐藏的元素中,通过按钮点击来切换这个元素的显示与隐藏,同时更新按钮文本和省略号标记的状态。

实现原理拆解

整个交互涉及三个 DOM 元素的协作:

  • 省略号标记(.dots:在收起状态下显示 ......,暗示内容被截断。

  • 隐藏内容区(.more:包含完整详细内容,默认不显示。

  • 切换按钮(.read:用于触发展开和收起操作。

点击按钮时,jQuery 做了三件事:

  1. 切换按钮前一个兄弟元素(也就是 .more 内容区)的可见状态,使用 .toggle()

  2. 切换省略号标记的可见状态,展开时隐藏省略号,收起时重新显示。

  3. 根据当前按钮文字决定切换到哪个文本——Read More 变为 Read Less,反之亦然。

为什么用 .prev() 和 .siblings() 而不是直接用 ID 选择器?

这个写法让 HTML 结构和 JavaScript 逻辑之间的耦合度更低。按钮通过 .prev() 找到紧邻的内容区,通过 .siblings('.dots') 找到同级的省略号,整个模块不需要任何 ID 或额外的 class 标记就能独立运作。这意味着页面上可以放多个此类模块,每个按钮只管自己所在区域,互不干扰。如果换成固定 ID 来操作,每新增一个模块就要修改脚本,扩展性和可维护性都会明显下降。

语法要点

$(selector).prev().toggle();          // 切换前一个兄弟元素的显示/隐藏
$(selector).siblings('.dots').toggle(); // 切换同级 .dots 元素的显示/隐藏
$(selector).text();                     // 获取或设置按钮的文本内容

示例代码

下面是一个完整的示例,模拟了课程介绍内容的“展开/收起”交互。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>展开更多 / 收起示例 · 编程学习</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <style>
        body {
            background-color: #fef9e7;
            padding: 0;
            margin: 0;
            font-family: sans-serif;
        }
        .container {
            font-size: 18px;
            max-width: 680px;
            margin: 40px auto;
            padding: 25px;
            background: #fff;
            border-radius: 8px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.08);
        }
        h1 {
            color: #2c6e49;
            font-size: 26px;
            margin-top: 0;
        }
        .more {
            display: none;
            font-size: 18px;
            line-height: 1.8;
        }
        .dots {
            font-weight: bold;
            letter-spacing: 2px;
        }
        button.read {
            margin-top: 10px;
            padding: 8px 20px;
            background-color: #4a7c59;
            border: none;
            font-size: 16px;
            cursor: pointer;
            color: #fff;
            border-radius: 4px;
            outline: none;
        }
        button.read:hover {
            background-color: #3b6448;
        }
    </style>
</head>
<body>
    <section>
        <div class="container">
            <h1>前端开发零基础入门课程</h1>
            <p>
                本课程面向编程初学者,系统性讲解 HTML、CSS、JavaScript
                三大前端基石,帮助你从零开始构建自己的网页项目。
                <span class="dots">......</span>
            </p>
            <span class="more">
                <p>课程共分为六大模块:</p>
                <ul>
                    <li>模块一:Web 基础与开发环境搭建</li>
                    <li>模块二:HTML5 语义化标签与页面结构</li>
                    <li>模块三:CSS3 布局与响应式设计</li>
                    <li>模块四:JavaScript 核心语法与 DOM 操作</li>
                    <li>模块五:前端工程化与版本控制入门</li>
                    <li>模块六:综合实战——个人作品站搭建</li>
                </ul>
                <p>课程更新时间:2026 年。如有疑问可发送邮件至 alan@ebingou.cn。</p>
            </span>

            <button class="read">展开更多</button>
        </div>
    </section>

    <script>
        $(document).ready(function () {
            $(".read").click(function () {
                // 切换紧邻按钮之前的 .more 内容区
                $(this).prev().toggle();
                // 切换同级的省略号标记
                $(this).siblings('.dots').toggle();

                // 根据当前文本切换按钮文字
                if ($(this).text() === '展开更多') {
                    $(this).text('收起');
                } else {
                    $(this).text('展开更多');
                }
            });
        });
    </script>
</body>
</html>

点击“展开更多”后,隐藏的课程模块列表和补充信息会显示出来,省略号消失,按钮文字变为“收起”。再次点击恢复初始的紧凑预览状态。

本节课程知识要点

  • .prev() 定位相邻元素.prev() 获取当前元素紧邻的前一个兄弟节点,适合在结构固定的 DOM 中做局部操作。

  • .siblings() 筛选同级元素:通过传入选择器参数,可以精确定位同级中特定类名的元素,避免波及无关节点。

  • .toggle() 简化显隐切换:无需手动判断当前状态再调用 .show() 或 .hide(),一个方法自动完成切换。

  • .text() 同时用于读取和设置.text() 不带参数时返回当前文本内容,带参数时则设置新文本,在状态切换中非常实用。

  • 模块独立性:通过相对遍历方法(.prev().siblings())而非固定 ID 操作 DOM,使每个模块独立运作,页面上可放置多个展开/收起组件而无需修改脚本。

个人经验与实用建议

在项目中,我习惯把这种“展开/收起”组件封装成一个通用模块。页面上可能有课程列表、文章摘要、用户评价等多个地方用到,它们唯一的区别就是内容不同,交互逻辑一致。只要按钮、.more 和 .dots 三者的相对位置保持不变,同一段 jQuery 脚本就能复用。

如果你的项目里同时在使用 Bootstrap 这类 UI 框架,注意框架自带的 .toggle() 方法与 jQuery 的 .toggle() 行为不同。Bootstrap 的 toggle 是通过 data-toggle 属性触发,走的是框架事件机制;jQuery 的 .toggle() 是直接操作元素的 display 属性。两者混用时可能会相互覆盖状态,排查时先确认是哪个库在控制显示隐藏逻辑,能更快定位问题。

如果页面需要支持 SEO,补充内容部分不应使用 display: none 做初始隐藏,搜索引擎可能因此忽略其中的文本。更好的做法是服务端渲染时就将完整内容输出,前端用 CSS max-height 配合 overflow: hidden 做视觉截断,再用 jQuery 切换一个展开类名来控制高度。这样既保证了 SEO 友好性,用户看到的交互效果也没有区别。

← jQuery单选框操作全指南:选中、取值、验证与联动 jQuery星级评分组件:点击与悬停两种交互实现 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号