kliping.pro
  • Docs
  • Directory
  • Colors
  • Typeset
Docs
    • Accordion
    • Action Bar
    • Alert
    • Alert Dialog
    • Angle Slider
    • Aspect Ratio
    • Attachment
    • Avatar
    • Avatar Group
    • Badge
    • Badge Overflow
    • Banner
    • Breadcrumb
    • Bubble
    • Button
    • Button Group
    • Calendar
    • Card
    • Carousel
    • Chart
    • Checkbox
    • Checkbox Group
    • Chip
    • Circular Progress
    • Client Only
    • Collapsible
    • Color Picker
    • Color Swatch
    • Combobox
    • Combobox Advanced
    • Command
    • Compare Slider
    • Composition
    • Context Menu
    • Cropper
    • Data Grid
    • Data Table
    • Data Table Advanced
    • Date Picker
    • Dialog
    • Direction Provider
    • Drawer
    • Dropdown Menu
    • Editable
    • Empty
    • Field
    • File Upload
    • Form
    • FPS
    • Gauge
    • Hitbox
    • Hover Card
    • Input
    • Input Group
    • Input OTP
    • Item
    • Kanban
    • Kbd
    • Kbd Advanced
    • Key Value
    • Label
    • List
    • Listbox
    • Map
    • Marker
    • Marquee
    • Mask Input
    • Masonry
    • Media Player
    • Mention
    • Menubar
    • Message
    • Message Scroller
    • Native Select
    • Navigation Menu
    • Number Field
    • Pagination
    • Pending
    • Phone Input
    • Pin Input
    • Popover
    • Portal
    • Presence
    • Progress
    • QR Code
    • Questionnaire
    • Radio Group
    • Range Calendar
    • Rating
    • Relative Time Card
    • Resizable
    • Responsive Dialog
    • Scroll Area
    • Scroll Spy
    • Scroller
    • Segmented Input
    • Select
    • Selection Toolbar
    • Separator
    • Sheet
    • Sidebar
    • Skeleton
    • Slider
    • Software Purchase Card
    • Sonner
    • Sortable
    • Speed Dial
    • Spinner
    • Stack
    • Stat
    • Status
    • Stepper
    • Stepper Advanced
    • Swap
    • Switch
    • Table
    • Tabs
    • Tags Input
    • Tags Input Advanced
    • Textarea
    • Time Picker
    • Timeline
    • Toast
    • Toggle
    • Toggle Group
    • Tooltip
    • Tour
    • Typography
    • Visually Hidden
    • Visually Hidden Input

Carousel

PreviousNext

Carousel dengan animasi dan gestur geser, dibangun memakai Embla.

View 11 variants
1
2
3
4
5

Installation ​

pnpm dlx shadcn-vue@latest add carousel

Pasang dependensi berikut:

pnpm add embla-carousel-vue

Salin dan tempel kode sumber di GitHub ke project Anda.

Sesuaikan path import dengan struktur project Anda.

Usage ​

vue
<script setup lang="ts">
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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Examples ​

Ukuran ​

Untuk mengatur ukuran item, pakai utility class basis pada <CarouselItem />.

1
2
3
4
5
vue
// 33% of the carousel width.
<template>
  <Carousel>
    <CarouselContent>
      <CarouselItem class="basis-1/3">
        ...
      </CarouselItem>
      <CarouselItem class="basis-1/3">
        ...
      </CarouselItem>
      <CarouselItem class="basis-1/3">
        ...
      </CarouselItem>
    </CarouselContent>
  </Carousel>
</template>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vue
// 50% on small screens and 33% on larger screens.
<template>
  <Carousel>
    <CarouselContent>
      <CarouselItem class="md:basis-1/2 lg:basis-1/3">
        ...
      </CarouselItem>
      <CarouselItem class="md:basis-1/2 lg:basis-1/3">
        ...
      </CarouselItem>
      <CarouselItem class="md:basis-1/2 lg:basis-1/3">
        ...
      </CarouselItem>
    </CarouselContent>
  </Carousel>
</template>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Jarak Antar Item ​

Untuk mengatur jarak antar item, kami memakai utility pl-[NILAI] pada <CarouselItem /> dan -ml-[NILAI] bernilai negatif pada <CarouselContent />.

