Przejdź do głównej zawartości Przejdź do nawigacji w dokumentach
Check
in English

Popovery

Dokumentacja i przykłady dodawania popoverów Bootstrap, takich jak te znalezione w iOS, do dowolnego elementu w witrynie.

Przegląd

Co należy wiedzieć podczas korzystania z wtyczki popover:

  • Popovery polegają na zewnętrznej bibliotece Popper do pozycjonowania. Musisz dołączyć popper.min.js przed bootstrap.jslub użyć takiego bootstrap.bundle.min.js, który zawiera Poppera.
  • Popovery wymagają wtyczki popover jako zależności.
  • Popovery są włączane ze względu na wydajność, więc musisz je zainicjować samodzielnie .
  • Zerowa długość titlei contentwartości nigdy nie pokażą popovera.
  • Określ container: 'body', aby uniknąć problemów z renderowaniem w bardziej złożonych komponentach (takich jak nasze grupy wejściowe, grupy przycisków itp.).
  • Wyzwalanie okienek popover na ukrytych elementach nie będzie działać.
  • Wyskakujące okienka dla .disabledlub disabledelementy muszą być wyzwalane na elemencie opakowania.
  • Po uruchomieniu z kotwic, które zawijają się w wielu liniach, popovery będą wyśrodkowane między całkowitą szerokością kotwic. Użyj .text-nowrapna swoim <a>s, aby uniknąć tego zachowania.
  • Popovery muszą być ukryte, zanim odpowiadające im elementy zostaną usunięte z DOM.
  • Popovery mogą być wyzwalane dzięki elementowi wewnątrz cienia DOM.
Domyślnie ten składnik używa wbudowanego narzędzia do oczyszczania treści, które usuwa wszystkie elementy HTML, które nie są wyraźnie dozwolone. Zobacz sekcję odkażania w naszej dokumentacji JavaScript, aby uzyskać więcej informacji.
Efekt animacji tego komponentu zależy od prefers-reduced-motionzapytania o media. Zobacz zmniejszoną sekcję ruchu w naszej dokumentacji ułatwień dostępu .

Czytaj dalej, aby zobaczyć, jak działają popovery na kilku przykładach.

Przykłady

Włącz popovery

Jak wspomniano powyżej, musisz zainicjować popovery, zanim będzie można ich użyć. Jednym ze sposobów na zainicjowanie wszystkich okienek popover na stronie byłoby wybranie ich według ich data-bs-toggleatrybutów, na przykład:

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

Demo na żywo

Używamy JavaScript podobnego do powyższego fragmentu, aby renderować następujący aktywny popover. Tytuły ustawia się za pomocą data-bs-title, a treść treści za pomocą data-bs-content.

Możesz użyć jednego titlelub data-bs-titlew swoim kodzie HTML. Gdy titlejest używany, Popper zastąpi go automatycznie, data-bs-titlegdy element jest renderowany.
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>

Cztery kierunki

Dostępne są cztery opcje: górna, prawa, dolna i lewa. Kierunki są odzwierciedlane podczas używania Bootstrap w RTL. Ustaw data-bs-placement, aby zmienić kierunek.

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>

Zwyczajcontainer

Jeśli masz jakieś style w elemencie nadrzędnym, które kolidują z popoverem, będziesz chciał określić niestandardowy container, aby zamiast tego pojawiał się kod HTML popovera w tym elemencie. Jest to powszechne w responsywnych tabelach, grupach wejściowych i tym podobnych.

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

Inną sytuacją, w której będziesz chciał ustawić własny niestandardowy container, są okienka popover wewnątrz modalnego okna dialogowego , aby upewnić się, że sam popover jest dołączony do modalnego okna dialogowego. Jest to szczególnie ważne w przypadku okienek popover zawierających elementy interaktywne – modalne okna dialogowe przechwytują fokus, więc jeśli okienko popover nie jest elementem podrzędnym modalnego, użytkownicy nie będą mogli skoncentrować się ani aktywować tych interaktywnych elementów.

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

Niestandardowe popovery

Dodano w wersji 5.2.0

