滚动吸附轮播组件(scroll-snap 卡片轮播,吸附强度/自动播放可调)
滚动吸附轮播组件:纯 CSS scroll-snap 实现卡片自动吸附对齐,支持箭头导航、圆点指示、自动轮播与 proximity/mandatory 两种吸附模式,零依赖零图片,移动端触控体验流畅。
效果演示(真实可交互)
↔ 拖拽滑动或点击箭头浏览,卡片自动吸附对齐
页面秒开体验如飞
沉浸式视觉呈现
滑动自然吸附
纯 CSS + 原生 JS
适配任意屏幕
粤喵自研原创
完整代码
核心思路:容器开启 overflow-x: auto 与 scroll-snap-type: x mandatory,每张卡片设置 scroll-snap-align: start,浏览器即可在滚动停止时自动吸附到最近的卡片边缘,完全无需 JS 计算位移。
<div class="carousel" id="carousel">
<section class="card"><b>第 1 张</b><p>滚动吸附轮播</p></section>
<section class="card"><b>第 2 张</b><p>纯 CSS 吸附</p></section>
<section class="card"><b>第 3 张</b><p>零依赖</p></section>
</div>
.carousel {
overflow-x: auto; /* 横向滚动容器 */
scroll-snap-type: x mandatory; /* 强制吸附;proximity 为就近吸附 */
scrollbar-width: none; /* 隐藏滚动条,保持视觉干净 */
display: flex;
gap: 16px;
}
.card {
flex: 0 0 248px;
scroll-snap-align: start; /* 吸附对齐点:卡片左缘 */
border-radius: 16px;
padding: 22px;
background: linear-gradient(150deg, #6c8cff, #a96cff);
color: #fff;
}
// 箭头导航:按固定步长(卡片宽 + 间距)滚动
const view = document.getElementById('carousel');
const STEP = 264;
document.getElementById('next').addEventListener('click', () => {
view.scrollTo({ left: view.scrollLeft + STEP, behavior: 'smooth' });
});
// 圆点指示:滚动时用 rAF 节流计算当前卡片序号
view.addEventListener('scroll', () => {
requestAnimationFrame(() => {
const idx = Math.round(view.scrollLeft / STEP);
dots.forEach((d, i) => d.classList.toggle('is-active', i === idx));
});
});
参数说明
| 参数 | 位置 | 说明 |
|---|---|---|
| 吸附模式 | scroll-snap-type | x mandatory 强制吸附,x proximity 仅在接近时吸附 |
| 吸附对齐点 | scroll-snap-align | start/center/end,决定卡片停靠位置 |
| 卡片宽度 | flex: 0 0 248px | 需与 JS 步长常量保持一致 |
| 自动轮播间隔 | setInterval 参数 | 演示中 1500-6000ms 可调 |
| 吸附步长 | STEP 常量 | 卡片宽 + 间距,箭头导航按此滚动 |
兼容性与性能
- 核心依赖
scroll-snap,Chrome 69+、Safari 11+、Firefox 68+、Edge 全系支持,旧浏览器退化为普通横向滚动,不影响阅读 - 吸附与平滑滚动均由浏览器原生合成器处理,比 JS 逐帧位移动画更省电、更流畅
- 滚动监听采用 rAF 节流,圆点更新不会造成布局抖动
- 演示使用内嵌滚动容器(
overflow-x: auto),无需整页滚动即可预览效果 - 隐藏滚动条后请保留键盘可操作性:容器可聚焦后使用方向键滚动
常见问题
Q: 为什么卡片没有吸附效果? 常见原因是父级容器未设 overflow-x: auto,或吸附属性写在了卡片而非容器上。请确认 scroll-snap-type 在滚动容器上、scroll-snap-align 在子卡片上,且卡片不是 position: fixed。
Q: mandatory 和 proximity 怎么选? 浏览器的相册、轮播场景用 mandatory 体验更干脆;内容较长、需要中途停留阅读时用 proximity 更宽松,不会强迫手指「贴边」。
Q: 自动轮播在移动端卡顿或跳帧? 自动轮播走 scrollTo({ behavior: 'smooth' }),滚动由浏览器接管,通常不卡。若在低端机出现丢帧,可适当加大轮播间隔,或改用 behavior: 'auto' 配合 CSS scroll-behavior: smooth。
Q: 可以商用吗? 可以。本组件为粤喵自研原创代码,免费商用无需署名,可自由改色、改卡片数量与吸附模式。
许可与来源
- 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
- 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
- 首次发布:2026-09-01 · 最近更新:2026-09-01
- 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
- 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理
常见问题
这个组件可以商用吗?
可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。
浏览器兼容性如何?
支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。
怎么修改动画参数?
直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。