Bootstrap'te açılır menü yapmak için tetikleyiciyi (bir düğme ya da bağlantı) ve menüyü .dropdown sınıflı bir sarmalayıcının içine koyarsınız. Tetikleyici .dropdown-toggle sınıfı ile data-bs-toggle="dropdown" özniteliğini, menü .dropdown-menu sınıfını, menüdeki her seçenek .dropdown-item sınıfını taşır. Menünün konumunu Popper kitaplığı hesapladığı için sayfada Popper'ı içeren bootstrap.bundle.min.js dosyası ya da Bootstrap'ten önce yüklenmiş ayrı bir Popper dosyası bulunmalıdır.

Bu yazı Bootstrap 5.0 belgelerine ve v5.0.2 kaynak koduna dayanır. Tek ve bölünmüş düğmeleri, yönleri, menü içeriğini, hizalamayı, offset ve autoClose gibi seçenekleri, JavaScript yöntemlerini ve olayları örneklerle anlatıyoruz. Sonraki 5.x sürümlerinde açılır menüye yeni özellikler eklenmiş olabilir; kullandığınız sürümün belgelerine getbootstrap.com üzerinden bakın.

Açılır menü nasıl çalışır?

Açılır menü nasıl çalışır?

Bootstrap'in açılır menüleri, bağlantı listeleri ve benzeri içerikleri göstermek için açılıp kapanan bağlamsal katmanlardır ve Dropdown JavaScript eklentisiyle etkileşimli hâle gelir. Belgeler bilinçli bir tasarım kararını özellikle not eder: menüler fareyle üzerine gelinince değil, tıklanınca açılır.

Eklenti, menüyü göstermek ve gizlemek için .dropdown-menu öğesindeki .show sınıfını değiştirir. Bootstrap 5.0.2 derlenmiş CSS dosyasında temel kurallar şöyledir (kısaltıldı):

scss
.dropup,
.dropend,
.dropdown,
.dropstart {
  position: relative;
}

.dropdown-menu {
  position: absolute;
  z-index: 1000;
  display: none;
  min-width: 10rem;
  padding: 0.5rem 0;
  /* (kısaltıldı) */
  border: 1px solid rgba(0, 0, 0, 0.15);
  border-radius: 0.25rem;
}

.dropdown-menu.show {
  display: block;
}

Bu kurallar iki şeyi açıklar. Menü position: absolute olduğu için kendisine en yakın konumlandırılmış ataya göre yerleşir; sarmalayıcı .dropdown bu yüzden position: relative taşır. Belgeler sarmalayıcı olarak .dropdown ya da position: relative bildiren başka bir öğe kullanmanızı ister. İkincisi, menü .show sınıfı gelene kadar display: none ile gizlidir; JavaScript yüklenmezse menü hiç görünmez.

data-bs-toggle="dropdown" özniteliğinin bir görevi daha var: eklenti, sayfadaki açık menüleri uygulama düzeyinde kapatırken bu özniteliği kullanır. Bu yüzden belgeler, menüyü JavaScript ile başlatsanız bile tetikleyicide bu özniteliğin her zaman bulunması gerektiğini vurgular. Konumlandırmayı Popper yapar; ancak menü bir navbar içindeyse Popper kullanılmaz, çünkü orada dinamik konuma gerek yoktur. Navbar içindeki kullanım Bootstrap navbar yazısında anlatılıyor.

Tek düğmeli açılır menü

Herhangi bir .btn öğesini birkaç değişiklikle açılır menü tetikleyicisine çevirebilirsiniz. Tetikleyici <button> ya da <a> olabilir:

html
<div class="dropdown">
  <button class="btn btn-secondary dropdown-toggle" type="button" id="hesapMenu" data-bs-toggle="dropdown" aria-expanded="false">
    Hesabım
  </button>
  <ul class="dropdown-menu" aria-labelledby="hesapMenu">
    <li><a class="dropdown-item" href="#">Profil</a></li>
    <li><a class="dropdown-item" href="#">Siparişlerim</a></li>
    <li><hr class="dropdown-divider"></li>
    <li><a class="dropdown-item" href="#">Çıkış yap</a></li>
  </ul>