Możesz dostosować wygląd okienek popover za pomocą zmiennych CSS . Ustawiamy niestandardową klasę za pomocą data-bs-custom-class="custom-popover", aby określić zakres naszego niestandardowego wyglądu i używamy jej do zastępowania niektórych lokalnych zmiennych CSS.

.custom-popover {
  --bs-popover-max-width: 200px;
  --bs-popover-border-color: var(--bs-primary);
  --bs-popover-header-bg: var(--bs-primary);
  --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>

Odrzuć przy następnym kliknięciu

Użyj focuswyzwalacza, aby odrzucić okienka popover przy następnym kliknięciu przez użytkownika innego elementu niż element przełączania.

Konkretne znaczniki wymagane do odrzucenia przy następnym kliknięciu

Aby zapewnić prawidłowe działanie w różnych przeglądarkach i na różnych platformach, należy użyć <a>tagu, a nie<button> tagu, a także dołączyć tabindexatrybut.

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'
})

Elementy niepełnosprawne

Elementy z disabledatrybutem nie są interaktywne, co oznacza, że ​​użytkownicy nie mogą na nich najeżdżać ani klikać, aby wywołać okienko wyskakujące (lub podpowiedź). Aby obejść ten problem, będziesz chciał wywoływać okienko popover z otoki <div>lub <span>, najlepiej, jeśli jest to możliwe przy użyciu klawiatury, używając tabindex="0".

W przypadku wyłączonych wyzwalaczy okienek popover możesz również preferować data-bs-trigger="hover focus"wyświetlanie okienka popover jako natychmiastowej wizualnej informacji zwrotnej dla użytkowników, ponieważ mogą oni nie oczekiwać kliknięcia wyłączonego elementu.

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

Zmienne

Dodano w wersji 5.2.0

W ramach ewoluującego podejścia Bootstrap do zmiennych CSS, popovery używają teraz lokalnych zmiennych CSS w .popovercelu ulepszenia dostosowywania w czasie rzeczywistym. Wartości zmiennych CSS są ustawiane przez Sass, więc dostosowywanie Sass jest nadal obsługiwane.

  --#{$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);
  

Zmienne Sassa

