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

CSS3를 사용한 애니메이션이나 data-bs-attributes를 사용한 CSS와 JavaScript로 사용자 정의 Bootstrap의 툴팁을 추가하기 위한 문서와 예시입니다.

개요

툴팁 플러그인을 사용할 때 알아두어야 할 점:

  • 툴팁의 배치는 서드파티 라이브러리인 Popper에 의존하고 있습니다. bootstrap.js 앞에 popper.min.js를 사용하거나, 팝오버가 포함되어 있는 bootstrap.bundle.min.js를 사용해야 합니다.
  • 툴팁은 퍼포먼스를 위해 opt-in 되어 있기 때문에 스스로 초기화를 해야 합니다.
  • 길이가 0의 타이틀을 가진 툴팁은 표시되지 않습니다.
  • 더 복잡한 컴포넌트(입력 그룹, 버튼 그룹 등)의 렌더링 문제를 피하기 위해 container: 'body'를 지정해 주십시오.
  • 숨겨진 요소에서 툴팁을 트리거 해도 제 기능을 하지 않습니다.
  • .disableddisabled 요소의 툴팁은 그 위(바깥) 요소에서 트리거 해야 합니다.
  • 여러 라인에 걸쳐 있는 하이퍼링크에서 트리거된 툴팁은 중앙에 배치됩니다. 이 동작을 피하기 위해서는 <a>white-space: nowrap;을 사용해 주십시오.
  • 툴팁은 대응 요소가 DOM에서 삭제되기 전에 숨겨야 합니다.
  • 툴팁은 shadow DOM 내의 요소 덕분에 트리거할 수 있습니다.

몇 가지 예를 들어보겠습니다.

이 컴포넌트는 기본적으로 명시적으로 허용되지 않는 HTML 요소를 제거하는 내장 콘텐츠 새니타이저를 사용합니다. 자세한 내용은 JavaScript 문서의 Sanitizer 문단을 참고하세요.
이 컴포넌트의 애니메이션 효과는 prefers-reduced-motion 미디어 쿼리에 따라 다릅니다. 접근성 문서의 모션 감소 문단을 참고하세요.

예시

툴팁 활성화

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

const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl))

링크의 툴팁

아래 링크에 커서를 맞추면 툴팁이 나타납니다:

Placeholder text to demonstrate some inline links with tooltips. This is now just filler, no killer. Content placed here just to mimic the presence of real text. And all that just to give you an idea of how tooltips would look when used in real-world situations. So hopefully you've now seen how these tooltips on links can work in practice, once you use them on your own site or project.

html
<p class="muted">Placeholder text to demonstrate some <a href="#" data-bs-toggle="tooltip" data-bs-title="Default tooltip">inline links</a> with tooltips. This is now just filler, no killer. Content placed here just to mimic the presence of <a href="#" data-bs-toggle="tooltip" data-bs-title="Another tooltip">real text</a>. And all that just to give you an idea of how tooltips would look when used in real-world situations. So hopefully you've now seen how <a href="#" data-bs-toggle="tooltip" data-bs-title="Another one here too">these tooltips on links</a> can work in practice, once you use them on <a href="#" data-bs-toggle="tooltip" data-bs-title="The last tip!">your own</a> site or project.</p>
HTML에 title 또는 data-bs-title을 자유롭게 사용할 수 있습니다. title을 사용하면 요소가 렌더링될 때 Popper가 자동으로 data-bs-title으로 대체합니다.

사용자 지정 도구 설명

v5.2.0에서 추가됨

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

.custom-tooltip {
  --bs-tooltip-bg: var(--bd-violet-bg);
  --bs-tooltip-color: var(--bs-white);
}
html
<button type="button" class="btn btn-secondary"
        data-bs-toggle="tooltip" data-bs-placement="top"
        data-bs-custom-class="custom-tooltip"
        data-bs-title="This top tooltip is themed via CSS variables.">
  Custom tooltip
</button>

아래 버튼에 커서를 맞추면 top, right, bottom, left의 4개 툴팁이 나타납니다: RTL에서 Bootstrap을 사용하는 경우 방향은 반대가 됩니다.

<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-title="Tooltip on top">
  Tooltip on top
</button>
<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-title="Tooltip on right">
  Tooltip on right
</button>
<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="Tooltip on bottom">
  Tooltip on bottom
</button>
<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-placement="left" data-bs-title="Tooltip on left">
  Tooltip on left
</button>

그리고 사용자 정의 HTML을 추가할 수 있습니다:

<button type="button" class="btn btn-secondary" data-bs-toggle="tooltip" data-bs-html="true" data-bs-title="<em>Tooltip</em> <u>with</u> <b>HTML</b>">
  Tooltip with HTML