</div>

Tetikleyici bir bağlantıysa belgelerdeki gibi role="button" ve href="#" eklenir. aria-expanded="false" başlangıç durumunu bildirir; eklenti menüyü açtığında bunu true yapar. Menüdeki aria-labelledby, menüyü tetikleyicinin metniyle adlandırır. .dropdown-toggle sınıfı metnin yanına küçük bir ok işareti ekler: derlenmiş CSS'te bu işaret bir ::after sözde öğesidir ve kenarlıklardan oluşan 0.3em boyutunda bir üçgen olarak çizilir. Düğme renkleri ve boyutları Bootstrap buton yazısında anlatılıyor; her düğme varyantı açılır menüyle çalışır.

Menü öğeleri bağlantı olmak zorunda değildir. İşlem yapan seçeneklerde <button class="dropdown-item" type="button"> kullanabilirsiniz. Tıklanamayan bir bilgi satırı için .dropdown-item-text vardır. 5.0 ile birlikte .dropdown-item öğelerinin <li> içine sarılması da desteklenir; sürüm geçişi belgesi bunu yenilikler arasında sayar.

Bölünmüş düğme (split button)

Bölünmüş düğmede ana eylem ve menüyü açan ok ayrı düğmelerdir. Yapı tek düğmeyle neredeyse aynıdır; farkı, iki düğmenin bir .btn-group içinde durması ve ok düğmesine .dropdown-toggle-split eklenmesidir. Belgelere göre bu sınıf okun iki yanındaki yatay iç boşluğu yüzde 25 azaltır ve normal açılır menü düğmesine eklenen sol dış boşluğu kaldırır; böylece ok ortada kalır ve ana düğmenin yanında uygun boyutta bir tıklama alanı oluşur.

html
<div class="btn-group">
  <button type="button" class="btn btn-primary">Kaydet</button>
  <button type="button" class="btn btn-primary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
    <span class="visually-hidden">Diğer seçenekler</span>
  </button>
  <ul class="dropdown-menu">
    <li><a class="dropdown-item" href="#">Taslak olarak kaydet</a></li>
    <li><a class="dropdown-item" href="#">Kaydet ve yayınla</a></li>
  </ul>
</div>

Ok düğmesinin görünür metni olmadığı için içine .visually-hidden sınıflı bir açıklama konur; ekran okuyucu bu metni okur, ekranda ise görünmez. Bu yardımcı sınıf Bootstrap erişilebilirlik yazısında anlatılıyor. Büyük ve küçük düğmelerle (btn-lg, btn-sm) hem tek hem bölünmüş açılır menüler çalışır; derlenmiş CSS bölünmüş okun iç boşluğunu düğme boyutuna göre ayrıca ayarlar.

Koyu menü ve yönler

Koyu bir navbar ya da koyu bir tasarıma uyum için mevcut .dropdown-menu öğesine .dropdown-menu-dark eklersiniz; menü öğelerinde başka değişiklik gerekmez. Bu varyant ve ona ait Sass değişkenleri 5.0 ile geldi.

Menünün açılacağı yön, üst öğeye verilen sınıfla seçilir: yukarı açmak için .dropup, sağa açmak için .dropend, sola açmak için .dropstart. Bootstrap'i sağdan sola (RTL) yazılan dillerle kullanırken yönler aynalanır; örneğin .dropstart menüsü sağ tarafta görünür. Sınıf adlarındaki start ve end sözcüklerinin nedeni budur.

html
<div class="btn-group dropup">
  <button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
    Yukarı açılır
  </button>
  <ul class="dropdown-menu dropdown-menu-dark">
    <li><a class="dropdown-item active" href="#" aria-current="true">Türkçe</a></li>
    <li><a class="dropdown-item" href="#">English</a></li>
    <li><a class="dropdown-item" href="#">Deutsch</a></li>
  </ul>
</div>

