为什么超载:在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
虽然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>
会自动拆分为尽可能多的两列。因为没有在任何地方声明height
或width
属性(通常或作为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 中