Bootstrap 5 彈出框(Popovers) 語法知識點及案例
一、彈出框基本概念
彈出框(Popovers)是Bootstrap提供的一個小型覆蓋層組件,用于顯示額外的信息,當用戶點擊某個元素時出現,再次點擊時消失。
二、彈出框基本語法知識點
1. 必需屬性
data-bs-toggle="popover"
- 標識元素為彈出框觸發器title
- 彈出框的標題(可選)data-bs-content
- 彈出框的內容
2. 配置選項
可以通過data屬性或JavaScript配置:
選項 | 類型 | 默認值 | 描述 |
---|---|---|---|
animation | boolean | true | 應用CSS淡入淡出過渡 |
container | string, element, false | false | 將彈出框附加到特定元素 |
content | string, element, function | ‘’ | 彈出框內容 |
delay | number, object | 0 | 顯示/隱藏的延遲(ms) {show: 500, hide: 100} |
html | boolean | false | 是否在彈出框中解析HTML |
placement | string, function | ‘right’ | 彈出框位置: auto, top, bottom, left, right |
selector | string, false | false | 如果提供選擇器,彈出框對象將委托給指定的目標 |
template | string | 基礎HTML模板 | 創建彈出框時使用的基本HTML |
trigger | string | ‘click’ | 觸發方式: click, hover, focus, manual |
fallbackPlacements | array | [‘top’, ‘right’, ‘bottom’, ‘left’] | 提供回退位置列表 |
boundary | string, element | ‘clippingParents’ | 彈出框的溢出約束邊界 |
customClass | string, function | ‘’ | 向彈出框添加類 |
sanitize | boolean | true | 啟用或禁用清理 |
allowList | object | 默認值 | 包含允許的屬性和標簽的對象 |
sanitizeFn | null, function | null | 允許您指定自己的清理函數 |
offset | array, string, function | [0, 8] | 彈出框相對于目標的偏移量 |
3. 方法
通過JavaScript控制彈出框:
方法 | 描述 |
---|---|
show() | 顯示彈出框 |
hide() | 隱藏彈出框 |
toggle() | 切換彈出框 |
dispose() | 隱藏并銷毀彈出框 |
enable() | 啟用彈出框顯示 |
disable() | 禁用彈出框顯示 |
toggleEnabled() | 切換啟用或禁用狀態 |
update() | 更新彈出框位置 |
getInstance() | 靜態方法,允許獲取與DOM元素關聯的彈出框實例 |
getOrCreateInstance() | 靜態方法,獲取與DOM元素關聯的彈出框實例或創建新實例 |
4. 事件
彈出框提供了一系列事件:
事件 | 描述 |
---|---|
show.bs.popover | 當show方法被調用時立即觸發 |
shown.bs.popover | 當彈出框對用戶可見時觸發(等待CSS過渡完成) |
hide.bs.popover | 當hide方法被調用時立即觸發 |
hidden.bs.popover | 當彈出框對用戶隱藏時觸發(等待CSS過渡完成) |
inserted.bs.popover | 當彈出框模板已添加到DOM時觸發 |
三、完整案例代碼
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Bootstrap 5 彈出框示例</title><!-- Bootstrap 5 CSS --><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body><div class="container py-5"><h1 class="text-center mb-5">Bootstrap 5 彈出框示例</h1><!-- 基本示例 --><div class="row mb-5"><div class="col-md-6"><h3>基本彈出框</h3><button type="button" class="btn btn-lg btn-danger" data-bs-toggle="popover" title="彈出框標題" data-bs-content="這是一個基本的彈出框內容">點擊顯示彈出框</button></div><div class="col-md-6"><h3>不同位置</h3><button type="button" class="btn btn-secondary" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="頂部彈出框">頂部</button><button type="button" class="btn btn-secondary" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="右側彈出框">右側</button><button type="button" class="btn btn-secondary" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="底部彈出框">底部</button><button type="button" class="btn btn-secondary" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="左側彈出框">左側</button></div></div><!-- 觸發方式示例 --><div class="row mb-5"><div class="col-12"><h3>不同觸發方式</h3><button type="button" class="btn btn-primary" data-bs-toggle="popover" data-bs-trigger="focus" title="Focus觸發" data-bs-content="通過focus事件觸發彈出框">Focus觸發</button><button type="button" class="btn btn-info" data-bs-toggle="popover" data-bs-trigger="hover" title="Hover觸發" data-bs-content="通過hover事件觸發彈出框">Hover觸發</button><button type="button" class="btn btn-warning" id="manualTrigger" title="手動觸發" data-bs-content="通過JavaScript手動觸發彈出框">手動觸發</button></div></div><!-- HTML內容示例 --><div class="row mb-5"><div class="col-12"><h3>HTML內容</h3><button type="button" class="btn btn-success" data-bs-toggle="popover" data-bs-html="true" title="<em>HTML內容</em>" data-bs-content="<b>加粗文本</b>和<a href='#'>鏈接</a>">包含HTML的彈出框</button></div></div><!-- 延遲示例 --><div class="row mb-5"><div class="col-12"><h3>延遲顯示/隱藏</h3><button type="button" class="btn btn-dark" data-bs-toggle="popover" data-bs-delay='{"show":500,"hide":100}' title="延遲示例" data-bs-content="顯示延遲500ms,隱藏延遲100ms">延遲效果</button></div></div><!-- 自定義模板 --><div class="row"><div class="col-12"><h3>自定義模板</h3><button type="button" class="btn btn-outline-primary" id="customPopover" title="自定義標題" data-bs-content="自定義內容">自定義模板彈出框</button></div></div></div><!-- Bootstrap 5 JS 包(包含Popper) --><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script><script>// 文檔加載完成后初始化所有彈出框document.addEventListener('DOMContentLoaded', function() {// 初始化頁面中所有帶有data-bs-toggle="popover"的元素const popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'));const popoverList = popoverTriggerList.map(function (popoverTriggerEl) {return new bootstrap.Popover(popoverTriggerEl);});// 手動觸發示例const manualTriggerBtn = document.getElementById('manualTrigger');const manualPopover = new bootstrap.Popover(manualTriggerBtn);manualTriggerBtn.addEventListener('click', function() {manualPopover.toggle();});// 自定義模板示例const customPopoverBtn = document.getElementById('customPopover');const customPopover = new bootstrap.Popover(customPopoverBtn, {template: '<div class="popover" role="tooltip">' +'<div class="popover-arrow"></div>' +'<h3 class="popover-header bg-primary text-white"></h3>' +'<div class="popover-body bg-light"></div>' +'</div>'});// 事件監聽示例customPopoverBtn.addEventListener('show.bs.popover', function () {console.log('彈出框即將顯示');});customPopoverBtn.addEventListener('shown.bs.popover', function () {console.log('彈出框已完全顯示');});customPopoverBtn.addEventListener('hide.bs.popover', function () {console.log('彈出框即將隱藏');});customPopoverBtn.addEventListener('hidden.bs.popover', function () {console.log('彈出框已完全隱藏');});// 動態內容示例const dynamicContentBtn = document.createElement('button');dynamicContentBtn.className = 'btn btn-outline-secondary ms-2';dynamicContentBtn.textContent = '動態內容';document.querySelector('.row:last-child .col-12').appendChild(dynamicContentBtn);const dynamicPopover = new bootstrap.Popover(dynamicContentBtn, {title: '動態內容',content: '初始內容'});dynamicContentBtn.addEventListener('click', function() {// 更新內容dynamicPopover.setContent({'.popover-body': '當前時間: ' + new Date().toLocaleTimeString()});});});</script>
</body>
</html>
四、代碼說明
-
基本結構:
- 引入了Bootstrap 5的CSS和JS文件
- 使用
data-bs-toggle="popover"
屬性標識彈出框觸發器
-
基本示例:
- 展示了最簡單的彈出框實現
- 演示了不同位置的彈出框(top, right, bottom, left)
-
觸發方式:
focus
: 元素獲得焦點時顯示hover
: 鼠標懸停時顯示- 手動觸發: 通過JavaScript控制
-
HTML內容:
- 設置
data-bs-html="true"
允許在彈出框中解析HTML
- 設置
-
延遲效果:
- 使用
data-bs-delay
屬性設置顯示和隱藏的延遲時間
- 使用
-
自定義模板:
- 通過JavaScript配置自定義的彈出框HTML結構
-
事件處理:
- 監聽彈出框的各種事件(show, shown, hide, hidden)
-
動態內容:
- 演示如何通過JavaScript動態更新彈出框內容
五、注意事項
- 彈出框依賴于Popper.js,確保使用bootstrap.bundle.min.js(包含Popper)或單獨引入Popper
- 彈出框需要手動初始化(通過data屬性或JavaScript)
- 在移動設備上,建議使用點擊觸發而非懸停觸發
- 包含HTML內容時要注意XSS安全問題
- 對于復雜的交互,考慮使用模態框(Modal)而非彈出框