Seçenekler: offset, reference, autoClose ve diğerleri

Seçenekler veri öznitelikleriyle ya da JavaScript ile verilir. Veri özniteliğinde seçenek adı data-bs- önekinin sonuna eklenir ve camelCase yazım kebab-case yazıma çevrilir: autoClose seçeneği data-bs-auto-close olur. Varsayılan değerler v5.0.2 dropdown.js dosyasındaki Default nesnesiyle belgelerdeki tablonun aynısıdır:

SeçenekTürVarsayılanGörevi
boundarystring veya öğe'clippingParents'Popper preventOverflow için taşma sınırı; öğe yalnızca JavaScript ile verilebilir
referencestring, öğe veya nesne'toggle'Menünün hizalandığı referans: 'toggle', 'parent', bir öğe ya da getBoundingClientRect sağlayan nesne
displaystring'dynamic'Popper ile dinamik konum; 'static' ile kapatılır
offsetdizi, string veya fonksiyon[0, 2]Menünün hedefe göre kaydırılması; veri özniteliğinde virgüllü string
autoCloseboolean veya stringtrueMenünün hangi tıklamalarla kapanacağı
popperConfignull, nesne veya fonksiyonnullBootstrap varsayılan Popper yapılandırmasını değiştirmek

offset iki sayılık bir dizidir; Popper terminolojisinde ilki eksen boyunca kayma (skidding), ikincisi hedeften uzaklıktır (distance). Veri özniteliğinde data-bs-offset="10,20" şeklinde yazılır. Fonksiyon verirseniz, fonksiyon ilk argüman olarak Popper yerleşimini, referans ve menü dikdörtgenlerini içeren bir nesne, ikinci argüman olarak tetikleyici öğeyi alır ve iki sayılık bir dizi döndürmelidir. reference seçeneğinin parent değeri, bölünmüş düğmede menünün ok düğmesine değil tüm düğme grubuna göre hizalanmasını sağlar.

autoClose seçeneğinin dört değeri vardır:

  • true (varsayılan): menünün içine ya da dışına tıklamak menüyü kapatır.
  • false: menü yalnızca tetikleyiciye yeniden tıklanarak ya da hide veya toggle yöntemi çağrılarak kapanır; belgelere göre bu durumda Esc tuşu da menüyü kapatmaz.
  • 'inside': menü yalnızca içine tıklanınca kapanır.
  • 'outside': menü yalnızca dışına tıklanınca kapanır.

Sürüm geçişi belgesi, v4'teki flip seçeneğinin kaldırıldığını ve çevirme davranışını kapatmak için Popper'ın kendi fallbackPlacements seçeneğine boş bir dizi verilmesi gerektiğini not eder; bu da popperConfig üzerinden yapılır. popperConfig bir fonksiyon olduğunda Bootstrap'in varsayılan Popper yapılandırmasını argüman olarak alır ve yeni bir yapılandırma nesnesi döndürmelidir:

javascript
var dropdown = new bootstrap.Dropdown(element, {
  popperConfig: function (defaultBsPopperConfig) {
    // var newPopperConfig = {...}
    // use defaultBsPopperConfig if needed...
    // return newPopperConfig
  }
})

JavaScript ile başlatma ve yöntemler

Veri öznitelikli tetikleyiciler sayfa yüklendiğinde kendiliğinden çalışır; ayrıca bir başlatma kodu gerekmez. Menüleri koddan başlatmak isterseniz belgelerdeki şu parçayı kullanırsınız:

javascript
var dropdownElementList = [].slice.call(document.querySelectorAll('.dropdown-toggle'))
var dropdownList = dropdownElementList.map(function (dropdownToggleEl) {
  return new bootstrap.Dropdown(dropdownToggleEl)
})
YöntemNe yapar
toggleMenüyü açıksa kapatır, kapalıysa açar
showMenüyü gösterir
hideMenüyü gizler
updateMenünün konumunu yeniden hesaplar
disposeÖğedeki menü örneğini yok eder ve saklanan veriyi kaldırır
getInstanceStatik; öğeye bağlı örneği döndürür
getOrCreateInstanceStatik; örnek yoksa yenisini oluşturup döndürür

