纯css轮播成功的关键在于结构正确:input与.slide必须同父同级,name相同且首个input默认checked;容器需overflow:hidden,.slide设flex-shrink:0或float:left,宽度严格100%;自动轮播用@keyframes配合steps()和:hover/:focus-within暂停。

纯 CSS 轮播能跑起来,关键不是写多少动画,而是结构对不对、选择器能不能真正匹配到目标元素。90% 的失败案例,都是因为 input 和要控制的 .slide 不在同一个父容器里,导致 :checked ~ .slide 完全失效。
为什么 :checked ~ .slide 什么都没发生?
兄弟选择器 ~(通用兄弟)和 +(紧邻兄弟)只认「同级、同父、在它后面」的元素。常见错误结构是把 input 塞进一个 <div class="controls">,而 <code>.slide 放在另一个 <div class="slides"> 里——它们压根不是兄弟,是「表兄弟」,CSS 选不到。
<ul>
<li>✅ 正确做法:所有 <code>input[type="radio"] 和所有 .slide 必须是同一父元素的直接子节点
input 的 name 属性必须相同(如 name="slide"),否则无法互斥input 加 checked,对应第一个 .slide 初始状态设为 opacity: 1 或 z-index: 1
display: none 控制显隐——它会破坏文档流,影响后续兄弟选择器匹配
transform: translateX() 滑动时图片错位或挤成一排?
滑动方案依赖「所有幻灯片水平排列 + 容器位移」,但一旦尺寸或布局失控,translateX(-100%) 就会偏移不准。最常出问题的是 flex 子项被压缩,或者容器没设 overflow: hidden。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- ✅ 外层容器必须设
overflow: hidden,否则看到全部图片堆在外面 - ✅ 所有
.slide必须设flex-shrink: 0(若用display: flex)或float: left(若用浮动),否则会被 flex 默认的shrink缩小 - ✅ 每张图宽度严格为
width: 100%,且父容器宽度固定或由内容撑开(避免百分比计算失准) - ✅
transition写在被位移的容器上(如.slides),不是单张图上;否则动画不连贯
自动轮播一加交互就乱套?
纯 CSS 自动轮播靠 @keyframes 驱动 translateX,但动画是独立运行的,用户点按钮切换时它根本不知道——结果就是手动切到第2张,动画却还在执行第3帧,画面卡死或跳变。
- ✅ 用
:hover临时暂停:给整个轮播容器加animation-play-state: paused,再写&:hover { animation-play-state: running; } - ✅ 移动端没
:hover,得补:focus-within(比如把label包住input和按钮,聚焦时触发暂停) - ✅
animation-timing-function推荐用steps(3, end)(3 张图),比ease更精准停在整帧,避免过渡中停顿 - ❌ 别试图用
setInterval+ CSS 类切换来模拟自动轮播——那已经不是纯 CSS 方案了,而且破坏了零 JS 的初衷
真正难的不是写动画,是让结构稳如磐石:input 和 slide 同级、容器溢出隐藏、子项不收缩、交互暂停逻辑覆盖全设备。少一个条件,轮播就静音——不是代码错了,是 DOM 关系断了。










