阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 列表在导航中的应用

列表在导航中的应用

作者:陈川 阅读数:11395人阅读 分类: HTML

列表在导航中的应用

导航是网站的重要组成部分,它帮助用户快速找到所需内容。列表元素(<ul><ol><dl>)在构建导航时非常实用,它们能清晰展示层级关系,且语义化良好。

无序列表构建基础导航

最简单的导航可以用无序列表实现。默认样式是垂直排列,但通过CSS可以轻松改为水平导航:

<nav>
  <ul class="main-nav">
    <li><a href="/">首页</a></li>
    <li><a href="/products">产品</a></li>
    <li><a href="/services">服务</a></li>
    <li><a href="/about">关于我们</a></li>
    <li><a href="/contact">联系</a></li>
  </ul>
</nav>

<style>
.main-nav {
  display: flex;
  list-style: none;
  gap: 1rem;
  padding: 0;
}
.main-nav a {
  text-decoration: none;
  color: #333;
  padding: 0.5rem 1rem;
}
.main-nav a:hover {
  background-color: #f0f0f0;
}
</style>

多级下拉菜单实现

列表嵌套可以创建多级导航。结合CSS的:hover伪类实现下拉效果:

<nav>
  <ul class="dropdown-nav">
    <li><a href="/">首页</a></li>
    <li>
      <a href="/products">产品</a>
      <ul>
        <li><a href="/products/software">软件</a></li>
        <li><a href="/products/hardware">硬件</a></li>
      </ul>
    </li>
    <li><a href="/contact">联系</a></li>
  </ul>
</nav>

<style>
.dropdown-nav {
  position: relative;
  display: flex;
  list-style: none;
}
.dropdown-nav ul {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  background: white;
  box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}
.dropdown-nav li:hover > ul {
  display: block;
}
</style>

面包屑导航的实现

有序列表适合构建面包屑导航,展示用户在网站中的位置:

<nav aria-label="面包屑导航">
  <ol class="breadcrumb">
    <li><a href="/">首页</a></li>
    <li><a href="/electronics">电子产品</a></li>
    <li><a href="/electronics/phones">手机</a></li>
    <li aria-current="page">智能手机</li>
  </ol>
</nav>

<style>
.breadcrumb {
  display: flex;
  list-style: none;
  padding: 0;
}
.breadcrumb li:not(:last-child)::after {
  content: ">";
  margin: 0 0.5rem;
}
.breadcrumb [aria-current] {
  color: #666;
}
</style>

标签式导航的列表应用

通过修改列表项的显示方式,可以创建标签式导航:

<ul class="tab-nav">
  <li class="active"><a href="#tab1">标签一</a></li>
  <li><a href="#tab2">标签二</a></li>
  <li><a href="#tab3">标签三</a></li>
</ul>

<style>
.tab-nav {
  display: flex;
  list-style: none;
  border-bottom: 1px solid #ddd;
  padding: 0;
}
.tab-nav li {
  margin-right: 0.5rem;
}
.tab-nav a {
  display: block;
  padding: 0.5rem 1rem;
  text-decoration: none;
  color: #333;
  border: 1px solid #ddd;
  border-bottom: none;
  background: #f8f8f8;
}
.tab-nav .active a {
  background: white;
  border-bottom: 1px solid white;
  margin-bottom: -1px;
}
</style>

响应式导航菜单

在小屏幕设备上,列表可以转换为汉堡菜单:

<nav class="responsive-nav">
  <button class="menu-toggle">☰</button>
  <ul>
    <li><a href="/">首页</a></li>
    <li><a href="/about">关于</a></li>
    <li><a href="/services">服务</a></li>
    <li><a href="/contact">联系</a></li>
  </ul>
</nav>

<style>
.responsive-nav ul {
  list-style: none;
  padding: 0;
  display: flex;
}
.responsive-nav .menu-toggle {
  display: none;
}
@media (max-width: 768px) {
  .responsive-nav ul {
    display: none;
    flex-direction: column;
  }
  .responsive-nav .menu-toggle {
    display: block;
  }
  .responsive-nav ul.show {
    display: flex;
  }
}
</style>

<script>
document.querySelector('.menu-toggle').addEventListener('click', function() {
  document.querySelector('.responsive-nav ul').classList.toggle('show');
});
</script>

定义列表在导航中的特殊应用

定义列表(<dl>)适合展示带有描述的导航项:

