最简文字卡片淡入方案是用opacity+transition:给容器设opacity:0、visibility:hidden和transition,通过切换.show类控制显隐;关键点包括容器需有明确宽高、transition写在初始类中、配合visibility防交互干扰。

文字卡片淡入:用 opacity + transition 最简实现
直接给文字卡片加 opacity: 0 和 transition: opacity 0.35s ease-out,再通过类名切换触发——这是最稳、兼容性最好、也最容易调试的方案。别一上来就写 @keyframes 或堆 JS,多数场景根本不需要。
关键点就三个:
- 文字卡片容器(比如 <div class="card">)必须有明确宽高或内容撑开,否则 <code>opacity 变化不可见
- transition 必须写在初始类里(如 .card),不能只写在 .card.show 里,否则反向隐藏没过渡
- 初始状态加 visibility: hidden 配合 opacity: 0,防止透明时仍可点击或占位干扰布局
示例 CSS:
.card {
opacity: 0;
visibility: hidden;
transition: opacity 0.35s ease-out, visibility 0.35s;
}
.card.show {
opacity: 1;
visibility: visible;
}
让卡片在页面加载后自动淡入
不用 JS 也能做,但得靠 animation-delay 配合 @keyframes;用 JS 更可控,尤其要避开“一闪而过”的坑。
常见错误是这样写:
el.style.opacity = '0';<br>el.style.opacity = '1';
→ 浏览器合并渲染,根本看不到过渡。正确做法是:
- 用
classList.add('show')触发,不操作内联样式 - 如果想延迟触发(比如等页面加载完 300ms),用
setTimeout,但别设太短( - 若卡片多个,别用
for循环同步加类,要用animation-delay或setTimeout错开起始时间,否则全挤在同一帧
JS 示例:
document.addEventListener('DOMContentLoaded', () => {<br> setTimeout(() => {<br> document.querySelectorAll('.card').forEach((card, i) => {<br> setTimeout(() => card.classList.add('show'), i * 150);<br> });<br> }, 300);<br>});
淡入后保持可见,再点按钮淡出:toggle 要小心
用 classList.toggle('show') 看似方便,但容易漏掉两个细节:动画结束后的状态残留,以及重复点击导致的节奏错乱。
transition 方案下,淡出没问题;但如果你用了 @keyframes + animation-fill-mode: forwards,再 toggle 类就失效了——因为 forwards 已把 opacity 锁死为 1,切掉类不会自动回退。
稳妥做法:
- 淡入淡出都走同一套
transition,靠.show类控制显隐 - 按钮事件里统一用
el.classList.toggle('show'),不额外干预样式 - 如果需支持键盘操作(比如空格键触发),记得给按钮加
tabindex="0"和role="button"
卡片内容跳动?不是动画问题,是排版没锁死
文字淡入时上下跳、左右晃,90% 不是 opacity 写错了,而是字体加载未完成、行高浮动或容器尺寸不稳定。
解决方法很具体:
- 给卡片设固定
line-height和min-height,比如line-height: 1.6; min-height: 2.4em; - 避免用
font-size: clamp(...)或响应式缩放字体,除非你已测试过所有断点下的高度一致性 - 慎用
will-change: opacity——现代浏览器基本不需要,反而可能引发合成层异常 - 如果卡片含图片,确保图片有宽高属性或
aspect-ratio,否则加载瞬间会重排
真正难调的从来不是动画本身,而是动画发生时,周围 DOM 是否安静。动效只是表象,稳定排版才是前提。











