Bootstrap 5 的 .fade 类仅提供过渡属性,需配合 .show 和 JS 触发 close() 才能实现淡出动画;若需复用警告框,应改用 classList 控制 d-none 与 show 状态,并确保自定义 CSS 含 transition。

不能只加 .fade 类就指望它自动淡出——Bootstrap 5 的 .fade 只提供过渡属性,不控制触发时机,也不带定时逻辑。
为什么加了 .fade 和 .show 还是硬切?
因为 Bootstrap 的淡出动画只在「主动关闭」时触发,比如点击 data-bs-dismiss="alert" 按钮,或调用 alert.close()。页面加载后它不会自己动。
- 只写 :元素默认
opacity: 0,根本看不见- 只写
:没fade就没transition,close()会直接移除 DOM,无动画- 必须同时有
fade和show,且后续通过 JS 触发关闭流程,动画才走通用
alert.close()实现自动淡出的正确姿势这是最贴近 Bootstrap 原生机制的做法,但要注意它默认会删 DOM 元素。
- 确保 HTML 中包含
data-bs-dismiss="alert"(哪怕按钮隐藏),否则插件不初始化,close()失效 - 必须等 DOM 加载完成再操作:
document.addEventListener('DOMContentLoaded', ...) - 用
bootstrap.Alert.getInstance(el)获取实例,别直接调el.alert('close')(非 jQuery 环境下无效) - 示例代码:
const alertEl = document.getElementById('my-alert'); if (alertEl) { const bsAlert = bootstrap.Alert.getInstance(alertEl); setTimeout(() => bsAlert?.close(), 2500); }注意:
close()执行后,alertEl会被remove()掉,不可复用。想复用同一个警告框?改用
classList控制显隐这是更可控、更适合表单反馈等重复场景的方式,绕过
close()的销毁逻辑。- HTML 初始状态:加
d-none,不加show(避免页面闪一下) - 显示前:先
classList.remove('d-none'),再classList.add('show') - 自动隐藏:用
setTimeout(() => alertEl.classList.add('d-none'), 2500) - 关键 CSS 必须存在:
.alert.fade { transition: opacity .15s linear; },否则d-none → show → d-none过程中无淡出
自定义 CSS 动画比依赖
.fade更灵活,但要避开几个坑比如想加位移、进度条,或统一控制多个 Alert 的动画节奏,就得自己写
@keyframes。- 动画名别用
fade或show,推荐alert-fade-out,避免和 Bootstrap 内部类冲突 - 务必加
transform(如translateY(-10px)),纯改opacity会导致点击区域残留 - 动画结束后元素还在 DOM 里,必须手动清理:
animationend事件比setTimeout更准,但 iOS Safari 有时不触发,建议 fallback 到setTimeout - 别让
.fade和自定义动画类共存,CSS 优先级容易打架,导致闪烁或失效
真正难的不是写动画,而是把「显示→等待→触发关闭→动画播完→DOM 清理」这整条链路对齐。漏掉
data-bs-dismiss、错放setTimeout时机、或复用时没清d-none,都会让动画卡在半路。 - 只写
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











