【发布时间】:2013-05-31 22:00:10
【问题描述】:
粗略地说,尝试构建一个四列布局,我得到了这个 HTML:
<div>
<div>A column</div>
<div>A column</div>
<div>A column</div>
<div>A column</div>
</div>
我有这个 CSS:
div {
background: #ccc;
}
div div {
background: #eee;
display: inline-block;
width: 25%;
}
在浏览器中渲染时(目前,我只使用 Chrome 进行测试)嵌套的 div 元素之间的空白(在本例中是由换行符引起的)被渲染,因此我的布局被丢弃了。
显然,我可以浮动我的嵌套 div...
div {
background: #ccc;
}
div div {
background: #eee;
width: 25%;
float: left;
}
但是我的容器 div 崩溃了,我不想必须使用 CSS clearfix hacks 或额外的 HTML 来打开它。
或者,我可以修改我的 HTML,以便删除空格...
<div><div>A column</div><div>A column</div><div>A column</div><div>A column</div></div>
但这使得它很难使用。打破标签以使其更具可读性的替代方法让我感觉很脏......
<div>
<div>A column</
div><div>A column</
div><div>A column</
div><div>A column</div>
</div>
我找到了 resource 或 two(我在 SO 上找不到任何东西),但我不太喜欢任何解决方案 - 它们都是解决方法,如果我必须但肯定会接受有其他选择吗?
所以我的问题... 是否有一种跨浏览器、符合 w3c、非 JavaScript、无黑客攻击、整洁的 HTML、防弹的方式来防止在使用 @987654332 时在浏览器中呈现 HTML 空白@?或者有没有可以使用且没有令人不快的副作用的 inline-block 替代方案?
编辑
假设这真的是不可能的,最好的解决方案是不需要额外的 HTML 标记和“灵活”的 CSS。换句话说,网站管理员可以正常编辑 HTML 而无需考虑破坏布局,而 CSS(被黑或其他)将适应网站管理员的修改,而无需自行修改。
我的“解决方法”
嗯,看来必须付出一些代价。在我的情况下,拥有不需要额外标记的 HTML 更为重要,因此最好的解决方案是在“只是工作”无形的 CSS hack 中工作。解决方案是浮动嵌套的 div 并添加一个 hack...
div div {
float: left;
}
div::before,
div::after {
content: "";
display: table;
}
div::after {
clear: both;
}
div {
*zoom: 1;
}
...这是我已经使用了一段时间并希望避免的修复的派生。发现此修复的简洁版本on this site。
所以现在标记中的每个 div 都已经应用了 clearfix hack,无论它是否需要它。我还没有通过应用于 all div 来了解这是否有任何不良副作用 - 我期待在出现任何问题时进行调试和修复 ;-)
【问题讨论】:
-
如果你真的想满足所有这些标准(跨浏览器、w3c 兼容、非 JavaScript、无黑客攻击、整洁的 HTML、防弹方式)——不,没有。跨度>
-
建议的解决方案,正如您在css-tricks.com/fighting-the-space-between-inline-block-elements 上建议的那样,给块一个字体大小:0 和您想要的字体大小的元素,似乎是一个很好的解决方案:没有 html 奇怪的代码等..我会用那个
-
@audre7 您要么需要在子 div 上依赖基于像素的字体大小调整——这不好,要么使用相对 EM——IE8 及更低版本不支持。 (在我看来,依靠 REM 将是这两个世界中最好的)
-
分解标签带来的肮脏感觉是我见过的最接近干净解决方案的东西。摆弄边距和字体大小可能会产生不良的副作用。删除空白没有(除了那种肮脏的感觉);)
-
@KyleSevenoaks:在他的问题中,他清楚地指出,为什么以及他不想使用浮点数和 clearfixes。
标签: css whitespace multiple-columns