Bootstrap下拉列表被溢出:隐藏容器,如何更改容器?

AlB*_* Sh 34 html css twitter-bootstrap

使用自举,我有一个下拉菜单(小号内)divoverflow:hidden,这是需要这样.这导致下拉列表被容器剪切.

我的问题是,如何解决这个剪切问题,例如body,以尽可能低的成本更改项目中所有下拉列表的容器?

这是代码的一个例子:http: //jsfiddle.net/0y3rk8xz/

Con*_*hol 35

如果有人对此解决方法感兴趣,bootstrap下拉列表中有一个show.bs.dropdown事件,您可以使用该事件将下拉元素移动到overflow:hidden容器外部.

$('.dropdown').on('show.bs.dropdown', function() {
  $('body').append($('.dropdown').css({
    position: 'absolute',
    left: $('.dropdown').offset().left,
    top: $('.dropdown').offset().top
  }).detach());
});
Run Code Online (Sandbox Code Playgroud)

如果您希望在关闭下拉列表后将元素移回其所属的位置,还会发生hidden.bs.dropdown事件:

$('.dropdown').on('hidden.bs.dropdown', function() {
  $('.bs-example').append($('.dropdown').css({
    position: false,
    left: false,
    top: false
  }).detach());
});
Run Code Online (Sandbox Code Playgroud)

这是一个工作示例:

http://jsfiddle.net/qozt42oo/32/


Jus*_*ner 12

使用 Bootstrap,5.2.1我们可以配置popperjs使用fixed突破父母的位置overflow: hiddden

<div style="overflow: hidden">
  <div class="dropdown">
    <button class="dropdown-toggle"
            type="button"
            data-bs-toggle="dropdown"
            data-bs-popper-config='{"strategy":"fixed"}'>
      Dropdown
    </button>
    <ul class="dropdown-menu">
      <li>Item #1</li>
      <li>Item #2</li>
    </ul>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

<div style="overflow: hidden">
  <div class="dropdown">
    <button class="dropdown-toggle"
            type="button"
            data-bs-toggle="dropdown"
            data-bs-popper-config='{"strategy":"fixed"}'>
      Dropdown
    </button>
    <ul class="dropdown-menu">
      <li>Item #1</li>
      <li>Item #2</li>
    </ul>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

更新

同样来自Bootstrap 5.2.1 Docs也可以popperConfig通过 JS 传入。

const element = document.querySelector(".dropdown-toggle")
const dropdown = bootstrap.Dropdown.getOrCreateInstance(element, {
  popperConfig: {
    strategy: "fixed"
  }
)
Run Code Online (Sandbox Code Playgroud)


Yul*_*ian 8

Ng Bootstrap >= 4.1.0(Angular 驱动的 Bootstrap)解决方案:

对于任何遇到同样问题但使用ng-bootstrap 的人,这里有一个解决方案 - 使用您container="body"的选项ngbDropdown

<div ngbDropdown container="body">
    <!-- Dropdown menu goes here -->
</div>
Run Code Online (Sandbox Code Playgroud)

  • 你是我的救命恩人。 (2认同)

Gur*_*uru 7

将div属性更改为overflow:visible;,或者Position:absolute;像.dropdown类一样 设置

.bs-example .dropdown{position:absolute;}
Run Code Online (Sandbox Code Playgroud)

参见工作代码:http://jsfiddle.net/guruWork/3x1f8ng5/

  • 我需要`overflow:hidden`风格.关于绝对定位,如果.bs-example和.dropdown之间有一个具有非静态位置的元素,它将无法工作,如下所示:http://jsfiddle.net/vn6437kf/ (4认同)

Joh*_*nes 6

这里提到的所有答案都不适合我,所以我找到了另一种解决方法:

$('.dropdown').on('shown.bs.dropdown', function () {
    const dropdown = $(this);
    setTimeout(function () {
        dropdown.find('.dropdown-menu').css({'top': dropdown.offset().top - $(window).scrollTop(), 'left': dropdown.offset().left - $(window).scrollLeft(), 'position': 'fixed'});
    }, 1);
});
Run Code Online (Sandbox Code Playgroud)

超时是必要的,因为事件处理程序在引导程序设置下拉列表的 CSS 之前被触发,因此会覆盖它


Jac*_*vin 5

我的解决方案是在下拉列表上使用静态定位。我在具有溢出隐藏的引导表内放置了下拉菜单。

<div class="table" style="overflow: hidden;">
  <div class="dropdown" style="position: static;">
    <div class="dropdown-menu">...</div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

但是,这对您的小提琴无效。因此,我不确定我的解决方案是否与引导表有关。无论如何,也许它将给某人一些新的尝试。