How do I remove the space between inline-block elements?
这给了HTML和CSS。 P / < >
1 2 3 4 5 | span { display:inline-block; width:100px; background-color:palevioletred; } |
1 2 3 4 5 6 | <p> <span> Foo </span> <span> Bar </span> </p> |
P / < >
作为一个结果,将有4,天窗;像素宽的空间之间的激情的元素。 P / < >
演示:/ / / / dghfv jsfiddle.net P / < >
我明白为什么这happens,我也知道,我能让你摆脱空间的removing白空间之间的跨度元素在HTML源代码,像这样: P / < >
1 2 3 4 5 | <p> <span> Foo </span><span> Bar </span> </p> |
然而,我希望为CSS的解决办法这不能被require HTML源代码到你的tampered与。 P / < >
我知道如何到不能解决这个与javascript - by removing的正文nodes从集装箱元(款),像这样: P / < >
1 2 | // jQuery $('p').contents().filter(function() { return this.nodeType === 3; }).remove(); |
演示:/ / / / / 1 dghfv jsfiddle.net P / < >
但这个问题可以在solved与CSS独立吗? P / < >
因为这个答案已经很流行了,所以我正在改写它。
让我们不要忘记问的实际问题:
How to remove the space between inline-block elements? I was hoping
for a CSS solution that doesn't require the HTML source code to be
tampered with. Can this issue be solved with CSS alone?
仅使用CSS就可以解决这个问题,但是没有完全健壮的CSS修复。
我在最初的回答中得到的解决方案是将
http://jsfidle.net/thirtydot/dghfv/1361/
这适用于所有现代浏览器的最新版本。它在IE8中工作。它在Safari 5中不起作用,但在Safari 6中起作用。Safari 5几乎是一个死浏览器(0.33%,2015年8月)。
相对字体大小的大多数可能问题都不难解决。
但是,如果你特别需要一个仅限于CSS的修复程序,这是一个合理的解决方案,但是如果你可以自由地更改HTML(就像我们大多数人一样),我并不推荐这样做。
这就是我作为一个经验丰富的Web开发人员为解决这个问题所做的实际工作:
1 2 3 4 5 | <p> <span>Foo</span><span>Bar</span> </p> |
是的,没错。我删除了内联块元素之间HTML中的空白。
这很容易。这很简单。它无处不在。这是务实的解决方案。
有时您需要仔细考虑空白的来源。用javascript附加另一个元素会增加空白吗?不,如果你做得好就不行。
让我们用一些新的HTML,用不同的方法来消除空白,开始一段神奇的旅程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <ul> <li> Item 1 </li> <li> Item 2 </li> <li> Item 3 </li> </ul> |
你可以这样做,就像我通常做的那样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<ul>
<li>
Item 1
</li>
<li>
Item 2
</li>
<li>
Item 3
</li>
</ul>http://jsfidle.net/thirtydot/dghfv/1362/
或者,这个:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<ul>
<li>
Item 1</li
>
<li>
Item 2</li
>
<li>
Item 3
</li>
</ul>或者,使用注释:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<ul>
<li>
Item 1
</li>
<!--
-->
<li>
Item 2
</li>
<!--
-->
<li>
Item 3
</li>
</ul>或者,如果您使用的是PHP或类似软件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<ul>
<li>
Item 1
</li>
<?
?>
<li>
Item 2
</li>
<?
?>
<li>
Item 3
</li>
</ul>或者,您甚至可以完全跳过某些结束标记(所有浏览器都可以这样做):
1
2
3
4
5
6
7
8
9
10
11
12
13<ul>
<li>
Item 1
<li>
Item 2
<li>
Item 3
</ul>
既然我已经走了,用"一千种不同的方法在30点前消除空白",让你烦死了,希望你已经忘记了关于
或者,您现在可以使用flexbox来实现以前可能使用的内联块的许多布局:https://css-tricks.com/snippets/css/a-guide-to-flexbox/
对于符合CSS3的浏览器,有
参见:http://www.w3.org/tr/2010/wd-css3-text-20101005/空白折叠
好吧,尽管我已经否决了
实际上,没有一个没有强烈副作用的解决方案。
然后我决定从我的
1 2 3 4 | I'm an inline-block div I'm an inline-block div |
对此
1 2 3 | I'm an inline-block div I'm an inline-block div |
这很难看,但很有效。
但是,等一下…如果我在
例如:
1 2 3 4 5 6 7 8 9 10 11 | <s:iterator begin="0" end="6" status="ctrDay"> <br/> <s:iterator begin="0" end="23" status="ctrHour"> <s:push value="%{days[#ctrDay.index].hours[#ctrHour.index]}"> I'm an inline-block div in a matrix (Do something here with the pushed object...) </s:push> </s:iterator> </s:iterator> |
把这些东西放在一行是绝对不可能的,这意味着
10那是不可读的,难以理解的,等等…
我发现的解决方案是:
use HTML comments to connect the end of one div to the begin of the next one!
1 2 3 4 5 6 7 8 9 10 11 | <s:iterator begin="0" end="6" status="ctrDay"> <br/> <s:iterator begin="0" end="23" status="ctrHour"><!-- --><s:push value="%{days[#ctrDay.index].hours[#ctrHour.index]}"><!-- --> I'm an inline-block div in a matrix (Do something here with the pushed object...) <!-- --></s:push><!-- --></s:iterator> </s:iterator> |
这样,您将拥有一个可读且正确缩进的代码。
而且,作为一个积极的副作用,
让我们举第一个例子。在我看来,这是:
1 2 3 4 | I'm an inline-block div <!-- --> I'm an inline-block div |
比这更好:
1 2 3 | I'm an inline-block div I'm an inline-block div |
在元素之间添加注释以不留空格。对我来说,这比将字体大小重置为零然后重新设置要容易得多。
1 2 3 4 | Element 1 <!-- --> Element 2 |
使用柔性箱
它非常棒,解决了所有这些内联块布局的问题,截至2017年,它有98%的浏览器支持(如果你不关心旧的IES的话,更多的支持)。
- 我们准备好使用flexbox了吗?
- 使用CSS flexible box-Web Developer Guide MDN
- flexbox css技巧完整指南
- flexy box-css flexbox playground和代码生成工具
这与我在相关部分给出的答案相同:display:inline block-那是什么空间?
实际上,有一种非常简单的方法可以从内联块中删除空白,既简单又具有语义性。它被称为具有零宽度空格的自定义字体,它允许您使用非常小的字体在字体级别折叠空白(由浏览器为单独行上的内嵌元素添加)。一旦您声明了字体,您只需更改容器上的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | @font-face{ font-family: 'NoSpace'; src: url('../Fonts/zerowidthspaces.eot'); src: url('../Fonts/zerowidthspaces.eot?#iefix') format('embedded-opentype'), url('../Fonts/zerowidthspaces.woff') format('woff'), url('../Fonts/zerowidthspaces.ttf') format('truetype'), url('../Fonts/zerowidthspaces.svg#NoSpace') format('svg'); } body { font-face: 'OpenSans', sans-serif; } .inline-container { font-face: 'NoSpace'; } .inline-container > * { display: inline-block; font-face: 'OpenSans', sans-serif; } |
适合口味。下面是一个下载到我刚刚在FONT Forge中创建并用fontsquirrelWebFONT生成器转换的字体。我花了5分钟。css
将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | p { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; } span { float: left; display: inline-block; width: 100px; background: blue; font-size: 30px; color: white; text-align: center; } |
1 2 3 4 5 6 | <p> <span> Foo </span> <span> Bar </span> </p> |
简化版??
1 2 3 4 5 6 7 8 9 10 11 | p { display: flex; } span { width: 100px; background: tomato; font-size: 30px; color: white; text-align: center; } |
1 2 3 4 5 6 | <p> <span> Foo </span> <span> Bar </span> </p> |
基于CSS文本模块级别3的另外两个选项(而不是从规范草案中删除的
word-spacing: -100%;
从理论上讲,它应该做所需的——缩短空白区在"单词"之间加上空格字符宽度的100%,即零。但似乎在任何地方都不起作用,不幸的是,这功能标记为"有风险"(也可以从规范中删除)。
word-spacing: -1ch;
它将字间距缩短为数字"0"的宽度。在单空间字体中,它应该完全等于空格字符(以及任何其他字符)的宽度。它适用于Firefox 10+、Chrome 27+,几乎适用于Internet Explorer 9+。
小提琴
不幸的是,现在是2019年,
同时,给父元素
使用flexbox并对旧浏览器执行回退(根据上面的建议):
1 2 3 4 5 6 7 | ul { display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; } |
字体大小:0;管理起来可能有点棘手…
我认为以下几行比任何其他方法都好得多,更可重用,并且节省时间。我个人使用:
1 2 3 4 5 6 7 8 | .inline-block-wrapper>.inline-block-wrapper, .inline-block-wrapper{letter-spacing: -4px;} .inline-block-wrapper>*{letter-spacing: 0;display: inline-block;} /* OR better shorter name...*/ .items>.items, .items{letter-spacing: -4px;} .items>*{letter-spacing: 0;display: inline-block;} |
然后你可以使用它如下…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <ul class="items"> <li> Item 1 </li> <li> Item 2 </li> <li> Item 3 </li> </ul> |
据我所知(我可能错了),但所有浏览器都支持这种方法。
说明:
这是可行的(也许-3px可能更好),正如你预期的那样。
- 复制并粘贴代码(一次)
- 然后在HTML上,只需在每个内联块的父级上使用
class="items" 。
您将不需要返回到CSS,并为新的内联块添加另一个CSS规则。
同时解决两个问题。
还要注意
http://jsfiddle.net/fd5u3/
注意:当包装器有子包装器时,我已经修改了以适应继承字母间距。
不过,从技术上讲,这并不是问题的答案:"如何删除内联块元素之间的空间?"
您可以尝试使用flexbox解决方案并应用下面的代码,空间将被删除。
1 2 3 4 | p { display: flex; flex-direction: row; } |
您可以通过以下链接了解更多信息:https://css-tricks.com/snippets/css/a-guide-to-flexbox/
简单的:
1 2 3 4 | item { display: inline-block; margin-right: -0.25em; } |
不需要触摸父元素。
此处唯一的条件是:不能定义项的字体大小(必须等于父项的字体大小)。
W3Schools-字间距属性
一般来说,我们在不同的行中使用类似的元素,但在
标签位于不同行的示例:
1 2 3 4 | p span { display: inline-block; background: red; } |
1 2 3 4 5 6 | <p> <span> Foo </span> <span> Bar </span> </p> |
标签在同一行中的示例
1 2 3 4 | p span { display: inline-block; background: red; } |
1 2 3 4 5 | <p> <span> Foo </span><span> Bar </span> </p> |
另一种有效的方法是CSS作业,它使用
1 2 3 4 5 6 7 8 | p { font-size: 0; } p span { display: inline-block; background: red; font-size: 14px; } |
1 2 3 4 5 6 | <p> <span> Foo </span> <span> Bar </span> </p> |
The above methods may not work somewhere depending on the whole application, but the last method is a foolproof solution for this situation and can be used anywhere.
我现在有这个问题,从
我不太确定您是想制作两个没有间隙的蓝色跨度,还是想处理其他空白,但如果您想消除间隙:
1 2 3 4 5 6 7 8 9 10 | span { display: inline-block; width: 100px; background: blue; font-size: 30px; color: white; text-align: center; float: left; } |
完成了。
我最近一直在解决这个问题,没有将父容器
在另一个线程中,我看到一个评论提到,
不管指定的字体大小是100%、15pt还是36px,使用ems似乎都可以工作。
http://cdpn.io/dkijo
10
1 2 3 4 5 6 | <p> <span> hello </span> <span> world </span> </p> |
我认为有一个非常简单/古老的方法可以实现这一点,即使是IE 6/7,所有浏览器都支持这种方法。我们可以简单地在父元素中将
1 2 3 4 5 | body { font-size: 24px } span { border: 1px solid #b0b0c0; } /* show borders to see spacing */ .no-spacing { letter-spacing: -1em; } /* could be a large negative value */ .no-spacing > * { letter-spacing: normal; } /* => back to normal spacing */ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <p style="color:red">Wrong (default spacing): </p> <span>Item-1</span> <span>Item-2</span> <span>Item-3</span> <hr/> <p style="color:green">Correct (no-spacing): </p> <span>Item-1</span> <span>Item-2</span> <span>Item-3</span> |
使用PHP括号:
1 2 3 | ul li { display: inline-block; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <ul> <li> first </li> <? ?> <li> first </li> <? ?> <li> first </li> </ul> |
这个问题最简单的答案是补充。
CSS
1 | float: left; |
codepen链接:http://jsfidle.net/dghfv/3560/
我将对user5609829的答案进行一点扩展,因为我相信这里的其他解决方案太复杂/工作太多。将
将
CSS:
1 2 3 4 5 6 7 8 9 10 11 12 | * { box-sizing: border-box; } .row { vertical-align: top; white-space: nowrap; } .column{ float: left; display: inline-block; width: 50% // Or whatever in your case } |
HTML:
1 2 | Some stuff Some other stuff |
这是抢劫犯。
CSS文本模块级别4规范定义了一个
因此,对于您的示例,您只需编写以下内容:
1 2 3 | p { text-space-collapse: discard; } |
不幸的是,还没有任何浏览器(截至2016年9月)实现HBP答案评论中提到的这一属性。
我尝试过用
它工作!
首先,脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | var ActionBox = React.createClass({ render: function() { return( ); }, }); var ApplicationGrid = React.createClass({ render: function() { var row = []; for(var j=0; j<30; j++){ for(var i=0; i<30; i++){ row.push(<ActionBox />); } } return( {row} ); }, }); var ButtonsAndGrid = React.createClass({ render: function() { return( <ApplicationGrid /> ); }, }); var MyApp = React.createClass({ render: function() { return( Game of Life! <ButtonsAndGrid /> ); }, }); ReactDOM.render( <MyApp />, document.getElementById('GoL') ); |
然后,Sass:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | html, body height: 100% body height: 100% margin: 0 padding: 0 #mainDiv width: 80% height: 60% margin: auto padding-top: 5px padding-bottom: 5px background-color: DeepSkyBlue text-align: center border: 2px solid #381F0B border-radius: 4px margin-top: 20px #buttonsDiv width: 80% height: 60% margin: auto margin-bottom: 0px padding-top: 5px padding-bottom: 0px background-color: grey text-align: center border: 2px solid #381F0B border-radius: 4px margin-top: 20px #applicationGrid width: 65% height: 50% padding-top: 0px margin: auto font-size: 0 margin-top: 0px padding-bottom: 5px background-color: white text-align: center border: 2px solid #381F0B border-radius: 4px margin-top: 20px #actionBox width: 20px height: 20PX padding-top: 0px display: inline-block margin-top: 0px padding-bottom: 0px background-color: lightgrey text-align: center border: 2px solid grey margin-bottom: 0px |
只是为了好玩:一个简单的javascript解决方案。
1 2 3 4 5 6 7 8 9 | document.querySelectorAll('.container').forEach(clear); function clear(element) { element.childNodes.forEach(check, element); } function check(item) { if (item.nodeType === 3) this.removeChild(item); } |
1 2 3 4 5 | span { display: inline-block; width: 100px; background-color: palevioletred; } |
1 2 3 4 5 | <p class="container"> <span> Foo </span> <span> Bar </span> </p> |
有很多解决方案,比如
通常我更喜欢使用
因此,
不过,我得警告你
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | * { margin: 0; padding: 0; } a { text-decoration: none; color: inherit; cursor: auto; } .nav { width: 260px; height: 100px; background-color: pink; color: white; font-size: 20px; letter-spacing: -1em; } .nav__text { width: 90px; height: 40px; box-sizing: border-box; border: 1px solid black; line-height: 40px; background-color: yellowgreen; text-align: center; display: inline-block; letter-spacing: normal; } |
1 2 3 4 5 | <nav class="nav"> <span class="nav__text">nav1</span> <span class="nav__text">nav2</span> <span class="nav__text">nav3</span> </nav> |
如果您使用的是Chrome(测试版本66.0.3359.139)或Opera(测试版本53.0.2907.99),您可能会看到:
如果您使用的是火狐(60.0.2)、IE10或EDGE,您可能会看到:
这很有趣。所以,我检查了MDN字母间距,发现了:
length
Specifies extra inter-character space in addition to the default space between characters. Values may be negative, but there may be implementation-specific limits. User agents may not further increase or decrease the inter-character space in order to justify text.
似乎这就是原因。
在父级
1 2 3 4 5 6 7 8 9 10 11 | span { display:inline-block; width:100px; background-color:palevioletred; vertical-align:bottom; letter-spacing:0px; } p { letter-spacing:-4px; } |
1 2 3 4 5 6 | <p> <span> Foo </span> <span> Bar </span> </p> |
1 2 3 4 5 6 7 8 | [cc lang="css"]span { display:inline-block; width:50px; background:blue; font-size:30px; color:white; text-align:center; } |
1 2 3 | <p> <span>Foo</span><span>Bar</span> </p> |
< /代码>
我发现的另一种方法是将左边距应用为负值,但行的第一个元素除外。
1 2 3 4 5 6 7 8 9 10 11 12 | span { display:inline-block; width:100px; background:blue; font-size:30px; color:white; text-align:center; margin-left:-5px; } span:first-child{ margin:0px; } |
在我看来,每一个试图消除
1 2 3 4 5 6 7 8 | p { display: table; } span { width: 100px; border: 1px solid silver; /* added for visualization only*/ display: table-cell; } |
1 2 3 4 5 6 | <p> <span> Foo </span> <span> Bar </span> </p> |
使用这些技巧之一
请参见下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | body { font-family: sans-serif; font-size: 16px; } ul { list-style: none } li { background: #000; display: inline-block; padding: 4px; color: #fff; } ul.white-space-fix li { margin-right: -4px; } ul.zero-size { font-size: 0px; } ul.zero-size li { font-size: 16px; } ul.flexbox { display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; } |
10
我发现一个纯粹的CSS解决方案在所有浏览器中都非常适合我:
1 2 3 | span { display: table-cell; } |
从内联块元素中删除空格。有许多方法:
负余量
1 2 3 4 | div a { display: inline - block; margin - right: -4 px; } |
字体大小为零
1 2 3 4 5 6 | nav { font - size: 0; } nav a { font - size: 16 px; } |
跳过结束标记
1 2 3 4 5 | < ul > < li > one < li > two < li > three < /ul> |
在CSS中有一个简单的解决方案。例如:
HTML1 2 3 4 5 | <p class="parent"> <span class="children"> Foo </span> <span class="children"> Bar </span> </p> |
CSS
1 2 3 4 5 6 7 8 9 10 11 12 | .parent { letter-spacing: -.31em; *letter-spacing: normal; *word-spacing: -.43em; } .children { display: inline-block; *display: inline; zoom: 1; letter-spacing: normal; word-spacing: normal; } |
在我看来,在像em这样的项目中使用
您可以在这个链接pureCSS中检查这个框架。享受:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | .row { letter-spacing: -.31em; *letter-spacing: normal; *word-spacing: -.43em; /* For better view */ background: #f9f9f9; padding: 1em .5em; } .col { display: inline-block; *display: inline; zoom: 1; letter-spacing: normal; word-spacing: normal; /* For better view */ padding: 16px; background: #dbdbdb; border: 3px #bdbdbd solid; box-sizing: border-box; width: 25%; } |
1 2 3 4 | 1 2 3 4 |
尝试此代码段:
1 2 3 4 5 6 7 8 9 | span { display: inline-block; width: 100px; background: blue; font-size: 30px; color: white; text-align: center; margin-right: -3px; } |
工作演示:http://jsfiddle.net/dghfv/2784/
所以有很多复杂的答案。我能想到的最简单的方法就是给其中一个元素一个负的边缘(根据元素的位置,要么是