update yöntemi, menü açıkken sayfa düzeni değiştiğinde (örneğin tetikleyicinin yanına içerik eklendiğinde) konumu tazelemek için kullanışlıdır. Örnek oluşturma, seçenek verme ve olay dinleme kalıpları tüm eklentilerde ortaktır ve Bootstrap JavaScript API yazısında toplu olarak anlatılıyor; dilin kendisi için JavaScript öğrenme rehberine bakabilirsiniz.

Olaylar

Olaylar: show.bs.dropdown, shown.bs.dropdown, hide.bs.dropdown, hidden.bs.dropdown

Açılır menünün dört olayı vardır ve hepsi tetikleyici öğede tetiklenip yukarı doğru kabarcıklanır (bubble). Bu yüzden dinleyiciyi .dropdown-menu öğesinin üst öğesine de ekleyebilirsiniz. Sürüm geçişi belgesi bunu kırıcı bir değişiklik olarak listeler: v5'te olaylar artık tetikleyici düğmede tetiklenir.

OlayNe zaman
show.bs.dropdownshow yöntemi çağrıldığı anda
shown.bs.dropdownMenü görünür olup CSS geçişleri bittiğinde
hide.bs.dropdownhide yöntemi çağrıldığı anda
hidden.bs.dropdownMenü gizlenip CSS geçişleri bittiğinde

hide.bs.dropdown ve hidden.bs.dropdown olaylarında, kapanışa bir tıklama yol açtıysa clickEvent adlı bir özellik bulunur ve o tıklamanın olay nesnesini taşır. Menünün neden kapandığını anlamak için bu özelliğe bakabilirsiniz.

javascript
var myDropdown = document.getElementById('myDropdown')
myDropdown.addEventListener('show.bs.dropdown', function () {
  // do something...
})

Klavye ve erişilebilirlik

WAI-ARIA standardında gerçek bir role="menu" bileşeni vardır, ancak bu rol eylem tetikleyen uygulama menülerine özgüdür ve içinde yalnızca menü öğeleri, onay kutulu ve radyo düğmeli menü öğeleri, radyo grupları ve alt menüler bulunabilir. Bootstrap'in açılır menüleri ise genel amaçlıdır; içine arama kutusu veya giriş formu koyabilirsiniz. Bu yüzden Bootstrap gerçek ARIA menüleri için gereken role ve aria- özniteliklerini beklemez ve kendiliğinden eklemez; gerekiyorsa bu daha özel öznitelikleri siz yazarsınız.

Klavye tarafında Bootstrap standart menü etkileşimlerinin çoğunu kendisi sağlar: ok tuşlarıyla .dropdown-item öğeleri arasında dolaşabilir, menüyü Esc ile kapatabilirsiniz. v5.0.2 dropdown.js kaynağına göre odak henüz bir menü öğesinde değilken (örneğin tetikleyicideyken) aşağı ok ilk öğeye, yukarı ok son öğeye gider; öğeler arasında ise listenin başında ve sonunda durur, başa sarmaz. Dokunmatik cihazlarda menü açılırken <body> öğesinin doğrudan çocuklarına boş mouseover dinleyicileri eklenir; belgeler bunun iOS'taki bir olay yetkilendirme tuhaflığını aşmak için yapıldığını ve menü kapanınca kaldırıldığını açıklar. ARIA kavramları için ARIA rolleri ve öznitelikleri yazısına bakın.

Sass değişkenleri

Menünün görünümü scss/_variables.scss içindeki değişkenlerden gelir: en küçük genişlik $dropdown-min-width (10rem), dikey iç boşluk $dropdown-padding-y (.5rem), 5.0 ile eklenen yatay iç boşluk $dropdown-padding-x (0), tetikleyiciyle menü arası boşluk $dropdown-spacer (.125rem), öğe iç boşlukları $dropdown-item-padding-y ve $dropdown-item-padding-x, etkin öğe rengi $dropdown-link-active-bg. Koyu menünün ayrı $dropdown-dark-* değişkenleri vardır. Ok işareti $caret-width (.3em) gibi değişkenlerle ve scss/mixins/_caret.scss içindeki mixin'lerle üretilir. Değişkenleri ezme yöntemi için Bootstrap Sass yazısına bakın.

