【问题标题】:How to give an empty/whitespace inline block element the height of its container's line height?如何为空/空白行内块元素提供其容器行高的高度?
【发布时间】:2015-08-12 00:10:18
【问题描述】:

Inline-block 元素默认为其容器行高的高度 - 当它们有内容时。我发现空的和只有空格的内联块元素默认为 height:0 (这是在 Firefox 上)。

有没有一种方法可以使空的内联块元素的容器行高的高度与包含文本的内联块元素相同?

对高度进行硬编码不是一种选择,添加像  这样的随机 HTML 也不能使元素不“空”。我一直在寻找重复的内容,但很惊讶没有找到。

例如,在这个演示中,我希望第一个跨度(围绕常规空间)显示第二个跨度(围绕 )的显示方式:

.inlineblock {
  display: inline-block;
  border: 2px solid #FF0000;
}
Lorem ipsum dolor sit amet, consectetur<span class="inlineblock"> </span>adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur<span class="inlineblock"> </span>sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

...而不是现在的样子,就是这样,第一个跨度高度:0:


我试过:给它一个固定的宽度,height: auto;height: inherit;,垂直对齐,给它一个位置:相对段落和/或内联块容器然后@987654332 @,但没有成功。

.inlineblock {
  display: inline-block;
  border: 2px solid #FF0000;
}
.width {
  width: 5px;
} 
.percent {
  height: 100%;
}
.relative {
  position: relative;
}
.vert {
  vertical-align: top;
}
.auto {
  height: auto;
}
.inherit {
  height: inherit;
}
<p class="relative">Lorem ipsum dolor sit amet, consectetur<span class="inlineblock"> </span>adipiscing elit, sed do<span class="inlineblock percent"> </span>eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation<span class="relative"><span class="inlineblock percent"> </span></span>ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in<span class="inlineblock vert"> </span>voluptate velit esse<span class="inlineblock inherit"> </span>cillum dolore<span class="inlineblock auto"> </span>eu fugiat<span class="inlineblock width"> </span>nulla pariatur. Excepteur<span class="inlineblock"> </span>sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum</p>

【问题讨论】:

  • 只是为了确保我理解,通过“硬编码不是一个选项”,你的意思是你不能向跨度添加 1em 的高度(这使得它与默认字符高度相同) )?
  • 因为它确实有效:jsfiddle.net/Doug021786/vjbaeu21
  • @Douglas 但是在明确设置字体大小时效果不佳:jsfiddle.net/wggpvb2g/1.
  • 啊好吧,好点@cdMinix
  • @Douglas 是对的。只要高度设置为 1em,即使父级的 font-size 不同,它也能正常工作。这个问题的原因是空的inline-blocks 被当作内联处理。没有padding 也没有字符来设置font-sizeline-height。因此它们只是在没有widthheight 的情况下崩溃。给它一个height (1em),给它一些padding,也给它一个vertical-align。见这里:jsfiddle.net/abhitalks/wggpvb2g/2

标签: css


【解决方案1】:

正如@Douglas 评论和演示的那样,如果您想避免内容,请使用 1em 的高度。 em 将相对于父级,因此可以很好地与父级的font-size 扩展。

根据此处的参考:http://www.w3.org/TR/css3-values/#font-relative-lengths

...字体相对长度指的是元素的字体度量 它们被使用。例外情况是当它们出现在 “font-size”属性本身,在这种情况下,它们指的是 计算父元素的字体度量..

在您的情况下,跨度没有明确定义 font-size 因此它们从父级继承它。 1em 的高度现在将与其继承的字体大小相关。

问题的原因是空的inline-blocks 被视为内联。没有填充和内容来设置font-sizeline-height。因此它们只是在没有widthheight 的情况下崩溃。给它一个height(1em),给它一些padding(如果需要),也给它一个vertical-align

小提琴示例:jsfiddle.net/abhitalks/wggpvb2g/2

示例片段

p:first-of-type { font-size: 11px; }
.inlineblock {
  display: inline-block;
  border: 2px solid #f00;
  vertical-align: middle;
  padding: 2px; height: 1em;
}
<p>Lorem ipsum dolor sit amet, consectetur<span class="inlineblock"></span>adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur<span class="inlineblock">&nbsp;</span>sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum</p>
<p>Lorem ipsum dolor sit amet, consectetur<span class="inlineblock"></span>adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur<span class="inlineblock">&nbsp;</span>sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum</p>

【讨论】:

  • 很有价值的解释,谢谢。我试图找到一个示例案例,其中依赖 height: 1em; 会遇到冲突,但它实际上看起来确实很健壮。一个轻微的建议修正:vertical-align: top; 似乎比 vertical-align: middle; - related question on vertical align quirks between inline blocks with and without content 更接近具有内容的内联块的默认行为。
  • @user568458: middle 没有问题,并且会整齐地对齐。您也可以使用bottom。选择最适合您的即可。
  • 假设line-height: 1。初始的line-height 是依赖于实现的,但是规范推荐一个介于 1 和 1.2 之间的值
  • @Oriol:嗯……是的,同意。现在在手机上,查不到。但是,这应该在 Op 的用例的限制范围内正常工作,除非它设置得太高或太低。
【解决方案2】:

以下使之成为可能,并且不依赖于 line-heightfont-size 或任何其他设置的 css 属性,但这是一个相当 hacky 的解决方案。

.inlineblock {
  display: inline-block;
}    
.inlineblock::after {
  display: inline-block;
  content: "\007C\00a0\00a0";
  border: 2px solid #FF0000;
}
Lorem ipsum dolor sit amet, consecteturadipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur&lt;span class="inlineblock"&gt; &lt;/span&gt;sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

请注意,\007C\00a0\00a0 代表 nbsp;,这是 css 可以理解的。

此解决方案创建一个新的pseudo element,而不是修改原始元素的高度,但这可能是您在不更改 html 的情况下可以获得的最接近的值。

【讨论】:

    【解决方案3】:

    你可以添加一个 inline-block 伪元素:

    .inlineblock::after {
      content: '';
      display: inline-block;
    }
    

    .inlineblock {
      display: inline-block;
      border: 2px solid #FF0000;
    }
    .inlineblock:after {
      content: '';
      display: inline-block;
    }
    Lorem ipsum dolor sit amet, consectetur&lt;span class="inlineblock"&gt; &lt;/span&gt;adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur&lt;span class="inlineblock"&gt;&amp;nbsp;&lt;/span&gt;sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

    或者,您可以插入一个普通空格并使用white-space 来防止它折叠:

    .inlineblock::after {
      content: ' ';
      white-space: pre-wrap; /* or pre */
    }
    

    .inlineblock {
      display: inline-block;
      border: 2px solid #FF0000;
    }
    .inlineblock:after {
      content: ' ';
      white-space: pre-wrap;
    }
    Lorem ipsum dolor sit amet, consectetur&lt;span class="inlineblock"&gt; &lt;/span&gt;adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur&lt;span class="inlineblock"&gt;&amp;nbsp;&lt;/span&gt;sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

    或插入zero-width space

    .inlineblock::after {
      content: '​'; /* or \00200B */
    }
    

    .inlineblock {
      display: inline-block;
      border: 2px solid #FF0000;
    }
    .inlineblock:after {
      content: '​';
    }
    Lorem ipsum dolor sit amet, consectetur&lt;span class="inlineblock"&gt; &lt;/span&gt;adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur&lt;span class="inlineblock"&gt;&amp;nbsp;&lt;/span&gt;sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-02
      • 2022-12-20
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多