Bootstrap 5 ile slider yapmak için .carousel sınıflı ve benzersiz id değerine sahip bir kapsayıcının içine .carousel-inner, onun içine de her slayt için bir .carousel-item koyarsınız; slaytlardan birine mutlaka .active eklersiniz. Kapsayıcıya data-bs-ride="carousel" verdiğinizde slaytlar sayfa yüklenir yüklenmez varsayılan olarak beş saniyede bir kendiliğinden döner. Önceki ve sonraki okları, alttaki göstergeleri ve yazı başlıklarını isteğe göre eklersiniz.

Bu yazıda carousel bileşeninin zorunlu yapısını, kontrol butonlarını, göstergeleri, slayt başlıklarını, solma geçişini, slayt başına farklı süreyi, dokunmatik kaydırmayı kapatmayı, koyu varyantı ve JavaScript seçeneklerini, yöntemlerini ve olaylarını belgeye dayanarak ele alıyoruz. Anlatım Bootstrap 5.0 belgelerine ve v5.0.2 kaynak koduna dayanır; daha yeni 5.x sürümlerinde değişiklikler olabileceği için kullandığınız sürümün belgesini getbootstrap.com üzerinden kontrol edin. Diğer bileşenler için Bootstrap öğrenme rehberine bakabilirsiniz.

Kontroller, göstergeler ve slayt başlıkları

Kontroller, göstergeler ve slayt başlıkları

Önceki ve sonraki okları eklemek için belge <button> öğesi kullanmanızı önerir; <a> kullanacaksanız role="button" eklemelisiniz. Kontrol butonları data-bs-target ile carousel kapsayıcısının id değerini, data-bs-slide ile de yönü (prev veya next) belirtir. Ok simgeleri yalnızca görsel olduğundan aria-hidden="true" alır, butonun ekran okuyucu metni ise .visually-hidden sınıflı bir <span> içinde verilir.

Göstergeler .carousel-indicators içine konan butonlardır ve her biri data-bs-slide-to ile sıfırdan başlayan slayt sırasını taşır. Etkin slayda karşılık gelen göstergeye .active ve aria-current="true" eklenir. Slayt başlıkları için her .carousel-item içine .carousel-caption yerleştirirsiniz. Belgedeki örnekte başlıklar .d-none .d-md-block ile küçük ekranlarda gizlenir ve orta boy ekrandan itibaren görünür. Hepsini birleştiren örnek:

html
<div id="kampanyaSlider" class="carousel slide" data-bs-ride="carousel">
  <div class="carousel-indicators">
    <button type="button" data-bs-target="#kampanyaSlider" data-bs-slide-to="0" class="active" aria-current="true" aria-label="Slayt 1"></button>
    <button type="button" data-bs-target="#kampanyaSlider" data-bs-slide-to="1" aria-label="Slayt 2"></button>
    <button type="button" data-bs-target="#kampanyaSlider" data-bs-slide-to="2" aria-label="Slayt 3"></button>
  </div>
  <div class="carousel-inner">
    <div class="carousel-item active">
      <img src="kampanya-1.jpg" class="d-block w-100" alt="Kış indirimi">
      <div class="carousel-caption d-none d-md-block">
        <h5>Kış indirimi</h5>
        <p>Seçili ürünlerde yüzde 30 indirim.</p>
      </div>
    </div>
    <div class="carousel-item">
      <img src="kampanya-2.jpg" class="d-block w-100" alt="Yeni gelenler">
      <div class="carousel-caption d-none d-md-block">
        <h5>Yeni gelenler</h5>
        <p>Bu haftanın yeni ürünlerine göz atın.</p>
      </div>
    </div>
    <div class="carousel-item">
      <img src="kampanya-3.jpg" class="d-block w-100" alt="Ücretsiz kargo">
      <div class="carousel-caption d-none d-md-block">
        <h5>Ücretsiz kargo</h5>
        <p>Tüm siparişlerde geçerlidir.</p>
      </div>
    </div>
  </div>
  <button class="carousel-control-prev" type="button" data-bs-target="#kampanyaSlider" data-bs-slide="prev">
    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Önceki</span>
  </button>
  <button class="carousel-control-next" type="button" data-bs-target="#kampanyaSlider" data-bs-slide="next">
    <span class="carousel-control-next-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Sonraki</span>
  </button>