Sık yapılan hatalar

  • Popper yok. Navbar dışındaki bir menü açılmaz ve konsolda bir hata belirir. v5.0.2 kaynağında bu durum için "Bootstrap's dropdowns require Popper" iletili bir denetim vardır; derlenmiş dosyada ileti farklı görünebilir, ama sonuç aynıdır. bootstrap.min.js yerine bootstrap.bundle.min.js kullanın ya da Popper'ı Bootstrap'ten önce yükleyin. Kurulum seçenekleri için CDN kurulumu yazısına bakın.
  • v4 özniteliği. data-toggle="dropdown" 5.0'da çalışmaz; doğrusu data-bs-toggle="dropdown".
  • Sarmalayıcı eksik. Tetikleyici ve menü .dropdown, .btn-group ya da position: relative taşıyan bir öğenin içinde değilse menü beklenmedik bir yerde açılabilir.
  • Responsive hizalama çalışmıyor. .dropdown-menu-lg-end gibi sınıflar Popper'ın dinamik konumuyla birlikte etkisiz kalır; tetikleyiciye data-bs-display="static" eklemeyi unutmayın.
  • Form içeren menü tıklayınca kapanıyor. Varsayılan autoClose: true içeri tıklamada da kapatır; data-bs-auto-close="outside" kullanın.
  • Üzerine gelince açılmasını beklemek. Bootstrap menüleri tıklamayla açılır; fareyle açılma isteniyorsa bu Bootstrap'in sağladığı bir davranış değildir.
  • Eksik ARIA ile role="menu". Rolü ekleyip gerekli diğer öznitelikleri ve klavye desenini tamamlamamak, ekran okuyucuya yanlış bir yapı bildirir. Genel amaçlı bir bağlantı listesinde rol eklemeyin.

Diğer genel sorunlar için Bootstrap çalışmıyor: sık hatalar yazısına bakabilirsiniz.

Sık Sorulan Sorular

Açılır menü neden açılmıyor?

En sık üç neden vardır: JavaScript dosyasının hiç yüklenmemesi, Popper'ın eksik olması ya da v4'ten kalan data-toggle yazımı. Menüyü açmaya çalışırken tarayıcının geliştirici konsolunda bir hata beliriyorsa önce Popper'ın yüklü olduğunu doğrulayın; hiç hata yoksa öznitelik adını ve Bootstrap dosyasının yüklenip yüklenmediğini kontrol edin.

Menünün her zaman sağa hizalı açılmasını nasıl sağlarım?

.dropdown-menu öğesine .dropdown-menu-end ekleyin. Hizalamanın yalnızca belirli bir genişlikten sonra değişmesini istiyorsanız responsive sınıflarla birlikte data-bs-display="static" kullanın.

Menü öğesine tıklayınca menü kapanmasın istiyorum.

Tetikleyiciye data-bs-auto-close="outside" ekleyin; menü yalnızca dışarıya tıklandığında kapanır. Menünün yalnızca sizin kodunuzla kapanmasını istiyorsanız false değerini verip hide yöntemini kendiniz çağırın.

Menüyü tetikleyiciden biraz uzağa açabilir miyim?

Evet, offset seçeneğini kullanın. Örneğin data-bs-offset="0,10" menüyü varsayılandan daha uzak açar; ilk sayı eksen boyunca kaymayı, ikincisi uzaklığı belirler. Varsayılan değer [0, 2] şeklindedir.

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 navbar menü yapımı · Bootstrap buton ve button group · Bootstrap nav tabs ve pills · Bootstrap tooltip ve popover · Bootstrap JavaScript API ve olaylar · JavaScript öğrenme rehberi