当文本换行到两行时,块元素采用全宽

Posted

技术标签:

【中文标题】当文本换行到两行时,块元素采用全宽【英文标题】:Block elements take full width when text wraps on to two lines 【发布时间】:2013-06-17 15:34:11 【问题描述】:

我基本上只是对此感到好奇,因为我经常看到它,而且我与之交谈过的人似乎都不知道是否有解决方案。

通常当我遇到这个时,它是一个看起来很漂亮的 <a> 按钮,上面有背景,是显示块或内联块。

问题是这样的:假设您在一个具有特定宽度的 div 中有一个按钮,比如说 160px,并且您有一个显示块或内联块 <a>,如果 @987654325 内的文本@ 不能全部放在一行上,它会像您期望的那样换成两行,但现在它在两行上,它不再需要占据 div 的整个宽度,但它确实如此!

我对发生这种情况并不感到惊讶,但我想知道是否有人知道可以解决此问题的 CSS 甚至 javascript 解决方案?

代码:

<div style="width: 160px; padding: 10px; background: blue;">
  <a href="#" style="background: red; display: block;">Test with a longwrappingword</a>
</div>

JSFiddle here

【问题讨论】:

【参考方案1】:

这是你的意思吗?我为锚点添加了宽度属性。

<div style="width: 160px; padding: 10px; background: blue;">
  <a href="#" style="background: red; display: block; width: 100px;">Test with a longwrappingword</a>
</div>

【讨论】:

这确实有效,但我希望它是动态的,因此它适用于任何长度的文本。【参考方案2】:

这是你的意思吗?

http://jsfiddle.net/UPxZm/

<div style="width: 160px; padding: 10px; background: blue;">
  <a id="block" href="#" style="background: red; display: block;">Test with a longwrappingword</a>
</div>

<script>
var $block = $('#block');
var orig = $block.html();
var index = orig.lastIndexOf(' ') || -1;
var longword = orig.substring(index + 1, orig.length);

$block.html(orig + longword);
var wanted_width = $block[0].scrollWidth / 2;
$block.html(orig);
$block.width(wanted_width);
</script>

【讨论】:

远非理想,必须有不那么笨拙的方法,但没有 javascript 我不这么认为【参考方案3】:

this 适合你吗?

<div style="width: 160px; padding: 10px; background: blue;">
  <a href="#" style="background: red; display: table; width: 1%">Test with a longwrappingword</a>
</div>
<span style="padding-left:130px">^ Where the element COULD end if it wanted to</span>

【讨论】:

虽然它仍然不完美,但它会导致文本在不需要时分成两行奇怪。就像周围的 div 更宽或没有定义宽度一样。 Example

以上是关于当文本换行到两行时,块元素采用全宽的主要内容,如果未能解决你的问题,请参考以下文章

内联块元素换行时的CSS,父包装器不适合新宽度

垂直和水平居中方法小结

BlackBerry Browser:奇怪的文本换行行为

水平居中总结

获取 flexbox 列换行以使用全宽并最小化高度

行内元素 块级元素 行内块级元素