【问题标题】:How to make sub menu span full width of the browser window?如何使子菜单跨越浏览器窗口的全宽?
【发布时间】:2016-08-18 11:38:20
【问题描述】:

我希望我的子菜单像下图一样跨越浏览器窗口的整个宽度:

我正在使用Bootstrap,我的主菜单也向右浮动。

我已经创建了一个演示,说明我到目前为止所做的事情。我怎样才能达到这个结果?

http://codepen.io/ifusion/pen/oLVVXj

【问题讨论】:

    标签: html css twitter-bootstrap sass


    【解决方案1】:

    首先,bootstrap 让你非常不灵活。因此,如果您想使用它,我建议将子菜单移出菜单元素,因为 width:100%; 取决于父级。所以应该比父元素更宽的所有东西都不应该是这个父元素的子元素。此外,position:absolute 依赖于具有position:absoluteposition:relative 的下一个父级。所以有很多事情并不容易。移动子菜单会更容易。在那里你可以使用width:100%;position:absoluteleft:0

    或者要使子菜单脱离页面流程,您可以使用position:fixed。和width:100%。查看 Codepen 了解此解决方案。我更喜欢第一个,即使它更多的工作。不过,固定定位有一些副作用,但也许对你来说并不重要。

    【讨论】:

    • 您的描述不是很清楚。如果父元素有position: fixed, relative or absolute,则子元素的宽度取决于父元素。如果您删除父元素上的position - 子元素将采用最近的具有位置的祖父母的宽度。 Hrrrm...这也不清楚。
    • 你错了。 width 依赖于父级。即使元素有position: static;(默认)。
    • 如果父元素没有显式设置位置,则位置固定的子元素将相对于已设置位置的最近祖父元素定位自身。
    • 好的,抱歉,您所说的width: 100% 是正确的。我指的是你可以使实际宽度比父宽度更宽 - 通过使用 left: xright: x...
    • 您也可以使用width:120% 使其更宽。有很多方法。我只是想说这样做不是一种好风格。至少我是这么认为的。但另一个你错了的事实:固定位置总是取决于浏览器的宽度。这就是我在替代解决方案中所利用的。
    【解决方案2】:

    位置绝对子将相对于最近的位置相对父定位,因此删除主菜单 li 的相对位置将解决此问题。还要从正文和 html 中删除填充和边距。

    body, html{
      margin: 0;
      padding: 0;
    }
    
    .main-menu {
      list-style-type: none;
      padding: 0;
      margin: 0;
      float: right;
    }
    .main-menu li {
      float: left;
    }
    .main-menu li a {
       display: block;
       background: #c2c2c2;
       padding: 20px;
       color: #337ab7;
       text-decoration: none;
    }
    
    .main-menu-dropdown {
        position: absolute;
        left: 0;
        right: 0;
        display: block;
        padding: 0;
        list-style-type: none;
        background-color: black;
        text-align: center;
    }
    .main-menu-dropdown li {
      float: none;
      display: inline-block;
      margin-left: -4px;
    }
    .main-menu-dropdown li a {
      background: black;
      display: inline-block;
    }
    <div class="container">
        <div class="col-md-12">
            <ul class="main-menu">
                <li><a href="#">First item</a></li>
                <li>
                    <a class="has-dropdown" href="#">Second Item</a>
                    <ul class="main-menu-dropdown clearfix">
                        <li><a href="#">Sub item 1</a></li>
                        <li><a href="#">Sub item 2</a></li>
                        <li><a href="#">Sub item 3</a></li>
                    </ul>
                </li>
                <li><a href="#">Third Item</a></li>
                <li><a href="#">Fourth Item</a></li>
            </ul>
            <div class="col-md-12">
            I need the sub menu to span the width of the browser
            </div>
        </div>
    </div>

    【讨论】:

      【解决方案3】:

      首先,子菜单的宽度受到限制,因为它的父元素有position: relative

      删除后,子菜单变为全宽,但项目仍左对齐。

      在下面的示例中,我将.main-menu-dropdown 使用display: flex,然后将其中的项目居中。

      http://codepen.io/adrianlynch/pen/RRddjk

      .main-menu-dropdown {
        position: absolute;
        left: -15px;
        right: -15px;
        display: flex;
        justify-content: center;
        margin: 0;
        padding: 0;
        list-style-type: none;
        background: black;
      }

      【讨论】:

      • 不是全宽,而是类col-md-12的宽度。
      • 是的,正如@ScientiaEtVeritas 所说,这需要是浏览器的全宽。就像.container-fluid 跨越整个宽度一样。由于浏览器不一致,我也想尽量避免使用 flex。
      • 如果是这种情况,您可以调整左/右/宽度以适应它。
      • Flex 得到了很好的支持,并且问题有据可查。这些天我看不出有什么理由不使用它。
      • 我已经调整了上面的 codepen 以适应 col-md-12container 之间的差异。如果它实际上只是左右流血,你可以调整它任何足够大的数字(即-1000em)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多