0

0

jQuery实现卡片内部元素显隐切换与手风琴效果教程

DDD

DDD

发布时间:2025-10-18 13:11:09

|

822人浏览过

|

来源于php中文网

原创

jQuery实现卡片内部元素显隐切换与手风琴效果教程

本教程详细讲解如何使用jquery高效管理卡片(card)内部元素的显示与隐藏状态。通过优化事件绑定、利用dom遍历方法(如`closest()`和`find()`)以及css类操作,我们将演示如何实现独立的元素切换功能和手风琴(accordion)式效果,确保用户界面的响应性和简洁性。

在现代Web应用中,卡片(Card)式布局因其清晰的组织结构而广受欢迎。然而,如何在这些卡片内部实现点击按钮显示或隐藏额外信息,同时保持代码的简洁性和功能性,是一个常见的需求。本文将指导您如何利用jQuery来高效地实现这一功能,并提供两种常见的交互模式:独立的元素切换和手风琴(Accordion)模式。

1. 基础HTML结构与CSS样式准备

首先,我们需要一个标准的卡片HTML结构,其中包含一个按钮和一个可切换显示/隐藏的信息面板。同时,定义一个CSS类来控制面板的可见性。

HTML 结构示例:



btc

Bitcoin

eth

Ethereum

CSS 样式示例:

.coin-card {
  border: 1px solid #ccc;
  margin: 0.5rem;
  padding: 1rem;
  float: left;
  width: 20%; /* 示例宽度 */
  box-sizing: border-box; /* 确保内边距和边框包含在宽度内 */
}
p {
  margin: 0;
}

/* 定义隐藏状态 */
.coin-card .more-info-panel.hidden {
  display: none;
}

在上述HTML中,我们为每个信息面板添加了 hidden 类,并通过CSS将其设置为 display: none;,使其在页面加载时默认隐藏。

2. jQuery核心方法解析

为了实现交互功能,我们将利用jQuery的以下核心方法:

改图鸭AI图片生成
改图鸭AI图片生成

改图鸭AI图片生成

下载
  • .on('click', handler): 推荐的事件绑定方式。它允许我们为匹配的元素(或通过事件委托)添加一个或多个事件处理器。相比于HTML中的 onclick 属性,.on() 更加灵活,避免了重复绑定问题,并使得JavaScript代码与HTML结构分离,提升了可维护性。
  • $(this): 在事件处理器内部,$(this) 引用触发事件的DOM元素(在这里是被点击的按钮),并将其封装成jQuery对象,以便使用jQuery方法。
  • .closest('.selector'): 从当前元素开始,向上遍历DOM树,查找匹配指定选择器的第一个祖先元素。这对于从子元素定位其父级容器非常有用。
  • .find('.selector'): 在当前元素的后代元素中查找匹配指定选择器的所有元素。这对于在父级容器中定位其内部的特定子元素非常有用。
  • .toggleClass('className'): 在元素上切换指定CSS类的存在。如果类存在,则移除它;如果类不存在,则添加它。
  • .addClass('className'): 为元素添加指定的CSS类。
  • .removeClass('className'): 从元素中移除指定的CSS类。
  • .hasClass('className'): 检查元素是否包含指定的CSS类,返回 true 或 false。

3. 实现方案一:独立面板切换(允许同时打开多个面板)

这种模式下,点击任何一个卡片内的“More Info”按钮,只会影响当前卡片内部的信息面板,其他卡片内的面板不受影响,因此可以同时打开多个面板。

$(document).ready(function() {
  // 为所有 .coin-card 内的 .btn-info 按钮绑定点击事件
  $('.coin-card .btn-info').on('click', function() {
    // 1. 获取当前被点击按钮的父级 .coin-card 元素
    const $card = $(this).closest('.coin-card');

    // 2. 在当前卡片内部查找 .more-info-panel 元素
    const $infoPanel = $card.find('.more-info-panel');

    // 3. 切换 .more-info-panel 的 'hidden' 类
    $infoPanel.toggleClass('hidden');

    // 可以在此处添加异步数据获取和内容更新逻辑
    // 例如:
    // const coinName = $card.find('.coin-name').text().toLowerCase();
    // fetchMoreInfo(coinName).then(data => {
    //   if (data) {
    //     $infoPanel.find('.usd').text(`USD: $${data?.market_data?.current_price?.usd}`);
    //     $infoPanel.find('.eur').text(`EUR: €${data?.market_data?.current_price?.eur}`);
    //     $infoPanel.find('.ils').text(`ILS: ₪${data?.market_data?.current_price?.ils}`);
    //   }
    // });
  });
});

