纯 css 实现 onboarding 的核心是用 radio/checkbox 控制步骤状态,通过 :checked + ~ 选择器切换 section 显示隐藏;需保证 input 在对应 section 前、避免 dom 中断、用 display: none 替代 visibility: hidden,并注意移动端 viewport 和语义化可访问性。

如何用纯 HTML + CSS 实现轻量 Onboarding 引导页
不需要框架、不依赖 JS 也能做出可用的 Onboarding 页面——关键在于把「步骤状态」和「页面切换」用语义化结构 + CSS 控制住。核心思路是:用 <section></section> 切分每一页,用 radio 或 checkbox 模拟当前步,再靠 :checked + ~ 或 + 选择器触发显示/隐藏。
为什么不用 JavaScript 更稳妥
很多新手一上来就写 onclick 切换 display: none,结果遇到两个问题:一是前进/后退按钮逻辑混乱,二是无法用浏览器后退键返回上一步,三是屏幕阅读器识别困难。纯 CSS 方案天然支持键盘导航(Tab + Space),且所有状态都反映在 URL 片段(配合 id 锚点)或表单控件中,可被搜索引擎和辅助技术感知。
-
input[type="radio"]天然互斥,适合线性流程(如 1→2→3) -
input[type="checkbox"]更适合非线性跳转(比如“跳过”或“返回第 1 步”) - 每个
input必须有唯一id,对应label[for]或后续section的显隐控制
常见错误:点击下一步没反应 or 样式错乱
绝大多数问题出在 CSS 选择器链断裂或 DOM 顺序不匹配。Onboarding 页面对 HTML 结构非常敏感:
- 必须保证
input在它要控制的section之前(否则~无法向上选中) - 如果用了
input + section,那section必须紧跟在input后面,中间不能插其他块级元素 - 别用
visibility: hidden隐藏未激活页——它仍占布局空间,会导致按钮错位;改用display: none或opacity: 0; pointer-events: none - 移动端记得加
viewportmeta,否则width=device-width失效,引导页文字挤成一团
一个可直接复制的最小可行示例
以下代码实现三步引导:欢迎页 → 权限说明 → 完成。点击“下一步”即跳转,支持空格键操作,无 JS:
<div class="onboarding">
<input type="radio" name="step" id="s1" checked><input type="radio" name="step" id="s2"><input type="radio" name="step" id="s3"><section class="step"><h2>欢迎!</h2>
<p>这是第一步</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill9263" title="Html2md"><img
src="https://img.php.cn/upload/skill/000/000/081/179249945220127.jpg" alt="Html2md" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill9263" title="Html2md" class="overflowclass">Html2md</a>
<p class="overflowclass">使用 Readability + Turndown 将 HTML 页面转换为干净的、Agent 友好的 Markdown。去除导航栏、广告、页脚、Cookie 横幅、社交按钮等干扰元素。支持 URL...</p>
</div>
<a rel="nofollow" href="/xiazai/skill9263" title="Html2md" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<label for="s2" class="btn">下一步</label>
</section><section class="step"><h2>我们需要访问相册</h2>
<p>用于上传头像</p>
<label for="s3" class="btn">继续</label>
<label for="s1" class="btn">上一步</label>
</section><section class="step"><h2>完成!</h2>
<p>现在可以开始使用了</p>
</section>
</div>
<style>
.onboarding .step { display: none; }
#s1:checked ~ .step:nth-of-type(1),
#s2:checked ~ .step:nth-of-type(2),
#s3:checked ~ .step:nth-of-type(3) {
display: block;
}
.btn { display: inline-block; padding: 8px 16px; background: #007bff; color: white; cursor: pointer; }
</style>
注意:nth-of-type 依赖 section 的实际顺序,如果中间加了注释或空行,可能错位。更稳的方式是给每个 section 加 class(如 step-1),然后用 #s1:checked ~ .step-1 精确控制。
真正难的不是写出第一版,而是让每一步的动效、焦点管理、响应式断点、以及和真实登录流程的衔接不出错——这些细节一旦漏掉,用户卡在第二步就关掉了页面。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










