恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
shadcn-vue Carousel 组件完全指南:基于 Embla 的滑动轮播实战
首页
资讯中心
/
shadcn-vue Carousel 组件完全指南:基于 Embla 的滑动轮播实战
shadcn-vue Carousel 组件完全指南:基于 Embla 的滑动轮播实战
发布时间:2026/9/24 14:53:37
UI组件前端【免费下载链接】shadcn-vueVue port of shadcn-ui项目地址https://gitcode.com/gh_mirrors/sh/shadcn-vue点击查看免费下载本文围绕 shadcn-vue 项目GitHub 加速计划 / sh / shadcn-vueVue 3 版 shadcn-ui中开箱即用的Carousel轮播组件展开系统讲解其基于 Embla Carousel 的安装方式、五种子组件的组合用法、尺寸与间距控制、横纵方向切换、Embla 原生 Options 透传、API 实例获取、事件监听、Slot Props 与插件扩展等完整能力。读完本文你将能够在自己的 Vue 3 TypeScript Tailwind CSS 项目中独立接入并深度定制一套具备滑动、按键导航与自动播放能力的轮播组件同时理解其在仓库 apps/v4/registry/new-york-v4/ui/carousel 下的源码实现原理。组件概览由五个原子组件构成的轮播体系Carousel是一个建立在 Embla Carousel 之上的 Vue 组件集合。与一个大而全的轮播不同它被拆分为五个各司其职的原子组件全部位于仓库的apps/v4/registry/new-york-v4/ui/carousel目录组件职责源码位置Carousel轮播容器负责创建 Embla 实例、注入上下文、键盘导航Carousel.vueCarouselContent可滚动的视口容器持有 Embla 挂载节点CarouselContent.vueCarouselItem单个幻灯片条目默认占满整行宽度CarouselItem.vueCarouselNext下一个按钮内置箭头图标超出边界自动禁用CarouselNext.vueCarouselPrevious上一个按钮内置箭头图标超出边界自动禁用CarouselPrevious.vue这五个组件通过vueuse/core的createInjectionState建立依赖注入关系Carousel负责把 Embla 实例与滚动能力提供下去其余四个子组件通过useCarousel()统一注入使用。类型定义集中在 interface.ts包括opts、plugins、orientation三个 Props 和init-api一个 Emits核心逻辑则在 useCarousel.ts。安装CLI 与手动两种方式方式一CLI 命令推荐在你的 Vue 3 Tailwind CSS 项目中执行npx shadcn-vuelatest add carouselCLI 会自动完成依赖安装、组件文件复制与导入路径配置。方式二手动安装安装底层依赖。轮播的滑动、吸附与触摸交互全部由 Embla Carousel 驱动需要安装其 Vue 绑定npm install embla-carousel-vue复制组件源码。将仓库apps/v4/registry/new-york-v4/ui/carousel下的五个.vue文件以及useCarousel.ts、interface.ts一并复制到项目的components/ui/carousel目录。更新导入路径。组件内部使用了/lib/utilscn工具函数、/registry/new-york-v4/ui/button按钮组件与lucide/vue图标请根据你的项目结构调整这些 import 路径。基础用法五组件组合轮播的最基本用法是将五个组件按容器 → 内容 → 条目的层级嵌套再把前后按钮放在容器内script setup langts import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, } from /components/ui/carousel /script template Carousel CarouselContent CarouselItem.../CarouselItem CarouselItem.../CarouselItem CarouselItem.../CarouselItem /CarouselContent CarouselPrevious / CarouselNext / /Carousel /template从源码可以看到默认行为的细节Carousel根节点渲染为带roleregion、aria-roledescriptioncarousel的div并设置了tabindex0使其可聚焦以接收键盘事件见 Carousel.vueCarouselItem默认类为min-w-0 shrink-0 grow-0 basis-full即每个条目默认占满一行rolegroup与aria-roledescriptionslide保证了屏幕阅读器的可访问性见 CarouselItem.vue前后按钮本质是Button组件的outlineicon变体通过:disabled!canScrollNext在到达边界时自动禁用见 CarouselNext.vue。尺寸控制用 basis 工具类定义条目宽度默认每个CarouselItem占满一行想一次展示多张幻灯片可在条目上叠加basis系列工具类覆盖默认的basis-full。每个条目占轮播宽度的 1/3template Carousel CarouselContent CarouselItem classbasis-1/3 ... /CarouselItem CarouselItem classbasis-1/3 ... /CarouselItem CarouselItem classbasis-1/3 ... /CarouselItem /CarouselContent /Carousel /template响应式宽度小屏 1/2、大屏 1/3template Carousel CarouselContent CarouselItem classmd:basis-1/2 lg:basis-1/3 ... /CarouselItem CarouselItem classmd:basis-1/2 lg:basis-1/3 ... /CarouselItem CarouselItem classmd:basis-1/2 lg:basis-1/3 ... /CarouselItem /CarouselContent /Carousel /template由于CarouselItem的类合并走的是cn()内部基于 tailwind-mergebasis-1/3会正确覆盖默认的basis-full无需担心样式冲突。间距控制pl 与负 ml 的配对技巧轮播条目间距采用的是pl-[VALUE]条目左侧内边距-ml-[VALUE]内容容器左侧负外边距的配对方案而不是gap或grid布局。为什么这么做直接给CarouselContent使用gap或grid布局时间距计算涉及大量数学换算很难调对pl-[VALUE]配合-ml-[VALUE]使用起来直观得多。你也可以在自己的项目中按需调整这个方案。固定间距 1remtemplate Carousel CarouselContent class-ml-4 CarouselItem classpl-4 ... /CarouselItem CarouselItem classpl-4 ... /CarouselItem CarouselItem classpl-4 ... /CarouselItem /CarouselContent /Carousel /template响应式间距小屏 0.5rem、大屏 1remtemplate Carousel CarouselContent class-ml-2 md:-ml-4 CarouselItem classpl-2 md:pl-4 ... /CarouselItem CarouselItem classpl-2 md:pl-4 ... /CarouselItem CarouselItem classpl-2 md:pl-4 ... /CarouselItem /CarouselContent /Carousel /template这与源码中的默认实现完全一致CarouselContent内部默认携带-ml-4水平或-mt-4垂直CarouselItem默认携带pl-4水平或pt-4垂直你传入的类会通过cn()追加合并见 CarouselContent.vue。方向切换vertical 与 horizontal通过orientationprop 即可切换横纵方向该 prop 默认值为horizontal见 Carousel.vueCarousel orientationvertical | horizontal ... /Carousel方向的切换在底层是全局生效的useCarousel.ts中通过axis: orientation horizontal ? x : y把方向映射为 Embla 的滚动轴CarouselContent在垂直模式下改用-mt-4 flex-col布局CarouselItem在垂直模式下改用pt-4上内边距前后按钮在垂直模式下分别定位到容器上下两侧并旋转 90°见 CarouselPrevious.vue键盘导航也会随之切换水平方向监听ArrowLeft/ArrowRight垂直方向监听ArrowUp/ArrowDown见 Carousel.vue。Options透传 Embla 原生配置Carousel的optsprop 会原样透传给 Embla Carousel从而获得其全部能力例如对齐方式与无限循环template Carousel :opts{ align: start, loop: true, } CarouselContent CarouselItem.../CarouselItem CarouselItem.../CarouselItem CarouselItem.../CarouselItem /CarouselContent /Carousel /template从 useCarousel.ts 的源码可以看到opts与orientation派生出的axis会被合并后一起传给emblaCarouselVue()plugins则作为第二参数传入。常用 Options 还包括startIndex初始索引、dragFree自由拖拽、containScroll滚动吸附策略、breakpoints响应式配置等完整清单可查阅 Embla Carousel 官方 API Options 文档。访问底层 API 实例拿到 Embla 实例后即可调用scrollTo、scrollSnapList、selectedScrollSnap等底层方法官方提供两种方式。Method 1监听 init-api 事件在Carousel组件上使用init-api事件即可在初始化完成时拿到 API 实例。仓库中的 CarouselApi.vue 演示了如何用它实现第 N 张 / 共 M 张的幻灯片计数器通过api.scrollSnapList().length获取总数api.selectedScrollSnap() 1获取当前索引并在select事件中实时更新。Method 2通过模板 ref 访问也可以给Carousel设置模板 ref直接读取其暴露出的carouselApi属性script setup langts const carouselContainerRef refInstanceTypetypeof Carousel | null(null) function accessApi() { carouselContainerRef.value?.carouselApi.on(select, () {}) } /script template Carousel refcarouselContainerRef ... /Carousel /template该方法可行的原因在于 Carousel.vue 通过defineExpose显式暴露了canScrollNext、canScrollPrev、carouselApi、carouselRef、orientation、scrollNext、scrollPrev共 7 个响应式状态与方法。事件监听轮播自身不逐条转发 Embla 事件而是推荐先获取 API 实例再在其上监听事件。由于 API 在组件挂载后才就绪通常配合watch在实例可用后注册监听器并只监听一次script setup langts import { nextTick, ref, watch } from vue import { useCarousel } from /components/ui/carousel const api refCarouselApi() function setApi(val: CarouselApi) { api.value val } const stop watch(api, (api) { if (!api) return // Watch only once or use watchOnce() in vueuse/core nextTick(() stop()) api.on(select, () { // Do something on select. }) }) /script template Carousel init-apisetApi ... /Carousel /templateEmbla 的常用事件包括select选中项变化、init、reInit、scroll、slidesChanged、resize等更多事件说明可参考 Embla Carousel 官方 API Events 文档。值得注意的是仓库内部也正是靠这套事件机制工作的useCarousel.ts在onMounted时订阅init、reInit、select三个事件来同步canScrollPrev/canScrollNext状态见 useCarousel.ts。Slot Props扩展按钮的显隐逻辑Carousel通过默认插槽向外暴露一组响应式状态与方法可用v-slot接收后自定义按钮行为例如只在可滚动方向时显示对应按钮template Carousel v-slot{ canScrollNext, canScrollPrev } ... CarouselPrevious v-ifcanScrollPrev / CarouselNext v-ifcanScrollNext / /Carousel /template可用的 Slot Props 完整集合为carouselRef、carouselApi、canScrollNext、canScrollPrev、orientation、scrollNext、scrollPrev——这与defineExpose暴露的内容一一对应见 Carousel.vue。Plugins接入 Embla 官方插件pluginsprop 接收 Embla 插件数组最常见的场景是自动播放。先安装插件npm install embla-carousel-autoplay再在组件中传入script setup langts import Autoplay from embla-carousel-autoplay /script template Carousel classw-full max-w-xs :plugins[Autoplay({ delay: 2000, })] ... /Carousel /templateAutoplay的常用配置包括delay播放间隔毫秒数、stopOnInteraction用户交互后是否停止、stopOnMouseEnter鼠标悬停是否暂停等Embla 生态还提供embla-carousel-auto-scroll、embla-carousel-class-names、embla-carousel-fade等插件可通过pluginsprop 自由组合完整用法见 Embla Carousel 官方 Plugins 文档。源码原理速览最后将整个组件的运行机制串联起来看依赖注入Carousel挂载时调用useProvideCarousel(props, emits)内部通过createInjectionState创建上下文useCarousel()在子组件中注入该上下文若脱离Carousel使用会抛出useCarousel must be used within a Carousel /错误见 useCarousel.tsEmbla 初始化emblaCarouselVue返回[emblaNode, emblaApi]emblaNode绑定到CarouselContent的ref上作为滚动容器状态同步init/reInit/select事件驱动canScrollPrev/canScrollNext从而控制前后按钮的禁用态类型安全interface.ts 中的CarouselProps、CarouselEmits、CarouselApi类型贯穿组件与useCarousel保证opts、plugins与 Embla 的类型完全对齐。仓库apps/v4/components/demo下还提供了CarouselDemo.vue、CarouselSize.vue、CarouselSpacing.vue、CarouselOrientation.vue、CarouselApi.vue、CarouselPlugin.vue等完整可运行的示例配合本文内容对照阅读即可快速掌握 shadcn-vue Carousel 组件的全部用法。赞分享UI组件前端【免费下载链接】shadcn-vueVue port of shadcn-ui项目地址https://gitcode.com/gh_mirrors/sh/shadcn-vue点击查看免费下载相关推荐shadcn-svelte Carousel 组件完整实战指南基于 Embla 的触摸滑动轮播shadcn svelte Carousel 组件完整实战指南基于 Embla 的触摸滑动轮播 Carousel 是 shadcn svelte 提供的高质量UI组件前端CLI开发工具shadcn-vue Carousel 组件完全指南基于 Embla 的轮播、滑动与 API 深度解析shadcn vue Carousel 组件完全指南基于 Embla 的轮播、滑动与 API 深度解析 本文以 shadcn vue 仓库中 CarouselUI组件前端揭秘aspire-contextualsentence-multim-compsci多向量模型如何实现句子级精准匹配揭秘aspire contextualsentence multim compsci多向量模型如何实现句子级精准匹配 aspire contextualsen上一篇gopher-reading-list移动端适配在手机上高效阅读的技巧下一篇LND通道使用统计生成通道活跃度报告创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考