<nav>
  <dl class="description-nav">
    <dt><a href="/web-design">网页设计</a></dt>
    <dd>响应式设计,用户体验优化</dd>
    
    <dt><a href="/seo">SEO优化</a></dt>
    <dd>提升网站在搜索引擎中的排名</dd>
  </dl>
</nav>

<style>
.description-nav {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: 0 1rem;
}
.description-nav dt {
  font-weight: bold;
}
.description-nav dd {
  margin: 0;
  color: #666;
}
</style>

带图标的导航列表

列表项中可以加入图标增强视觉效果:

<ul class="icon-nav">
  <li>
    <a href="/dashboard">
      <svg width="20" height="20" viewBox="0 0 24 24"><path d="M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z"/></svg>
      仪表盘
    </a>
  </li>
  <li>
    <a href="/messages">
      <svg width="20" height="20" viewBox="0 0 24 24"><path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z"/></svg>
      消息
    </a>
  </li>
</ul>

<style>
.icon-nav {
  list-style: none;
  padding: 0;
}
.icon-nav a {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.5rem;
  text-decoration: none;
  color: #333;
}
.icon-nav a:hover {
  background: #f5f5f5;
}
.icon-nav svg {
  fill: currentColor;
}
</style>

可访问性考虑

使用列表构建导航时,需要注意可访问性问题:

<nav aria-label="主导航">
  <ul role="menu">
    <li role="none"><a href="/" role="menuitem">首页</a></li>
    <li role="none">
      <a href="/products" role="menuitem" aria-haspopup="true">产品</a>
      <ul role="menu">
        <li role="none"><a href="/products/software" role="menuitem">软件</a></li>
        <li role="none"><a href="/products/hardware" role="menuitem">硬件</a></li>
      </ul>
    </li>
  </ul>
</nav>

键盘导航支持也很重要,需要添加相应的JavaScript代码:

document.querySelectorAll('[role="menu"] a').forEach(menuItem => {
  menuItem.addEventListener('keydown', e => {
    if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
      e.preventDefault();
      const parentMenu = e.target.closest('[role="menu"]');
      const items = [...parentMenu.querySelectorAll('[role="menuitem"]')];
      const currentIndex = items.indexOf(e.target);
      
      if (e.key === 'ArrowDown') {
        const nextIndex = (currentIndex + 1) % items.length;
        items[nextIndex].focus();
      } else {
        const prevIndex = (currentIndex - 1 + items.length) % items.length;
        items[prevIndex].focus();
      }
    }
  });
});

现代CSS技术增强列表导航

使用CSS Grid可以创建复杂的导航布局:

<nav class="mega-menu">
  <ul>
    <li>
      <a href="/products">产品</a>
      <div class="submenu">
        <ul>
          <li><a href="/products/software">软件产品</a></li>
          <li><a href="/products/hardware">硬件产品</a></li>
        </ul>
        <ul>
          <li><a href="/products/new">新品</a></li>
          <li><a href="/products/featured">特色产品</a></li>
        </ul>
      </div>
    </li>
  </ul>
</nav>

<style>
.mega-menu {
  position: relative;
}
.mega-menu .submenu {
  display: none;
  position: absolute;
  left: 0;
  width: 100%;
  background: white;
  padding: 1rem;
  box-shadow: 0 5px 10px rgba(0,0,0,0.1);
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 1rem;
}
.mega-menu li:hover .submenu {
  display: grid;
}
.mega-menu .submenu ul {
  list-style: none;
  padding: 0;
}
</style>

列表导航的JavaScript交互

为列表导航添加动态效果:

<ul class="accordion-nav">
  <li>
    <button class="accordion-toggle">产品</button>
    <ul class="accordion-content">
      <li><a href="/products/software">软件</a></li>
      <li><a href="/products/hardware">硬件</a></li>
    </ul>
  </li>
</ul>

<style>
.accordion-nav {
  list-style: none;
  padding: 0;
}
.accordion-toggle {
  width: 100%;
  text-align: left;
  padding: 0.5rem;
  background: none;
  border: none;
  cursor: pointer;
}
.accordion-content {
  list-style: none;
  padding-left: 1rem;
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease;
}
.accordion-content.show {
  max-height: 500px;
}
</style>

<script>
document.querySelectorAll('.accordion-toggle').forEach(button => {
  button.addEventListener('click', () => {
    const content = button.nextElementSibling;
    content.classList.toggle('show');
  });
});
</script>

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