字幕应使用 position: absolute 叠放于 position: relative 容器内,统一 top: 0; left: 0;,并默认声明 opacity: 0 和 transition: opacity 0.3s ease-in-out,通过 class 切换控制显隐,淡出后须监听 transitionend 事件再操作 display 或 visibility。

字幕元素必须用 position: absolute 叠放
HTML 里没有原生“字幕标签”,通常用 正确做法:所有字幕包裹在同一个容器内,每个字幕元素设 很多人把 正确写法是:默认状态就声明 真正起作用的是“让浏览器分两帧处理”。轻量方案是插入强制重排语句;更推荐用 class 切换,交由 CSS 自动管理状态。 很多人想“淡出后彻底释放空间”,就同时写 真正安全的做法是等动画自然结束,再操作 DOM 或布局属性。关键不是“怎么设”,而是“什么时候设”。
真正容易被忽略的是:opacity 初始值和 transition 声明必须共存于同一份 CSS 规则中,且该规则不能被伪类(如 模拟字幕,但若不叠在一起,淡入淡出会撑开页面、导致布局跳动。常见错误是让每行字幕按文档流排列,结果动画时高度反复变化。position: absolute,并统一 top: 0; left: 0;。这样它们视觉上重叠,opacity 切换才不会影响其他内容。
position: relative,否则 absolute 会相对 body 定位visibility: hidden 或 display: none 控制显隐——前者不触发过渡,后者直接中断动画line-height 和 min-height 防止上下抖动transition: opacity 必须写在默认状态里
transition: opacity 0.3s ease 写在 .show 类里,结果首次加载或切换时动画完全不触发。浏览器需要明确的“起点”,而这个起点只能来自未加类的默认样式。opacity: 0 和 transition: opacity 0.3s ease-in-out;再用类(如 .active)只改 opacity: 1。
transition: all 0.3s ease——它会让 margin、color 等隐式变化也参与过渡,造成抽搐0.25s–0.4s,太短看不出效果,太长拖慢节奏JS 控制时别直接连写两行 style.opacity
el.style.opacity = '0'; el.style.opacity = '1'; 这种写法几乎必然失败。浏览器会合并这两次样式变更,在同一渲染帧完成,中间没有机会触发过渡。
el.classList.remove('active'),再读取 el.offsetHeight,最后 el.classList.add('active')
setTimeout(() => ..., 0) 处理单个元素——它依赖事件循环,不如重排可靠animation-delay 错开起始时间淡出后必须监听 transitionend 才能安全隐藏
opacity: 0 和 visibility: hidden,结果动画中途卡住。因为 visibility 不支持过渡,一设就立刻生效,opacity 过渡直接被截断。
transitionend 事件,且检查 event.propertyName === 'opacity',防止其他过渡干扰display: none 必须放在事件回调里,不能提前写max-height + overflow: hidden,但得预设一个足够大的 max-height 值(比如 max-height: 200px):hover)或媒体查询隔离——否则浏览器找不到“已知起点”,动画就静默失效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











