Maison > Questions et réponses > le corps du texte
J'ai créé un menu horizontal en utilisant CSS, HTML et jquery. Lorsque quelqu'un clique sur un élément de menu, un sous-menu s'affiche.
Mon problème est que lorsque le sous-menu est déjà ouvert et que je clique sur un autre élément de menu, il affiche le nouveau sous-menu mais ne masque pas le menu précédent qui a été ouvert.
Mise à jour : j'ai modifié la question afin qu'elle ne se concentre désormais que sur un seul problème.
$(".menus_li").click(function(e) { $(".blocks_ul", this).toggleClass('submenu-is-active'); });
a { color: #fff; text-decoration: none; } li { list-style: none; } .top-menu { z-index: 2; position: fixed; top: 0; left: 0; width: 100%; display: flex; width: 100%; background: #0088ff; padding: 1rem; margin: 0; } .menus_li { font-weight: bold; margin-left: 1rem; } .blocks_ul { display: none; position: absolute; background: #fff; top: 100%; min-width: 120px; border-radius: 8px; padding: 1rem; } .blocks_ul a { color: #000; } .blocks_ul li { padding-left: 10px; font-weight: normal; padding: 0.4rem 0.7rem; } .blocks_ul.submenu-is-active { display: block; } .bg_submenu { background-color: rgba(0, 0, 0, 0.6); position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 1; display: none; } .bg_submenu.show { display: block; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="bg_submenu"></div> <ul class="top-menu"> <li class="menus_li"><a href="#">Cars +</a> <ul class="blocks_ul"> <li><a class="menu-link" href="#">Mercedes</a></li> <li><a class="menu-link" href="#">Jeep</a></li> <li><a class="menu-link" href="#">Ford</a></li> <li><a class="menu-link" href="#">BMW</a></li> <li><a class="menu-link" href="#">Tesla</a></li> </ul> </li> <li class="menus_li"><a href="#">Computers +</a> <ul class="blocks_ul"> <li><a class="menu-link" href="#">Apple</a></li> <li><a class="menu-link" href="#">Lenovo</a></li> <li><a class="menu-link" href="#">HP</a></li> <li><a class="menu-link" href="#">Dell</a></li> <li><a class="menu-link" href="#">Acer</a></li> </ul> </li> </ul>
P粉6638838622024-03-21 07:56:08
Vous pouvez modifier le code comme suit (commentaires dans le code)
const $blocks = $(".blocks_ul"); // get all blocks const $background = $(".bg_submenu"); // get background $(".menus_li").on('click', e => { const $thisBlock = $(".blocks_ul", e.currentTarget); // get current block $blocks.not($thisBlock).removeClass('submenu-is-active'); // remove class from other blocks $thisBlock.toggleClass('submenu-is-active'); // toggle the class on the current block $background.toggleClass('show', $thisBlock.hasClass('submenu-is-active')); // only show the background if you are showing the block }); $('body').on('click', e => { const $clicked = $(e.target); // get the target that was clicked // check if the click originated in the menu if (!$clicked.hasClass('menus_li') && !$clicked.closest('.menus_li').length) { // if not do the following $blocks.removeClass('submenu-is-active'); // hide menu $background.removeClass('show'); // hide background } })
a { color: #fff; text-decoration: none; } li { list-style: none; } .top-menu { z-index: 2; position: fixed; top: 0; left: 0; width: 100%; display: flex; width: 100%; background: #0088ff; padding: 1rem; margin: 0; } .menus_li { font-weight: bold; margin-left: 1rem; } .blocks_ul { display: none; position: absolute; background: #fff; top: 100%; min-width: 120px; border-radius: 8px; padding: 1rem; } .blocks_ul a { color: #000; } .blocks_ul li { padding-left: 10px; font-weight: normal; padding: 0.4rem 0.7rem; } .blocks_ul.submenu-is-active { display: block; } .bg_submenu { background-color: rgba(0, 0, 0, 0.6); position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 1; display: none; } .bg_submenu.show { display: block; }
sssccc