代码解释:

  1. $(document).ready(function() { ... });:确保在DOM完全加载后才执行jQuery代码。
  2. $('.coin-card .btn-info').on('click', function() { ... });:选取所有类名为 coin-card 元素内部的类名为 btn-info 的按钮,并为它们的点击事件绑定一个匿名函数。
  3. const $card = $(this).closest('.coin-card');:$(this) 指向当前被点击的按钮。closest('.coin-card') 向上找到这个按钮最近的父级 div,且这个 div 带有 coin-card 类。
  4. const $infoPanel = $card.find('.more-info-panel');:在 $card 这个jQuery对象(即当前卡片)内部,查找所有带有 more-info-panel 类的元素。由于我们知道每个卡片只有一个这样的面板,所以它会返回该面板。
  5. $infoPanel.toggleClass('hidden');:如果 $infoPanel 带有 hidden 类,则移除它(显示面板);如果 $infoPanel 没有 hidden 类,则添加它(隐藏面板)。

4. 实现方案二:手风琴(Accordion)模式(一次只允许打开一个面板)

手风琴模式的特点是,当您点击一个按钮显示其对应面板时,所有其他已打开的面板都会自动关闭,确保在任何时候都只有一个面板处于打开状态。

$(document).ready(function() {
  // 为所有 .coin-card 内的 .btn-info 按钮绑定点击事件
  $('.coin-card .btn-info').on('click', function() {
    // 1. 获取当前被点击按钮的父级 .coin-card 元素
    const $card = $(this).closest('.coin-card');

    // 2. 在当前卡片内部查找 .more-info-panel 元素
    const $infoPanel = $card.find('.more-info-panel');

    // 3. 检查当前面板在点击前是否处于隐藏状态(即将被打开)
    const isOpen = $infoPanel.hasClass('hidden');

    // 4. 首先隐藏所有卡片内的信息面板
    // 这会关闭所有当前打开的面板
    $('.coin-card .more-info-panel').addClass('hidden');

    // 5. 如果当前面板在点击前是隐藏的(即用户意图是打开它),
    // 那么在所有面板都被隐藏后,再单独显示它
    if (isOpen) {
      $infoPanel.removeClass('hidden');
    }

    // 可以在此处添加异步数据获取和内容更新逻辑
    // 与方案一类似,如果需要,在此处调用 fetchMoreInfo 并更新 $infoPanel 内容
  });
});

代码解释:

  1. 前三步与方案一相同,用于定位当前卡片和面板,并判断其当前状态。
  2. const isOpen = $infoPanel.hasClass('hidden');:在执行任何隐藏操作之前,我们先记录当前点击的面板是否是隐藏的。如果它是隐藏的,那么用户点击的意图就是打开它。
  3. $('.coin-card .more-info-panel').addClass('hidden');:这是手风琴模式的关键一步。它会选择页面上所有 .coin-card 内部的 .more-info-panel 元素,并为它们添加 hidden 类,从而关闭所有已打开的面板。
  4. if (isOpen) { $infoPanel.removeClass('hidden'); }:如果 isOpen 为 true(意味着当前点击的面板在执行第4步之前是隐藏的),那么在所有面板都被关闭后,我们再单独移除当前面板的 hidden 类,使其显示。这样就实现了点击一个按钮打开一个面板,同时关闭其他面板的效果。

5. 注意事项

  • 避免混用事件绑定方式:强烈建议避免在HTML元素上直接使用 onclick 属性,同时又通过jQuery的 .on() 方法为同一元素绑定事件。这会导致事件处理逻辑混乱,难以调试,并可能造成重复绑定等问题。统一使用jQuery的事件绑定机制是最佳实践。
  • 异步数据加载:如果面板内容需要从后端异步获取(例如通过 fetchMoreInfo 函数),请确保在面板显示前或显示后立即触发数据加载,并在数据返回后更新面板内容。在手风琴模式下,每次打开面板时都重新加载数据可能是必要的。
  • 性能考虑:对于大量卡片的情况,jQuery的选择器和DOM操作效率通常很高。但在极端的性能敏感场景下,可以考虑使用事件委托将事件绑定到父容器上,而不是每个按钮。不过,对于本文的场景,直接绑定到按钮通常足够高效。
  • CSS display: none 与 visibility: hidden:display: none 会使元素完全从文档流中移除,不占据任何空间。而 visibility: hidden 只是隐藏元素,但它仍然占据其在文档流中的空间。在需要隐藏整个区域时,display: none 通常是更合适的选择。

总结

通过本教程,您应该已经掌握了如何使用jQuery来灵活地管理卡片内部元素的显示与隐藏。无论是简单的独立切换还是复杂的手风琴模式,jQuery提供的 closest()、find()、toggleClass() 等方法,结合优化的事件绑定,都能帮助您以简洁、高效的方式实现丰富的UI交互效果,极大地提升了Web应用的可用性和用户体验。

jQuery实现卡片内部元素显隐切换与手风琴效果教程jQuery实现卡片内部元素显隐切换与手风琴效果教程

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

556

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

374

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

732

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

477

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

414

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

991

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

658

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

553

2023.09.20

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

36

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

CSS教程
CSS教程

共754课时 | 20.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号