汉堡菜单仅使用 CSS 不起作用

Posted

技术标签:

【中文标题】汉堡菜单仅使用 CSS 不起作用【英文标题】:Hamburger menu not working using CSS only 【发布时间】:2022-01-09 14:13:51 【问题描述】:

我有以下代码。无论复选框是否被选中,汉堡菜单都会一直显示。

input[type=checkbox]:checked .hamburger-menu 
  animation: menu-display 0.3s forwards ease-in-out;


@keyframes menu-display 
  from 
    display: none;
  
  to 
    display: block;
  
<div class='navbar-div-outside'>
  <nav class='navbar'>
    <div class='logo-div'>
      <a href="% url 'home' %" class='navbar-brand'>DevByAnirudh</a>
    </div>
    <div class='menu-div'>
      % block navbar %% endblock navbar %
    </div>
    <div class='nav-icons'>
      <p><a target='_blank' href="https://www.instagram.com/devbyanirudh/"><i class="fab fa-instagram"></i></a></p>
      <p><a target='_blank' href="https://twitter.com/devbyanirudh"><i class="fab fa-twitter"></i></a></p>
      <p><a target='_blank' href="https://www.youtube.com/channel/UCefdYcnQIHbRhPp0N8UIQsw"><i class="fab fa-youtube"></i></a></p>
    </div>
    <!-- hamburger menu part -->
    <div class='hamburger'>
      <label for="checkbox"><i class="fas fa-bars bars"></i></label>
      <input class='checkbox' type="checkbox" id="checkbox">
    </div>
  </nav>
  <!-- end of navbar -->
  <div class='hamburger-menu'>
    <li><a href="% url 'home' %">Home</a></li>
    <li><a href="% url 'BlogListView' %">Blog</a></li>
    <li><a href="/about">About</a></li>
    <li><a href="/contact">Contact</a></li>
  </div>
</div>

我希望在选中复选框时显示.hamburger-menu

【问题讨论】:

我假设您想要汉堡包进入视野时的动画效果。您不能使用 display ,因为它不是动画的,但您可以使用 opacity 使汉堡包更逐渐出现。合适吗? 【参考方案1】:

问题出在您的 css 选择器 input[type=checkbox]:checked .hamburger-menu

该选择器在状态为:checkedinput[type=checkbox] 元素内选择一个类为.hamburger-menu 的元素。

您的标记不包含这样的结构(无论如何这都是无效的,因为您实际上不能将内容放入 &lt;input/&gt; 标记内)。

无论如何,即使它会正确选择,您也正在尝试为is not possible 的display css 属性设置动画。

放弃该动画尝试,您可以使用 javascript 显示/隐藏菜单。

let checkbox = document.querySelector('#checkbox');
let menu = document.querySelector('.hamburger-menu');

checkbox.addEventListener('change', (event) => 
  if (event.target.checked === true)
    menu.classList.add('visible');
  else
    menu.classList.remove('visible');
);
.hamburger-menu 
  display: none;


.hamburger-menu.visible 
  display: block;
<div class='navbar-div-outside'>
  <nav class='navbar'>
    <div class='logo-div'>
      <a href="% url 'home' %" class='navbar-brand'>DevByAnirudh</a>
    </div>
    <div class='menu-div'>
      % block navbar %% endblock navbar %
    </div>
    <div class='nav-icons'>
      <p><a target='_blank' href="https://www.instagram.com/devbyanirudh/"><i class="fab fa-instagram"></i></a></p>
      <p><a target='_blank' href="https://twitter.com/devbyanirudh"><i class="fab fa-twitter"></i></a></p>
      <p><a target='_blank' href="https://www.youtube.com/channel/UCefdYcnQIHbRhPp0N8UIQsw"><i class="fab fa-youtube"></i></a></p>
    </div>
    <!-- hamburger menu part -->
    <div class='hamburger'>
      <label for="checkbox"><i class="fas fa-bars bars"></i></label>
      <input class='checkbox' type="checkbox" id="checkbox">
    </div>
  </nav>
  <!-- end of navbar -->
  <div class='hamburger-menu'>
    <li><a href="% url 'home' %">Home</a></li>
    <li><a href="% url 'BlogListView' %">Blog</a></li>
    <li><a href="/about">About</a></li>
    <li><a href="/contact">Contact</a></li>
  </div>
</div>

【讨论】:

那么,当复选框被选中时,如何选择类hamburger-menu 可以使用 css ~ 选择器,但这需要重新构建您的 html(@ANDO Andriamalala 刚刚添加了一个使用它的解决方案)。我建议将 javascript 与菜单的可见性类结合使用。通过这样做,您根本不需要更改您的 html。我添加了一个 sn-p。【参考方案2】:

试试这个

input[type=checkbox] ~ .hamburger-menu 
  display: none;


input[type=checkbox]:checked ~ .hamburger-menu 
  display: block;
<div class='navbar-div-outside'>
  <nav class='navbar'>
    <div class='logo-div'>
      <a href="% url 'home' %" class='navbar-brand'>DevByAnirudh</a>
    </div>
    <div class='menu-div'>
      % block navbar %% endblock navbar %
    </div>
    <div class='nav-icons'>
      <p><a target='_blank' href="https://www.instagram.com/devbyanirudh/"><i class="fab fa-instagram"></i></a></p>
      <p><a target='_blank' href="https://twitter.com/devbyanirudh"><i class="fab fa-twitter"></i></a></p>
      <p><a target='_blank' href="https://www.youtube.com/channel/UCefdYcnQIHbRhPp0N8UIQsw"><i class="fab fa-youtube"></i></a></p>
    </div>
    <!-- hamburger menu part -->
    <div class='hamburger'>
      <label for="checkbox"><i class="fas fa-bars bars"></i></label>
      <input class='checkbox' type="checkbox" id="checkbox">
      <div class='hamburger-menu'>
        <li><a href="% url 'home' %">Home</a></li>
        <li><a href="% url 'BlogListView' %">Blog</a></li>
        <li><a href="/about">About</a></li>
        <li><a href="/contact">Contact</a></li>
      </div>
    </div>
  </nav>
  <!-- end of navbar -->
</div>

【讨论】:

以上是关于汉堡菜单仅使用 CSS 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

汉堡图标菜单不起作用

Bootstrap 5.0.2汉堡菜单不起作用[重复]

汉堡图标在 Android Studio 中不起作用

折叠的菜单不起作用

revealViewController 委托不起作用

主菜单在 iO 上不起作用