내용으로 건너뛰기 문서 내비게이션으로 건너뛰기
// Popovers

iOS에서 볼수 있는 Bootstrap 팝오버를 사이트 임의의 요소에 추가하기 위한 문서와 예시입니다.

개요

팝오버 플러그인을 사용할 때 알아두어야 할 점:

  • 팝오버는 서드파티 라이브러리인 Popper에 의존하고 있습니다. bootstrap.js 앞에 popper.min.js를 사용하거나, Popper가 포함되어 있는 bootstrap.bundle.min.js를 사용해야 합니다.
  • 팝오버는, 의존관계로 popover 플러그인이 필요합니다.
  • 팝오버는 퍼포먼스를 위해 opt-in 되어 있기 때문에, 스스로 초기화를 해야 합니다.
  • 길이가 0인 titlecontent 값은 팝오버를 표시하지 않습니다.
  • 더 복잡한 컴포넌트(input group, button groups 등)의 렌더링 문제를 피하기 위해 container: 'body'를 지정해 주십시오.
  • 숨겨진 요소에서 팝오버를 트리거 해도 작동하지 않습니다.
  • .disabled 또는 disabled 요소의 팝오버는 그 위(바깥) 요소에서 트리거 해야 합니다.
  • 여러 라인에 걸쳐 있는 앵커로부터 트리거 된 경우, 팝오버는 앵커의 전체 폭을 중심으로 표시됩니다. 이 동작을 피하기 위해서는 <a>.text-nowrap을 사용해 주십시오.
  • 팝오버는 대응 요소가 DOM에서 삭제되기 전에 숨겨야 합니다.
  • 팝오버는 shadow DOM 내의 요소 덕분에 트리거할 수 있습니다.
이 컴포넌트는 기본적으로 명시적으로 허용되지 않는 HTML 요소를 제거하는 내장 콘텐츠 새니타이저를 사용합니다. 자세한 내용은 JavaScript 문서의 Sanitizer 문단을 참고하세요.
이 컴포넌트의 애니메이션 효과는 prefers-reduced-motion 미디어 쿼리에 따라 다릅니다. 접근성 문서의 모션 감소 문단을 참고하세요.

팝오버가 어떤 기능을 하는지 몇 가지 예를 들어 보겠습니다.

예시

팝오버 활성화

위에서 설명했듯이 팝오버를 사용하려면 사용하기 전에 팝오버를 초기화해주어야 합니다. 페이지 상의 모든 팝오버를 초기화하는 방법 중 하나는 아래처럼 data-bs-toggle 속성으로 선택하는 것입니다:

const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))

라이브 데모

위의 스니펫과 유사한 JavaScript를 사용하여 다음과 같은 라이브 팝오버를 렌더링합니다. 제목은 data-bs-title을 통해 설정하고 본문 콘텐츠는 data-bs-content를 통해 설정합니다.

HTML에 title 또는 data-bs-title을 자유롭게 사용할 수 있습니다. title을 사용하면 요소가 렌더링될 때 Popper가 자동으로 data-bs-title으로 대체합니다.
html
<button type="button" class="btn btn-lg btn-danger" data-bs-toggle="popover" data-bs-title="Popover title" data-bs-content="And here's some amazing content. It's very engaging. Right?">Click to toggle popover</button>

사방위

4가지 옵션이 있습니다: top, right, bottom, left. RTL에서 Bootstrap을 사용하는 경우 방향은 반대가 됩니다. data-bs-placement 로 방향을 변경할 수 있습니다.

html
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Top popover">
  Popover on top
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Right popover">
  Popover on right
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Bottom popover">
  Popover on bottom
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Left popover">
  Popover on left
</button>

사용자 지정 container

부모 요소에 팝오버를 방해하는 일부 스타일이 있는 경우 사용자 정의 container를 지정하여 해당 요소 내에 팝오버의 HTML이 대신 표시되도록 할 수 있습니다. 이는 반응형 표, 입력 그룹 등에서 흔히 사용됩니다.

