드롭다운
드롭다운 (Dropdowns)
Bootstrap 드롭다운 플러그인으로 링크 목록 등을 표시하는 맥락적 오버레이를 토글합니다.
출처: 문서
본문
개요 (Overview)
드롭다운은 링크 목록 등을 표시하기 위한 토글 가능하고 맥락적인 오버레이입니다. 포함된 Bootstrap 드롭다운 JavaScript 플러그인으로 상호작용하게 만들 수 있습니다. hover가 아니라 클릭으로 토글됩니다—이것은 의도적인 설계 결정입니다.
드롭다운은 동적 위치 지정과 뷰포트 감지를 제공하는 제3자 라이브러리인 Popper를 기반으로 합니다. Bootstrap의 JavaScript 앞에 popper.min.js를 포함하거나, Popper를 담고 있는 bootstrap.bundle.min.js / bootstrap.bundle.js를 사용하세요. 단, navbar에서는 동적 위치 지정이 필요 없으므로 Popper를 사용해 드롭다운을 배치하지 않습니다.
접근성 (Accessibility)
WAI ARIA 표준은 실제 role="menu" 위젯을 정의하지만, 이것은 동작이나 기능을 트리거하는 애플리케이션 같은 메뉴에 특화된 것입니다. ARIA 메뉴는 메뉴 아이템, 체크박스 메뉴 아이템, 라디오 버튼 메뉴 아이템, 라디오 버튼 그룹, 서브 메뉴만 포함할 수 있습니다.
반면 Bootstrap의 드롭다운은 다양한 상황과 마크업 구조에 적용될 수 있도록 범용적으로 설계되었습니다. 예를 들어 검색 필드나 로그인 폼 같은 추가 입력과 폼 컨트롤을 포함하는 드롭다운을 만들 수 있습니다. 이런 이유로 Bootstrap은 진짜 ARIA 메뉴에 필요한 role과 aria-* 속성 중 어느 것도 기대하지 않으며 자동으로 추가하지도 않습니다. 작성자가 이런 더 구체적인 속성을 직접 포함해야 합니다.
하지만 Bootstrap은 커서 키로 개별 .dropdown-item 요소를 이동하고 Esc 키로 메뉴를 닫는 기능 같은 대부분의 표준 키보드 메뉴 상호작용에 대한 내장 지원을 추가합니다.
예제 (Examples)
드롭다운의 토글(버튼이나 링크)과 드롭다운 메뉴를 .dropdown, 또는 position: relative;를 선언하는 다른 요소 안에 감싸세요. 이상적으로 드롭다운 트리거에는 <button> 요소를 사용해야 하지만, 플러그인은 <a> 요소에서도 작동합니다. 여기 예시들은 적절한 곳에서 의미론적 <ul> 요소를 사용하지만, 커스텀 마크업도 지원됩니다.
단일 버튼 (Single button)
마크업 몇 가지를 바꾸면 어떤 단일 .btn이라도 드롭다운 토글로 바꿀 수 있습니다. <button> 요소에서 사용하는 방법은 다음과 같습니다:
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
Dropdown button
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</div>
드롭다운 토글에는 <button>이 권장 컨트롤이지만, <a> 요소를 사용해야 하는 상황이 있을 수 있습니다. 그럴 경우 컨트롤의 목적을 스크린 리더 같은 보조 기술에 적절히 전달하도록 role="button" 속성을 추가할 것을 권장합니다.
<div class="dropdown">
<a class="btn btn-secondary dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Dropdown link
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</div>
가장 좋은 점은 어떤 버튼 변형에서든 이렇게 할 수 있다는 것입니다:
<!-- Example single danger button -->
<div class="btn-group">
<button type="button" class="btn btn-danger dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Danger
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Separated link</a></li>
</ul>
</div>
스플릿 버튼 (Split button)
마찬가지로, 단일 버튼 드롭다운과 거의 동일한 마크업으로 스플릿 버튼 드롭다운을 만들 수 있지만, 드롭다운 캐럿(caret) 주변에 올바른 간격을 위해 .dropdown-toggle-split이 추가됩니다.
이 추가 클래스는 캐럿 양쪽의 가로 패딩을 25% 줄이고, 일반 버튼 드롭다운에 추가되는 margin-left를 제거합니다. 이런 추가 변경으로 캐럿이 스플릿 버튼 중앙에 유지되고, 메인 버튼 옆에 더 적절한 크기의 히트 영역이 제공됩니다.
<!-- Example split danger button -->
<div class="btn-group">
<button type="button" class="btn btn-danger">Danger</button>
<button type="button" class="btn btn-danger dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Separated link</a></li>
</ul>
</div>
크기 조정 (Sizing)
버튼 드롭다운은 기본 및 스플릿 드롭다운 버튼을 포함한 모든 크기의 버튼에서 작동합니다.
<!-- Large button groups (default and split) -->
<div class="btn-group">
<button class="btn btn-secondary btn-lg dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
Large button
</button>
<ul class="dropdown-menu">
...
</ul>
</div>
<div class="btn-group">
<button class="btn btn-secondary btn-lg" type="button">
Large split button
</button>
<button type="button" class="btn btn-lg btn-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
...
</ul>
</div>
<div class="btn-group">
<button class="btn btn-secondary btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
Small button
</button>
<ul class="dropdown-menu">
...
</ul>
</div>
<div class="btn-group">
<button class="btn btn-secondary btn-sm" type="button">
Small split button
</button>
<button type="button" class="btn btn-sm btn-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
...
</ul>
</div>
다크 드롭다운 (Dark dropdowns) — v5.3.0에서 폐기
기존 .dropdown-menu에 .dropdown-menu-dark를 추가해 어두운 navbar나 커스텀 스타일에 맞는 더 어두운 드롭다운을 선택하세요. 드롭다운 아이템에는 변경이 필요 없습니다.
주의! 컴포넌트의 다크 변형은 색상 모드 도입과 함께 v5.3.0에서 폐기되었습니다. .dropdown-menu-dark를 추가하는 대신 루트 요소, 부모 래퍼, 또는 컴포넌트 자체에 data-bs-theme="dark"를 설정하세요.
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
Dropdown button
</button>
<ul class="dropdown-menu dropdown-menu-dark">
<li><a class="dropdown-item active" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Separated link</a></li>
</ul>
</div>
그리고 navbar에서 사용해 보세요:
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavDarkDropdown" aria-controls="navbarNavDarkDropdown" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavDarkDropdown">
<ul class="navbar-nav">
<li class="nav-item dropdown">
<button class="btn btn-dark dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Dropdown
</button>
<ul class="dropdown-menu dropdown-menu-dark">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
방향 (Directions)
방향은 RTL 모드에서 반전됩니다. 따라서 .dropstart는 오른쪽에 나타납니다.
가운데 정렬 (Centered)
부모 요소에 .dropdown-center를 사용해 토글 아래 중앙에 드롭다운 메뉴를 만드세요.
<div class="dropdown-center">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
Centered dropdown
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Action two</a></li>
<li><a class="dropdown-item" href="#">Action three</a></li>
</ul>
</div>
드롭업 (Dropup)
부모 요소에 .dropup을 추가해 요소 위에 드롭다운 메뉴를 트리거하세요.
<!-- Default dropup button -->
<div class="btn-group dropup">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Dropup
</button>
<ul class="dropdown-menu">
<!-- Dropdown menu links -->
</ul>
</div>
<!-- Split dropup button -->
<div class="btn-group dropup">
<button type="button" class="btn btn-secondary">
Split dropup
</button>
<button type="button" class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<!-- Dropdown menu links -->
</ul>
</div>
가운데 드롭업 (Dropup centered)
부모 요소에 .dropup-center를 사용해 토글 위 중앙에 드롭업 메뉴를 만드세요.
<div class="dropup-center dropup">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
Centered dropup
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Action two</a></li>
<li><a class="dropdown-item" href="#">Action three</a></li>
</ul>
</div>
드롭엔드 (Dropend)
부모 요소에 .dropend를 추가해 요소 오른쪽에 드롭다운 메뉴를 트리거하세요.
<!-- Default dropend button -->
<div class="btn-group dropend">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Dropend
</button>
<ul class="dropdown-menu">
<!-- Dropdown menu links -->
</ul>
</div>
<!-- Split dropend button -->
<div class="btn-group dropend">
<button type="button" class="btn btn-secondary">
Split dropend
</button>
<button type="button" class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Toggle Dropend</span>
</button>
<ul class="dropdown-menu">
<!-- Dropdown menu links -->
</ul>
</div>
드롭스타트 (Dropstart)
부모 요소에 .dropstart를 추가해 요소 왼쪽에 드롭다운 메뉴를 트리거하세요.
<!-- Default dropstart button -->
<div class="btn-group dropstart">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Dropstart
</button>
<ul class="dropdown-menu">
<!-- Dropdown menu links -->
</ul>
</div>
<!-- Split dropstart button -->
<div class="btn-group dropstart">
<button type="button" class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">Toggle Dropstart</span>
</button>
<ul class="dropdown-menu">
<!-- Dropdown menu links -->
</ul>
<button type="button" class="btn btn-secondary">
Split dropstart
</button>
</div>
메뉴 아이템 (Menu items)
드롭다운 아이템으로 <a> 또는 <button> 요소를 사용할 수 있습니다.
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
Dropdown
</button>
<ul class="dropdown-menu">
<li><button class="dropdown-item" type="button">Action</button></li>
<li><button class="dropdown-item" type="button">Another action</button></li>
<li><button class="dropdown-item" type="button">Something else here</button></li>
</ul>
</div>
.dropdown-item-text로 비-대화형 드롭다운 아이템을 만들 수도 있습니다. 커스텀 CSS나 텍스트 유틸리티로 자유롭게 더 스타일링하세요.
<ul class="dropdown-menu">
<li><span class="dropdown-item-text">Dropdown item text</span></li>
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
활성 (Active)
드롭다운의 아이템에 .active를 추가해 활성으로 스타일링하세요. 보조 기술에 활성 상태를 전달하려면 aria-current 속성을 사용하세요—현재 페이지에는 page 값을, 집합의 현재 아이템에는 true를 사용합니다.
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Regular link</a></li>
<li><a class="dropdown-item active" href="#" aria-current="true">Active link</a></li>
<li><a class="dropdown-item" href="#">Another link</a></li>
</ul>
비활성 (Disabled)
드롭다운의 아이템에 .disabled를 추가해 비활성으로 스타일링하세요.
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Regular link</a></li>
<li><a class="dropdown-item disabled" aria-disabled="true">Disabled link</a></li>
<li><a class="dropdown-item" href="#">Another link</a></li>
</ul>
메뉴 정렬 (Menu alignment)
기본적으로 드롭다운 메뉴는 부모의 위쪽에서 100%, 왼쪽을 따라 자동으로 배치됩니다. 방향성 .drop* 클래스로 변경할 수 있지만, 추가 변형 클래스로도 제어할 수 있습니다.
.dropdown-menu에 .dropdown-menu-end를 추가해 드롭다운 메뉴를 오른쪽 정렬하세요. Bootstrap을 RTL로 사용하면 방향이 반전되어 .dropdown-menu-end가 왼쪽에 나타납니다.
주의! 드롭다운은 navbar 안에 포함될 때를 제외하고 Popper 덕분에 배치됩니다.
<div class="btn-group">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Right-aligned menu example
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><button class="dropdown-item" type="button">Action</button></li>
<li><button class="dropdown-item" type="button">Another action</button></li>
<li><button class="dropdown-item" type="button">Something else here</button></li>
</ul>
</div>
반응형 정렬 (Responsive alignment)
반응형 정렬을 사용하려면 data-bs-display="static" 속성을 추가해 동적 위치 지정을 비활성화하고 반응형 변형 클래스를 사용하세요.
주어진 브레이크포인트 이상에서 드롭다운 메뉴를 오른쪽 정렬하려면 .dropdown-menu{-sm|-md|-lg|-xl|-xxl}-end를 추가하세요.
<div class="btn-group">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" data-bs-display="static" aria-expanded="false">
Left-aligned but right aligned when large screen
</button>
<ul class="dropdown-menu dropdown-menu-lg-end">
<li><button class="dropdown-item" type="button">Action</button></li>
<li><button class="dropdown-item" type="button">Another action</button></li>
<li><button class="dropdown-item" type="button">Something else here</button></li>
</ul>
</div>
주어진 브레이크포인트 이상에서 드롭다운 메뉴를 왼쪽 정렬하려면 .dropdown-menu-end와 .dropdown-menu{-sm|-md|-lg|-xl|-xxl}-start를 추가하세요.
<div class="btn-group">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" data-bs-display="static" aria-expanded="false">
Right-aligned but left aligned when large screen
</button>
<ul class="dropdown-menu dropdown-menu-end dropdown-menu-lg-start">
<li><button class="dropdown-item" type="button">Action</button></li>
<li><button class="dropdown-item" type="button">Another action</button></li>
<li><button class="dropdown-item" type="button">Something else here</button></li>
</ul>
</div>
navbar 에서는 Popper를 사용하지 않으므로 드롭다운 버튼에 data-bs-display="static" 속성을 추가할 필요가 없다는 점을 유의하세요.
정렬 옵션 (Alignment options)
위에 보여준 대부분의 옵션을 가져와, 다양한 드롭다운 정렬 옵션의 작은 키친 싱크 데모를 한 곳에 모았습니다.
<div class="btn-group">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
Dropdown
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
</ul>
</div>
<div class="btn-group">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Right-aligned menu
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
</ul>
</div>
<div class="btn-group">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" data-bs-display="static" aria-expanded="false">
Left-aligned, right-aligned lg
</button>
<ul class="dropdown-menu dropdown-menu-lg-end">
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
</ul>
</div>
<div class="btn-group">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" data-bs-display="static" aria-expanded="false">
Right-aligned, left-aligned lg
</button>
<ul class="dropdown-menu dropdown-menu-end dropdown-menu-lg-start">
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
</ul>
</div>
<div class="btn-group dropstart">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Dropstart
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
</ul>
</div>
<div class="btn-group dropend">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Dropend
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
</ul>
</div>
<div class="btn-group dropup">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Dropup
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
</ul>
</div>
메뉴 콘텐츠 (Menu content)
헤더 (Headers)
어떤 드롭다운 메뉴에서든 동작 섹션에 라벨을 붙이도록 헤더를 추가하세요.
<ul class="dropdown-menu">
<li><h6 class="dropdown-header">Dropdown header</h6></li>
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
</ul>
구분선 (Dividers)
구분선으로 관련 메뉴 아이템 그룹을 분리하세요.
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Separated link</a></li>
</ul>
텍스트 (Text)
드롭다운 메뉴 안에 자유 형식 텍스트를 배치하고 간격 유틸리티를 사용하세요. 메뉴 너비를 제한하려면 추가 크기 스타일이 필요할 것입니다.
<div class="dropdown-menu p-4 text-body-secondary" style="max-width: 200px;">
<p>
Some example text that’s free-flowing within the dropdown menu.
</p>
<p class="mb-0">
And this is more example text.
</p>
</div>
폼 (Forms)
드롭다운 메뉴 안에 폼을 넣거나, 드롭다운 메뉴 자체를 폼으로 만들고, 필요한 음수 공간을 위해 마진이나 패딩 유틸리티를 사용하세요.
<div class="dropdown-menu">
<form class="px-4 py-3">
<div class="mb-3">
<label for="exampleDropdownFormEmail1" class="form-label">Email address</label>
<input type="email" class="form-control" id="exampleDropdownFormEmail1" placeholder="[email protected]">
</div>
<div class="mb-3">
<label for="exampleDropdownFormPassword1" class="form-label">Password</label>
<input type="password" class="form-control" id="exampleDropdownFormPassword1" placeholder="Password">
</div>
<div class="mb-3">
<div class="form-check">
<input type="checkbox" class="form-check-input" id="dropdownCheck">
<label class="form-check-label" for="dropdownCheck">
Remember me
</label>
</div>
</div>
<button type="submit" class="btn btn-primary">Sign in</button>
</form>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">New around here? Sign up</a>
<a class="dropdown-item" href="#">Forgot password?</a>
</div>
<div class="dropdown">
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false" data-bs-auto-close="outside">
Dropdown form
</button>
<form class="dropdown-menu p-4">
<div class="mb-3">
<label for="exampleDropdownFormEmail2" class="form-label">Email address</label>
<input type="email" class="form-control" id="exampleDropdownFormEmail2" placeholder="[email protected]">
</div>
<div class="mb-3">
<label for="exampleDropdownFormPassword2" class="form-label">Password</label>
<input type="password" class="form-control" id="exampleDropdownFormPassword2" placeholder="Password">
</div>
<div class="mb-3">
<div class="form-check">
<input type="checkbox" class="form-check-input" id="dropdownCheck2">
<label class="form-check-label" for="dropdownCheck2">
Remember me
</label>
</div>
</div>
<button type="submit" class="btn btn-primary">Sign in</button>
</form>
</div>
드롭다운 옵션 (Dropdown options)
드롭다운의 위치를 바꾸려면 data-bs-offset 또는 data-bs-reference를 사용하세요.
<div class="d-flex">
<div class="dropdown me-1">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false" data-bs-offset="10,20">
Offset
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</div>
<div class="btn-group">
<button type="button" class="btn btn-secondary">Reference</button>
<button type="button" class="btn btn-secondary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false" data-bs-reference="parent">
<span class="visually-hidden">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Separated link</a></li>
</ul>
</div>
</div>
자동 닫기 동작 (Auto close behavior)
기본적으로 드롭다운 메뉴는 드롭다운 메뉴 안이나 바깥을 클릭하면 닫힙니다. autoClose 옵션을 사용해 드롭다운의 이 동작을 바꿀 수 있습니다.
<div class="btn-group">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" data-bs-auto-close="true" aria-expanded="false">
Default dropdown
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
</ul>
</div>
<div class="btn-group">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" data-bs-auto-close="inside" aria-expanded="false">
Clickable inside
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
</ul>
</div>
<div class="btn-group">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
Clickable outside
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
</ul>
</div>
<div class="btn-group">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" data-bs-auto-close="false" aria-expanded="false">
Manual close
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
<li><a class="dropdown-item" href="#">Menu item</a></li>
</ul>
</div>
CSS
변수 (Variables) — v5.2.0에서 추가
Bootstrap의 진화하는 CSS 변수 접근 방식에 따라, 드롭다운은 이제 .dropdown-menu에 로컬 CSS 변수를 사용해 실시간 커스터마이징을 강화합니다. CSS 변수의 값은 Sass를 통해 설정되므로 Sass 커스터마이징도 여전히 지원됩니다.
--#{$prefix}dropdown-zindex: #{$zindex-dropdown};
--#{$prefix}dropdown-min-width: #{$dropdown-min-width};
--#{$prefix}dropdown-padding-x: #{$dropdown-padding-x};
--#{$prefix}dropdown-padding-y: #{$dropdown-padding-y};
--#{$prefix}dropdown-spacer: #{$dropdown-spacer};
@include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size);
--#{$prefix}dropdown-color: #{$dropdown-color};
--#{$prefix}dropdown-bg: #{$dropdown-bg};
--#{$prefix}dropdown-border-color: #{$dropdown-border-color};
--#{$prefix}dropdown-border-radius: #{$dropdown-border-radius};
--#{$prefix}dropdown-border-width: #{$dropdown-border-width};
--#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius};
--#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg};
--#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y};
--#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow};
--#{$prefix}dropdown-link-color: #{$dropdown-link-color};
--#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color};
--#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg};
--#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color};
--#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg};
--#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color};
--#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x};
--#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y};
--#{$prefix}dropdown-header-color: #{$dropdown-header-color};
--#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x};
--#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y};
드롭다운 아이템에는 .dropdown에 설정되지 않은 변수가 적어도 하나 포함됩니다. 이렇게 하면 Bootstrap이 폴백 값을 기본으로 사용하는 동안 새 값을 제공할 수 있습니다.
--bs-dropdown-item-border-radius
CSS 변수 커스터마이징은 .dropdown-menu-dark 클래스에서 볼 수 있는데, 중복 CSS 셀렉터를 추가하지 않고 특정 값을 덮어씁니다.
--#{$prefix}dropdown-color: #{$dropdown-dark-color};
--#{$prefix}dropdown-bg: #{$dropdown-dark-bg};
--#{$prefix}dropdown-border-color: #{$dropdown-dark-border-color};
--#{$prefix}dropdown-box-shadow: #{$dropdown-dark-box-shadow};
--#{$prefix}dropdown-link-color: #{$dropdown-dark-link-color};
--#{$prefix}dropdown-link-hover-color: #{$dropdown-dark-link-hover-color};
--#{$prefix}dropdown-divider-bg: #{$dropdown-dark-divider-bg};
--#{$prefix}dropdown-link-hover-bg: #{$dropdown-dark-link-hover-bg};
--#{$prefix}dropdown-link-active-color: #{$dropdown-dark-link-active-color};
--#{$prefix}dropdown-link-active-bg: #{$dropdown-dark-link-active-bg};
--#{$prefix}dropdown-link-disabled-color: #{$dropdown-dark-link-disabled-color};
--#{$prefix}dropdown-header-color: #{$dropdown-dark-header-color};
Sass 변수 (Sass variables)
모든 드롭다운에 대한 변수:
$dropdown-min-width: 10rem;
$dropdown-padding-x: 0;
$dropdown-padding-y: .5rem;
$dropdown-spacer: .125rem;
$dropdown-font-size: $font-size-base;
$dropdown-color: var(--#{$prefix}body-color);
$dropdown-bg: var(--#{$prefix}body-bg);
$dropdown-border-color: var(--#{$prefix}border-color-translucent);
$dropdown-border-radius: var(--#{$prefix}border-radius);
$dropdown-border-width: var(--#{$prefix}border-width);
$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}); // stylelint-disable-line function-disallowed-list
$dropdown-divider-bg: $dropdown-border-color;
$dropdown-divider-margin-y: $spacer * .5;
$dropdown-box-shadow: var(--#{$prefix}box-shadow);
$dropdown-link-color: var(--#{$prefix}body-color);
$dropdown-link-hover-color: $dropdown-link-color;
$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg);
$dropdown-link-active-color: $component-active-color;
$dropdown-link-active-bg: $component-active-bg;
$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color);
$dropdown-item-padding-y: $spacer * .25;
$dropdown-item-padding-x: $spacer;
$dropdown-header-color: $gray-600;
$dropdown-header-padding-x: $dropdown-item-padding-x;
$dropdown-header-padding-y: $dropdown-padding-y;
// fusv-disable
$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x; // Deprecated in v5.2.0
// fusv-enable
다크 드롭다운에 대한 변수:
$dropdown-dark-color: $gray-300;
$dropdown-dark-bg: $gray-800;
$dropdown-dark-border-color: $dropdown-border-color;
$dropdown-dark-divider-bg: $dropdown-divider-bg;
$dropdown-dark-box-shadow: null;
$dropdown-dark-link-color: $dropdown-dark-color;
$dropdown-dark-link-hover-color: $white;
$dropdown-dark-link-hover-bg: rgba($white, .15);
$dropdown-dark-link-active-color: $dropdown-link-active-color;
$dropdown-dark-link-active-bg: $dropdown-link-active-bg;
$dropdown-dark-link-disabled-color: $gray-500;
$dropdown-dark-header-color: $gray-500;
드롭다운의 상호작용성을 나타내는 CSS 기반 캐럿에 대한 변수:
$caret-width: .3em;
$caret-vertical-align: $caret-width * .85;
$caret-spacing: $caret-width * .85;
Sass 믹스인 (Sass mixins)
믹스인은 CSS 기반 캐럿을 생성하는 데 사용되며 scss/mixins/_caret.scss에서 찾을 수 있습니다.
@mixin caret-down($width: $caret-width) {
border-top: $width solid;
border-right: $width solid transparent;
border-bottom: 0;
border-left: $width solid transparent;
}
@mixin caret-up($width: $caret-width) {
border-top: 0;
border-right: $width solid transparent;
border-bottom: $width solid;
border-left: $width solid transparent;
}
@mixin caret-end($width: $caret-width) {
border-top: $width solid transparent;
border-right: 0;
border-bottom: $width solid transparent;
border-left: $width solid;
}
@mixin caret-start($width: $caret-width) {
border-top: $width solid transparent;
border-right: $width solid;
border-bottom: $width solid transparent;
}
@mixin caret(
$direction: down,
$width: $caret-width,
$spacing: $caret-spacing,
$vertical-align: $caret-vertical-align
) {
@if $enable-caret {
&::after {
display: inline-block;
margin-left: $spacing;
vertical-align: $vertical-align;
content: "";
@if $direction == down {
@include caret-down($width);
} @else if $direction == up {
@include caret-up($width);
} @else if $direction == end {
@include caret-end($width);
}
}
@if $direction == start {
&::after {
display: none;
}
&::before {
display: inline-block;
margin-right: $spacing;
vertical-align: $vertical-align;
content: "";
@include caret-start($width);
}
}
&:empty::after {
margin-left: 0;
}
}
}
사용법 (Usage)
데이터 속성이나 JavaScript를 통해 드롭다운 플러그인은 부모 .dropdown-menu의 .show 클래스를 토글해 숨겨진 콘텐츠(드롭다운 메뉴)를 토글합니다. data-bs-toggle="dropdown" 속성은 애플리케이션 수준에서 드롭다운 메뉴를 닫는 데 의존되므로, 항상 사용하는 것이 좋습니다.
터치 지원 기기에서 드롭다운을 열면 <body> 요소의 직접 자식들에게 빈 mouseover 핸들러가 추가됩니다. 이 다소 지저분한 핵은 iOs의 이벤트 위임(딜리게이션)의 괴짜 동작을 우회하기 위해 필요한데, 그렇지 않으면 드롭다운 바깥의 어느 곳을 탭해도 드롭다운을 닫는 코드가 트리거되지 않습니다. 드롭다운이 닫히면 이 추가 빈 mouseover 핸들러들은 제거됩니다.
데이터 속성으로 (Via data attributes)
드롭다운을 토글하려면 링크나 버튼에 data-bs-toggle="dropdown"을 추가하세요.
<div class="dropdown">
<button type="button" data-bs-toggle="dropdown" aria-expanded="false">
Dropdown trigger
</button>
<ul class="dropdown-menu">
...
</ul>
</div>
JavaScript로 (Via JavaScript)
드롭다운은 JavaScript로 호출하든 data-api를 사용하든 트리거 요소에 data-bs-toggle="dropdown"이 있어야 합니다.
JavaScript로 드롭다운을 호출하세요:
const dropdownElementList = document.querySelectorAll('.dropdown-toggle')
const dropdownList = [...dropdownElementList].map(dropdownToggleEl => new bootstrap.Dropdown(dropdownToggleEl))
옵션 (Options)
옵션은 데이터 속성이나 JavaScript로 전달할 수 있으므로 data-bs-animation="{value}"처럼 data-bs-에 옵션 이름을 붙일 수 있습니다. 데이터 속성으로 옵션을 전달할 때는 옵션 이름의 표기(camelCase)를 "kebab-case"로 바꿔야 합니다. 예를 들어 data-bs-customClass="beautifier" 대신 data-bs-custom-class="beautifier"를 사용하세요.
Bootstrap 5.2.0부터 모든 컴포넌트는 간단한 컴포넌트 설정을 JSON 문자열로 담을 수 있는 실험적 예약 데이터 속성 data-bs-config를 지원합니다. 요소에 data-bs-config='{"delay":0, "title":123}'과 data-bs-title="456" 속성이 있으면 최종 title 값은 456이 되고, 별도의 데이터 속성이 data-bs-config에 주어진 값을 덮어씁니다. 또한 기존 데이터 속성이 data-bs-delay='{"show":0,"hide":150}'처럼 JSON 값을 담을 수 있습니다.
최종 설정 객체는 data-bs-config, data-bs-, js 객체를 병합한 결과로, 가장 나중에 주어진 키-값이 다른 것들을 덮어씁니다.
| 이름 | 타입 | 기본값 | 설명 |
|---|---|---|---|
| autoClose | boolean, string | true | 드롭다운의 자동 닫기 동작을 설정합니다: |
| boundary | string, element | 'clippingParents' | 드롭다운 메뉴의 오버플로 제약 경계입니다 (Popper의 preventOverflow modifier에만 적용). 기본적으로 clippingParents이며 HTMLElement 참조를 받을 수 있습니다 (JavaScript로만). 자세한 내용은 Popper의 detectOverflow 문서를 참고하세요. |
| display | string | 'dynamic' | 기본적으로 동적 위치 지정을 위해 Popper를 사용합니다. static으로 이것을 비활성화하세요. |
| offset | array, string, function | [0, 2] | 타깃에 대한 드롭다운의 오프셋입니다. 데이터 속성에 쉼표로 구분된 문자열을 전달할 수 있습니다: data-bs-offset="10,20"처럼. 오프셋을 결정하는 데 함수를 사용하면 popper placement, reference, popper rects를 담은 객체가 첫 번째 인자로 호출됩니다. 트리거링 요소 DOM 노드가 두 번째 인자로 전달됩니다. 함수는 skidding, distance 두 숫자의 배열을 반환해야 합니다. 자세한 내용은 Popper의 offset 문서를 참고하세요. |
| popperConfig | null, object, function | null | Bootstrap의 기본 Popper 설정을 바꾸려면 Popper의 configuration을 참고하세요. Popper 설정을 만드는 데 함수를 쓰면 Bootstrap의 기본 Popper 설정을 담은 객체로 호출됩니다. 기본값을 자신의 설정과 사용·병합하는 데 도움이 됩니다. 함수는 Popper의 설정 객체를 반환해야 합니다. |
| reference | string, element, object | 'toggle' | 드롭다운 메뉴의 참조 요소입니다. 'toggle', 'parent', HTMLElement 참조 또는 getBoundingClientRect를 제공하는 객체의 값을 받습니다. 자세한 내용은 Popper의 constructor 문서와 virtual element 문서를 참고하세요. |
autoClose 옵션의 세부 동작:
true- 드롭다운 메뉴 바깥이나 안을 클릭하면 닫힙니다.false- 토글 버튼을 클릭하고 hide/toggle 메서드를 수동으로 호출할 때만 닫힙니다. (Esc 키를 눌러도 닫히지 않습니다)'inside'- 드롭다운 메뉴 안을 클릭할 때만 닫힙니다.'outside'- 드롭다운 메뉴 바깥을 클릭할 때만 닫힙니다. 참고: Esc 키로는 항상 닫을 수 있습니다.
popperConfig와 함께 함수 사용 (Using function with popperConfig)
const dropdown = new bootstrap.Dropdown(element, {
popperConfig(defaultBsPopperConfig) {
// const newPopperConfig = {...}
// use defaultBsPopperConfig if needed...
// return newPopperConfig
}
})
메서드 (Methods)
| 메서드 | 설명 |
|---|---|
| dispose | 요소의 드롭다운을 파괴합니다. (DOM 요소에 저장된 데이터를 제거합니다.) |
| getInstance | DOM 요소에 연결된 드롭다운 인스턴스를 가져올 수 있는 정적 메서드입니다. 이렇게 사용할 수 있습니다: bootstrap.Dropdown.getInstance(element). |
| getOrCreateInstance | DOM 요소에 연결된 드롭다운 인스턴스를 반환하거나, 초기화되지 않았다면 새로 만드는 정적 메서드입니다. 이렇게 사용할 수 있습니다: bootstrap.Dropdown.getOrCreateInstance(element). |
| hide | 주어진 navbar 또는 탭 내비게이션의 드롭다운 메뉴를 숨깁니다. |
| show | 주어진 navbar 또는 탭 내비게이션의 드롭다운 메뉴를 보여줍니다. |
| toggle | 주어진 navbar 또는 탭 내비게이션의 드롭다운 메뉴를 토글합니다. |
| update | 요소의 드롭다운 위치를 업데이트합니다. |
이벤트 (Events)
모든 드롭다운 이벤트는 트리거링 요소에서 발생한 후 버블링됩니다. 따라서 .dropdown-menu의 부모 요소에도 이벤트 리스너를 추가할 수 있습니다. hide.bs.dropdown과 hidden.bs.dropdown 이벤트는 (원래 이벤트 타입이 click일 때만) 클릭 이벤트의 Event Object를 담는 clickEvent 속성을 가집니다.
| 이벤트 타입 | 설명 |
|---|---|
| hide.bs.dropdown | hide 인스턴스 메서드가 호출되는 즉시 발생합니다. |
| hidden.bs.dropdown | 드롭다운이 사용자에게 숨겨지기 완료되고 CSS 전환이 완료되었을 때 발생합니다. |
| show.bs.dropdown | show 인스턴스 메서드가 호출되는 즉시 발생합니다. |
| shown.bs.dropdown | 드롭다운이 사용자에게 보이게 되고 CSS 전환이 완료되었을 때 발생합니다. |
const myDropdown = document.getElementById('myDropdown')
myDropdown.addEventListener('show.bs.dropdown', event => {
// do something...
})