</button>

SVG에도 가능합니다:

CSS

변수

v5.2.0에서 추가됨

Bootstrap의 진화하는 CSS 변수 접근 방식의 일환으로, 이제 툴팁은 향상된 실시간 사용자 지정을 위해 .tooltip의 로컬 CSS 변수를 사용합니다. CSS 변수의 값은 Sass를 통해 설정되므로 Sass 사용자 정의도 계속 지원됩니다.

--#{$prefix}tooltip-zindex: #{$zindex-tooltip};
--#{$prefix}tooltip-max-width: #{$tooltip-max-width};
--#{$prefix}tooltip-padding-x: #{$tooltip-padding-x};
--#{$prefix}tooltip-padding-y: #{$tooltip-padding-y};
--#{$prefix}tooltip-margin: #{$tooltip-margin};
@include rfs($tooltip-font-size, --#{$prefix}tooltip-font-size);
--#{$prefix}tooltip-color: #{$tooltip-color};
--#{$prefix}tooltip-bg: #{$tooltip-bg};
--#{$prefix}tooltip-border-radius: #{$tooltip-border-radius};
--#{$prefix}tooltip-opacity: #{$tooltip-opacity};
--#{$prefix}tooltip-arrow-width: #{$tooltip-arrow-width};
--#{$prefix}tooltip-arrow-height: #{$tooltip-arrow-height};

Sass 변수

$tooltip-font-size:                 $font-size-sm;
$tooltip-max-width:                 200px;
$tooltip-color:                     var(--#{$prefix}body-bg);
$tooltip-bg:                        var(--#{$prefix}emphasis-color);
$tooltip-border-radius:             var(--#{$prefix}border-radius);
$tooltip-opacity:                   .9;
$tooltip-padding-y:                 $spacer * .25;
$tooltip-padding-x:                 $spacer * .5;
$tooltip-margin:                    null; // TODO: remove this in v6

$tooltip-arrow-width:               .8rem;
$tooltip-arrow-height:              .4rem;
// fusv-disable
$tooltip-arrow-color:               null; // Deprecated in Bootstrap 5.2.0 for CSS variables
// fusv-enable

사용 방법

툴팁 플러그인은 필요에 따라 콘텐츠와 마크업을 생성하고 기본 값으로는 트리거 요소 뒤에 툴팁을 배치합니다. JavaScript를 사용해 툴팁을 트리거 합니다:

const exampleEl = document.getElementById('example')
const tooltip = new bootstrap.Tooltip(exampleEl, options)

부모 컨테이너가 overflow: auto 혹은 overflow: scroll로 되어 있으면 툴팁의 위치가 자동으로 변경되려고는 하지만, 위치는 원래대로 유지되고 있습니다. 그것을 해결하기 위해서는, boundary 옵션 (popperConfig 옵션을 사용한 flip 제어자의 경우)을 기본값으로 가지고 있는 'clippingParents'를 임의의 HTML 요소, 예를 들어 document.body등으로 오버라이드하여 설정하면 됩니다:

const tooltip = new bootstrap.Tooltip('#example', {
  boundary: document.body // or document.querySelector('#boundary')
})

마크업

툴팁에 필요한 마크업은 툴팁을 작성하고자 하는 HTML 요소의 data 속성과 title 뿐입니다. 툴팁 마크업은 단순하지만 위치를 지정해야 합니다 (플러그인에 의해 기본 top이설정되어 있습니다).

키보드 및 보조 기술 사용자가 툴팁에 액세스할 수 있도록 하려면 링크 또는 양식 컨트롤과 같이 전통적으로 키보드로 초점을 맞출 수 있고 상호 작용이 가능한 HTML 요소에만 툴팁을 추가하세요. 임의의 HTML 요소(<span> 등)는 tabindex="0" 속성을 추가하여 포커스가 가능하게 할 수 있지만 이는 키보드 사용자에게 상호작용할 수 없는 요소에 탭 멈춤이 추가되어 키보드 사용자를 곤란하게 하거나 혼란스럽게 할 수 있으며 현재 대부분의 스크린 리더는 이러한 상황에서 툴팁을 제공하지 않습니다. 게다가 툴팁의 트리거로서 hover에만 의지해서는 안됩니다. 이것은 키보드 사용자가 툴팁을 트리거 할 수 없게 되기 때문입니다.
<!-- HTML to write -->
<a href="#" data-bs-toggle="tooltip" data-bs-title="Some tooltip text!">Hover over me</a>

<!-- Generated markup by the plugin -->
<div class="tooltip bs-tooltip-auto" role="tooltip">
  <div class="tooltip-arrow"></div>
  <div class="tooltip-inner">
    Some tooltip text!
  </div>
</div>

비활성화 요소

disabled 속성을 갖는 요소는 상호작용할 수 없습니다. 즉, 사용자가 포커스를 맞추거나 호버하거나 클릭하여 툴팁 (혹은 팝오버)을 구동할 수 없습니다. 해결책으로는 <div><span>으로 툴팁을 트리거하여, 이상적으로 tabindex="0"을 사용해서 키보드로 포커스가 가능하도록 해야합니다.

html
<span class="d-inline-block" tabindex="0" data-bs-toggle="tooltip" data-bs-title="Disabled tooltip">
  <button class="btn btn-primary" type="button" disabled>Disabled button</button>
</span>

옵션

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

개별 툴팁의 데이터 속성

개별 툴팁 옵션은 위에서 설명한 것처럼 data 속성을 사용해 지정할 수도 있습니다.

popperConfig으로 기능 사용하기

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

메소드

모든 API 메서드는 비동기식이며 전환을 시작합니다. 전환이 시작되는 즉시 호출자에게 반환되지만 전환이 끝나기 전에 호출자에게 반환됩니다. 또한 전환 중인 컴포넌트에 대한 메서드 호출은 무시됩니다. JavaScript 문서에서 자세히 알아보세요.
메소드 설명
disable 요소의 툴팁을 표시하는 기능을 삭제합니다. 툴팁은 재활성화 된 경우에만 표시합니다.
dispose 요소의 툴팁을 숨기고 없앱니다 (DOM 요소에 보존되어 있는 데이터를 삭제). 위임을 사용하는 툴팁(selector 옵션을 사용하여 작성된 것)은 후손의 트리거 요소상에서 개별적으로 없앨수 없습니다.
enable 요소의 툴팁을 표시하는 기능을 부여합니다. 툴팁은 기본적으로 활성화되어 있습니다.
getInstance DOM 요소와 연관된 툴팁의 인스턴스를 취득하는 Static 메소드입니다.
getOrCreateInstance 정적 메서드를 사용하여 DOM 요소와 연결된 툴팁 인스턴스를 가져오거나 초기화되지 않은 경우 새 인스턴스를 만들 수 있습니다.
hide 요소의 툴팁을 숨깁니다. 툴팁이 실제로 숨겨지기 전에 호출한 곳으로 돌아갑니다 (즉, hidden.bs.tooltip 이벤트가 발생하기 전). 이것은 툴팁의 “수동” 트리거로 간주됩니다.
setContent 초기화 후 툴팁의 내용을 변경하는 방법을 제공합니다.
show 요소의 툴팁을 표시합니다. 툴팁이 실제로 나타나기 전에 호출한 곳으로 돌아갑니다 (즉, shown.bs.tooltip 이벤트가 발생하기 전). 이것은 툴팁의 “수동” 트리거로 간주합니다. 길이가 0 을 가진 타이틀은 절대 표시되지 않습니다.
toggle 요소의 툴팁을 토글합니다. 툴팁이 실제로 표시되거나 숨겨지기 전에 호출한 곳으로 돌아갑니다 (즉, shown.bs.tooltip 혹은 hidden.bs.tooltip 이벤트가 발생하기 전). 이것은 툴팁의 “수동” 트리거로 간주됩니다.
toggleEnabled 요소의 툴팁 표시 및 숨김을 변경합니다.
update 요소의 툴팁 위치를 갱신합니다.
const tooltip = bootstrap.Tooltip.getInstance('#example') // Returns a Bootstrap tooltip instance

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

이벤트

이벤트 설명
hide.bs.tooltip 이 이벤트는 hide 인스턴스 메소드가 호출되었을 때 바로 발생합니다.
hidden.bs.tooltip 이 이벤트는 툴팁이 사용자로부터 숨김 상태가 되었을 때 발생합니다 (CSS 트렌지션이 완료되기를 기다립니다).
inserted.bs.tooltip 이 이벤트는 show.bs.tooltip 이벤트 후 툴팁 템플릿이 DOM에 추가되었을 때 발생합니다.
show.bs.tooltip 이 이벤트는 show 인스턴스 메소드가 호출되었을 때 바로 발생합니다.
shown.bs.tooltip 이 이벤트는 툴팁이 사용자에게 보일 때 발생합니다 (CSS 트렌지션이 완료되기를 기다립니다).
const myTooltipEl = document.getElementById('myTooltip')
const tooltip = bootstrap.Tooltip.getOrCreateInstance(myTooltipEl)

myTooltipEl.addEventListener('hidden.bs.tooltip', () => {
  // do something...
})

tooltip.hide()