Carousel
Dokunmatik ekranda ivmeli, fare sürüklemeli, ok tuşlu, noktalı, küçük resimli yerel scroll-snap slaytları ve gerektiğinde duran bir otomatik oynatma.
pnpm dlx shadcn@latest add https://hextaui.com/r/carousel.jsonBileşeni, HextaUI tema token'larını ve bileşenin bağımlı olduğu tüm HextaUI bileşenlerini ekler.
Henüz eklemediyseniz tema token'larını global CSS'inize ekleyin.
Bağımlılıkları yükleyin.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnAşağıdaki kodu kopyalayıp projenize yapıştırın.
components/ui/carousel.tsx components/ui/button.tsx components/ui/number-flow.tsx lib/motion.ts İçe aktarma yollarını proje yapılandırmanıza uyacak şekilde güncelleyin.
Slaytlar CSS scroll snap ile yerel olarak kayar; böylece dokunmatik ivme ve trackpad kaydırması platform gibi hissettirir. Fare sürükleyebilir ve ok tuşları her seferinde bir slayt ilerler.
API
Carousel API'sini almak için setApi geçin, sonra kendi konumunuzu göstermek için select'i dinleyin. Next son slaytta devre dışıdır ancak odağı korur.
Görünümde birkaç tane
Öğeler kendi basis değerini belirler. Boşluklar spacing prop'undan gelir; bu yüzden her basis'te tam kalır.
Noktalar ve sayaç
Etkin nokta, slaytlar kaydıkça uzar ve komşuları yer açar. Sayaç yalnızca değişen basamağı döndürür.
Otomatik oynatma
autoplay varsayılan olarak kapalıdır ve azaltılmış hareketle kapalı kalır. Üzerine gelince, klavye odağında, dokunmada, sürüklemede, gizli bir sekmede veya görünümden çıkıldığında duraklar; zamanlayıcı çalışırken etkin nokta dolar.
Küçük resimler
<CarouselThumbnails /> ana carousel'i izler ve etkin küçük resmi görünür tutmak için kayar.
Dikey
orientation="vertical" için <CarouselContent /> üzerinde bir yükseklik gerekir. Düğmeler üste ve alta taşınır.
Kontrollü
index ve onIndexChange geçin. Kaydırma state'inizi günceller, state'iniz de carousel'i kaydırır.
Başa sarma ve başlangıç dizini
rewind son slayttaki Next'i ilkine geri gönderir. defaultIndex bir slaytta kaydırma animasyonu olmadan açılır.
Bağlantılar ve odaklanabilir içerik
Bir bağlantıyı fareyle sürüklemek, onu açmadan kaydırır. Ekran dışındaki bir slayta Tab ile gelmek onu görünüme kaydırır.
Slayt ekleme ve kaldırma
Noktalar, sayaç ve düğmeler slaytlar gelip gittikçe güncellenir.
İç içe
Ok tuşları, sürükleme ve noktalar yalnızca içinde bulunduğunuz carousel'i hareket ettirir.
Uzun içerik ve tek slayt
Kırılmayan metin slaytının içinde sarar. Tek slaytla noktalar gizlenir ve düğmeler devre dışı kalır.
Sağdan sola
Slaytlar sağdan başlar, oklar ters döner, Sol ok tuşu ileri gider ve noktalar sağdan dolar.
Odak carousel'in herhangi bir yerindeyken tuşlar çalışır; metin alanları ve iç içe carousel'ler hariç.
| Tuş | Action |
|---|---|
| → | Sonraki slayt. Sağdan sola düzenlerde önceki. Dikey carousel'lerde ↓. |
| ← | Önceki slayt. Sağdan sola düzenlerde sonraki. Dikey carousel'lerde ↑. |
| Tab | Düğmeler, etkin nokta ve slaytların içeriği arasında gezinir; ekran dışındaki slaytları görünüme kaydırır. |
| EnterSpace | Odaktaki düğmeyi, noktayı veya küçük resmi etkinleştirir. |
- Kök, carousel olarak tanımlanan bir
region'dır. Ona biraria-labelverin. - Her öğe, slayt olarak tanımlanan ve “3 of 5” gibi konumuyla etiketlenen bir
group'tur. - Kibar (polite) bir canlı bölge, klavye veya düğmeyle gezindikten sonra yeni slayt'ı duyurur ve otomatik oynatma sürerken sessiz kalır.
- Noktalar ve küçük resimler tek bir tab durağı kullanır ve odak etkin olanı izler.
- Previous ve Next devre dışıyken de odaklanabilir kalır; böylece odak iki uçta da kaybolmaz.
| Prop | Tür | Varsayılan |
|---|---|---|
orientation | "horizontal" | "vertical" | "horizontal" |
spacingSlaytlar arasındaki boşluk. | "none" | "sm" | "default" | "lg" | "default" |
index | number | – |
defaultIndex | number | 0 |
onIndexChange | (index: number) => void | – |
rewindSon slayttan ilkine sarın. | boolean | false |
mouseDragSlaytları fareyle sürüklemeye izin verin. | boolean | true |
autoplayBir zamanlayıcıyla ilerler. delay varsayılanı 5000ms, asgari 1000ms. | boolean | { delay?: number } | false |
setApi | (api: CarouselApi) => void | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Öznitelik | Açıklama |
|---|---|
data-slot="carousel" | CSS'te kökü hedefleyin. |
data-orientation | Yönelim. |
--carousel-spacing | spacing ile ayarlanan, slaytlar arasındaki boşluk. |
| Prop | Tür | Varsayılan |
|---|---|---|
classNameSlaytları tutan şeride uygulanır. | string | – |
viewportClassNameKayan görünüm alanına uygulanır. | string | – |
| Öznitelik | Açıklama |
|---|---|
data-slot="carousel-content" | Kayan görünüm alanı. |
data-slot="carousel-container" | İçindeki şerit. |
data-scrollable | Birden fazla konum olduğunda bulunur. |
data-dragging | Fareyle sürükleme sürerken bulunur. |
| Prop | Tür | Varsayılan |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Öznitelik | Açıklama |
|---|---|
data-slot="carousel-item" | Görünümde birkaç tane göstermek için basis-* ayarlayın. |
İkisi de bir <Button /> oluşturur ve onun prop'larını kabul eder. İçeriğin dışında dururlar; bu yüzden carousel'in çevresinde yer bırakın.
| Prop | Tür | Varsayılan |
|---|---|---|
variant | ButtonProps["variant"] | "outline" |
size | ButtonProps["size"] | "icon-sm" |
childrenYönelimi ve yönü izler. | ReactNode | Arrow icon |
| Öznitelik | Açıklama |
|---|---|
data-slot="carousel-previous" | “Previous slide” olarak etiketlenir. |
data-slot="carousel-next" | “Next slide” olarak etiketlenir. |
data-disabled | İki uçtan birinde bulunur. Düğme odaklanabilir kalır. |
| Prop | Tür | Varsayılan |
|---|---|---|
aria-label | string | "Choose slide" |
| Öznitelik | Açıklama |
|---|---|
data-slot="carousel-dots" | Noktaların grubu. Tek konumda gizlenir. |
data-slot="carousel-dot" | Her nokta. Etkin olanda aria-current bulunur. |
--dot-active | 0 ile 1 arası; kaydırma sırasında bir noktanın ne kadar etkin olduğu. |
| Öznitelik | Açıklama |
|---|---|
data-slot="carousel-counter" | Geçerli konumu toplamın üzerinde, dönen bir basamakla gösterir. |
| Prop | Tür | Varsayılan |
|---|---|---|
variant | ButtonProps["variant"] | "ghost" |
size | ButtonProps["size"] | "icon-sm" |
| Öznitelik | Açıklama |
|---|---|
data-slot="carousel-autoplay-toggle" | “Pause slideshow” veya “Play slideshow” olarak etiketlenir. |
| Prop | Tür | Varsayılan |
|---|---|---|
aria-label | string | "Slides" |
| Öznitelik | Açıklama |
|---|---|
data-slot="carousel-thumbnails" | Kayan şerit. |
| Prop | Tür | Varsayılan |
|---|---|---|
indexAçtığı slayt. Varsayılan olarak şeritteki konumudur. | number | – |
render | ReactElement | (props, state) => ReactElement | <button> |
| Öznitelik | Açıklama |
|---|---|
data-slot="carousel-thumbnail" | CSS'te küçük resimleri hedefleyin. |
data-active | Slaytı görünümdeyken bulunur. |
setApi ve useCarousel() ile döndürülür. Animasyonsuz hareket için jump: true geçin.
| Prop | Tür | Varsayılan |
|---|---|---|
scrollPrev | (jump?: boolean) => void | – |
scrollNext | (jump?: boolean) => void | – |
scrollToBir snap konumuna kaydırır. | (index: number, jump?: boolean) => void | – |
scrollToSlideBir slaytı gösteren konuma kaydırır. | (slideIndex: number, jump?: boolean) => void | – |
canScrollPrev | () => boolean | – |
canScrollNext | () => boolean | – |
selectedScrollSnap | () => number | – |
scrollSnapList | () => number[] | – |
slidesInView | () => number[] | – |
slideNodes | () => HTMLElement[] | – |
viewportNode | () => HTMLElement | null | – |
play | () => void | – |
stop | () => void | – |
isPlaying | () => boolean | – |
on / off | (event: "select" | "scroll" | "settle" | "reInit", listener) => CarouselApi | – |
Kendi kontrollerinizi oluşturmak için <Carousel /> içinde kullanın. api, orientation, selectedIndex, snapCount, slideCount, slidesInView, canScrollPrev, canScrollNext, isPlaying ve kaydırma ile oynatma yöntemlerini döndürür.
- ButtonHer varyant ve boyutta düğmeler; hızlı istekler için spinner'ı atlayan yerleşik yükleme, başarı ve hata akışı.
- Number flowYalnızca değişen basamakların döndüğü animasyonlu sayılar; herhangi bir Intl biçimi ve yerel ayarla.
- AccordionHer biri bir panel gösteren yığılmış başlıklar; yarıda tersine çevrilebilen yükseklik hareketi ve kapalıyken de aranabilir kalan paneller.
- Aspect ratioMedya yüklenmeden önce şeklini koruyan, yüklenirken parıldayan, medyayı yumuşakça görünür kılan ve hata durumunda yedeğe düşen bir kutu.
- CollapsibleYüksekliği hareketle gösterilip gizlenen, yarıda tersine çevrilebilen ve yerleşimi zıplatmayan bir panel.
- ResizableBirbirinden ayırabileceğiniz paneller; hover'da uyanan sakin bir ayırıcı, sıfırlama ya da daraltmada kayarak değişen boyutlar ve kalıcı düzenler sunar.