</div>

Kontrol ve gösterge öğelerindeki data-bs-target değeri, carousel kapsayıcısının id değeriyle eşleşmek zorundadır. Bu yüzden belge, aynı sayfada birden fazla carousel kullanıyorsanız her birine ayrı ve benzersiz bir kimlik vermenizi ister; aksi hâlde bir slider’ın okları diğerini çevirir. Ekran boyutuna göre gizleme sınıflarının mantığı için Bootstrap display yazısına, .visually-hidden sınıfının ayrıntısı için erişilebilirlik yazısına göz atabilirsiniz.

Klavyeyle kullanım da hazırdır: keyboard seçeneği açıkken kaynak kod, carousel odaktayken sol ve sağ ok tuşlarını slayt değiştirmek için dinler; odak bir input ya da textarea içindeyse tuşlara karışmaz. Dokunmatik ekranlarda sola ve sağa kaydırma hareketiyle slayt değiştirilebilir.

Göstergelerdeki data-bs-slide-to değeri dizilerdeki gibi sıfırdan başlar: ilk slayt için 0, üçüncü slayt için 2 yazılır. Kontrollerdeki data-bs-slide ise göreli çalışır; prev ve next mevcut konuma göre bir adım geri ya da ileri gider. Otomatik dönüş için kaynak kod nextWhenVisible yöntemini kullanır: sayfa gizliyse ya da carousel veya üst öğesi görünür değilse bir sonraki slayda geçilmez. Bu yüzden carousel’i örneğin kapalı bir sekme panelinin içine koyduğunuzda, panel açılana kadar slaytlar ilerlemez. Göstergelerin sayısı ile slayt sayısının aynı olması da sizin sorumluluğunuzdadır; Bootstrap göstergeleri kendisi üretmez.

Crossfade, slayt başına süre ve dokunmayı kapatmak

Slaytların kaymak yerine birbirine karışarak geçmesini istiyorsanız carousel kapsayıcısına .carousel-fade eklersiniz. Her slaydın ekranda kalma süresini ayrı ayrı belirlemek için ise ilgili .carousel-item öğesine milisaniye cinsinden data-bs-interval verirsiniz. Aşağıdaki örnekte ilk slayt on saniye, ikinci slayt iki saniye kalır, üçüncüsü genel ayara (varsayılan 5000 ms) uyar:

html
<div id="solmaSlider" class="carousel slide carousel-fade" data-bs-ride="carousel">
  <div class="carousel-inner">
    <div class="carousel-item active" data-bs-interval="10000">
      <img src="duyuru-1.jpg" class="d-block w-100" alt="Önemli duyuru">
    </div>
    <div class="carousel-item" data-bs-interval="2000">
      <img src="duyuru-2.jpg" class="d-block w-100" alt="Kısa hatırlatma">
    </div>
    <div class="carousel-item">
      <img src="duyuru-3.jpg" class="d-block w-100" alt="Genel bilgi">
    </div>
  </div>
</div>

Dokunmatik kaydırma desteği varsayılan olarak açıktır. Kapatmak için kapsayıcıya data-bs-touch="false" eklersiniz. Belgedeki örnek bunu otomatik oynatmayı kapatmakla birleştirir: kapsayıcıdan data-bs-ride kaldırılır ve data-bs-interval="false" verilir. Bu durumda slaytlar yalnızca kullanıcı oklara bastığında değişir:

