扩展Bootstrap Popover插件

时间:2014-04-24 20:26:49

标签: javascript jquery twitter-bootstrap-3 popover

我正在使用Bootstrap 3的popover js文件,默认情况下,当您悬停/单击弹出式触发器时(我只关心左/右放置),弹出窗口在元素所在的中间垂直对齐。< / p>

请参阅:enter image description here

但是,无论弹出窗口的高度如何,我都想修改此默认定位。

像这样:

enter image description here

我尝试了以下内容,但由于弹出窗口的高度可能不同,我没有得到我想要的位置,这就像上面的第二张图片。

$('.trigger').popover({
   trigger: 'hover',
   container: 'body'
}).hover(function(){
   var off = $('.popover').offset(),
       delta = 50,
       newY = parseInt( off.top ) + delta + 'px';

   $('.popover').css({top: newY });
});

任何帮助?

编辑:有没有办法扩展Bootstrap工具提示js?我最终不得不通过更改Tooltip.prototype.getCalculatedOffset函数来更改源代码。我所做的只是改变左/右位置而不是减去actualHeight

Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
    // return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :
    //        placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :
    //        placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
    //     /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }

    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :
       placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :
       placement == 'left'   ? { top: pos.top + pos.height / 2, left: pos.left - actualWidth } :
       /* placement == 'right' */ { top: pos.top + pos.height / 2, left: pos.left + pos.width   }
  }

有没有办法让我可以创建自己的placement类型 - 例如展示位置=='自定义左'和展示位置='自定义右'?

3 个答案:

答案 0 :(得分:3)

这对我有用(对于弹出窗口,而不是工具)

$.fn.popover.Constructor.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
    return  placement == 'bottom'? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 }:
            placement == 'top'? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 -actualWidth / 2 }:
            placement == 'left'? { top: pos.top + pos.height / 2, left: pos.left - actualWidth }:
            { top: pos.top + pos.height / 2, left: pos.left + pos.width };
};

答案 1 :(得分:1)

theNeoteric有正确的答案。 我还添加了以下内容以对齐弹出箭头。

$.fn.popover.Constructor.prototype.replaceArrow = function (delta, dimension, isHorizontal) {
    var intOffset = 32;
    if (delta != 0) { intOffset = intOffset - (delta / 2) } ;
    this.arrow()
    .css(isHorizontal ? 'left' : 'top', intOffset + 'px')
    .css(isHorizontal ? 'top' : 'left', '')
}

答案 2 :(得分:0)

也许这会有所帮助? (未经测试)。简而言之:等到“显示”事件触发并设置位置。

$('.popover').on('shown.bs.popover', function () {
  var off = $(this).offset(),
       delta = 50,
       newY = parseInt( off.top ) + delta + 'px';

   $(this).css({top: newY });
})