const popover = new bootstrap.Popover('.example-popover', {
  container: 'body'
})

명시적인 사용자 정의 container를 설정해야 하는 또 다른 상황은 모달 대화 상자 내부의 팝업으로, 팝업 자체가 모달에 추가되도록 하는 것입니다. 이는 대화형 요소가 포함된 팝업의 경우 특히 중요합니다. 모달 대화 상자는 포커스를 가두기 때문에 팝업이 모달의 하위 요소가 아니면 사용자가 이러한 대화형 요소에 초점을 맞추거나 활성화할 수 없습니다.

const popover = new bootstrap.Popover('.example-popover', {
  container: '.modal-body'
})

사용자 지정 팝오버

v5.2.0에서 추가됨

CSS 변수를 사용하여 팝오버의 모양을 사용자 정의할 수 있습니다. data-bs-custom-class="custom-popover"로 사용자 정의 클래스를 설정하여 사용자 정의 모양의 범위를 지정하고 이를 사용하여 일부 로컬 CSS 변수를 재정의합니다.

.custom-popover {
  --bs-popover-max-width: 200px;
  --bs-popover-border-color: var(--bd-violet-bg);
  --bs-popover-header-bg: var(--bd-violet-bg);
  --bs-popover-header-color: var(--bs-white);
  --bs-popover-body-padding-x: 1rem;
  --bs-popover-body-padding-y: .5rem;
}
html
<button type="button" class="btn btn-secondary"
        data-bs-toggle="popover" data-bs-placement="right"
        data-bs-custom-class="custom-popover"
        data-bs-title="Custom popover"
        data-bs-content="This popover is themed via CSS variables.">
  Custom popover
</button>

다음 클릭으로 닫기

사용자가 다음 토글 요소 이외의 요소를 클릭했을 때 팝오버를 닫으려면 focus 트리거를 사용합니다.

브라우저나 플랫폼에 관계없이 제대로 다음 클릭으로 닫기를 사용하기 위해서는 특정 HTML이 필요합니다. <button> 태그가 아닌 <a> 태그만 사용할 수 있으며, 반드시 tabindex 속성을 포함해야 합니다.
html
<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-bs-toggle="popover" data-bs-trigger="focus" data-bs-title="Dismissible popover" data-bs-content="And here's some amazing content. It's very engaging. Right?">Dismissible popover</a>
const popover = new bootstrap.Popover('.popover-dismiss', {
  trigger: 'focus'
})

비활성화 요소

disabled 속성을 갖는 요소는 인터랙티브하지 않습니다. 즉, 사용자가 팝오버(또는 툴팁)를 일으키기 위해서 호버하거나 클릭할 수 없습니다. 차선책으로 감싼 <div><span>에서 팝오버를 트리거 되길 원하지만, tabindex="0"을 사용해 키보드 포커스가 가능하도록 이상적으로 만듭니다.

무효화된 팝오버를 트리거 하기 위해서는 data-bs-trigger="hover focus"라고 하면 사용자는 무효가 된 요소를 click 할 것을 기대하지 않기 때문에 팝오버가 바로 시각적으로 표시되게 됩니다.

html
<span class="d-inline-block" tabindex="0" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-content="Disabled popover">
  <button class="btn btn-primary" type="button" disabled>Disabled button</button>
</span>

CSS

변수

v5.2.0에서 추가됨

Bootstrap의 진화하는 CSS 변수 접근 방식의 일환으로, 이제 팝오버는 .popover에서 로컬 CSS 변수를 사용하여 실시간 사용자 정의 기능을 향상시킵니다. CSS 변수의 값은 Sass를 통해 설정되므로 Sass 사용자 정의도 계속 지원됩니다.

