CSS文本换行折叠容器

5
我正在寻找一个HTML/CSS的解决方案,以解决我们在建站过程中遇到的问题。如果需要,我可以使用基于JavaScript的解决方案,但最好是使用本地处理的方式。
我们有一些文本需要放置在指定区域内,但是如果超过可用宽度,则需要自动换行。在文本背后是带透明度的背景颜色。
当文本很短时,由于浮动,容器会折叠为文本的宽度。 当文本很长并且出现换行时,容器会以最大宽度悬停,即使其中的文本已经在下面换行,因此右侧会出现一小部分背景颜色(这对于换行的单词来说并不足够)。 我希望容器能够折叠到前一个单词的边缘,这样它就不会“看起来像”为换行的单词腾出了空间,而实际上这个空间非常接近。 HTML
<div>
    <p>Crack the Shutters Open Wide for Parkside Paradise</p>
</div>

CSS

body div {
    background-color: #AAFF3B;
    max-width:80%;
    padding:20px;
    display:inline-block;
    float:left;
}
body p {
    display:inline-block;
    background-color: #FFAA3B;
    position: relative;   
    float:left;
    white-space:pre-line;
    clear:left;
}

以下是JSFiddle链接:http://jsfiddle.net/nmuot8bm/3/ 如果您查看第三个示例,您会发现橙色框右侧有一小段填充,因为单词“porttitor”换行到新行下面,但橙色容器仍然处于最大宽度,尽管使用了float属性。如果内容编辑器引入了换行符(例如在示例4中的“vestibulum”和“porttitor”之间),则容器将正确折叠。
我认为正在发生的是文本换行前容器会增长,而浏览器在换行后不会重新计算宽度?
这是JSFiddle中我的测试用例的图片:enter image description here 这是故障的站点分离出JSFiddle之前的图片: example 2 您可以看到文本已换行,但容器没有折叠,留下了一个大的背景颜色间隙。
请注意:“text-align:justify”可以模拟此操作,但是单词之间的间距与站点上的其他文本不一致。
编辑:我看到这个问题可能是重复的。我发誓在发布之前进行了研究!
以下是相关链接: max-width adjusts to fit text? CSS Width / Max-Width on Line Wrap? Wrapping text forces containing element to max-width Shrink DIV to text that's wrapped to its max-width? 我认为普遍共识/结论是:没有使用前沿的CSS是不可能实现的,应该使用JavaScript解决方案。
我已经向JSFiddle添加了更多示例:http://jsfiddle.net/nmuot8bm/6/,其中包括来自此处的JavaScript解决方案:https://dev59.com/cVwX5IYBdhLWcg3w6S8h#33246364

正如你所提到的,CSS 无法做到这一点......这是由于内联盒模型的工作方式。 - Paulie_D
这可能与此问题相同:*CSS浮动以将包装文本收缩到所需的最小值* - Simon East
2个回答

0

CSS 无法实现...这是内联盒模型的工作方式。 JS 示例/解决方案可以在 JSFiddle 上找到。


-1
如果问题是浮动元素导致父容器崩溃,有很多解决方案;其中最简单的方法是将overflow: hiddendisplay: table添加到父级(即崩溃的元素)。此外,请注意inline-block和浮动元素本质上是多余的。

我想要的是相反的效果 - 当文本换行导致容器水平方向变大后,我想强制容器折叠,但文本却在边缘留下了空隙。 - agrath
好的,那么您需要在容器上设置max-width :) 如果您所说的“折叠”是指“一个div从950px高度开始,当容器被大屏幕拉伸时,我希望它变为650px高度”,那么您可以编写一个媒体查询。媒体查询看起来可能像该元素上的max-width:@media screen and (max-width: 1020px)或任何所需的值。 - Gina
如果你的段落文本恰巧超出了框,确保以下几点:1. 如果它浮动,父元素具有 overflow: hidden 或 display: table 2. 它和父元素具有 box-sizing: border-box 3. 它是绝对或相对定位在没有定位的父元素内吗?将定位添加到父元素(通常为 position: relative),因为默认情况下它可能是静态的。 - Gina
哦,我刚看了下你的问题,并意识到我从未回答过你的实际问题...我在Chrome浏览器上确实遇到过这个bug,但在Firefox或Safari上没有。你所说的是浏览器以不同方式呈现文本中的空格。我通常使用word-wrap:break-word或word-break:break-word来确保它每次都包裹相同,并且不会在换行符处断开。 - Gina
感谢您的协助,实际上问题相当微妙,但当文本换行因为框达到其最大宽度时,换行单词占用的空间没有被折叠。 - agrath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接