为什么超载:在Firefox中而不是在Chrome中隐藏隐藏多列渲染?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么超载:在Firefox中而不是在Chrome中隐藏隐藏多列渲染?相关的知识,希望对你有一定的参考价值。

我最近偶然发现Firefox中的一个奇怪行为,该行为带有columns:2 div中的列表。

如果列表设置为overflow:hidden,则Firefox将不再在2列中呈现。按预期在2列中进行渲染(有和没有溢出)。

这是一个最小的示例:

$('button').on('click', (e) => {
  $('ul').toggleClass('overflow')
})
div {
  columns:2;
}

ul.overflow {
  overflow: hidden;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button>toggle overflow</button>
<div>
    <ul>
        <li>Lorem ipsum dolor.</li>
        <li>Consequuntur, ab nostrum.</li>
        <li>Quibusdam, iure, fuga.</li>
        <li>Suscipit quisquam, vel.</li>
        <li>Assumenda architecto, adipisci!</li>
        <li>Molestias, nostrum ratione.</li>
        <li>Quaerat, eveniet, in.</li>
        <li>Illum, debitis, dicta.</li>
        <li>Tempore, placeat, ea.</li>
        <li>Amet dignissimos, maiores.</li>
        <li>Odio, eos, ullam.</li>
        <li>Modi libero, quis!</li>
        <li>Aliquid, commodi, voluptates.</li>
        <li>Aperiam, magni, vel.</li>
        <li>Vitae, minima dolorum!</li>
        <li>Quidem, corporis, dolorum.</li>
        <li>Autem, minima, sit.</li>
        <li>Adipisci, odio, numquam.</li>
        <li>At, dicta, hic!</li>
        <li>Odit, blanditiis voluptate.</li>
    </ul>
</div>

在CodePen上:https://codepen.io/BugHunter2k/pen/rNaVpGG

什么渲染是正确的?我可以添加一些内容吗,即使[overflow:hidden

,Firefox也可以渲染2列
答案

虽然Thierry的答案包括解决一个问题的解决方案,但它也修复了您所面临的实际问题(我相信,这是无意的),并且错误地归咎于错误的浏览器。让我们分解一下:

首先,这实际上在Firefox中正常运行,在Chrome中不正确。

由于multi-column container,您有一个div充当columns: 2,它是以下简称:

div {
    column-count: 2;
    column-width: auto;
}

此多列容器将建立一个新的block formatting context,因此后代元素上的任何属性都将相对于div而非本例中的页面应用。

要记住的一件事是,多列布局有点灵活(我也不是说关于flexbox布局)...它们会尝试遵守您提供的值,但是如果它们可以容纳较少的列,或者如果他们必须占用更多的列以适合您的标记,则很可能会这样做。您稍后会在我的答案中看到一个示例。

在div中,您有一个无序列表,该列表通常在垂直列表中显示其子级,但是由于前面的columns: 2<ul>会自动拆分为尽可能多的两列。因为没有在任何地方声明heightwidth属性(通常或作为column-属性),所以它只将内容分割50-50。您在列表的两半之间看到的不对齐是因为默认情况下<ul>具有margin-top属性,该属性将列表项的前半部分向下推16px(通常是<ul> s上的边距大小)。

columns: 2中应用ul {}而不是div {}可以解决您的问题的原因是因为您现在将<ul> itself分为两列,而不是试图挤压普通的<ul>放入多列容器中,但是可以容纳;浏览器知道以这种方式将相同的格式应用于每列的开头。

现在,默认情况下,<div>的宽度与容器的宽度相同(由于其默认的display:block;属性),与容器的内容一样高。如果要向<ul>添加更多项目,则两组列表项的高度会增加(如果为div设置了背景颜色,则可以更轻松地看到)。

回到我提到的灵活性,如果您将div的高度限制为150px,您会发现默认情况下列数增加并且div溢出:

div {
    columns:2;
    column-rule: thin solid red; /* this value added just to illustrate the split between columns */
    height: 150px;
    background: grey; /* this value added for ease of visual comprehension */
}

ul.overflow {
    overflow: hidden;
}
<div>
    <ul>
        <li>Lorem ipsum dolor.</li>
        <li>Consequuntur, ab nostrum.</li>
        <li>Quibusdam, iure, fuga.</li>
        <li>Suscipit quisquam, vel.</li>
        <li>Assumenda architecto, adipisci!</li>
        <li>Molestias, nostrum ratione.</li>
        <li>Quaerat, eveniet, in.</li>
        <li>Illum, debitis, dicta.</li>
        <li>Tempore, placeat, ea.</li>
        <li>Amet dignissimos, maiores.</li>
        <li>Odio, eos, ullam.</li>
        <li>Modi libero, quis!</li>
        <li>Aliquid, commodi, voluptates.</li>
        <li>Aperiam, magni, vel.</li>
        <li>Vitae, minima dolorum!</li>
        <li>Quidem, corporis, dolorum.</li>
        <li>Autem, minima, sit.</li>
        <li>Adipisci, odio, numquam.</li>
        <li>At, dicta, hic!</li>
        <li>Odit, blanditiis voluptate.</li>
    </ul>
</div>
另一答案
但是您可以做的是将columns: 2;放在ul而不是div上。它还将解决第二列与第一列不一致的(不需要的?)行为。

以上是关于为什么超载:在Firefox中而不是在Chrome中隐藏隐藏多列渲染?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我对表格的媒体查询可以在 chrome 中使用,而不是在 firefox 中使用?

嵌入式闪存在 Chrome 中工作而不是在 FireFox 中

SVG 矩形在 Firefox 中而不是 Chrome/Safari 中组合在一起

Jquery click 在 FIrefox 中注册,而不是在 IE 中

CORS 请求在 Firefox 中中止,而不是在 Chrome 或 IE 中

导航栏在 Chrome 中损坏,而不是在 IE 或 Firefox 中