아코디언
Collapse(콜랩스) JavaScript 플러그인과 조합하여, 수직으로 접는 아코디언을 만듭니다.
작동 원리
아코디언은 내부적으로 콜랩스를 사용하여 접기가 가능합니다.
이 컴포넌트의 애니메이션 효과는 prefers-reduced-motion
미디어 쿼리에 따라 다릅니다. 접근성 문서의 모션 감소 문단을 참고하세요.
예시
아래의 아코디언을 클릭하면, 아코디언의 내용을 접기/펼치기가 가능합니다.
기본적으로 확장된 아코디언을 렌더링하려면 다음 단계를 확인해주세요:
.accordion-collapse
요소에.show
클래스를 추가합니다..accordion-button
요소에서.collapsed
클래스를 삭제하고aria-expanded
속성을true
로 설정합니다.
.accordion-body
, though the transition does limit overflow.
.accordion-body
, though the transition does limit overflow.
.accordion-body
, though the transition does limit overflow.
<div class="accordion" id="accordionExample">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
Accordion Item #1
</button>
</h2>
<div id="collapseOne" class="accordion-collapse collapse show" data-bs-parent="#accordionExample">
<div class="accordion-body">
<strong>This is the first item's accordion body.</strong> It is shown by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
Accordion Item #2
</button>
</h2>
<div id="collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
<div class="accordion-body">
<strong>This is the second item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
Accordion Item #3
</button>
</h2>
<div id="collapseThree" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
<div class="accordion-body">
<strong>This is the third item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
</div>
</div>
</div>
</div>
채우기
.accordion-flush
를 추가하여 몇 개의 둥근 모서리를 삭제해, 아코디언을 부모 컨테이너와 함께 edge-to-edge로 렌더링합니다.
.accordion-flush
class. This is the first item’s accordion body..accordion-flush
class. This is the second item’s accordion body. Let’s imagine this being filled with some actual content..accordion-flush
class. This is the third item’s accordion body. Nothing more exciting happening here in terms of content, but just filling up the space to make it look, at least at first glance, a bit more representative of how this would look in a real-world application.<div class="accordion accordion-flush" id="accordionFlushExample">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseOne" aria-expanded="false" aria-controls="flush-collapseOne">
Accordion Item #1
</button>
</h2>
<div id="flush-collapseOne" class="accordion-collapse collapse" data-bs-parent="#accordionFlushExample">
<div class="accordion-body">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the first item’s accordion body.</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseTwo" aria-expanded="false" aria-controls="flush-collapseTwo">
Accordion Item #2
</button>
</h2>
<div id="flush-collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionFlushExample">
<div class="accordion-body">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the second item’s accordion body. Let’s imagine this being filled with some actual content.</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseThree" aria-expanded="false" aria-controls="flush-collapseThree">
Accordion Item #3
</button>
</h2>
<div id="flush-collapseThree" class="accordion-collapse collapse" data-bs-parent="#accordionFlushExample">
<div class="accordion-body">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the third item’s accordion body. Nothing more exciting happening here in terms of content, but just filling up the space to make it look, at least at first glance, a bit more representative of how this would look in a real-world application.</div>
</div>
</div>
</div>
항상 열기
다른 항목이 열렸을 때도 이전 아코디언 항목이 열린 상태로 유지되게 하고 싶으면 각 .accordion-collapse
의 data-bs-parent
속성을 생략하면 됩니다.
.accordion-body
, though the transition does limit overflow.
.accordion-body
, though the transition does limit overflow.
.accordion-body
, though the transition does limit overflow.
<div class="accordion" id="accordionPanelsStayOpenExample">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#panelsStayOpen-collapseOne" aria-expanded="true" aria-controls="panelsStayOpen-collapseOne">
Accordion Item #1
</button>
</h2>
<div id="panelsStayOpen-collapseOne" class="accordion-collapse collapse show">
<div class="accordion-body">
<strong>This is the first item's accordion body.</strong> It is shown by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#panelsStayOpen-collapseTwo" aria-expanded="false" aria-controls="panelsStayOpen-collapseTwo">
Accordion Item #2
</button>
</h2>
<div id="panelsStayOpen-collapseTwo" class="accordion-collapse collapse">
<div class="accordion-body">
<strong>This is the second item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#panelsStayOpen-collapseThree" aria-expanded="false" aria-controls="panelsStayOpen-collapseThree">
Accordion Item #3
</button>
</h2>
<div id="panelsStayOpen-collapseThree" class="accordion-collapse collapse">
<div class="accordion-body">
<strong>This is the third item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
</div>
</div>
</div>
</div>
접근성
자세한 내용은 콜랩스 문서의 접근성 문단을 참고해 주세요.
CSS
변수
v5.2.0에서 추가됨Bootstrap의 진화하는 CSS 변수 접근 방식의 일환으로 아코디언은 이제 향상된 실시간 사용자 지정을 위해 .accordion
에서 로컬 CSS 변수를 사용합니다. CSS 변수의 값은 Sass를 통해 설정되므로 Sass 사용자 정의도 계속 지원됩니다.
--#{$prefix}accordion-color: #{$accordion-color};
--#{$prefix}accordion-bg: #{$accordion-bg};
--#{$prefix}accordion-transition: #{$accordion-transition};
--#{$prefix}accordion-border-color: #{$accordion-border-color};
--#{$prefix}accordion-border-width: #{$accordion-border-width};
--#{$prefix}accordion-border-radius: #{$accordion-border-radius};
--#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius};
--#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x};
--#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y};
--#{$prefix}accordion-btn-color: #{$accordion-button-color};
--#{$prefix}accordion-btn-bg: #{$accordion-button-bg};
--#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)};
--#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width};
--#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform};
--#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition};
--#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)};
--#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow};
--#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x};
--#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y};
--#{$prefix}accordion-active-color: #{$accordion-button-active-color};
--#{$prefix}accordion-active-bg: #{$accordion-button-active-bg};
Sass 변수
$accordion-padding-y: 1rem;
$accordion-padding-x: 1.25rem;
$accordion-color: var(--#{$prefix}body-color);
$accordion-bg: var(--#{$prefix}body-bg);
$accordion-border-width: var(--#{$prefix}border-width);
$accordion-border-color: var(--#{$prefix}border-color);
$accordion-border-radius: var(--#{$prefix}border-radius);
$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width);
$accordion-body-padding-y: $accordion-padding-y;
$accordion-body-padding-x: $accordion-padding-x;
$accordion-button-padding-y: $accordion-padding-y;
$accordion-button-padding-x: $accordion-padding-x;
$accordion-button-color: var(--#{$prefix}body-color);
$accordion-button-bg: var(--#{$prefix}accordion-bg);
$accordion-transition: $btn-transition, border-radius .15s ease;
$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle);
$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis);
// fusv-disable
$accordion-button-focus-border-color: $input-focus-border-color; // Deprecated in v5.3.3
// fusv-enable
$accordion-button-focus-box-shadow: $btn-focus-box-shadow;
$accordion-icon-width: 1.25rem;
$accordion-icon-color: $body-color;
$accordion-icon-active-color: $primary-text-emphasis;
$accordion-icon-transition: transform .2s ease-in-out;
$accordion-icon-transform: rotate(-180deg);
$accordion-button-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='#{$accordion-icon-color}' stroke-linecap='round' stroke-linejoin='round'><path d='m2 5 6 6 6-6'/></svg>");
$accordion-button-active-icon: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='#{$accordion-icon-active-color}' stroke-linecap='round' stroke-linejoin='round'><path d='m2 5 6 6 6-6'/></svg>");
사용법
콜랩스 플러그인은 몇 가지 클래스를 활용하여 무거운 작업을 처리합니다:
- 콘텐츠를 숨기는
.collapse
- 콘텐츠를 표시하는
.collapse.show
- 전환이 시작될 때 추가되고, 끝나면 제거되는
.collapsing
이 클래스는 _transitions.scss
에서 찾을 수 있습니다.
데이터 속성 사용하기
요소에 data-bs-toggle="collapse"
와 data-bs-target
을 추가하면 하나 이상의 접을 수 있는 요소에 대한 제어권이 자동으로 할당됩니다. data-bs-target
속성은 콜랩스를 적용할 CSS 선택자를 허용합니다. 접을 수 있는 요소에 collapse
클래스를 추가해야 합니다. 기본적으로 열려 있도록 설정하려면 show
클래스를 추가하세요.
접을 수 있는 영역에 아코디언 그룹 관리 기능을 추가하려면 데이터 속성 data-bs-parent="#selector"
를 추가하세요.
JavaScript 사용하기
다음으로 수동으로 활성화할 수 있습니다:
const accordionCollapseElementList = document.querySelectorAll('#myAccordion .collapse')
const accordionCollapseList = [...accordionCollapseElementList].map(accordionCollapseEl => new bootstrap.Collapse(accordionCollapseEl))
옵션
옵션은 데이터 속성이나 JavaScript를 통해 전달될 수 있으므로, data-bs-animation="{value}"
처럼 data-bs-
에 옵션 이름을 추가할 수 있습니다. 데이터 속성을 통해 옵션을 전달할 때는 옵션 이름의 대소문자를 “camelCase”에서 “kebab-case”로 변경해야 합니다. 예를 들어, data-bs-customClass="beautifier"
대신 data-bs-custom-class="beautifier"
를 사용하세요.
Bootstrap 5.2.0부터 모든 컴포넌트는 간단한 컴포넌트 구성을 JSON 문자열로 저장할 수 있는 experimental 예약 데이터 속성 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 object
의 병합된 결과로, 주어진 최신 key-value가 다른 key-value를 재정의합니다.
이름 | 유형 | 기본값 | 설명 |
---|---|---|---|
parent | selector, DOM element | null | 상위 요소가 제공된 경우, 해당하는 접을 수 있는 항목이 표시될 때 지정된 상위 요소 내의 모든 접을 수 있는 요소가 닫힙니다. (기존 아코디언 동작과 유사하며, card 클래스에 따라 달라짐) 이 속성은 접을 수 있는 대상 영역에 설정해야 합니다. |
toggle | boolean | true | 호출 시 접을 수 있는 요소를 전환합니다. |
메소드
모든 API 메서드는 비동기식이며 전환을 시작합니다. 전환이 시작되는 즉시 호출자에게 반환되지만 전환이 끝나기 전에 호출자에게 반환됩니다. 또한 전환 중인 컴포넌트에 대한 메서드 호출은 무시됩니다. JavaScript 문서에서 자세히 알아보세요.
콘텐츠를 접을 수 있는 요소로 활성화합니다. 선택적 옵션인 object
를 허용합니다.
생성자를 사용하여 콜랩스 인스턴스를 만들 수 있습니다. 다음과 같이 예시를 들 수 있습니다:
const bsCollapse = new bootstrap.Collapse('#myCollapse', {
toggle: false
})
메소드 | 설명 |
---|---|
dispose | 요소의 콜랩스를 제거합니다. (DOM 요소에 저장된 데이터를 삭제함) |
getInstance | 정적 메서드로, DOM 요소에 연결된 콜랩스 인스턴스를 반환합니다. 사용 예시: bootstrap.Collapse.getInstance(element) |
getOrCreateInstance | DOM 요소에 연결된 콜랩스 인스턴스를 반환하거나, 없으면 새로 생성합니다. 사용 예시: bootstrap.Collapse.getOrCreateInstance(element) |
hide | 접을 수 있는 요소를 숨깁니다. 요소가 실제로 숨겨지기 전에 호출자에게 반환됩니다. (hidden.bs.collapse 이벤트 발생 전) |
show | 접을 수 있는 요소를 표시합니다. 요소가 실제로 표시되기 전에 호출자에게 반환됩니다. (shown.bs.collapse 이벤트 발생 전) |
toggle | 접을 수 있는 요소의 표시/숨김 상태를 전환합니다. 요소가 실제로 표시되거나 숨겨지기 전에 호출자에게 반환됩니다. (shown.bs.collapse 또는 hidden.bs.collapse 이벤트 발생 전) |
이벤트
Bootstrap의 콜랩스 클래스는 콜랩스 기능에 연결할 수 있는 몇 가지 이벤트를 제공합니다.
이벤트 유형 | 설명 |
---|---|
hide.bs.collapse | 이 이벤트는 hide 메서드가 호출되는 즉시 발생합니다. |
hidden.bs.collapse | 이 이벤트는 콜랩스 요소가 사용자에게 숨겨졌을 때 발생합니다. (CSS 전환이 완료될 때까지 대기) |
show.bs.collapse | 이 이벤트는 show 인스턴스 메서드가 호출되는 즉시 발생합니다. |
shown.bs.collapse | 이 이벤트는 콜랩스 요소가 사용자에게 표시될 때 발생합니다. (CSS 전환이 완료될 때까지 대기) |
const myCollapsible = document.getElementById('myCollapsible')
myCollapsible.addEventListener('hidden.bs.collapse', event => {
// do something...
})