两个内联块元素,每个元素的宽度为50%,不能并排放置在一行中


87
<!DOCTYPE html>
<html>
<head>
<title>Width issue</title>
<style type="text/css">
body {
    margin: 0;
}
#left {
    width: 50%;
    background: lightblue;
    display: inline-block;
}
#right {
    width: 50%;
    background: orange;
    display: inline-block;
}
</style>
</head>
<body>
    <div id="left">Left</div>
    <div id="right">Right</div>
</body>
</html>

JSFiddle:http : //jsfiddle.net/5EcPK/

上面的代码试图将#left div和#right div并排放置在一行中。但是,正如您在上面的JSFiddle URL中所看到的,情况并非如此。

我能够解决将div之一的宽度减小到49%的问题。参见http://jsfiddle.net/mUKSC/。但这不是理想的解决方案,因为两个div之间出现很小的间隙。

我能够解决问题的另一种方法是通过同时浮动两个div。参见http://jsfiddle.net/VptQm/。这很好。

但是我最初的问题仍然存在。为什么当两个div都作为内联块元素保留时,它们却不能并排放置?

Answers:


139

使用inline-block元素时,whitespace 这些元素之间始终存在问题(该空间大约为4px宽)。

因此,您的两个divs都具有50%的宽度,加上whitespace(〜4px)的宽度大于100%,因此会损坏。您的问题的示例:


有几种方法可以解决此问题:

1.这些元素之间没有空格

2.使用HTML注释

3.将父级设置font-size0,然后为inline-block元素添加一些值

4.在它们之间使用负边距(不理想

5.落角

6.跳过某些HTML关闭标记(感谢@thirtydot作为参考


参考文献:

  1. 争取CSS技巧上的内联块元素之间的空间
  2. 删除内联块元素之间的空白by David Walsh
  3. 如何删除内联块元素之间的空间?

正如@MarcosPérezGude 所说的最好的方法是使用rem,并font-sizehtml标签上添加一些默认值(例如HTML5Boilerplate)。例:

html{
    font-size: 1em;
}

.ib-parent{             /* ib -> inline-block */
    font-size: 0;
}

.ib-child{
    display: inline-block;
    font-size: 1rem;
}

更新快到2018年了,请使用flexbox甚至更好的CSS网格布局


3
@hoosierEE没什么好说的。元素之间的间隔很好,这是因为内联块元素将定位在文本行上。如果在一行中放置空格,将有一个空格。因此,即使您认为这是一个问题(如Vucko所说的那样),该行为也是正确的。
MarcosPérezGude

2
我同意@MarcosPérezGude,此行为是正确的。从我的帖子中可以看到,有几种方法可以删除该空白(我本人使用HTML注释来删除空白)。但是,如果你介意的白色空间,您可以随时使用flexboxtable/table-row/table-cell或使用float
Vucko

2
我完美地使用了内联块。我通常的做法是parent { font-size:0; } child {font-size: 1rem; }。随着REMS现在是最容易
马科斯·佩雷斯·古德

将制表符仍解析为空格有点令人讨厌。我以前从未见过删除结束标记修复程序,这有任何不稳定或副作用吗?
MintWelsh

还要确保border已关闭。如果您要浮动div,这可以增加空间。
evolross 17-10-24

22

css3中的好答案是:

white-space: nowrap;

在父节点中,以及:

white-space: normal;
vertical-align: top;

div(或其他)的50%

范例:http//jsfiddle.net/YpTMh/19/

编辑:

还有另一种方法:

font-size: 0;

父节点并在子节点中覆盖它


7

这是因为两个div之间的空格被解释为空格。如果<div>按如下所示将标签放入行中,则问题已得到纠正

<div id="left"></div><div id="right"></div>


4

使它们阻塞而不是内联阻塞。这将使div忽略它们之间的空间。

display:block;

或删除标签之间的空间

<div id='left'></div><div id='right'></div>

或添加

margin: -1en;

到div之一以减轻单个渲染空间占用的空间。


2

请检查以下代码:

body {
    margin: 0;
}
#left {
    width: 50%;
    background: lightblue;
    display: inline-block;
    float:left;
}
#right {
    width: 50%;
    background: orange;
    display: inline-block;
    float:left;
}
<div id="left">Left</div>
<div id="right">Right</div>



1

可以通过将css display:inline添加到保存inline元素的div中来完成。

在使用带有负值的空白消除空白时,有必要将其添加到此特定元素中。将其添加到类中会影响使用该类的地方。

因此,使用display:inline;会更安全。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.