html
<div id="elleSlider" class="carousel slide" data-bs-touch="false" data-bs-interval="false">
  <div class="carousel-inner">
    <div class="carousel-item active">
      <img src="adim-1.jpg" class="d-block w-100" alt="Kurulum adımı 1">
    </div>
    <div class="carousel-item">
      <img src="adim-2.jpg" class="d-block w-100" alt="Kurulum adımı 2">
    </div>
  </div>
  <button class="carousel-control-prev" type="button" data-bs-target="#elleSlider" data-bs-slide="prev">
    <span class="carousel-control-prev-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Önceki</span>
  </button>
  <button class="carousel-control-next" type="button" data-bs-target="#elleSlider" data-bs-slide="next">
    <span class="carousel-control-next-icon" aria-hidden="true"></span>
    <span class="visually-hidden">Sonraki</span>
  </button>
</div>

Adım adım anlatım ya da ürün galerisi gibi kullanıcının kendi hızında ilerlemesi gereken içeriklerde otomatik dönüşü kapatmak genellikle daha kullanışlıdır; slaytın, kullanıcı okumadan değişmesi önlenir.

Koyu varyant ve geçiş süresini değiştirmek

Varsayılan kontroller, göstergeler ve başlıklar beyazdır; açık renkli görsellerin üstünde zor seçilir. Kapsayıcıya .carousel-dark eklediğinizde kontroller, göstergeler ve başlıklar koyulaşır. Belgeye göre okların beyaz dolgusu CSS filter özelliğiyle tersine çevrilir; Sass tarafında bu ayar $carousel-dark-control-icon-filter değişkeninde invert(1) grayscale(100) olarak tanımlıdır. Göstergenin etkin rengi $carousel-dark-indicator-active-bg, başlık rengi $carousel-dark-caption-color değişkeninden gelir.

html
<div id="koyuSlider" class="carousel carousel-dark slide" data-bs-ride="carousel">
  <div class="carousel-inner">
    <div class="carousel-item active">
      <img src="acik-zemin-1.jpg" class="d-block w-100" alt="Açık zeminli görsel">
      <div class="carousel-caption d-none d-md-block">
        <h5>Açık zemin</h5>
        <p>Koyu kontroller burada daha iyi okunur.</p>
      </div>
    </div>
  </div>
</div>

Slayt geçişinin süresi $carousel-transition-duration değişkeniyle belirlenir ve varsayılanı .6s değeridir. Derlenmiş CSS kullanıyorsanız aynı ayarı kendi CSS kuralınızla değiştirebilirsiniz. Belge, birden fazla geçiş tanımlıyorsanız transform geçişini ilk sıraya koymanızı ister, örneğin transition: transform 2s ease, opacity .5s ease-out. Ok genişliği ($carousel-control-width, varsayılan yüzde 15), ok opaklığı ve gösterge ölçüleri de aynı değişken grubundadır; değişkenlerin nasıl ezildiğini Sass ile özelleştirme yazısında bulabilirsiniz.

Yöntemler ve olaylar

Carousel örneği üzerinden çağırabileceğiniz yöntemler belgede şöyle listelenir:

YöntemNe yapar
cycleSlaytlar arasında döngüyü başlatır
pauseDöngüyü durdurur
prevBir önceki slayda geçer; slid olayından önce çağırana döner
nextBir sonraki slayda geçer; slid olayından önce çağırana döner
nextWhenVisibleSayfa ya da carousel görünür değilse ilerlemez
toSıfırdan başlayan sıra numarasıyla belirli bir slayda gider
disposeÖğe üzerinde saklanan carousel verisini siler
getInstanceStatik; öğeye bağlı örneği verir
getOrCreateInstanceStatik; örnek yoksa yenisini oluşturup verir

Tüm yöntemler eşzamansızdır ve geçiş başladığı anda döner. Geçiş sürerken yapılan bir çağrı yok sayılır; belge bunu tam olarak carousel üzerinden örnekler. Art arda iki to() çağrısı yaparsanız ikincisi kaybolur. Doğru yol, ikinci geçişi ilk geçişin bittiğini bildiren slid.bs.carousel olayına bağlamaktır:

