【问题标题】:Why is there an unexplainable gap between these inline-block div elements? [duplicate]为什么这些 inline-block div 元素之间存在无法解释的差距? [复制]
【发布时间】:2013-10-03 01:04:43
【问题描述】:

我有两个 inline-block div 元素,它们是相同的,彼此相邻。然而,尽管边距设置为 0,但两个 div 之间似乎有一个 4 像素的神秘空间。没有影响它们的父 div - 这是怎么回事?

CSS

#container
{
    display:inline-block;
    position:relative;
    background:rgb(255,100,0);
    margin:0px;
    width:40%;
    height:100px;
}

这就是我想要的样子:

【问题讨论】:

  • 有一个更简单的答案,但这太老了,我要评论了。不要使用 inline-block 将它们并排放置,只需使用 float: left 并将它们的容器居中即可。我的测试没有差距。

标签: html css margin padding


【解决方案1】:

最简单的解决方法是只float 容器。 (例如float: left;)另一方面,每个id 应该是唯一的,这意味着您不能在同一个HTML 文档中使用相同的id 两次。您应该改用类,您可以将相同的class 用于多个元素。

.container {
    position: relative;
    background: rgb(255, 100, 0);
    margin: 0;
    width: 40%;
    height: 100px;
    float: left;
}

【讨论】:

  • 虽然这确实有效(thakyou),但它会在我的页面布局中引起其他问题,我可能目前还没有经验来解决
  • 通过添加float 属性,您可以强制元素充当块元素,因此display: inline-block 不适用。
【解决方案2】:

你需要添加

#container
{
    display:inline-block;
    position:relative;
    background:rgb(255,100,0);
    margin:0px;
    width:40%;
    height:100px;
    margin-right:-4px;
}

因为每当你写display:inline-block 时,它都需要一个额外的margin-right:4px。所以,你需要删除它。

【讨论】:

    【解决方案3】:

    使用inline-block 允许在您的 HTML 中使用空格,这通常等于 .25em(或 4px)。

    您可以注释掉空格,或者更常见的解决方案是将父级的 font-size 设置为 0 并将其重置为内联块元素上所需的大小。

    【讨论】:

    • 这是一个我从未想过的酷解决方案,但不幸的是打破了字体大小的正常 CSS 继承:/
    • @colllin 是的,确实如此……但您只需要注意它。 Inline-block 和 float 都有它们的“陷阱”……如何解决它们是一个选择问题。字体解决方案是一种选择,但不是唯一的选择。
    • 当然,但减少我“必须注意”的事情总是一件好事,保护自己在 6 个月内不意外破坏某些东西也是如此。
    • @Pauli_D 您还可以在元素之间放置 cmets,因为它们不仅会删除文档中的空格,还会删除网站上的空格。当你拥有大量元素时,它有点难看和痛苦。
    • 谢谢,我很清楚处理inline-block的各种方法……这只是两年前的一种
    【解决方案4】:

    找到了一个不涉及 Flex 的解决方案,因为 Flex 在旧版浏览器中不起作用。 示例:

    .container {
        display:block;
        position:relative;
        height:150px;
        width:1024px;
        margin:0 auto;
        padding:0px;
        border:0px;
        background:#ececec;
        margin-bottom:10px;
        text-align:justify;
        box-sizing:border-box;
        white-space:nowrap;
        font-size:0pt;
        letter-spacing:-1em;
    }
    
    .cols {
        display:inline-block;
        position:relative;
        width:32%;
        height:100%;
        margin:0 auto;
        margin-right:2%;
        border:0px;
        background:lightgreen;  
        box-sizing:border-box;
        padding:10px;
        font-size:10pt;
        letter-spacing:normal;
    }
    
    .cols:last-child {
        margin-right:0;
    }
    

    【讨论】:

      【解决方案5】:

      只需添加边框:2px solid #e60000;到您的第二个 div 标签 CSS。

      确实有效

      #Div2Id {
          border: 2px solid #e60000; --> color is your preference
      }
      

      【讨论】:

        【解决方案6】:

        在这种情况下,您的 div 元素已从 block 级别元素更改为 inline 元素。 inline 元素的一个典型特征是它们尊重标记中的空白。这就解释了为什么元素之间会产生 间隙(example)

        有一些解决方案可以用来解决这个问题。

        方法 1 - 从标记中删除空格

        示例 1 - 将空格注释掉:(example)

        <div>text</div><!--
        --><div>text</div><!--
        --><div>text</div><!--
        --><div>text</div><!--
        --><div>text</div>
        

        示例 2 - 删除换行符:(example)

        <div>text</div><div>text</div><div>text</div><div>text</div><div>text</div>
        

        示例 3 - 在下一行关闭部分标记 (example)

        <div>text</div
        ><div>text</div
        ><div>text</div
        ><div>text</div
        ><div>text</div>
        

        示例 4 - 关闭下一行的整个标签:(example)

        <div>text
        </div><div>text
        </div><div>text
        </div><div>text
        </div><div>text
        </div>
        

        方法 2 - 重置font-size

        由于inline 元素之间的空格由font-size 确定,您可以简单地将font-size 重置为0,从而删除元素之间的空格。

        只需在父元素上设置font-size: 0,然后为子元素声明一个新的font-size。这有效,如此处所示(example)

        #parent {
            font-size: 0;
        }
        
        #child {
            font-size: 16px;
        }
        

        这种方法效果很好,因为它不需要更改标记;但是,如果子元素的 font-size 是使用 em 单位声明的,则它不起作用。因此,我建议从标记中删除空格,或者floating the elements,从而避免inline 元素生成的空间。

        方法 3 - 将父元素设置为display: flex

        在某些情况下,您还可以将父元素的display 设置为flex(example)

        这有效地删除了supported browsers 中元素之间的空格。不要忘记添加适当的供应商前缀以获得额外支持。

        .parent {
            display: flex;
        }
        .parent > div {
            display: inline-block;
            padding: 1em;
            border: 2px solid #f00;
        }
        

        .parent {
            display: flex;
        }
        .parent > div {
            display: inline-block;
            padding: 1em;
            border: 2px solid #f00;
        }
        <div class="parent">
            <div>text</div>
            <div>text</div>
            <div>text</div>
            <div>text</div>
            <div>text</div>
        </div>

        旁注:

        使用负边距来删除inline 元素之间的空间是非常不可靠的。如果有其他更优化的解决方案,请不要使用负边距。

        【讨论】:

        • 好吧,我想我可以用负边距来修补它 - 谢谢 :) 但是我不知道什么或如何摆脱空白 - 啊我研究一下
        • 由于没有人真正费心解释为什么会发生这种情况......内联(和内联块)元素尊重标记中的空白,所以你所看到的本质上是标记中“单词”之间的空格字符。这就是为什么设置一个负数 word-spacing 也可以“解决”这个问题,尽管负字间距和负边距是无效的解决方案,因为间距取决于您的浏览器和您的字体大小(如 Josh 的最后一个示例所示),所以它是如果您进行任何更改,将是第一个破坏的东西。
        • 当你花 20 分钟调试你的 CSS 的那一刻,却发现 Chrome 被放大到 110% 并且根本没有任何差距。
        • 我会说display: flex 是当今最好的解决方案。
        • font-size 是唯一一个对我有用的两个inline-block 元素之间的额外垂直空间(这是text-align: center 它们在另一个div 中的方式)。 flex 完全搞砸了布局
        猜你喜欢
        • 1970-01-01
        • 2012-01-24
        • 2016-03-15
        • 2012-03-05
        • 1970-01-01
        • 2013-05-20
        • 2017-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多