aside 侧边栏
<aside> 元素表示页面的辅助内容或补充内容,这些内容与页面的主内容间接相关。典型的用法包括侧边栏、广告区域、相关链接、作者介绍、标签云等。<aside> 的核心特征是:如果移除它,主内容的完整性不受影响。
前置知识
阅读本节前,建议先了解:section 章节
基础概念
什么是 aside
<aside> 是 HTML5 语义化标签,用于表示与主内容间接相关的辅助信息。它的隐式 ARIA 角色是 complementary,屏幕阅读器会将其识别为"补充内容" landmark。
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>aside 示例</title>
</head>
<body>
<main>
<article>
<h1>CSS Grid 布局教程</h1>
<p>Grid 是二维布局系统...</p>
</article>
<!-- 侧边栏:辅助内容 -->
<aside>
<h2>相关文章</h2>
<ul>
<li><a href="#">Flexbox 教程</a></li>
<li><a href="#">CSS 定位详解</a></li>
</ul>
</aside>
</main>
</body>
</html>aside 的隐式角色
| 属性 | 值 | 说明 |
|---|---|---|
| 隐式角色 | complementary | 补充内容 landmark |
| 可访问名称 | 通过 aria-label 或标题 | 需要可访问名称才能作为 landmark |
| 可移除性 | 移除后主内容不受影响 | 核心特征 |
适合放在 aside 中的内容
| 内容类型 | 示例 | 说明 |
|---|---|---|
| 相关链接 | "相关文章"、"推荐阅读" | 与主内容相关但不属于正文 |
| 侧边栏 | 网站侧边栏 | 传统的侧边栏内容 |
| 广告 | 广告横幅、赞助内容 | 商业性辅助内容 |
| 作者信息 | 作者简介、联系方式 | 关于文章作者的补充信息 |
| 标签/分类 | 标签云、分类列表 | 内容的元信息 |
| 引用块 | 拉引语(pull quote) | 文章中的突出引用 |
语法与使用
基本语法
html
<aside>
<h2>侧边栏标题</h2>
<!-- 辅助内容 -->
</aside>
<!-- 带 aria-label -->
<aside aria-label="侧边栏">
<!-- 辅助内容 -->
</aside>aside 的两种层级
<aside> 可以出现在两个层级:
- 页面级 aside:整个页面的侧边栏,与
<main>并列 - 内容级 aside:在
<article>内部,与该文章相关的辅助内容
html
<body>
<main>
<article>
<h1>文章标题</h1>
<p>正文内容...</p>
<!-- 内容级 aside:文章内的辅助信息 -->
<aside>
<h2>术语解释</h2>
<dl>
<dt>CSS</dt>
<dd>层叠样式表</dd>
</dl>
</aside>
</article>
</main>
<!-- 页面级 aside:页面侧边栏 -->
<aside>
<h2>热门文章</h2>
<ul>
<li><a href="#">文章1</a></li>
<li><a href="#">文章2</a></li>
</ul>
</aside>
</body>详细说明
典型的 aside 使用场景
1. 网站侧边栏
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>aside 侧边栏示例</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, sans-serif; color: #333; }
.site-header { background: #2c3e50; color: #fff; padding: 1rem 2rem; }
.site-header nav a { color: #bdc3c7; text-decoration: none; margin-left: 1rem; }
.page-layout {
max-width: 1100px; margin: 2rem auto; padding: 0 2rem;
display: grid; grid-template-columns: 1fr 280px; gap: 2rem;
}
main article {
background: #fff; padding: 2rem; border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
main h1 { margin-bottom: 1rem; }
/* aside 侧边栏 */
aside { display: flex; flex-direction: column; gap: 1.5rem; }
.sidebar-widget {
background: #fff; padding: 1.25rem; border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.sidebar-widget h2 {
font-size: 1rem; margin-bottom: 0.75rem; padding-bottom: 0.5rem;
border-bottom: 2px solid #3498db; color: #2c3e50;
}
.sidebar-widget ul { list-style: none; }
.sidebar-widget li { margin-bottom: 0.5rem; }
.sidebar-widget a { color: #3498db; text-decoration: none; font-size: 0.9rem; }
.sidebar-widget a:hover { text-decoration: underline; }
/* 搜索框 */
.sidebar-search {
display: flex; gap: 0.5rem;
}
.sidebar-search input {
flex: 1; padding: 0.5rem 0.75rem;
border: 1px solid #ddd; border-radius: 4px; font-size: 0.9rem;
}
.sidebar-search button {
padding: 0.5rem 1rem; background: #3498db; color: #fff;
border: none; border-radius: 4px; cursor: pointer;
}
/* 标签云 */
.tag-cloud { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.tag-cloud a {
padding: 0.25rem 0.75rem; background: #ecf0f1;
border-radius: 3px; font-size: 0.8rem; color: #555;
text-decoration: none;
}
.tag-cloud a:hover { background: #3498db; color: #fff; }
</style>
</head>
<body>
<header class="site-header">
<h1>TechBlog</h1>
<nav aria-label="主导航">
<a href="/">首页</a>
<a href="/blog">博客</a>
<a href="/about">关于</a>
</nav>
</header>
<div class="page-layout">
<main>
<article>
<h1>CSS Grid 布局完全指南</h1>
<p>CSS Grid 是二维布局系统,可以同时控制行和列的排布...</p>
<p>与 Flexbox 的一维布局不同,Grid 提供了更强大的布局能力...</p>
</article>
</main>
<!-- 页面级 aside -->
<aside aria-label="侧边栏">
<!-- 搜索 -->
<div class="sidebar-widget">
<h2>搜索</h2>
<div class="sidebar-search">
<input type="search" placeholder="搜索文章..." aria-label="搜索文章">
<button>搜索</button>
</div>
</div>
<!-- 作者信息 -->
<div class="sidebar-widget">
<h2>关于作者</h2>
<p>张三,前端开发工程师,专注于 CSS 和 JavaScript 开发。</p>
<address>
<a href="mailto:zhangsan@example.com">联系作者</a>
</address>
</div>
<!-- 热门文章 -->
<div class="sidebar-widget">
<h2>热门文章</h2>
<ul>
<li><a href="#">Flexbox 30 分钟入门</a></li>
<li><a href="#">CSS 变量完全指南</a></li>
<li><a href="#">响应式设计最佳实践</a></li>
<li><a href="#">JavaScript 事件机制</a></li>
</ul>
</div>
<!-- 标签云 -->
<div class="sidebar-widget">
<h2>标签</h2>
<div class="tag-cloud">
<a href="#">HTML</a>
<a href="#">CSS</a>
<a href="#">JavaScript</a>
<a href="#">Flexbox</a>
<a href="#">Grid</a>
<a href="#">响应式</a>
<a href="#">动画</a>
<a href="#">性能优化</a>
</div>
</div>
<!-- 广告 -->
<div class="sidebar-widget">
<h2>推广</h2>
<p>推荐学习资源:</p>
<a href="#">前端开发在线课程</a>
</div>
</aside>
</div>
</body>
</html>2. 文章内的 aside(术语解释)
html
<article>
<h1>Web 性能优化指南</h1>
<p>...</p>
<!-- 文章内的辅助信息 -->
<aside>
<h2>术语解释</h2>
<dl>
<dt>FCP</dt>
<dd>First Contentful Paint,首次内容绘制时间</dd>
<dt>LCP</dt>
<dd>Largest Contentful Paint,最大内容绘制时间</dd>
<dt>CLS</dt>
<dd>Cumulative Layout Shift,累积布局偏移</dd>
</dl>
</aside>
<p>...</p>
</article>3. 文章内的 aside(引用块)
html
<article>
<h1>人工智能发展简史</h1>
<p>人工智能的概念最早由...</p>
<aside>
<blockquote>
<p>"机器能思考吗?"这个问题是艾伦·图灵在1950年提出的。</p>
<cite>—— 艾伦·图灵,《计算机器与智能》</cite>
</blockquote>
</aside>
<p>此后,AI 经历了多次...</p>
</article>实战示例
aside 在不同位置的使用
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>aside 多位置示例</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, sans-serif; }
.site-header { background: #1a1a2e; color: #fff; padding: 1rem 2rem; }
.site-footer { background: #1a1a2e; color: #999; text-align: center; padding: 1rem; margin-top: 2rem; }
.content-wrapper {
max-width: 1000px; margin: 2rem auto; padding: 0 2rem;
display: grid; grid-template-columns: 1fr 250px; gap: 2rem;
}
article { max-width: 100%; }
article h1 { margin-bottom: 1rem; }
article h2 { margin: 1.5rem 0 0.75rem; }
/* 文章内 aside */
article aside {
background: #fffbeb; border-left: 3px solid #f59e0b;
padding: 1rem; margin: 1.5rem 0; border-radius: 0 4px 4px 0;
font-size: 0.9rem;
}
article aside h3 { margin-bottom: 0.5rem; color: #92400e; }
/* 侧边栏 aside */
.sidebar aside {
background: #f8f9fa; padding: 1.25rem; border-radius: 8px;
}
.sidebar aside h3 {
font-size: 0.95rem; margin-bottom: 0.75rem;
padding-bottom: 0.5rem; border-bottom: 2px solid #6366f1;
}
.sidebar aside ul { list-style: none; }
.sidebar aside li { margin-bottom: 0.4rem; }
.sidebar aside a { color: #4f46e5; text-decoration: none; font-size: 0.85rem; }
</style>
</head>
<body>
<header class="site-header">
<h1>DevWiki</h1>
</header>
<div class="content-wrapper">
<main>
<article>
<h1>JavaScript 闭包详解</h1>
<p>闭包(Closure)是 JavaScript 中一个重要的概念。简单来说,闭包是指一个函数能够记住并访问它的词法作用域,即使这个函数在其词法作用域之外执行。</p>
<!-- 文章内 aside:术语提示 -->
<aside>
<h3>词法作用域</h3>
<p>词法作用域是指函数在定义时(而非调用时)确定的作用域链。这意味着内部函数可以访问外部函数的变量。</p>
</aside>
<h2>闭包的基本示例</h2>
<p>下面是一个简单的闭包示例:</p>
<h2>闭包的应用场景</h2>
<p>闭包在实际开发中有很多应用场景...</p>
<!-- 文章内 aside:注意提示 -->
<aside>
<h3>注意</h3>
<p>过度使用闭包可能导致内存泄漏,因为闭包会保持对外部变量的引用,阻止垃圾回收。</p>
</aside>
<h2>总结</h2>
<p>闭包是 JavaScript 中强大而优雅的特性...</p>
</article>
</main>
<!-- 页面级 aside:侧边栏 -->
<aside class="sidebar">
<aside aria-label="目录">
<h3>本文目录</h3>
<ul>
<li><a href="#basics">闭包的基本示例</a></li>
<li><a href="#use-cases">应用场景</a></li>
<li><a href="#summary">总结</a></li>
</ul>
</aside>
<aside aria-label="推荐阅读">
<h3>推荐阅读</h3>
<ul>
<li><a href="#">JavaScript 作用域链</a></li>
<li><a href="#">let 和 var 的区别</a></li>
<li><a href="#">this 指向完全指南</a></li>
</ul>
</aside>
<aside aria-label="相关课程">
<h3>相关课程</h3>
<ul>
<li><a href="#">JavaScript 高级编程</a></li>
<li><a href="#">设计模式精讲</a></li>
</ul>
</aside>
</aside>
</div>
<footer class="site-footer">
<p>© 2024 DevWiki. All rights reserved.</p>
</footer>
</body>
</html>注意事项
常见错误
- 主内容放在 aside 中:aside 是辅助内容,不是主内容
html
<!-- 错误:文章正文放在 aside 中 -->
<aside>
<h1>文章标题</h1>
<p>这是文章的主要内容...</p> <!-- 不应该在 aside 中 -->
</aside>
<!-- 正确:主内容在 main 中 -->
<main>
<article>
<h1>文章标题</h1>
<p>这是文章的主要内容...</p>
</article>
</main>aside 内没有可识别的内容关系:aside 应该与主内容有间接关系
滥用 aside 代替 div:如果内容只是布局目的,使用 div
最佳实践
- 为 aside 添加 aria-label:当页面有多个 aside 时帮助区分
- 确保移除 aside 不影响主内容:这是 aside 的核心特征
- 在响应式设计中处理 aside:小屏幕下可以将 aside 移到内容下方
- aside 内使用 section 分组:当 aside 包含多个独立区域时
- 保持 aside 内容简洁:侧边栏不应包含过长的内容
下一节
继续学习:footer 页脚