How can you ensure twitter bootstrap popover windows are visible?

后端 未结 2 1604
情话喂你
情话喂你 2020-12-23 22:52

Does anyone know of an extension to the popover component of twitter bootstrap that dynamically changes the placement option to ensure that the popover displays on the scree

2条回答
  •  余生分开走
    2020-12-23 23:06

    The placement can be a function instead of a string. An example of auto placement written by fat and then ported to the most recent version of bootstrap by wleeper is in one of the github issues on the project here: https://github.com/twitter/bootstrap/issues/345

    Here is the result of compiling the CoffeeScript to JavaScript:

    $("a[rel=popover]").popover({
      placement: function(tip, element) {
        var $element, above, actualHeight, actualWidth, below, boundBottom, boundLeft, boundRight, boundTop, elementAbove, elementBelow, elementLeft, elementRight, isWithinBounds, left, pos, right;
        isWithinBounds = function(elementPosition) {
          return boundTop < elementPosition.top && boundLeft < elementPosition.left && boundRight > (elementPosition.left + actualWidth) && boundBottom > (elementPosition.top + actualHeight);
        };
        $element = $(element);
        pos = $.extend({}, $element.offset(), {
          width: element.offsetWidth,
          height: element.offsetHeight
        });
        actualWidth = 283;
        actualHeight = 117;
        boundTop = $(document).scrollTop();
        boundLeft = $(document).scrollLeft();
        boundRight = boundLeft + $(window).width();
        boundBottom = boundTop + $(window).height();
        elementAbove = {
          top: pos.top - actualHeight,
          left: pos.left + pos.width / 2 - actualWidth / 2
        };
        elementBelow = {
          top: pos.top + pos.height,
          left: pos.left + pos.width / 2 - actualWidth / 2
        };
        elementLeft = {
          top: pos.top + pos.height / 2 - actualHeight / 2,
          left: pos.left - actualWidth
        };
        elementRight = {
          top: pos.top + pos.height / 2 - actualHeight / 2,
          left: pos.left + pos.width
        };
        above = isWithinBounds(elementAbove);
        below = isWithinBounds(elementBelow);
        left = isWithinBounds(elementLeft);
        right = isWithinBounds(elementRight);
        if (above) {
          return "top";
        } else {
          if (below) {
            return "bottom";
          } else {
            if (left) {
              return "left";
            } else {
              if (right) {
                return "right";
              } else {
                return "right";
              }
            }
          }
        }
      }
    });
    

    It is working well for me except for one case: if the item is in the upper right corner there is no good spot for the popover to appear that is one of the options and it appears partially off the screen.

提交回复
热议问题