$popover-font-size:                 $font-size-sm;
$popover-bg:                        $white;
$popover-max-width:                 276px;
$popover-border-width:              $border-width;
$popover-border-color:              var(--#{$prefix}border-color-translucent);
$popover-border-radius:             $border-radius-lg;
$popover-inner-border-radius:       subtract($popover-border-radius, $popover-border-width);
$popover-box-shadow:                $box-shadow;

$popover-header-font-size:          $font-size-base;
$popover-header-bg:                 shade-color($popover-bg, 6%);
$popover-header-color:              $headings-color;
$popover-header-padding-y:          .5rem;
$popover-header-padding-x:          $spacer;

$popover-body-color:                $body-color;
$popover-body-padding-y:            $spacer;
$popover-body-padding-x:            $spacer;

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

Stosowanie

Włącz popovery przez JavaScript:

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

Sprawianie, że popovery działają dla użytkowników klawiatury i technologii wspomagających

Aby umożliwić użytkownikom klawiatury aktywowanie okienek popover, należy dodawać je tylko do elementów HTML, które tradycyjnie dają się skoncentrować na klawiaturze i które są interaktywne (takich jak łącza lub kontrolki formularzy). Chociaż można skupić się na dowolnych elementach HTML (takich jak <span>s) przez dodanie tabindex="0"atrybutu, doda to potencjalnie denerwujące i mylące tabulatory na nieinteraktywnych elementach dla użytkowników klawiatury, a większość technologii wspomagających obecnie nie ogłasza zawartości popover w tej sytuacji . Ponadto nie należy polegać wyłącznie na hoverwyzwalaczu popoverów, ponieważ uniemożliwi to ich wyzwalanie użytkownikom klawiatury.

Chociaż możesz wstawiać sformatowany, ustrukturyzowany kod HTML w popoverach za pomocą tej htmlopcji, zdecydowanie zalecamy unikanie dodawania nadmiernej ilości treści. Sposób, w jaki obecnie działają popovery, polega na tym, że po wyświetleniu ich zawartość jest powiązana z elementem wyzwalającym z aria-describedbyatrybutem. W rezultacie cała zawartość popovera zostanie ogłoszona użytkownikom technologii wspomagających jako jeden długi, nieprzerwany strumień.

Dodatkowo, chociaż możliwe jest również uwzględnienie interaktywnych kontrolek (takich jak elementy formularzy lub linki) w popoverze (poprzez dodanie tych elementów do allowListdozwolonych atrybutów i tagów), należy pamiętać, że obecnie popover nie zarządza kolejnością fokusów klawiatury. Gdy użytkownik klawiatury otworzy okienko popover, fokus pozostaje na elemencie wyzwalającym, a ponieważ okienko popover zwykle nie następuje bezpośrednio za wyzwalaczem w strukturze dokumentu, nie ma gwarancji, że przejście do przodu/naciśnięcieTABprzeniesie użytkownika klawiatury do samego popovera. Krótko mówiąc, zwykłe dodanie interaktywnych kontrolek do popovera może sprawić, że te kontrolki będą nieosiągalne/nieużyteczne dla użytkowników klawiatury i użytkowników technologii wspomagających, lub przynajmniej spowoduje nielogiczną ogólną kolejność fokusów. W takich przypadkach rozważ użycie modalnego okna dialogowego.

Opcje

Ponieważ opcje mogą być przekazywane przez atrybuty danych lub JavaScript, możesz dołączyć nazwę opcji do data-bs-, jak w data-bs-animation="{value}". Pamiętaj, aby zmienić typ wielkości liter w nazwie opcji z „ camelCase ” na „ kebab-case ” podczas przekazywania opcji przez atrybuty danych. Na przykład użyj data-bs-custom-class="beautifier"zamiast data-bs-customClass="beautifier".

Od wersji Bootstrap 5.2.0 wszystkie komponenty obsługują eksperymentalny atrybut zarezerwowanych danych data-bs-config, który może zawierać prostą konfigurację komponentu w postaci ciągu JSON. Gdy element ma atrybuty data-bs-config='{"delay":0, "title":123}'i data-bs-title="456", ostateczną titlewartością będzie, 456a oddzielne atrybuty danych zastąpią wartości podane w data-bs-config. Ponadto istniejące atrybuty danych mogą zawierać wartości JSON, takie jak data-bs-delay='{"show":0,"hide":150}'.

Należy zauważyć, że ze względów bezpieczeństwa opcji sanitize, sanitizeFni allowListnie można podać przy użyciu atrybutów danych.
Nazwa Rodzaj Domyślna Opis
allowList obiekt Domyślna wartość Obiekt zawierający dozwolone atrybuty i tagi.
animation logiczne true Zastosuj przejście CSS do wyskakującego okienka.
boundary ciąg, element 'clippingParents' Granica ograniczenia przepełnienia popovera (dotyczy tylko modyfikatora PreventOverflow Poppera). Domyślnie jest 'clippingParents'i może akceptować odwołanie HTMLElement (tylko przez JavaScript). Aby uzyskać więcej informacji, zapoznaj się z dokumentacją Poppera detectOverflow .
container ciąg, element, fałsz false Dołącza popover do określonego elementu. Przykład: container: 'body'. Ta opcja jest szczególnie przydatna, ponieważ pozwala umieścić okienko popover w przepływie dokumentu w pobliżu elementu wyzwalającego — co zapobiegnie oddalaniu się okienka popover od elementu wyzwalającego podczas zmiany rozmiaru okna.
content ciąg, element, funkcja '' Domyślna wartość treści, jeśli data-bs-contentatrybut nie jest obecny. Jeśli podana zostanie funkcja, zostanie wywołana z thisreferencją ustawioną na element, do którego dołączony jest popover.
customClass ciąg, funkcja '' Dodaj klasy do wyskakującego okienka, gdy jest on wyświetlany. Pamiętaj, że te klasy zostaną dodane do wszystkich klas określonych w szablonie. Aby dodać wiele klas, oddziel je spacjami: 'class-1 class-2'. Możesz także przekazać funkcję, która powinna zwrócić pojedynczy ciąg zawierający dodatkowe nazwy klas.
delay numer, obiekt 0 Opóźnienie wyświetlania i ukrywania popovera (ms) — nie dotyczy wyzwalania ręcznego. Jeśli podano numer, opóźnienie jest stosowane zarówno do ukrywania, jak i pokazywania. Struktura obiektu to: delay: { "show": 500, "hide": 100 }.
fallbackPlacements ciąg, tablica ['top', 'right', 'bottom', 'left'] Zdefiniuj zastępcze miejsca docelowe, podając listę miejsc docelowych w tablicy (w kolejności preferencji). Aby uzyskać więcej informacji, zapoznaj się z dokumentacją dotyczącą zachowania Poppera .
html logiczne false Zezwalaj na HTML w wyskakującym okienku. Jeśli prawda, znaczniki HTML w popoverze titlebędą renderowane w popoverze. Jeśli false, innerTextwłaściwość zostanie użyta do wstawienia treści do DOM. Użyj tekstu, jeśli martwisz się atakami XSS.
offset liczba, ciąg, funkcja [0, 0] Przesunięcie popovera względem jego celu. Możesz przekazać ciąg w atrybutach danych z wartościami oddzielonymi przecinkami, takimi jak: data-bs-offset="10,20". Kiedy funkcja jest używana do określenia przesunięcia, jest wywoływana z obiektem zawierającym położenie poppera, referencję i prostokąty poppera jako pierwszy argument. Węzeł DOM elementu wyzwalającego jest przekazywany jako drugi argument. Funkcja musi zwrócić tablicę z dwiema liczbami: poślizg , odległość . Więcej informacji można znaleźć w dokumentacji offsetowej Poppera .
placement ciąg, funkcja 'top' Jak ustawić popover: auto, góra, dół, lewo, prawo. Gdy autojest określony, dynamicznie zmieni orientację popovera. Gdy funkcja jest używana do określenia położenia, jest wywoływana z węzłem DOM popover jako pierwszym argumentem i węzłem DOM elementu wyzwalającego jako drugim. Kontekst thisjest ustawiony na instancję popover.
popperConfig null, obiekt, funkcja null Aby zmienić domyślną konfigurację Poppera Bootstrapa, zobacz Konfiguracja Poppera . Kiedy funkcja jest używana do utworzenia konfiguracji Poppera, jest wywoływana z obiektem, który zawiera domyślną konfigurację Poppera Bootstrapa. Pomaga w używaniu i łączeniu ustawień domyślnych z własną konfiguracją. Funkcja musi zwrócić obiekt konfiguracyjny dla Poppera.
sanitize logiczne true Włącz lub wyłącz sanityzację. 'template'W przypadku aktywacji opcje 'content'zostaną 'title'oczyszczone.
sanitizeFn null, funkcja null Tutaj możesz podać własną funkcję odkażania. Może to być przydatne, jeśli wolisz korzystać z dedykowanej biblioteki do przeprowadzania sanityzacji.
selector ciąg, fałsz false Jeśli podano selektor, obiekty popover zostaną delegowane do określonych celów. W praktyce służy to również do nanoszenia popoverów na dynamicznie dodawane elementy DOM ( jQuery.onobsługa). Zobacz to wydanie i przykład informacyjny .
template strunowy '<div class="popover" role="popover"><div class="popover-arrow"></div><div class="popover-inner"></div></div>' Podstawowy kod HTML do użycia podczas tworzenia popovera. Popover titlezostanie wstrzyknięty do .popover-inner. .popover-arrowstanie się strzałką popovera. Najbardziej zewnętrzny element opakowania powinien mieć .popoverklasę i role="popover".
title ciąg, element, funkcja '' Domyślna wartość tytułu, jeśli titleatrybut nie jest obecny. Jeśli podana zostanie funkcja, zostanie wywołana z thisreferencją ustawioną na element, do którego dołączony jest popover.
trigger strunowy 'hover focus' Jak uruchamia się popover: kliknięcie, najechanie, skupienie, ręczne. Możesz przekazać wiele wyzwalaczy; oddziel je spacją. 'manual'wskazuje, że popover zostanie wyzwolony programowo za pomocą metod i .popover('show'); tej wartości nie można łączyć z żadnym innym wyzwalaczem. samoistnie spowoduje pojawienie się okienek popover, których nie można uruchomić za pomocą klawiatury i należy ich używać tylko wtedy, gdy istnieją alternatywne metody przekazywania tych samych informacji użytkownikom klawiatury..popover('hide').popover('toggle')'hover'

Atrybuty danych dla poszczególnych okienek popover

Opcje dla poszczególnych okienek popover można alternatywnie określić za pomocą atrybutów danych, jak wyjaśniono powyżej.

Korzystanie z funkcji zpopperConfig

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

Metody

Metody asynchroniczne i przejścia

Wszystkie metody API są asynchroniczne i rozpoczynają przejście . Wracają do rozmówcy zaraz po rozpoczęciu przejścia, ale przed jego zakończeniem . Ponadto wywołanie metody na składniku przechodzącym zostanie zignorowane .

Zobacz naszą dokumentację JavaScript, aby uzyskać więcej informacji .

metoda Opis
disable Usuwa możliwość wyświetlania popovera elementu. Popover będzie można wyświetlić tylko wtedy, gdy zostanie ponownie włączony.
dispose Ukrywa i niszczy popover elementu (usuwa dane zapisane w elemencie DOM). Popovery korzystające z delegowania (utworzone za pomocą opcji selector) nie mogą być indywidualnie niszczone w potomnych elementach wyzwalających.
enable Daje możliwość pokazania popoverowi elementu. Popovery są domyślnie włączone.
getInstance Metoda statyczna , która pozwala uzyskać instancję popover skojarzoną z elementem DOM.
getOrCreateInstance Metoda statyczna , która pozwala uzyskać instancję popover skojarzoną z elementem DOM lub utworzyć nową w przypadku, gdy nie została zainicjowana.
hide Ukrywa popover elementu. Powraca do dzwoniącego, zanim popover został faktycznie ukryty (tj. przed hidden.bs.popoverwystąpieniem zdarzenia). Jest to uważane za „ręczne” wyzwalanie popover.
setContent Umożliwia zmianę zawartości popovera po jego zainicjowaniu.
show Ujawnia popover elementu. Wraca do dzwoniącego przed faktycznym wyświetleniem popovera (tj. przed shown.bs.popoverwystąpieniem zdarzenia). Jest to uważane za „ręczne” wyzwalanie popover. Popovery, których tytuł i treść mają zerową długość, nigdy nie są wyświetlane.
toggle Przełącza popover elementu. Powraca do dzwoniącego, zanim popover został faktycznie wyświetlony lub ukryty (tj. przed wystąpieniem zdarzenia shown.bs.popoverlub ). hidden.bs.popoverJest to uważane za „ręczne” wyzwalanie popover.
toggleEnabled Przełącza możliwość pokazywania lub ukrywania popover elementu.
update Aktualizuje pozycję popovera elementu.
// getOrCreateInstance example
const popover = bootstrap.Popover.getOrCreateInstance('#example') // Returns a Bootstrap popover instance

// setContent example
myPopover.setContent({
  '.popover-header': 'another title',
  '.popover-body': 'another content'
})
Metoda setContentakceptuje objectargument, w którym każdy klucz właściwości jest prawidłowym stringselektorem w szablonie popover, a każda powiązana wartość właściwości może być string| element| function| null

Wydarzenia

Wydarzenie Opis
hide.bs.popover To zdarzenie jest wywoływane natychmiast po hidewywołaniu metody wystąpienia.
hidden.bs.popover To zdarzenie jest uruchamiane po zakończeniu ukrywania popovera przed użytkownikiem (poczeka na zakończenie przejścia CSS).
inserted.bs.popover To zdarzenie jest wywoływane po show.bs.popoverzdarzeniu, gdy szablon popover został dodany do DOM.
show.bs.popover To zdarzenie jest wyzwalane natychmiast po showwywołaniu metody wystąpienia.
shown.bs.popover To zdarzenie jest uruchamiane, gdy popover jest widoczny dla użytkownika (poczeka na zakończenie przejścia CSS).
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
  // do something...
})