Skip to content

Bootstrap 弹出框

🎯 概述

Bootstrap 弹出框(Popovers)类似于提示框,但可以包含更多内容,包括标题和正文。常用于显示详细信息、帮助文档或交互式内容。

📦 基本用法

html
<button type="button" class="btn btn-lg btn-danger" 
        data-bs-toggle="popover" 
        data-bs-title="弹出框标题"
        data-bs-content="这是弹出框的内容。">
    点击显示弹出框
</button>

<script>
// 必须手动初始化弹出框
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]');
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl));
</script>

📍 弹出框位置

html
<button type="button" class="btn btn-secondary" 
        data-bs-container="body" 
        data-bs-toggle="popover" 
        data-bs-placement="top"
        data-bs-content="顶部弹出框">
    顶部
</button>

<button type="button" class="btn btn-secondary" 
        data-bs-container="body" 
        data-bs-toggle="popover" 
        data-bs-placement="right"
        data-bs-content="右侧弹出框">
    右侧
</button>

<button type="button" class="btn btn-secondary" 
        data-bs-container="body" 
        data-bs-toggle="popover" 
        data-bs-placement="bottom"
        data-bs-content="底部弹出框">
    底部
</button>

<button type="button" class="btn btn-secondary" 
        data-bs-container="body" 
        data-bs-toggle="popover" 
        data-bs-placement="left"
        data-bs-content="左侧弹出框">
    左侧
</button>

🎨 HTML 内容

html
<button type="button" class="btn btn-primary" 
        data-bs-toggle="popover" 
        data-bs-html="true"
        data-bs-title="<strong>HTML 标题</strong>"
        data-bs-content="<em>这是</em> <u>HTML</u> <strong>内容</strong>">
    HTML 弹出框
</button>

🖱️ 触发方式

html
<!-- 点击触发(默认) -->
<button type="button" class="btn btn-primary" 
        data-bs-toggle="popover" 
        data-bs-trigger="click"
        data-bs-content="点击触发">
    点击
</button>

<!-- 悬停触发 -->
<button type="button" class="btn btn-success" 
        data-bs-toggle="popover" 
        data-bs-trigger="hover"
        data-bs-content="悬停触发">
    悬停
</button>

<!-- 聚焦触发 -->
<button type="button" class="btn btn-info" 
        data-bs-toggle="popover" 
        data-bs-trigger="focus"
        data-bs-content="聚焦触发">
    聚焦
</button>

❌ 可关闭的弹出框

html
<a tabindex="0" class="btn btn-danger" 
   role="button" 
   data-bs-toggle="popover" 
   data-bs-trigger="focus"
   data-bs-title="可关闭的弹出框"
   data-bs-content="点击外部区域关闭此弹出框">
    可关闭弹出框
</a>

💻 JavaScript API

初始化

javascript
// 初始化单个弹出框
const popover = new bootstrap.Popover('#myPopover', {
    container: 'body',
    title: '标题',
    content: '内容',
    placement: 'top',
    trigger: 'click'
});

// 初始化所有弹出框
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]');
[...popoverTriggerList].map(el => new bootstrap.Popover(el));

方法

javascript
const myPopover = document.getElementById('myPopover');
const popover = bootstrap.Popover.getInstance(myPopover);

// 显示弹出框
popover.show();

// 隐藏弹出框
popover.hide();

// 切换弹出框
popover.toggle();

// 销毁弹出框
popover.dispose();

// 启用弹出框
popover.enable();

// 禁用弹出框
popover.disable();

// 更新弹出框
popover.update();

配置选项

javascript
const options = {
    animation: true,           // 是否使用动画
    container: false,          // 容器元素
    content: '',               // 内容
    delay: 0,                  // 延迟(毫秒)
    html: false,               // 是否允许 HTML
    placement: 'right',        // 位置
    title: '',                 // 标题
    trigger: 'click',          // 触发方式
    offset: [0, 8],           // 偏移量
    customClass: ''           // 自定义类名
};

🎭 事件监听

javascript
const myPopover = document.getElementById('myPopover');

myPopover.addEventListener('show.bs.popover', () => {
    console.log('即将显示弹出框');
});

myPopover.addEventListener('shown.bs.popover', () => {
    console.log('弹出框已显示');
});

myPopover.addEventListener('hide.bs.popover', () => {
    console.log('即将隐藏弹出框');
});

