基于文档高度的引导下拉列表位置(上/下)

Posted

技术标签:

【中文标题】基于文档高度的引导下拉列表位置(上/下)【英文标题】:Bootstrap dropdown list position (Up/Bottom) based on document height 【发布时间】:2015-12-21 04:27:38 【问题描述】:

我的页面上有引导下拉菜单列表。当页面最小化或屏幕调整时,菜单列表将离开屏幕。如果屏幕高度使列表脱离屏幕,我想检查并向上显示它们。

这是我的html

 <div  class="btn-group pull-right">                    
 <button type="button" class="btn dropdown-toggle" data-toggle="dropdown" aria-expanded="false">Click<span class="caret"></span></button>
                <ul  class="dropdown-menu pull-right" role="menu">
                    <li>First</li>
                    <li>Second></li>
                    <li>Third</li>
                    <li><Fourth</li>
                    <li>Fifth</li>
                </ul>
            </div>

注意:列表是根据高度而不是宽度来计算的。屏幕宽度无关紧要,因为我已经在使用“向右拉”,这使我的列表显示在屏幕内。

【问题讨论】:

【参考方案1】:

我已经创建了一个基于@Serlite 解决方案的点击事件,以防你只想在点击任何下拉菜单时执行代码:

$(document.body).on('click', '[data-toggle=dropdown]', function()
    var dropmenu = $(this).next('.dropdown-menu');

    dropmenu.css(
        visibility: "hidden",
        display: "block"
    );

    // Necessary to remove class each time so we don't unwantedly use dropup's offset top
    dropmenu.parent().removeClass("dropup");

    // Determine whether bottom of menu will be below window at current scroll position
    if (dropmenu.offset().top + dropmenu.outerHeight() > $(window).innerHeight() + $(window).scrollTop())
        dropmenu.parent().addClass("dropup");
    

    // Return dropdown menu to fully hidden state
    dropmenu.removeAttr("style");
);

【讨论】:

【参考方案2】:

要使下拉菜单在单击其切换控件时向上显示,您应该在菜单的容器元素上使用.dropup 类。要确定何时应用此类,您可以计算展开的下拉菜单的底部是否会在窗口下方结束,如果是,则应用 .dropup 类。

一种可能的实现方式(附加到窗口的scroll 事件):

function determineDropDirection()
  $(".dropdown-menu").each( function()

    // Invisibly expand the dropdown menu so its true height can be calculated
    $(this).css(
      visibility: "hidden",
      display: "block"
    );

    // Necessary to remove class each time so we don't unwantedly use dropup's offset top
    $(this).parent().removeClass("dropup");

    // Determine whether bottom of menu will be below window at current scroll position
    if ($(this).offset().top + $(this).outerHeight() > $(window).innerHeight() + $(window).scrollTop())
      $(this).parent().addClass("dropup");
    

    // Return dropdown menu to fully hidden state
    $(this).removeAttr("style");
  );


determineDropDirection();

$(window).scroll(determineDropDirection);

这里有一个Bootply 来演示。尝试缩短演示面板,然后上下滚动面板,查看下拉菜单将如何根据可用空间显示在其切换控件上方/下方。

希望这会有所帮助!如果您有任何问题,请告诉我。

【讨论】:

很好,按预期工作。我还添加了 $(window).resize(determineDropDirection);这样在调整窗口大小时它的行为也会相同。 很高兴为您提供帮助,很高兴您能够根据自己的目的调整它。 谢谢!确实解决了一个非常普遍的问题! 我可以知道为什么我们将 css(Line 5 - Line 8) 放在这个函数中,而不是放在 css 文件中吗? @Meilan 我们只是暂时应用样式,以便确定下拉菜单的尺寸;我们不希望它们总是被应用(就像它们是在样式表中定义的一样)。经过我们的计算,内联样式再次被removeAttr("style")移除。

以上是关于基于文档高度的引导下拉列表位置(上/下)的主要内容,如果未能解决你的问题,请参考以下文章

基于第一个下拉菜单的引导多选动态选项

基于移动设备上点击位置的下拉列表弹出 CSS

如何在引导下拉列表中获取选定元素,其中下拉列表是动态填充的

增加引导下拉菜单宽度

引导模式上的summernote时无法下拉

在引导选项卡中选择 2 挤压下拉列表