html - 使带有列的内联 block 具有正确的宽度

标签 html css google-chrome css-multicolumn-layout

想要制作带有水平列的inline-block。我需要每个 inline-block 的宽度为最小列数以适应内容。

问题是浏览器处理了奇怪的列。

div {
  height: 10em;
  border: 1px solid red;
  display: inline-block;
  vertical-align: top;

  -moz-column-width: 10em;
  column-width: 10em;
  -moz-column-fill: auto;
  column-fill: auto;
}
<div>
  <p>Lorem ipsum dolor sit amet, an nec posse homero accumsan. Pro sale deseruisse ad. Vix cu integre fuisset insolens. Quo perfecto pericula ex. Te nam tritani honestatis, eam integre virtute ut.</p>
  <p>Cum an autem affert laoreet, ea ius falli impedit ocurreret. No duo aperiam perfecto lobortis, ut mea aliquid graecis, te has facete sententiae. Ut singulis laboramus his, meis laoreet docendi ius ad. Duo nisl alterum perfecto no, eum in etiam laboramus prodesset, rebum nobis nusquam in sit. Usu at expetendis consectetuer.</p>
</div>
<div>
  <p>Lorem ipsum dolor sit amet, an nec posse homero accumsan. Pro sale deseruisse ad. Vix cu integre fuisset insolens. Quo perfecto pericula ex. Te nam tritani honestatis, eam integre virtute ut.</p>
</div>
<div>
  <p>Lorem ipsum dolor sit amet, an nec posse homero accumsan.</p>
</div>
<div>
  <p>Lorem ipsum</p>
</div>

Chrome,可能会确定没有列的宽度,而不是将列放入该区域。第一个 block 有一个列的额外空间。其他 block 可能只有一列的宽度,但它们都有不同的宽度:

Chrome screenshot

Firefox 将所有 block 的宽度设置为单个列,然后 ext 溢出它。我可以在元素或其任何容器上强制滚动条,但我无法使它们中的任何一个具有正确的宽度。

Firefox screenshot

我有一个 hack forsing Chrome 的行为像 Firefox,但它并没有帮助我解决问题:

div {
  height: 10em;
  border: 1px solid red;
  display: inline-block;
  vertical-align: top;

  -moz-column-width: 10em;
  column-width: 10em;
  -moz-column-fill: auto;
  column-fill: auto;
  
  /* chrome to firefox */
  width: -webkit-min-content;
  width: min-content;
  min-width: 10em;
}
<div>
  <p>Lorem ipsum dolor sit amet, an nec posse homero accumsan. Pro sale deseruisse ad. Vix cu integre fuisset insolens. Quo perfecto pericula ex. Te nam tritani honestatis, eam integre virtute ut.</p>
  <p>Cum an autem affert laoreet, ea ius falli impedit ocurreret. No duo aperiam perfecto lobortis, ut mea aliquid graecis, te has facete sententiae. Ut singulis laboramus his, meis laoreet docendi ius ad. Duo nisl alterum perfecto no, eum in etiam laboramus prodesset, rebum nobis nusquam in sit. Usu at expetendis consectetuer.</p>
</div>
<div>
  <p>Lorem ipsum dolor sit amet, an nec posse homero accumsan. Pro sale deseruisse ad. Vix cu integre fuisset insolens. Quo perfecto pericula ex. Te nam tritani honestatis, eam integre virtute ut.</p>
</div>
<div>
  <p>Lorem ipsum dolor sit amet, an nec posse homero accumsan.</p>
</div>
<div>
  <p>Lorem ipsum</p>
</div>

实际上我需要得到这样的东西:

Expected result

附言:Same question in russian.

最佳答案

如果需要 javascript,我有一个适用于固定大小容器的简单解决方案。如果大小可以动态变化,则需要重新计算(并且应该首先重置内联样式)。

在 Chrome 51、FF 47、IE 11 和 Opera 12 中正常工作。

var divs = document.querySelectorAll("div");

for (var q=0; q<divs.length; ++q) {
  //divs[q].style.width = ""; // Reset old value if refreshing
  divs[q].style.width = divs[q].scrollWidth + 'px';
}
div {
  height: 10em;
  border: 1px solid red;
  display: inline-block;
  vertical-align: top;

  -moz-column-width: 10em;
  column-width: 10em;
  -moz-column-fill: auto;
  column-fill: auto;
  
  /* chrome to firefox */
  width: -webkit-min-content;
  width: min-content;
  min-width: 10em;
}
<div>
  <p>Lorem ipsum dolor sit amet, an nec posse homero accumsan. Pro sale deseruisse ad. Vix cu integre fuisset insolens. Quo perfecto pericula ex. Te nam tritani honestatis, eam integre virtute ut.</p>
  <p>Cum an autem affert laoreet, ea ius falli impedit ocurreret. No duo aperiam perfecto lobortis, ut mea aliquid graecis, te has facete sententiae. Ut singulis laboramus his, meis laoreet docendi ius ad. Duo nisl alterum perfecto no, eum in etiam laboramus prodesset, rebum nobis nusquam in sit. Usu at expetendis consectetuer.</p>
</div>
<div>
  <p>Lorem ipsum dolor sit amet, an nec posse homero accumsan. Pro sale deseruisse ad. Vix cu integre fuisset insolens. Quo perfecto pericula ex. Te nam tritani honestatis, eam integre virtute ut.</p>
</div>
<div>
  <p>Lorem ipsum dolor sit amet, an nec posse homero accumsan.</p>
</div>
<div>
  <p>Lorem ipsum</p>
</div>

关于html - 使带有列的内联 block 具有正确的宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38598799/

相关文章:

javascript - 如何通过单击网站中的链接在 Adob​​e Reader 中打开 PDF?

html - 使用 CSS 将文本添加到顶部栏

css - 悬停在父元素上时在子元素上应用 CSS?

javascript - 为什么 document.getElementById(id).contentWindow 不适用于 Chrome 中的本地 htm 文件?

javascript - console.log 和 JSON.parse 返回错误

javascript - jQuery html() 方法像 innerHTML 一样存在安全风险?

html - 从底部到顶部堆叠多个 div

javascript - 悬停样式应在多级菜单动态加载时保持 onclick

javascript - 在动画侧边栏中隐藏子菜单

javascript - 如何覆盖/扩展 Chrome 的 JavaScript 中的 ReferenceError?