最直接方式是用 opacity 配合 @keyframes 实现渐隐渐现,opacity 取值 0–1,需明确定义动画名称并调用,注意初始状态与动画起始帧不同、避免 display: none、兼顾可访问性与性能。
opacity + @keyframes 实现渐隐渐现最直接的方式是结合 opacity 属性和 CSS 动画帧。注意:opacity 取值范围是 0(完全透明)到 1(完全不透明),不能用百分比或单词如 hidden。
opacity: 0 不影响元素的文档流位置,只是“看不见”,仍占空间、可响应事件(除非加 pointer-events: none)@keyframes 名称,并在元素上通过 animation 或其子属性调用opacity: 0,动画从 0 → 1)@keyframes fadeInOut {
0% { opacity: 0; }
50% { opacity: 1; }
100% { opacity: 0; }
}
.element {
animation: fadeInOut 2s ease-in-out infinite;
}
opacity 有时没动画效果?常见原因是浏览器跳过了过渡/动画——因为 opacity 没被声明为可动画属性,或缺少触发条件。
animation 声明,而不是仅靠 transition;如果用 transition,要配合 JS 触发类名切换或伪类(如 :hover)@keyframes,但支持 filter: alpha(opacity=xx) —— 现代项目基本可忽略display: none 状态,opacity 动画不会生效(它已脱离渲染树),应改用 visibility: hidden + opacity
transition 方式更适合手动控制显隐当需要 JS 控制「点击显示/隐藏」时,transition 比 @keyframes 更自然,因为它响应属性变化而非固定周期。
transition: opacity 0.3s ease,否则变化是瞬时的visibility 使用:先设 visibility: hidden; opacity: 0,再通过 JS 切换类名激活 visibility: visible; opacity: 1
opacity 过渡来“隐藏”交互区域——低 opacity 仍可能被点击,记得加 pointer-events: none 配合.fade-element {
opacity: 0;
visi
bility: hidden;
transition: opacity 0.3s ease, visibility 0.3s;
}
.fade-element.show {
opacity: 1;
visibility: visible;
}
opacity 是 CSS 合成属性(composited property),浏览器通常会将其提升到独立图层,动画较流畅。但仍有细节容易被忽略:
will-change: opacity 提前提示(但别滥用)opacity: 0 自动忽略内容,若内容真该被忽略,请同时加 aria-hidden="true" 或用 display: none(此时不能再靠 opacity 动画))或过长(> 0.4s),前者难感知,后者易打断用户操作节奏