javascript - 响应式菜单,带有可点击的子菜单,可根据屏幕尺寸改变位置

标签 javascript html css

我对情况的最佳描述:

移动设备上的菜单是垂直的,桌面上的菜单是水平的。

.menu {
        list-style-type: none;
        display: flex;
        flex-wrap: wrap;
        flex-direction: column;
        @media (min-width: 768px) {
        flex-direction: row;        
        justify-content: space-between;
      };    
    }

第一个菜单链接是一个可单击的子菜单。这使情况变得复杂,因为这意味着需要复制子菜单,以便在移动设备上(当菜单是垂直时)子菜单位于菜单链接之间,而在桌面上(当菜单是水平时)位于菜单链接下方(因此子菜单不会破坏 justify-content: space- Between; 的对齐方式。 HTML:

<footer>
  <hr />
  <ul class="menu">
    <li>
      <a class="toggle" href="#submenu">submenu</a>
      <ol id="submenu" class="table-of-contents toggle-content is-mobile">
        <li>
          <a href="#" class="content-entry">sub-menu</a>
        </li>
        ...
      </ol>
    </li>
    <li><a href="#">link2</a></li>
    <li><a href="#">link3</a></li>
    <li><a href="#">link4</a></li>
  </ul>
  <ol id="submenu" class="table-of-contents toggle-content is-desktop">
    <li>
      <a href="#" class="content-entry">lorem the ipsum placeholder text</a>
    </li>
    ...
  </ol>
  <hr />
  <p class="additional">some text</p>
</footer>

到目前为止,子菜单已按上述方式显示,但在使子菜单可点击时出现问题,因为子菜单具有相同的 ID。问题是如何使子菜单在我的场景中在移动设备和桌面设备上都可单击。

请查看 jsfiddle 示例(更改结果窗口的宽度) https://jsfiddle.net/virsis12/c4Lt2krm/31/

最佳答案

无需复制 #submenu 的 html。

您应该将#submenu移动到第一个li元素内,并在桌面屏幕上将其position设置为absolute.使用javascript显示或隐藏子菜单。

const toggle = document.querySelector('.toggle');
const submenu = document.getElementById('submenu');

toggle.addEventListener('click', () => {
  submenu.classList.toggle('showSubMenu');
});
ol, ul {
  list-style-type: none;
}

.menu {
  display: flex;
  flex-wrap: wrap;
  flex-direction: column;
}

.submenu-container {
  position: relative;
}

.table-of-contents {
  display: none;
  box-sizing: border-box;
  padding: 10px;
  text-align: left;
  overflow: hidden;
}

.table-of-contents li {
  padding: 5px 0;
}

.showSubMenu {
  display: block;
}

@media (min-width: 768px) {
  .table-of-contents {
    background: #fff;
    position: absolute;
    box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
    top: 120%;
    left: 0;
    width: 150px;
    text-align: center;
  }
  .menu {
    flex-direction: row;
    justify-content: space-between;
  }
}
<footer class=" footer">
  <hr>
  <ul class="menu">
    <li class="submenu-container">
      <a class="toggle" href="#submenu">submenu</a>
      <ol id="submenu" class="table-of-contents">
        <li><a href="#" class="content-entry">placeholder text</a></li>
        <li><a href="#" class="content-entry">placeholder text</a></li>
        <li><a href="#" class="content-entry">placeholder text</a></li>
        <li><a href="#" class="content-entry">placeholder text</a></li>
        <li><a href="#" class="content-entry">placeholder text</a></li>
        <li><a href="#" class="content-entry">placeholder text</a></li>
      </ol>
    </li>
    <li><a href="#">link2</a></li>
    <li><a href="#">link3</a></li>
    <li><a href="#">link4</a></li>
  </ul>
  <hr>
  <p class="additional">some text</p>
</footer>

关于javascript - 响应式菜单,带有可点击的子菜单,可根据屏幕尺寸改变位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62729322/

相关文章:

javascript - 如何从圆的最外圆弧画线

html - 适用于结构化数据的文本友好文件格式

html - 在一行中向左浮动两个 flex 元素,向右浮动一个元素

javascript - 垂直 Bootstrap 旋转木马箭头和导航列表

javascript - 什么时候检查函数的参数是矫枉过正的?

html - css高度不增长

android - 转换 Html 并将文本设置为 Textview

javascript - CSS:根据内容扩展 float 元素的宽度

html - 输入/按钮元素不会在 flex 容器中收缩

javascript - 如何在 JavaScript 中访问父元素的子元素