同一元素slideUp与slideDown切换功能实现问题
网格元素点击展开/切换/收起交互优化
需求:
- 点击网格内某元素,其关联内容通过
slideDown展开; - 点击同一网格内其他元素,对应内容展开,同时收起之前展开的内容;
- 重复点击同一元素时,执行
slideUp收起内容。
初始代码无法实现重复点击收起的效果,重复点击时仍会触发slideDown:
初始代码
$(".g-item").on("click", function () { $(".g-item").removeClass('is-active'); $(this).addClass('is-active'); $(".g-inner").fadeOut(); if ($(this).hasClass('is-active')) { $(this).parent().find(".is-active [data-grid_content]").slideDown(); } else { $(this).parent().find(".is-active [data-grid_content]").slideUp(); } });
问题原因
初始代码每次点击都会先移除所有.g-item的is-active类,再给当前元素添加该类,导致if判断永远为真,只会执行slideDown逻辑,无法触发收起操作。
修改后的代码
jQuery(".g-item").on("click", function () { // 先收起其他已激活元素的内容并移除激活状态 jQuery(".g-item.is-active").not(this).find("[data-grid_content]").slideUp().end().removeClass('is-active'); if ($(this).hasClass("is-active")) { $(this).find("[data-grid_content]").slideUp(); $(this).removeClass('is-active'); } else { $(this).addClass('is-active'); $(this).find("[data-grid_content]").slideDown(); } });
修改说明
- 先处理其他已激活元素:收起它们的关联内容,并移除
is-active类,确保同一时刻只有一个元素处于激活状态; - 判断当前元素激活状态:
- 若已激活,收起其关联内容并移除激活类;
- 若未激活,添加激活类并展开关联内容;
- 简化选择器逻辑,直接通过当前元素查找关联内容,避免不必要的父元素遍历,提升代码性能。
内容的提问来源于stack exchange,提问作者user10980228
相关产品推荐
相关产品推荐

