javascript - bootstrap tooltip\popover - 解决左侧放置不一致的问题

标签 javascript jquery css twitter-bootstrap twitter-bootstrap-tooltip

我一直在做一个元素,我注意到我想要解决的 Bootstrap 行为中的一些不一致。

当弹出窗口(或工具提示,无论什么,它们基本相同)接近屏幕边缘时 - 如果它是右侧的,当接近边缘时 - 它会收缩以免离开屏幕(它只能在一定程度上起作用,但这通常就足够了。

当展示位置在左侧时不会发生这种情况。

即:

正确的位置:

正常宽度:

enter image description here

靠近边缘:

enter image description here

左侧位置:

正常宽度:

enter image description here

靠近边缘:

enter image description here

这些图片来自小DEMO我写信来说明这个问题。

我把源代码搞得一团糟,至今无济于事。我似乎无法弄清楚到底是什么导致了这种行为。

有什么想法吗?

附注

我正在使用 Bootstrap 3.1.1。新的 3.2 没有解决这个问题(我想避免在此时升级)。


重大更新!

经过一些挖掘,我发现这与 bootstrap 无关 - 它是简单的 css - 似乎当你绝对定位一个元素并将其推到两侧时,它会尝试并留在屏幕内。

我从来不知道这种行为,它会自动发生 - 但只会发生在你插入的方向 - 即从左边插入的 div 在到达屏幕的右边缘时会收缩,反之亦然。

碰巧的是,弹出框仅使用 left 赋值定位 - 这就是我们看到不一致行为的原因 - 当它被推到右边时它会收缩而不是另一个方向。

所以解决方案是分配权利——听起来很简单? 没那么多。我拿了源代码并对其进行了一些操作,adding these lines (jsfiddle 中第 250 行的某处):

if (placement == 'left' && offset.left < 0) {
    var right = ( $(window).width() + 10 ) - ( offset.left + actualWidth ); 

    offset.left = 0;
    $tip.offset(offset);
    $tip.css({ 'right': right });
}

看起来很有道理吧?如果左侧的偏移量小于 0(即,它离开屏幕),则计算窗口宽度并从中删除左侧偏移量和弹出框本身的宽度(actualWidth),您将得到与右侧的距离。

然后,确保重置左侧偏移并应用右侧定位。 但是...它只能在某种程度上起作用——也就是说它只能在第二次起作用。

检查一下 for yourself !悬停一次,它放错了位置,将鼠标拉到一边再试一次,突然它就定位正确了。什么鬼?

编辑

好的,这似乎经常出现,所以我会说清楚:

我知道 auto 放置。我不想要它。 我想控制popover的去向,让它自动决定并不能解决问题,只是避免它而已

最佳答案

好的,我已经接近了一点。

在 css 中分配 right 后,actualWidthactualHeight 将发生变化,因此您需要更新这些变量。在您的 jsfiddle 中的第 253 行附近:

if (placement == 'left' && offset.left < 0) {
    var right = (  $(window).width() + 10) - ( offset.left + actualWidth ); 

    offset.left = 0;
    $tip.offset(offset);
    $tip.css({ 'right': right });
    actualWidth  = $tip[0].offsetWidth;
    actualHeight = $tip[0].offsetHeight;
}

这在您第一次悬停时有效,但此后每次都会将 top 设置得太高,因此您无法阅读工具提示的顶部。

更新: 似乎设置了 right 值会打乱 applyPlacement 函数中的定位。要解决此问题,请在设置初始 actualWidth 和 actualHeight 之前清除 right 值(第 225 行左右):

$tip.css({ 'right': '' });
// check to see if placing tip in new offset caused the tip to resize itself
var actualWidth  = $tip[0].offsetWidth
var actualHeight = $tip[0].offsetHeight

关于javascript - bootstrap tooltip\popover - 解决左侧放置不一致的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24760420/

相关文章:

React setState 中的 JavaScript 使用

javascript - 不安全的 <form> 调用。在 index.html 页面上找到

javascript - bootbox.js 回调不起作用

jquery - 使用 jQuery 在 Google App Engine 中提交 Ajax 表单

html - HTML内容背后的YouTube全屏视频

css - * css 选择器的实际性能影响是什么?

javascript - 我可以制作没有外部数据文件的圆环图吗?

javascript - 动态添加多个框阴影的纯CSS方案

jquery - MVC 3 客户端验证间歇性地工作

javascript - 隐藏一个 div 并显示另一个 overtop 时使用 jQuery 进行幻灯片转换