当前位置: 首页 > 知识库问答 >
问题:

如何删除内联/内联块元素之间的空格?

谷飞星
2023-03-14

给定这个HTML和CSS:

null

span {
    display:inline-block;
    width:100px;
    background-color:palevioletred;
}
<p>
    <span> Foo </span>
    <span> Bar </span>
</p>

null

因此,跨度元素之间将有4 ;像素宽的空间。

演示:http://jsfiddle.net/dghfv/

我理解为什么会发生这种情况,我也知道可以通过删除HTML源代码中SPAN元素之间的空白来消除这种空格,如下所示:

<p>
    <span> Foo </span><span> Bar </span>
</p>

然而,我希望CSS解决方案不需要篡改HTML源代码。

我知道如何用JavaScript解决这个问题--从container元素(段落)中删除文本节点,如下所示:

// jQuery
$('p').contents().filter(function() { return this.nodeType === 3; }).remove();

演示:http://jsfiddle.net/dghfv/1/

但是,这个问题能单独用CSS解决吗?

共有3个答案

霍书
2023-03-14

编辑:

今天,我们应该只使用Flexbox。

老答案:

好的,虽然我对font-size:0;Not implemented CSS3 Feature的答案都投了赞成票,但在尝试之后我发现它们都不是真正的解决方案。

实际上,没有一个没有强烈副作用的变通方法

然后,我决定从HTML源(JSP)中删除内联块div之间的空格(这是关于这个参数的答案),将其转换为:

<div class="inlineBlock">
    I'm an inline-block div
</div>
<div class="inlineBlock">
    I'm an inline-block div
</div>

对此

<div class="inlineBlock">
    I'm an inline-block div
</div><div class="inlineBlock">
    I'm an inline-block div
</div>

这很难看,但很管用。

但是,等一下。。。 如果我在taglibs循环(struts2jstl等)内生成div,该怎么办 ?

例如:

<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]}">
            <div class="inlineBlock>
                I'm an inline-block div in a matrix 
                (Do something here with the pushed object...)
           </div>
       </s:push>
    </s:iterator>
</s:iterator>

这是绝对不能想象的内联所有东西,这将意味着

<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]}"><div class="inlineBlock>
                I'm an inline-block div in a matrix             
                (Do something here with the pushed object...)
           </div></s:push></s:iterator>
</s:iterator>

难懂的,难懂的,难懂的等等。

我找到的解决办法是:

使用HTML注释将一个div的结尾连接到下一个div的开头!

<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]}"><!--
        --><div class="inlineBlock>
                I'm an inline-block div in a matrix             
                (Do something here with the pushed object...)
           </div><!--
    --></s:push><!--
--></s:iterator>
</s:iterator>

这样,您将获得一个可读的,正确缩进的代码。

而且,作为一个积极的副作用,HTML源代码虽然充斥着空注释,但将正确地缩进;

让我们举第一个例子。 依我拙见,这:

    <div class="inlineBlock">
        I'm an inline-block div
    </div><!--
 --><div class="inlineBlock">
        I'm an inline-block div
    </div>

比这更好:

    <div class="inlineBlock">
         I'm an inline-block div
    </div><div class="inlineBlock">
         I'm an inline-block div
    </div>
晏卓君
2023-03-14

对于符合CSS3的浏览器,有white-space-collapsing:discard

见:http://www.w3.org/tr/2010/wd-css3-text-20101005/#white-space-collapsing

索嘉石
2023-03-14

因为这个答案已经变得相当流行,所以我对它进行了重大的重写。

让我们不要忘记所提出的实际问题:

如何移除内联块元素之间的空格? 我希望有一个CSS解决方案,它不需要篡改HTML源代码。 这个问题能单独用CSS解决吗?

单独使用CSS解决这个问题是可能的,但是没有完全健壮的CSS修补程序。

我在最初的回答中得到的解决方案是将font-size:0添加到父元素,然后在子元素上声明一个合理的font-size

http://jsfiddle.net/thirtydot/dghfv/1361/

这在所有现代浏览器的最新版本中都是有效的。 它在IE8下工作。 它在Safari5中不起作用,但在Safari6中起作用。 Safari5几乎是一个死掉的浏览器(0.33%,2015年8月)。

与相对字体大小有关的大多数可能的问题并不复杂修复。

然而,虽然这是一个合理的解决方案,如果您特别需要一个CSS仅修复,但如果您可以自由地更改您的HTML(就像我们大多数人一样),这不是我推荐的。

这就是我,作为一个相当有经验的web开发人员,实际为解决这个问题所做的:

