纯 css 无法真正实现交互式「左右 + 淡入淡出」混合动画,因其缺乏动态状态响应能力:@keyframes 只能硬编码时序,radio 方案仅能伪错位显隐,而真滑动需每张图独立位移轨迹(如 -100%/0%/100%)并实时同步 opacity,必须由 js 控制类名触发 css 过渡。

纯 CSS 无法实现「左右 + 淡入淡出」的混合动画——因为「左右」是位移(transform: translateX()),「淡入淡出」是透明度(opacity),二者必须同时控制,而纯 CSS 轮播若只靠 @keyframes 或 :hover,没法在不 JS 干预下动态决定哪张图该进、哪张该退、哪张该透明。
为什么不能只用 opacity + transition 做“左右淡入淡出”
很多人误以为加个 transform: translateX() 就能“左右”,其实不是:如果所有图片都 position: absolute 叠在一起,改 translateX 只会让它们一起偏移,视觉上仍是重叠切换,看不出“从右滑入+淡出”的分离感。真正左右滑动需要每张图有独立位移轨迹(比如当前图在 0%,下一张在 100%,上一张在 -100%),这必须靠 CSS 动画时序编排,而纯 CSS 的 @keyframes 只能写死周期,无法响应用户点击或自动轮播的实时状态。
-
opacity和transform可以同时动画,但触发条件受限::hover 只能手动悬停,@keyframes无法暂停/跳帧/响应索引 - 所谓“左右淡入淡出”本质是两个动作同步:一张图
opacity: 0+translateX(-100%)(左滑出),另一张opacity: 1+translateX(0)(居中淡入) - 纯 CSS 方案(如 radio 按钮 + 相邻兄弟选择器)能切换,但无法做到「滑入同时淡入」「滑出同时淡出」的精确耦合,容易出现位移和透明度不同步,看起来卡顿或错位
@keyframes 实现固定节奏的左右滑入+淡出(无交互)
如果你只要自动循环、不要点击控制,可以用纯 CSS @keyframes 硬编码每张图的位移与透明度关键帧。它适合背景图轮播或 Banner 首屏动效,但必须提前知道图片数量,且首帧需手动对齐。
- 每张图用
<li>包裹,设为position: absolute,父容器overflow: hidden - 定义一个 3s 动画周期,例如 3 张图:第 0s–1s 图1居中不透明;第 1s–2s 图2从右滑入+淡入;第 2s–3s 图3从右滑入+淡入,图1同时左滑出+淡出
- 关键要给
nth-child(1)设animation-delay: -3s,让它在第一帧就处于激活态,避免白屏 - 动画属性必须同时包含
transform和opacity,例如:transform: translateX(0) opacity: 1→transform: translateX(-100%) opacity: 0
用 input[type="radio"] + CSS 模拟可点击的左右淡入淡出
这是目前最接近“纯 CSS 实现交互式左右淡入淡出”的方案,但它本质是“伪左右”:图片仍绝对定位叠加,靠 z-index 和 opacity 控制显隐,再用 transform 给“非当前项”加轻微位移(如 translateX(20px))制造左右错落感,不是真滑动。
- HTML 中用
<input type="radio" name="slide">控制选中状态,配合~或+选择器定位对应图片 - CSS 中为每张图设置不同
transform: translateX()偏移(如 -40px / 0 / +40px),再用opacity控制是否可见 - 缺点明显:无法实现“图A左滑出、图B右滑入”的连贯流水线;位移值是静态的,不是基于视口宽度响应式计算;移动端触摸不友好
- 响应式要点:把
translateX()改成vw单位(如translateX(-30vw)),并确保容器width: 100vw
真正可靠的方案:CSS 动画 + 极简 JS 控制类名
放弃“纯 CSS”执念,用 10 行 JS 切换类名,把复杂逻辑交给 CSS 动画,这才是兼顾可控性、响应式和性能的做法。90% 的生产环境轮播都这么干。
- HTML 结构保持简单:
<div class="carousel"> <img src="1.jpg"><img src="2.jpg"> </div> - CSS 定义两个类:
.fade-out(opacity: 0; transform: translateX(-100%);)和.fade-in(opacity: 1; transform: translateX(0);),都带transition: all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) - JS 只做三件事:给当前图加
.fade-out,等transitionend后移除它并给下一张加.fade-in,再更新currentSlide索引 - 响应式关键:CSS 中用
width: 100%; height: 0; padding-bottom: 56.25%(16:9)撑开容器,图片用object-fit: cover
别被“纯 CSS”这个词困住——真正的响应式左右淡入淡出,核心在于位移与透明度的时序对齐,而这个对齐点必须由 JS 标定。CSS 负责动画本身,JS 负责决策时机。漏掉这点,要么动画错乱,要么交互失效,要么在 Safari 上直接不触发 transitionend。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











