激活Modal时隐藏其他Toggle按钮的实现方案咨询
问题说明
我有左右两个Modal,点击对应Toggle按钮会下拉展开。需求是激活其中一个Modal时,仅保留当前Toggle按钮显示,隐藏另一个Toggle按钮及对应的Modal。目前的问题是,任意一个Modal激活时,两个Toggle按钮都会显示。尝试过CSS嵌套div、display:none等方法但未解决,希望找到可行的实现方法。
解决方案
核心思路
- 点击顶部Toggle按钮时,先关闭所有已激活的Modal
- 显示当前点击的按钮,隐藏另一个按钮
- 激活对应的目标Modal
- 关闭Modal时,恢复两个Toggle按钮的显示
修改后的代码
HTML(保持原结构无需改动)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <button class="toggle" data-modal-id="lefty" id="lefty">LEFT</button> <button class="toggle" data-modal-id="righty" id="righty">RIGHT</button> <div class="modal" data-modal-id="lefty"> <div class="modal-overlay toggle"></div> <div class="modal-wrapper modal-transition"> <div class="modal-header"> <button class="modal-close toggle"></button> <h2 class="modal-heading">This is a modal on the left</h2> </div> <div class="modal-body"> <div class="modal-content"> </div> </div> </div> </div> <div class="modal" data-modal-id="righty"> <div class="modal-overlay toggle"></div> <div class="modal-wrapper modal-transition"> <div class="modal-header"> <h2 class="modal-heading">This is a modal on the right</h2> </div> <div class="modal-body"> <div class="modal-content"> </div> </div> </div> </div>
CSS(新增按钮隐藏类,其余原有代码保留)
/* 新增按钮隐藏类 */ .toggle-hidden { display: none !important; } /* 以下为原有CSS代码,保持不变 */ .modal { position: fixed; z-index: 10000; top: 0; left: 0; visibility: hidden; width: 100%; height: 100%; box-sizing: border-box; } .modal.modal-visible { visibility: visible; } .modal-overlay { position: fixed; z-index: 10; top: 0; left: 0; width: 100%; height: 0%; background: #fff; visibility: hidden; opacity: 0; transition: visibility 0s height 0.5s; box-sizing: border-box; } .modal.modal-visible .modal-overlay { opacity: 1; visibility: visible; transition-delay: 0s; } .modal-wrapper { position: fixed; z-index: 9999; top: 0; left: 0; width: 100%; height: 100%; margin-left: 0; background-color: #fff; box-sizing: border-box; } .modal-transition { transition: all 0.5s; transform: translateY(-100%); opacity: 1; } .modal.modal-visible .modal-transition { transform: translateY(0); opacity: 1; } .modal-header, .modal-content { padding: 1em; } .modal-header { position: relative; top: 10%; background-color: #fff; } .modal-close { position: fixed; top: 0; right: 0; padding: 1em; color: #aaa; background: none; border: 0; font-size: 18px; } .modal-close:hover { color: #777; } .modal-heading { font-size: 1.125em; margin: 0; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .modal-content>*:first-child { margin-top: 0; } .modal-content>*:last-child { margin-bottom: 0; } .modal.modal-scroll .modal-content { max-height: 100%; overflow-y: scroll; } .modal.modal-scroll .modal-wrapper { position: absolute; z-index: 9999; top: 2em; left: 50%; width: 32em; margin-left: -16em; background-color: #CDf; box-shadow: 0 0 1.5em hsla(0, 0%, 0%, 0.35); box-sizing: border-box; } button { background: transparent; font-family: 'Republique', sans-serif; font-variant: normal; font-weight: 400; font-size: 24px; line-height: 0.5; -webkit-hyphens: auto; -moz-hyphens: auto; -ms-hyphens: auto; hyphens: auto; letter-spacing: .4px; color: #000; cursor: pointer; outline: 0; border: 0; padding: 4px; } #righty { position: fixed; right: 10px; top: 10px; z-index: 100000; } #lefty { position: fixed; left: 10px; top: 10px; z-index: 100000; } body { background: pink; } button { color: white; } button:hover { color: #ccc; }
JavaScript(重写点击逻辑,处理按钮显隐与Modal切换)
// 统一处理所有Toggle元素的点击事件 $('.toggle').on('click', function(e) { const targetModalId = $(this).data("modal-id"); // 判断当前点击的是否是顶部的Toggle按钮 const isTopToggleButton = $(this).is('button.toggle'); if (isTopToggleButton) { // 点击顶部按钮:先关闭所有Modal,切换按钮显隐 $('.modal').removeClass('modal-visible'); $('.toggle').addClass('toggle-hidden'); $(this).removeClass('toggle-hidden'); // 激活对应Modal $(`.modal[data-modal-id='${targetModalId}']`).addClass('modal-visible'); } else { // 点击Modal内的关闭按钮/遮罩:关闭当前Modal,恢复所有按钮显示 $(this).closest(".modal").removeClass('modal-visible'); $('.toggle').removeClass('toggle-hidden'); } });
改动说明
- 新增
.toggle-hidden类,通过高优先级的display: none实现按钮隐藏 - 合并原代码中重复绑定的点击事件,区分点击元素类型(顶部按钮/Modal内关闭元素)
- 确保激活Modal时仅显示对应按钮,关闭Modal后恢复所有按钮可见
- 避免多个Modal同时激活的冲突问题
内容的提问来源于stack exchange,提问作者Don Rodriguez
相关产品推荐
相关产品推荐