javascript
var myCarouselEl = document.getElementById('myCarousel')
var carousel = bootstrap.Carousel.getInstance(myCarouselEl)

myCarouselEl.addEventListener('slid.bs.carousel', function (event) {
  carousel.to('2') // 1. slayda gecis bittikten sonra calisir
})

carousel.to('1') // gecisi baslatir ve hemen doner
carousel.to('2') // yok sayilir: onceki gecis henuz bitmedi

Carousel iki olay yayar ve ikisi de .carousel öğesinin kendisinde tetiklenir. slide.bs.carousel geçiş başlar başlamaz, slid.bs.carousel ise geçiş tamamlandığında çalışır. Her iki olay nesnesinde dört ek özellik bulunur: direction kaymanın yönünü ("left" ya da "right"), relatedTarget etkin hâle gelen slayt öğesini, from mevcut slaydın sırasını, to ise gelecek slaydın sırasını verir. Bu özelliklerle örneğin “3 / 5” biçiminde bir sayaç güncelleyebilirsiniz:

javascript
var slider = document.getElementById('kampanyaSlider')
var sayac = document.getElementById('slaytSayaci')

slider.addEventListener('slid.bs.carousel', function (event) {
  sayac.textContent = (event.to + 1) + ' / 3'
})

Olay sistemi, preventDefault() kullanımı ve örnek alma yöntemleri bütün bileşenlerde aynı mantıkla çalışır; ortak kuralları Bootstrap JavaScript API yazısında topladık.

Sık yapılan hatalar

  • Hiçbir slayta .active eklememek: Carousel tamamen görünmez olur. İlk slayda ve ilk göstergeye .active ekleyin.
  • Oklar ile kimliğin uyuşmaması: data-bs-target değeri kapsayıcının id değeriyle aynı değilse oklar çalışmaz. Sayfada iki slider varsa kimlikleri farklı olmalıdır.
  • Hem data-bs-ride hem new bootstrap.Carousel kullanmak: Belge bunu açıkça yasaklar. Birini seçin.
  • Farklı boyutlu görseller: Slayt yüksekliği her geçişte zıplar. Aynı oranda görseller kullanın ya da yüksekliği CSS ile sabitleyin.
  • Bootstrap 4 öznitelikleri: data-ride, data-slide ve data-interval v5’te çalışmaz; hepsine bs öneki gerekir. Ayrıntı için geçiş yazısına bakın.
  • JavaScript dosyasını yüklememek: Carousel’in bütün slayt davranışı, kontrolleri ve göstergeleri JavaScript gerektirir. Kurulum için CDN kurulum yazısına bakın.
  • İç içe carousel kurmak: Bir slaydın içine ikinci bir carousel koymak desteklenmez.

Diğer genel sorunlar için Bootstrap çalışmıyor yazısına göz atabilirsiniz.

Sık Sorulan Sorular

Bootstrap carousel otomatik dönmüyor, neden?

Kapsayıcıda data-bs-ride="carousel" yoksa slider yüklenişte oynamaz. Ayrıca data-bs-interval="false" verilmişse otomatik dönüş kapalıdır. Sekme arka plandayken dönmemesi ise Page Visibility API kaynaklı beklenen davranıştır.

Slayt süresini nasıl değiştiririm?

Bütün slaytlar için kapsayıcıya data-bs-interval="3000" gibi bir değer verin ya da JavaScript ile interval seçeneğini kullanın. Tek bir slayt için o .carousel-item öğesine ayrı data-bs-interval ekleyin.

Fare üstüne gelince durmasını nasıl engellerim?

pause seçeneğini false yapın; veri özniteliği olarak data-bs-pause="false" yazabilirsiniz.

Kayma yerine solma efekti mümkün mü?

Evet, kapsayıcıya .carousel-fade sınıfını ekleyin. .slide sınıfı da yerinde kalmalıdır.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Bootstrap öğrenme rehberi · Bootstrap JavaScript API · Bootstrap modal · Görseller ve ratio · Display sınıfları · JavaScript öğrenme rehberi