Kenapa begitu: kami sempat mencoba properti gap atau layout grid pada <CarouselContent />, tapi itu menuntut perhitungan dan pikiran ekstra untuk mendapatkan jarak yang pas. Utility pl-[NILAI] dan -ml-[NILAI] ternyata jauh lebih mudah dipakai.

Anda bebas mengubahnya di project sendiri kalau memang perlu.

1
2
3
4
5
vue
<template>
  <Carousel>
    <CarouselContent class="-ml-4">
      <CarouselItem class="pl-4">
        ...
      </CarouselItem>
      <CarouselItem class="pl-4">
        ...
      </CarouselItem>
      <CarouselItem class="pl-4">
        ...
      </CarouselItem>
    </CarouselContent>
  </Carousel>
</template>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vue
<template>
  <Carousel>
    <CarouselContent class="-ml-2 md:-ml-4">
      <CarouselItem class="pl-2 md:pl-4">
        ...
      </CarouselItem>
      <CarouselItem class="pl-2 md:pl-4">
        ...
      </CarouselItem>
      <CarouselItem class="pl-2 md:pl-4">
        ...
      </CarouselItem>
    </CarouselContent>
  </Carousel>
</template>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Orientasi ​

Pakai prop orientation untuk menentukan arah carousel.

1
2
3
4
5
vue
<Carousel orientation="vertical | horizontal">
  ...
</Carousel>

Opsi ​

Opsi bisa diteruskan ke carousel lewat prop opts. Keterangan lengkapnya ada di dokumentasi Embla Carousel.

vue
<template>
  <Carousel
    :opts="{
      align: 'start',
      loop: true,
    }"
  >
    <CarouselContent>
      <CarouselItem>...</CarouselItem>
      <CarouselItem>...</CarouselItem>
      <CarouselItem>...</CarouselItem>
    </CarouselContent>
  </Carousel>
</template>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

API ​

Cara 1 ​

Pakai emit @init-api pada komponen <Carousel /> untuk menangkap instance API-nya.

1
2
3
4
5
Slide 0 of 0

Cara 2 ​

Bisa juga diakses lewat template ref pada komponen <Carousel />.

vue
<script setup lang="ts">
const carouselContainerRef = ref<InstanceType<typeof Carousel> | null>(null)

function accessApi() {
  carouselContainerRef.value?.carouselApi.on('select', () => {})
}
</script>

<template>
  <Carousel ref="carouselContainerRef">
    ...
  </Carousel>
</template>
1
2
3
4
5
6
7
8
9
10
11
12
13

Event ​

Event bisa didengarkan lewat API. Untuk mendapatkan instance API-nya, pakai emit @init-api pada komponen <Carousel />.

vue
<script setup lang="ts">
import { nextTick, ref, watch } from 'vue'
import { useCarousel } from '@/components/ui/carousel'

const api = ref<CarouselApi>()

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-api="setApi">
    ...
  </Carousel>
</template>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

Keterangan lengkap soal event ada di dokumentasi Embla Carousel.

Slot Props ​

Slot props yang reaktif seperti carouselRef, canScrollNext..Prev, scrollNext..Prev bisa Anda ambil lewat direktif v-slot pada <Carousel v-slot="slotProps" /> untuk memperluas fungsinya.

vue
<template>
  <Carousel v-slot="{ canScrollNext, canScrollPrev }">
    ...
    <CarouselPrevious v-if="canScrollPrev" />
    <CarouselNext v-if="canScrollNext" />
  </Carousel>
</template>
1
2
3
4
5
6
7

Plugins ​

Pakai prop plugins untuk menambahkan plugin ke carousel.

pnpm add embla-carousel-autoplay
vue
<script setup lang="ts">
import Autoplay from 'embla-carousel-autoplay'
</script>

<template>
  <Carousel
    class="w-full max-w-xs"
    :plugins="[Autoplay({
      delay: 2000,
    })]"
  >
    ...
  </Carousel>
</template>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5

Keterangan lengkap soal plugin ada di dokumentasi Embla Carousel.

PreviousCardNext Chart

On This Page

InstallationUsageExamplesUkuranJarak Antar ItemOrientasiOpsiAPICara 1Cara 2EventSlot PropsPlugins
Dirilis di bawah lisensi MIT. Ditulis ulang untuk Vue dari shadcn-vue, shadcn-ui-blocks, dan shadcn-hooks. Hak cipta © 2026 Kliping