myPopover.addEventListener('hidden.bs.popover', () => {
    console.log('弹出框已隐藏');
});

🌟 实际示例

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap 弹出框示例</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container my-5">
        <h1>Bootstrap 弹出框示例</h1>
        
        <!-- 四个方向的弹出框 -->
        <h2>弹出框位置</h2>
        <div class="mb-4">
            <button type="button" class="btn btn-secondary me-2" 
                    data-bs-container="body" 
                    data-bs-toggle="popover" 
                    data-bs-placement="top"
                    data-bs-title="顶部弹出框"
                    data-bs-content="这是顶部弹出框的内容。">
                顶部
            </button>
            <button type="button" class="btn btn-secondary me-2" 
                    data-bs-container="body" 
                    data-bs-toggle="popover" 
                    data-bs-placement="right"
                    data-bs-title="右侧弹出框"
                    data-bs-content="这是右侧弹出框的内容。">
                右侧
            </button>
            <button type="button" class="btn btn-secondary me-2" 
                    data-bs-container="body" 
                    data-bs-toggle="popover" 
                    data-bs-placement="bottom"
                    data-bs-title="底部弹出框"
                    data-bs-content="这是底部弹出框的内容。">
                底部
            </button>
            <button type="button" class="btn btn-secondary" 
                    data-bs-container="body" 
                    data-bs-toggle="popover" 
                    data-bs-placement="left"
                    data-bs-title="左侧弹出框"
                    data-bs-content="这是左侧弹出框的内容。">
                左侧
            </button>
        </div>
        
        <!-- HTML 内容弹出框 -->
        <h2>HTML 内容</h2>
        <div class="mb-4">
            <button type="button" class="btn btn-primary" 
                    data-bs-toggle="popover" 
                    data-bs-html="true"
                    data-bs-title="<strong>HTML 标题</strong>"
                    data-bs-content="<p>这是一个包含 <strong>HTML</strong> 内容的弹出框。</p><ul><li>列表项 1</li><li>列表项 2</li></ul>">
                HTML 弹出框
            </button>
        </div>
        
        <!-- 不同触发方式 -->
        <h2>触发方式</h2>
        <div class="mb-4">
            <button type="button" class="btn btn-primary me-2" 
                    data-bs-toggle="popover" 
                    data-bs-trigger="click"
                    data-bs-title="点击触发"
                    data-bs-content="点击按钮显示此弹出框。">
                点击触发
            </button>
            <button type="button" class="btn btn-success me-2" 
                    data-bs-toggle="popover" 
                    data-bs-trigger="hover"
                    data-bs-title="悬停触发"
                    data-bs-content="鼠标悬停显示此弹出框。">
                悬停触发
            </button>
            <button type="button" class="btn btn-info" 
                    data-bs-toggle="popover" 
                    data-bs-trigger="focus"
                    data-bs-title="聚焦触发"
                    data-bs-content="获得焦点时显示此弹出框。">
                聚焦触发
            </button>
        </div>
        
        <!-- 可关闭的弹出框 -->
        <h2>可关闭的弹出框</h2>
        <div class="mb-4">
            <a tabindex="0" class="btn btn-danger" 
               role="button" 
               data-bs-toggle="popover" 
               data-bs-trigger="focus"
               data-bs-title="可关闭"
               data-bs-content="点击外部区域可以关闭此弹出框。">
                可关闭弹出框
            </a>
        </div>
        
        <!-- 不同颜色的按钮 -->
        <h2>不同按钮样式</h2>
        <div class="mb-4">
            <button type="button" class="btn btn-primary me-2" 
                    data-bs-toggle="popover" 
                    data-bs-title="主要"
                    data-bs-content="主要按钮的弹出框">
                Primary
            </button>
            <button type="button" class="btn btn-success me-2" 
                    data-bs-toggle="popover" 
                    data-bs-title="成功"
                    data-bs-content="成功按钮的弹出框">
                Success
            </button>
            <button type="button" class="btn btn-danger me-2" 
                    data-bs-toggle="popover" 
                    data-bs-title="危险"
                    data-bs-content="危险按钮的弹出框">
                Danger
            </button>
            <button type="button" class="btn btn-warning me-2" 
                    data-bs-toggle="popover" 
                    data-bs-title="警告"
                    data-bs-content="警告按钮的弹出框">
                Warning
            </button>
        </div>
        
        <!-- 实际应用:帮助信息 -->
        <h2>实际应用:表单帮助</h2>
        <form class="mb-4">
            <div class="mb-3">
                <label for="username" class="form-label">
                    用户名
                    <button type="button" class="btn btn-sm btn-outline-secondary" 
                            data-bs-toggle="popover" 
                            data-bs-title="用户名规则"
                            data-bs-content="用户名必须是 3-20 个字符,只能包含字母、数字和下划线。">
                        ?
                    </button>
                </label>
                <input type="text" class="form-control" id="username">
            </div>
            <div class="mb-3">
                <label for="password" class="form-label">
                    密码
                    <button type="button" class="btn btn-sm btn-outline-secondary" 
                            data-bs-toggle="popover" 
                            data-bs-title="密码要求"
                            data-bs-html="true"
                            data-bs-content="<ul class='mb-0'><li>至少 8 个字符</li><li>包含大小写字母</li><li>包含数字</li><li>包含特殊字符</li></ul>">
                        ?
                    </button>
                </label>
                <input type="password" class="form-control" id="password">
            </div>
        </form>
        
        <!-- JavaScript 控制 -->
        <h2>JavaScript 控制</h2>
        <div class="mb-4">
            <button type="button" class="btn btn-primary me-2" id="jsPopover">
                可控制的弹出框
            </button>
            <button type="button" class="btn btn-success me-2" id="showBtn">显示</button>
            <button type="button" class="btn btn-warning me-2" id="hideBtn">隐藏</button>
            <button type="button" class="btn btn-danger" id="toggleBtn">切换</button>
        </div>
        
        <!-- 实际应用:产品信息 -->
        <h2>实际应用:产品卡片</h2>
        <div class="row">
            <div class="col-md-4">
                <div class="card">
                    <div class="card-body">
                        <h5 class="card-title">产品名称</h5>
                        <p class="card-text">产品简短描述</p>
                        <p class="card-text"><strong>¥299</strong></p>
                        <button type="button" class="btn btn-primary" 
                                data-bs-toggle="popover" 
                                data-bs-title="产品详情"
                                data-bs-html="true"
                                data-bs-content="<p><strong>规格:</strong>标准版</p><p><strong>库存:</strong>充足</p><p><strong>配送:</strong>2-3 天</p>">
                            查看详情
                        </button>
                    </div>
                </div>
            </div>
        </div>
    </div>
    
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
    <script>
        // 初始化所有弹出框
        const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]');
        const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl));
        
        // JavaScript 控制示例
        const jsPopoverEl = document.getElementById('jsPopover');
        const jsPopover = new bootstrap.Popover(jsPopoverEl, {
            title: 'JavaScript 控制',
            content: '这个弹出框可以通过 JavaScript 方法控制显示和隐藏。',
            trigger: 'manual'
        });
        
        document.getElementById('showBtn').addEventListener('click', () => {
            jsPopover.show();
        });
        
        document.getElementById('hideBtn').addEventListener('click', () => {
            jsPopover.hide();
        });
        
        document.getElementById('toggleBtn').addEventListener('click', () => {
            jsPopover.toggle();
        });
        
        // 监听弹出框事件
        jsPopoverEl.addEventListener('shown.bs.popover', () => {
            console.log('弹出框已显示');
        });
    </script>
</body>
</html>

✅ 最佳实践

1. 可访问性

html
<button type="button" class="btn btn-primary" 
        data-bs-toggle="popover" 
        data-bs-title="标题"
        data-bs-content="内容"
        aria-label="显示更多信息">
    更多信息
</button>

2. 禁用元素的弹出框

html
<span class="d-inline-block" data-bs-toggle="popover" data-bs-content="禁用按钮的说明">
    <button class="btn btn-primary" type="button" disabled>禁用按钮</button>
</span>

3. 自定义样式

javascript
const popover = new bootstrap.Popover(element, {
    customClass: 'my-custom-popover',
    template: '<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'
});

🎯 常见应用场景

  1. 帮助文档 - 提供详细的帮助信息
  2. 表单提示 - 显示输入要求和示例
  3. 产品信息 - 展示产品详细规格
  4. 用户引导 - 新功能介绍和引导
  5. 快速预览 - 显示内容摘要

下一步

现在你已经掌握了 Bootstrap 弹出框的使用方法,接下来我们将学习消息弹窗组件。

下一章:Bootstrap 消息弹窗 →