可用css过渡+input range实现图片对比滑块:下层before图铺满,上层after图通过width或clip-path动态裁切,transition控制平滑变化,js监听input事件实时更新样式,兼顾语义、性能与无障碍。

用 CSS 过渡实现简易的图片对比滑块,核心是控制一张图片的可见宽度随滑块位置动态变化,并配合 transition 实现平滑缩放效果。不需要 JS 也能做基础版,但要拖拽交互必须用 JS 监听鼠标/触摸事件;CSS 负责视觉过渡和布局。
结构:双图层叠 + 滑块容器
将“Before”图作为背景或底层,“After”图放在上层并用 overflow: hidden 截断,再通过一个可拖动的滑块(<input type="range"> 或自定义 <div>)控制上层图片的显示宽度。
<ul>
<li>外层容器设为 <code>position: relative,宽高固定
position: absolute; inset: 0 铺满width: 100%,通过 clip-path 或父容器 overflow: hidden + 动态 width 控制露出区域<input type="range">,语义清晰、自带键盘支持,值范围设为 0–100
CSS 过渡关键:用 width + transition 实现平滑裁切
对上层图片(After)设置 transition: width 0.3s ease,再用 JS 把滑块值映射为百分比宽度(如 65 → width: 65%)。注意要给上层图加 display: block 和 height: 100%,避免塌陷。
- 不推荐用
transform: scaleX()做缩放——会拉伸图像,失真 - 避免用
left/right动画裁切,因涉及重排,性能不如width+overflow - 若想更现代,可用
clip-path: inset(0 0 0 X%)配合transition: clip-path,兼容性稍弱但更精准(Chrome/Firefox/Edge 支持良好)
JS 交互:绑定滑块并更新样式
监听 input 事件(非 change),实时响应拖拽。获取滑块值后,直接设置上层图片的 style.width 或 style.clipPath。
- 示例:
afterImg.style.width = `${slider.value}%` - 移动端需额外监听
touchstart/touchmove,或直接用input事件(现代移动端 range 输入也触发 input) - 可加
cursor: ew-resize到滑块区域,提升操作提示感
增强体验的小细节
让对比更直观、操作更顺手:
- 在滑块位置加一条细竖线(伪元素
::after),颜色对比强(如白边+半透黑底) - 滑块轨道设
background: linear-gradient(to right, #000 0%, #000 50%, transparent 50%)显示分界 - 禁用图片拖拽:
img { user-drag: none; -webkit-user-drag: none; } - 为无障碍考虑,给
<input>加aria-label="拖动滑块查看前后对比"











