弹窗公告栏不能仅用 window.alert(),需自研 DOM 弹窗:用 div+CSS 实现可访问、可关闭浮层,配合 localStorage 版本化控制展示逻辑,并依用户行为与时机智能触发。

弹窗公告栏用 window.alert() 就够了吗?
不够。原生 alert() 会阻塞页面、无法自定义样式、不能点击链接或按钮,用户关闭后也无法记录行为。真要“公告栏”,得自己实现一个轻量 DOM 弹窗。
用 div + CSS 实现可关闭的浮层
核心是创建一个绝对定位的 div,初始 display: none,再用 JS 控制显隐。关键点不是“怎么弹出来”,而是“怎么不干扰主流程”:
- 给弹窗加
aria-modal="true"和role="dialog",提升基础可访问性 - 遮罩层(
overlay)必须设z-index高于页面其他内容,但别盲目设 9999 —— 查看当前页面最高z-index值再 +10 更稳妥 - 按
Esc关闭弹窗时,记得先event.stopPropagation(),避免触发外层滚动条跳回顶部
示例结构:
<div id="notice-modal" class="modal" aria-modal="true" role="dialog" tabindex="-1">
<div class="modal-overlay"></div>
<div class="modal-content">
<button class="close-btn" aria-label="关闭公告">×</button>
<p>系统将于今晚 23:00 进行维护</p>
</div>
</div>
localStorage 控制“不再提示”逻辑
公告通常只需对用户展示一次。直接读写 localStorage 最简单,但要注意:
立即学习“前端免费学习笔记(深入)”;
- 键名别用
"shown_notice"这种泛用名,建议带版本号,比如"notice_v2_maintenance",避免旧公告逻辑污染新公告 - 检查前先
try/catch,某些隐私模式下localStorage可能被禁用,直接访问会抛SecurityError - 不要在页面加载完成前就判断是否显示 —— 等
DOMContentLoaded触发后再读取,否则可能因 JS 加载顺序导致误判
自动触发时机:别在 window.onload 里直接弹
用户刚打开页面就弹公告,体验很差。更合理的策略是延迟 + 行为触发:
- 首次进入页面且停留超过 3 秒再显示,用
setTimeout+document.hasFocus()双重判断 - 如果用户正在输入(
input、textarea获得焦点),暂停弹出,避免打断操作 - 滚动到底部时再弹一次(适合长页面),监听
scroll时用requestAnimationFrame节流,别直接绑
真正难的不是“怎么弹出来”,而是“什么时候弹、对谁弹、弹完怎么收口”。样式和动画只是表层,交互节奏和状态管理才是落地时最常翻车的地方。



