--#{$prefix}popover-zindex: #{$zindex-popover};
--#{$prefix}popover-max-width: #{$popover-max-width};
@include rfs($popover-font-size, --#{$prefix}popover-font-size);
--#{$prefix}popover-bg: #{$popover-bg};
--#{$prefix}popover-border-width: #{$popover-border-width};
--#{$prefix}popover-border-color: #{$popover-border-color};
--#{$prefix}popover-border-radius: #{$popover-border-radius};
--#{$prefix}popover-inner-border-radius: #{$popover-inner-border-radius};
--#{$prefix}popover-box-shadow: #{$popover-box-shadow};
--#{$prefix}popover-header-padding-x: #{$popover-header-padding-x};
--#{$prefix}popover-header-padding-y: #{$popover-header-padding-y};
@include rfs($popover-header-font-size, --#{$prefix}popover-header-font-size);
--#{$prefix}popover-header-color: #{$popover-header-color};
--#{$prefix}popover-header-bg: #{$popover-header-bg};
--#{$prefix}popover-body-padding-x: #{$popover-body-padding-x};
--#{$prefix}popover-body-padding-y: #{$popover-body-padding-y};
--#{$prefix}popover-body-color: #{$popover-body-color};
--#{$prefix}popover-arrow-width: #{$popover-arrow-width};
--#{$prefix}popover-arrow-height: #{$popover-arrow-height};
--#{$prefix}popover-arrow-border: var(--#{$prefix}popover-border-color);

Sass 변수

$popover-font-size:                 $font-size-sm;
$popover-bg:                        var(--#{$prefix}body-bg);
$popover-max-width:                 276px;
$popover-border-width:              var(--#{$prefix}border-width);
$popover-border-color:              var(--#{$prefix}border-color-translucent);
$popover-border-radius:             var(--#{$prefix}border-radius-lg);
$popover-inner-border-radius:       calc(#{$popover-border-radius} - #{$popover-border-width}); // stylelint-disable-line function-disallowed-list
$popover-box-shadow:                var(--#{$prefix}box-shadow);

$popover-header-font-size:          $font-size-base;
$popover-header-bg:                 var(--#{$prefix}secondary-bg);
$popover-header-color:              $headings-color;
$popover-header-padding-y:          .5rem;
$popover-header-padding-x:          $spacer;

$popover-body-color:                var(--#{$prefix}body-color);
$popover-body-padding-y:            $spacer;
$popover-body-padding-x:            $spacer;

$popover-arrow-width:               1rem;
$popover-arrow-height:              .5rem;

사용 방법

JavaScript로 팝오버를 유효화합니다:

const exampleEl = document.getElementById('example')
const popover = new bootstrap.Popover(exampleEl, options)

키보드 및 보조 기술 사용자가 팝오버에 액세스할 수 있도록 유지하려면 키보드 포커스가 가능하며 상호작용이 가능한 HTML 요소(링크나 폼 컨트톨 등)에 팝오버를 추가하세요.

임의의 HTML 요소(<span> 등)는 tabindex="0" 속성을 추가함으로써 포커스가 가능한데, 이는 키보드 사용자에게는 상호작용할 수 없는 요소에 탭 멈춤이 추가되어 혼란을 초래할 수 있습니다. 게다가 키보드 사용자가 팝오버를 트리거 할 수 없게 되므로 팝오버의 트리거를 hover에만 의지해서는 안됩니다.

html 옵션에서 리치로 구조화된 HTML을 팝오버에 넣을 수 있지만 과도한 양의 콘텐츠를 추가하는 것은 피하는 것이 좋습니다. 팝오버가 현재 기능을 하는 방법은 한 번 표시되면 해당 콘텐츠는 aria-describedby 속성을 갖는 트리거 요소에 연결됩니다. 그 결과 팝오버 콘텐츠 전체가 스크린 리더 사용자에게 길고 끊기지 않는 스트림으로 알릴 것입니다.

또한, 인터랙티브한 컨트롤(폼 요소나 링크 등)들을 팝오버에 포함할 수도 있지만 (허락된 속성이나 태그의 allowList에 이러한 요소를 추가하여), 현재 팝오버는 키보드 포커스 순서를 관리하지 않는다는 점에 유의하십시오. 키보드 사용자가 팝오버를 열면 포커스는 트리거가 되는 요소에 머무르고, 팝오버는 보통 문서 구조의 트리거를 쉽게 따라가지 않기 때문에 TAB 을 앞으로 이동/눌러도 키보드 사용자가 팝오버 자체로 이동하라는 보장은 없습니다. 요컨대 단순히 팝오버에 상호작용할 수 있는 컨트롤을 추가하는 것만으로도 키보드 사용자나 스크린 리더 사용자들이 이들 컨트롤에 접근할 수 없거나 적어도 전체적으로 비논리적인 포커스 순서가 될 수 있습니다. 이러한 경우는, modal(모달) 사용을 검토해 주십시오.

옵션

옵션은 데이터 속성이나 JavaScript를 통해 전달할 수 있으므로 data-bs-에 옵션 이름을 추가할 수 있습니다(예: data-bs-animation="{value}"). 데이터 속성을 통해 옵션을 전달할 때 옵션 이름의 대/소문자 유형을 ‘camelCase‘에서 ‘kebab-case‘로 변경해야 합니다. 예를 들어 data-bs-custom-class="beautifier" 대신 data-bs-customClass="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를 재정의합니다.

보안상의 이유로 sanitize, sanitizeFn, allowList 옵션을 data 속성으로 지정할 수 없다는 것에 주의해 주세요.
이름 유형 기본값 설명
allowList object 기본값 허용된 속성 및 태그가 포함된 개체입니다.
animation boolean true 팝오버에 CSS 페이드 전환을 적용합니다.
boundary string, element 'clippingParents' 팝오버의 오버플로 제약 조건 경계(Popper의 preventOverflow 수정자에만 적용). 기본값은 'clippingParents'이며 (JavaScript를 통해서만) HTMLElement 참조를 받을 수 있습니다. 자세한 내용은 Popper의 detectOverflow 문서를 참조하세요.
container string, element, false false 특정 요소에 팝오버를 추가합니다. 예: container: 'body'. 이 옵션은 문서 흐름에서 트리거 요소 근처에 팝오버를 배치할 수 있다는 점에서 특히 유용하며, 창 크기를 조정하는 동안 팝오버가 트리거 요소에서 떠다니는 것을 방지할 수 있습니다.
content string, element, function '' 팝오버의 텍스트 콘텐츠입니다. 함수가 지정되면 팝오버가 첨부된 요소에 대한 this 참조를 설정하여 호출됩니다.
customClass string, function '' 팝오버가 표시되면 클래스를 추가합니다. 이러한 클래스는 템플릿에 지정된 모든 클래스에 추가됩니다. 여러 클래스를 추가하려면 class-1 class-2와 같이 공백으로 구분합니다. 추가 클래스 이름이 포함된 단일 문자열을 반환하는 함수를 전달할 수도 있습니다.
delay number, object 0 팝오버 표시 및 숨기기 지연(ms) - 수동 트리거 유형에는 적용되지 않습니다. 숫자를 지정하면 숨기기/표시 모두에 지연이 적용됩니다. 객체 구조: delay: { "show": 500, "hide": 100 }.
fallbackPlacements string, array ['top', 'right', 'bottom', 'left'] 배열에 배치 목록을 제공함으로써 대체 배치를 정의합니다(선호도 순서대로). 자세한 내용은 Popper의 동작 문서를 참조하세요.
html boolean false 팝오버에 HTML 허용. true이면 팝오버의 title에 있는 HTML 태그가 팝오버에 렌더링됩니다. false인 경우 innerText 속성을 사용하여 DOM에 콘텐츠를 삽입합니다. XSS 공격이 걱정된다면 텍스트를 사용하세요.
offset number, string, function [0, 0] 대상에 대한 팝오버의 오프셋입니다. data-bs-offset="10,20"와 같이 쉼표로 구분된 값으로 데이터 속성에 문자열을 전달할 수 있습니다. 함수가 오프셋을 결정하는 데 사용되는 경우 Popper 배치, 참조 및 Popper 레코드가 포함된 객체를 첫 번째 인수로 사용하여 호출됩니다. 트리거링 요소 DOM 노드는 두 번째 인수로 전달됩니다. 이 함수는 두 개의 숫자가 포함된 배열을 반환해야 합니다: 스키딩, 거리. 자세한 내용은 Popper의 오프셋 문서를 참조하세요.
placement string, function 'top' auto, top, bottom, left, right로 팝오버 위치를 지정할 수 있습니다. auto를 지정하면 팝오버의 방향이 동적으로 변경됩니다. 함수가 위치를 결정하는 데 사용되는 경우, 함수는 팝오버 DOM 노드를 첫 번째 인수로, 트리거링 요소 DOM 노드를 두 번째 인수로 사용하여 호출됩니다. this 컨텍스트는 팝오버 인스턴스로 설정됩니다.
popperConfig null, object, function null Bootstrap의 기본 Popper 구성을 변경하려면 Popper 구성을 참조하세요. 함수를 사용하여 Popper 구성을 생성하는 경우 Bootstrap의 기본 Popper 구성이 포함된 객체와 함께 호출됩니다. 이 함수를 사용하면 기본 구성을 사용하고 자신만의 구성과 병합할 수 있습니다. 함수는 Popper에 대한 구성 객체를 반환해야 합니다.
sanitize boolean true 새니타이징(sanitizing)을 활성화 또는 비활성화합니다. 'template'을 활성화하면 'content', 'title' 옵션이 새니타이징 처리됩니다.
sanitizeFn null, function null 여기에서 자체 새니타이징 기능을 제공할 수 있습니다. 전용 라이브러리를 사용하여 새니타이징을 수행하려는 경우 유용할 수 있습니다.
selector string, false false 선택기가 제공되면 팝오버 객체가 지정된 대상에 위임됩니다. 실제로는 동적으로 추가된 DOM 요소에 팝오버를 적용하는 데에도 사용됩니다(jQuery.on 지원). 이번 이슈유익한 예제를 참조하세요. 참고:title 속성을 선택자로 사용해서는 안 됩니다.
template string '<div class="popover" role="tooltip"><div class="popover-arrow"></div><div class="popover-inner"></div></div>' 팝오버를 만들 때 사용할 기본 HTML입니다. 팝오버의 title.popover-inner에 삽입됩니다. .popover-arrow는 팝오버의 화살표가 됩니다. 가장 바깥쪽 래퍼 요소에는 .popover 클래스와 role="tooltip"이 있어야 합니다.
title string, element, function '' 팝오버 제목입니다. 함수가 지정되면 팝오버가 첨부된 요소에 대한 this 참조를 설정하여 호출됩니다.
trigger string 'hover focus' 팝업이 트리거되는 방법: 클릭, 마우스오버, 포커스, 수동. 여러 트리거를 전달할 수 있으며, 공백으로 구분하세요. 'manual'.popover('show'), .popover('hide').popover('toggle') 메서드를 통해 프로그래밍 방식으로 팝업이 트리거됨을 나타내며, 이 값은 다른 트리거와 결합할 수 없습니다. 'hover'를 단독으로 사용하면 키보드를 통해 트리거할 수 없는 팝오버가 발생하므로 키보드 사용자에게 동일한 정보를 전달할 수 있는 대체 메서드가 있는 경우에만 사용해야 합니다.

독립 팝오버를 위한 데이터 속성

위에서 설명했듯이 각각의 팝오버 data 옵션은 data 속성을 사용하여 지정할 수도 있습니다.

popperConfig으로 기능 사용하기

const popover = new bootstrap.Popover(element, {
  popperConfig(defaultBsPopperConfig) {
    // const newPopperConfig = {...}
    // use defaultBsPopperConfig if needed...
    // return newPopperConfig
  }
})

메소드

모든 API 메서드는 비동기식이며 전환을 시작합니다. 전환이 시작되는 즉시 호출자에게 반환되지만 전환이 끝나기 전에 호출자에게 반환됩니다. 또한 전환 중인 컴포넌트에 대한 메서드 호출은 무시됩니다. JavaScript 문서에서 자세히 알아보세요.
메소드 설명
disable 요소의 팝오버를 표시하는 기능을 삭제합니다. 팝오버는 다시 활성화된 경우에만 표시됩니다.
dispose 요소의 팝오버를 숨기고 없앱니다 (DOM 요소에 저장된 데이터를 삭제합니다). 위임을 사용하는 팝오버 (selector 옵션을 사용하여 작성된 것)는 자식의 트리거 요소로 인해 개벌적으로 없앨 수 없습니다.
enable 요소의 팝오버를 표시하는 기능을 부여합니다. 팝오버는 기본으로 활성화되어 있습니다.
getInstance DOM 요소와 연관된 팝오버 인스턴스를 가져올 수 있게 하는 Static 메소드입니다.
getOrCreateInstance Static method which allows you to get the popover instance associated with a DOM element, or create a new one in case it wasn’t initialized.
hide 요소의 팝오버를 숨깁니다. 팝오버가 실제로 숨겨지기 전에 호출한 곳으로 돌아갑니다 (즉, hidden.bs.popover 이벤트 발생 전). 이것은 팝오버의 “manual” 트리거로 간주합니다.
setContent Gives a way to change the popover’s content after its initialization.
show 요소의 팝오버를 표시합니다. 팝오버가 실제로 나타나기 전에 호출된 곳으로 돌아갑니다 (즉, shown.bs.popover 이벤트가 발생하기 전). 이것은 팝오버의 “manual” 트리거로 간주합니다. 타이틀과 콘텐츠의 양쪽 모두의 길이가 0인 팝오버는 결코 표시되지 않습니다.
toggle 요소의 팝오버를 토글합니다. 팝오버가 실제로 표시 또는 숨기기 전에 호출된 곳으로 돌아갑니다 (즉, shown.bs.popover 혹은 hidden.bs.popover 이벤트가 발생하기 전). 이것은 팝오버의 “manual” 트리거로 간주합니다.
toggleEnabled 요소의 팝오버 표시/숨김 여부를 바꿉니다.
update 요소의 팝오버 위치를 새로고칩니다.
// getOrCreateInstance example
const popover = bootstrap.Popover.getOrCreateInstance('#example') // Returns a Bootstrap popover instance

// setContent example
popover.setContent({
  '.popover-header': 'another title',
  '.popover-body': 'another content'
})
setContent 메서드는 object 인수를 받는데, 각 속성 키는 팝오버 템플릿 내에서 유효한 string 선택자이며, 각 관련 속성 값은 string | element | function | null일 수 있습니다.

이벤트

이벤트 설명
hide.bs.popover 이 이벤트는 hide 인스턴스 메소드가 호출되었을 때 바로 발생합니다.
hidden.bs.popover 이 이벤트는 팝오버의 숨김이 완료될 때 발생합니다 (CSS 트랜지션이 완료되기를 기다립니다).
inserted.bs.popover 이 이벤트는 show.bs.popover 이벤트 후에, 팝오버의 템플렛이 DOM 에 추가될 때 발생합니다.
show.bs.popover 이 이벤트는 show 인스턴스 메소드가 호출되었을 때 바로 발생합니다.
shown.bs.popover 이 이벤트는 팝오버가 사용자에게 보여질 때 바로 발생합니다 (CSS 트랜지션이 완료되기를 기다립니다).
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
  // do something...
})