列表在导航中的应用
列表在导航中的应用
导航是网站的重要组成部分,它帮助用户快速找到所需内容。列表元素(<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
上一篇:目录列表和菜单列表(已废弃)