<p>
    <span>Foo</span><span>Bar</span>
</p>

是的,没错。 我删除了HTML中内联块元素之间的空白。

很简单。 很简单。 到处都管用。 这是务实的解决方案。

您有时确实需要仔细考虑空格的来源。 用JavaScript附加另一个元素会添加空格吗? 不,如果你做得好就不会。

让我们开始一段神奇的旅程,用一些新的HTML:

<ul>
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
</ul>

>

  • 您可以这样做,就像我通常做的那样:

    <ul>
        <li>Item 1</li><li>Item 2</li><li>Item 3</li>
    </ul>
    

    http://jsfiddle.net/thirtydot/dghfv/1362/

    或者,这个:

    <ul>
        <li>Item 1</li
        ><li>Item 2</li
        ><li>Item 3</li>
    </ul>
    

    或者,使用注释:

    <ul>
        <li>Item 1</li><!--
        --><li>Item 2</li><!--
        --><li>Item 3</li>
    </ul>
    

    或者,如果您正在使用using PHP或类似工具:

    <ul>
        <li>Item 1</li><?
        ?><li>Item 2</li><?
        ?><li>Item 3</li>
    </ul>
    

    或者,您甚至可以完全跳过某些结束标记(所有浏览器都可以这样做):

    <ul>
        <li>Item 1
        <li>Item 2
        <li>Item 3
    </ul>
    

    既然我已经去了,并且用“一千种不同的方法删除空格,由三十点”把你烦死了,希望你已经把font-size:0忘得一干二净了。

    或者,您现在可以使用flexbox来实现许多您以前使用过的内联块布局:https://css-tricks.com/snippets/css/a-guide-to-flexbox/

  •  类似资料:
    • 问题内容: 鉴于此HTML和CSS: 结果,SPAN元素之间将有4像素宽的空间。 我知道为什么会发生这种情况,而且我也知道可以通过删除HTML源代码中SPAN元素之间的空白来摆脱该空间,如下所示: 但是,我希望找到一种不需要篡改HTML源代码的CSS解决方案。 我知道如何使用JavaScript解决此问题-通过从容器元素(该段)中删除文本节点,如下所示: 但是,仅靠CSS就能解决这个问题吗? 问题

    • 问题内容: 我想要几个相邻的块元素,它们占据了整个浏览器的宽度。 使用,效果很好,但是在一个元素和另一个元素之间存在几个像素的随机空间: 没有填充,没有边距,没有边框,没有偏移。 问题答案: 那是因为inline(-block)元素之间有一个空格字符(一个换行符和一些制表符算作一个空格),可以通过这样注释该空格来解决: 实际上,这不是错误,而是内联元素的正常行为。就像将图像放置在文本行旁边,或在输

    • 问题内容: 我正在使用此CSS来格式化两列,但是我仍然在两列之间留有边距空间。我可以使用或类似的方法消除它。有没有更优雅的方法可以做到这一点,或者CSS代码有问题? 问题答案: 也许您有: ?如果是这样,那么这可能是一个空格问题(事实证明,空格在html中确实很重要)。这应该解决它:

    • 问题内容: 鉴于: 如何注释,以便XML为: 问题答案: 您可以利用注释执行以下操作。 oo 酒吧 想要查询更多的信息 http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html

    • 问题内容: 举个例子 是在HTML5有效吗? 问题答案: 是的,您编写的内容在HTML5中有效,但并非所有内联元素,我认为这只是适用于.. 参考:HTML5中的“块级”链接 提示:如果使用此设置,则to 或可能会有意外的视觉样式结果 更新: 对于“默认样式可能会导致混淆”的其他“内联代码块”组合,则“不允许”使用-说明在这里 ### 默认样式可能导致混淆的情况 某些元素具有默认样式或行为,这些默认

    • 内联命名空间旨在通过”版本”的概念,来实现库的演化。考虑如下代码: // 文件:V99.h inline namespace V99 { void f(int); // 对V98版本进行改进 void f(double); // 新特性 // … } // 文件:V98.h namespace V98 { void

    • 问题内容: 鉴于此HTML: 如何使它们像这样显示内联: foo bar baz 不像这样: foo bar baz 问题答案: 那是另一回事:

    • 问题内容: 我的问题很简单: 为什么在Firefox中,内联元素的边距顶部被忽略? 有人知道吗? 问题答案: 这不仅限于Firefox,而且在CSS 2.1规范中进行了定义: ### 8.3边距属性:“ margin-top”,“ margin-right”,“ margin-bottom”,“ margin-left”和“margin” 边距属性指定框的边距区域的宽度。’margin’速记属性设