You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bootstrap 5是否提供Popper.js全部功能?Tooltip修饰器失效问题咨询

问题:Bootstrap Tooltip滚动切换位置时自定义Popper Modifier不触发

我想在页面滚动导致Tooltip位置变化时执行自定义操作,但尝试使用Popper 2的Modifiers打印日志却没生效。具体场景是:滚动到页面底部后点击触发Tooltip,再次滚动时Tooltip会从右侧切换到顶部,但自定义的修饰器函数完全没执行,怀疑Bootstrap没有暴露Popper.js的全部功能。

我的代码如下:

JavaScript

const topLogger = {
    name: 'topLogger',
    enabled: true,
    phase: 'main',
    fn({ state }) {
        console.log('Popper is on the top');
    },
};

var exampleEl = document.querySelector('[data-bs-toggle="tooltip"]');
var tooltip = new bootstrap.Tooltip(exampleEl, {
    modifiers: [topLogger],
});

CSS

span {
  margin-left: 100px;
}

HTML

<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous">
    
    <title>Hello, world!</title>
  </head>

  <body>
  <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br>
  
   <span class="text-decoration-none toolip-link" data-bs-animation="true" data-bs-trigger="click" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-custom-class="custom-tooltip" data-bs-html="true" data-bs-title="This is dummy content to be show in the tooltip">Click Me</span>
  <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br>

    <!-- Optional JavaScript; choose one of the two! -->

    <!-- Option 1: Bootstrap Bundle with Popper -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-/bQdsTh/da6pkI1MST/rWKFNjaCP5gBSY4sEBT38Q/9RBh9AH40zEOg7Hlq2THRZ" crossorigin="anonymous"></script>

   </body>
</html>

原因分析

Bootstrap 5对Popper做了封装优化:默认情况下,滚动导致Tooltip位置调整时,Bootstrap仅调用Popper的轻量化更新逻辑,不会完整触发所有自定义Modifiers的执行流程。同时你的Modifier配置的phase: 'main'时机不对,无法捕捉到滚动后的位置切换事件。


解决方案

方案1:获取Popper实例,监听位置更新事件

Bootstrap Tooltip显示后,会在实例上暴露内部的_popper对象,你可以直接操作这个Popper实例添加自定义逻辑:

var exampleEl = document.querySelector('[data-bs-toggle="tooltip"]');
var tooltip = new bootstrap.Tooltip(exampleEl);

// 监听Tooltip显示完成事件
exampleEl.addEventListener('shown.bs.tooltip', function() {
    const popperInstance = tooltip._popper;

    // 添加自定义Modifier,监听位置变化
    popperInstance.modifiers.push({
        name: 'positionChangeLogger',
        enabled: true,
        phase: 'afterMain', // 位置计算完成后执行
        fn({ state }) {
            if (state.placement !== state.previousPlacement) {
                console.log(`Tooltip位置从${state.previousPlacement}切换到${state.placement}`);
                if (state.placement === 'top') {
                    console.log('Popper is on the top');
                }
            }
        }
    });

    // 或者直接监听Popper的update事件
    popperInstance.on('update', () => {
        console.log('当前Tooltip位置:', popperInstance.state.placement);
    });
});

方案2:手动监听滚动,强制触发Tooltip完整更新

通过监听页面滚动事件,主动调用Tooltip的update()方法,强制Popper重新计算位置并触发所有Modifiers:

const topLogger = {
    name: 'topLogger',
    enabled: true,
    phase: 'afterMain',
    fn({ state }) {
        if (state.placement === 'top') {
            console.log('Popper is on the top');
        }
    },
};

var exampleEl = document.querySelector('[data-bs-toggle="tooltip"]');
var tooltip = new bootstrap.Tooltip(exampleEl, {
    modifiers: [topLogger],
});

// 监听页面滚动
window.addEventListener('scroll', () => {
    // 仅当Tooltip显示时执行更新
    if (tooltip._isShown) {
        tooltip.update();
    }
});

内容的提问来源于stack exchange,提问作者user31782

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:45:34