【问题标题】:Equal height Flexbox columns in ChromeChrome 中等高的 Flexbox 列
【发布时间】:2015-01-21 07:46:31
【问题描述】:

我有一个简单的 2 列布局,我想使用 Flexbox 来获得相等的高度:

HTML

<div class="row flex">
    <!-- menu -->
    <div class="col-xs-4">
        <aside>
            Menu goes here
        </aside>    
    </div>
    <!-- content -->
    <div class="col-xs-8">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam ac elementum justo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Phasellus nec elementum erat. Suspendisse consequat ut metus ut cursus. Aenean et lectus id libero venenatis varius. Vivamus luctus ligula sit amet faucibus vulputate. Vestibulum tincidunt fringilla mauris, a vulputate magna egestas nec. Vivamus a odio ut nibh viverra fermentum.</p>
    </div>
</div>

CSS

body { color: red; }
.flex { display: flex; }
aside { background: #000; height: 100%; }

这在 Firefox 中有效,但在 Chrome 中无效:here's a Fiddle

我尝试了一些东西(包括供应商前缀),但它仍然不起作用。

【问题讨论】:

    标签: html css google-chrome flexbox


    【解决方案1】:

    使用Flexbox 创建两个相等的列:

    • 父容器获取display: flex

    • 每一列都由一个 div 创建,它们得到flex: 1 来增长/缩小

    拉伸第一列的子节点:

    • 第一列也被赋予了display: flex,这样它的子节点就可以拥有弹性属性并增长

    • 旁边的孩子被给flex: 1,会长大/缩小

    This is the easiest guide to Flexbox you could ask for.

    Flexbox 兼容性: IE11+ and all modern browsers

    示例


    使用 BootstrapHere is the fiddle from your comment with my changes added. 左侧的 1px 间隙已被 div.flex.row:before, div.flex.row:after { display: none } 移除

    相关回答:Remove 1px gap when using display:flex in Chrome


    我已经为这个例子剥离了所有不必要的类。目前,两个柱高都由最高的柱确定。您还可以在 flex 容器上使用 height: 100vh 填充页面的整个高度 — read more about viewport units here.

    视口单位兼容性: Viewport Units are almost well supported

    要给列更大的宽度,给它更大的 flex 值。我已将本例中的第二列更改为flex: 3,它会更宽。

    body {
      color: red;
      margin: 0;
    }
    .flex {
      display: flex;
      /*Should the columns span the entire height of the page? Use:
      height: 100vh;*/
    }
    .column {
      flex: 1;
    }
    .column:first-child {
      display: flex;
    }
    .column:last-of-type {
      background: #000;
      flex: 3;
    }
    aside {
      flex: 1;
      background: #F90;
    }
    <div class="flex">
      <!-- menu -->
      <div class="column">
        <aside>
          Menu goes here
        </aside>
      </div>
      <!-- content -->
      <div class="column">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam ac elementum justo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Phasellus nec elementum erat. Suspendisse consequat ut metus ut cursus.
          Aenean et lectus id libero venenatis varius. Vivamus luctus ligula sit amet faucibus vulputate. Vestibulum tincidunt fringilla mauris, a vulputate magna egestas nec. Vivamus a odio ut nibh viverra fermentum.</p>
        <p>Nulla facilisi. Pellentesque nec libero leo. Duis porta ut neque vulputate blandit. In vel quam eu eros finibus feugiat ut in nulla. Morbi congue, tellus commodo euismod pulvinar, lacus dui fringilla lectus, in tempus mi nulla semper ex. Integer feugiat,
          lectus a facilisis rutrum, ex magna tincidunt ligula, in suscipit turpis lorem quis neque. Suspendisse dictum, nulla at aliquet cursus, magna tellus mattis purus, nec volutpat mauris nunc non neque. Mauris pretium mauris sed eros interdum lobortis.
          Aenean id vestibulum nisl. Praesent sit amet tempor nulla, consequat viverra ante. Maecenas eu pretium lacus, a consectetur sem. Proin viverra eget turpis eu condimentum. Donec et egestas enim. Maecenas fermentum auctor ligula, nec fringilla mi.
          Quisque hendrerit purus eget urna semper sodales.</p>
    
      </div>
    </div>

    【讨论】:

    • 感谢先生ManSam,这是一个解决方案,但我不想触摸第一列的背景颜色(我的“col-xs-4”)并直接处理“aside”背景颜色(和 100 % height)...这可能吗?
    • @Ivan - 不用担心,我已经更新了我的答案。背景现在应用于&lt;aside&gt; 并拉伸以填充列的宽度。第一列将与第二列高度匹配,并且旁边会在其中增长。
    • 您的示例运行良好,但仍然存在问题:列的宽度相等(它们应该不同),并且在 Chrome 上,第一列左侧有一个 1px 的小间隙:jsfiddle.net/e5pswtd8/1 不管怎样我接受它,即使我改用 jQuery 来维持我的心理健康:-D
    • @Ivan - 如果你确实想坚持使用 flexbox 布局,你可以给第二列一个更高的 flex 值。我已经更改了我的示例并给出了第二列flex: 3; 它将被赋予更大的宽度计算部分。 差距是由引导程序引起的,很可能是clearfix。您会注意到我的示例中没有空白。
    • @Ivan - Here is your flexbox layout with that 1px left clearfix gap removed for flex divs. 我已经包含了flex: 3 以确保第二列更宽。
    【解决方案2】:

    这是我使用一点 Modernizr 和 jQuery 的解决方案(使用 Equalize plugin

    http://jsfiddle.net/0Leymgbe/1/

    这就是它起作用的原因:

    if ($().equalize) { // check if plugin is loaded
        $(window).on("resize", function () {
            (Modernizr.mq("(min-width: 768px)")) // if it's tablet or desktop...
            ? $('.row').equalize({reset: true}) // then equalize the columns
            : $('.row > div').css({'height': 'auto'}); //else reset to original height
        }).resize(); // trigger the resize on page load, too
    }
    

    在窗口调整大小(和加载)时 Modernizr 检查视口是否大于 768px(平板电脑和台式机):如果为真,则 jQuery 均衡列;如果为 false(智能手机),则恢复原始高度

    (对我来说)没有办法让它简单地与 CSS3 flexbox 一起工作

    【讨论】:

    • 我相信我在回答中所做的更改已经合理地解决了您遇到的问题 :) 如果 Flexbox 的浏览器支持对您来说不是问题,display: flex 与 jQuery 相比非常轻量级插件!
    • 是的,好多了,谢谢!虽然在调整浏览器大小时我仍然对列的宽度有一些问题:在所有分辨率下,列的比例应该是 1:2(col-xs-4 与 col-xs-8),但它是可变的......即,在768px,大概是 1:4
    • 我使用 flex: 2; 而不是 flex: 3; 修复了错误的比率:jsfiddle.net/9wjvk3hp/2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 2017-02-28
    • 1970-01-01
    • 2016-09-26
    • 2017-02-13
    相关资源
    最近更新 更多