线包装上的CSS宽度/最大宽度?

Sam*_*Sam 16 css

#tooltip
{ 
    position: absolute;
    width:auto;
    min-width:50px;
    max-width:250px;
    padding:10px;
    background-color:#eee;
    border:1px solid #aaa;
}
Run Code Online (Sandbox Code Playgroud)

基于这种风格,我希望我的工具提示缩小或增长以适应内容,低至50px或高达250px.但是,当内容换行到下一行时,max-width属性似乎超出了我的width属性.当句子末尾的单词很长时,它看起来像留下了一堆填充(见截图),这是一种美学的东西.这是正常的行为吗?

在此输入图像描述

Bol*_*ock 17

是的,这是正常行为.

浏览器将尝试将文本内嵌在框内,直到达到其允许的最大宽度250px,然后将任何不适合第一行的文本换行到下一行和后续行.(如果没有足够的文本来达到最大宽度,则width: auto会使框缩小以适合该文本量.)

但是,在包装它之后,该框不会再缩小以适合文本,因为文本换行不会以这种方式工作.这意味着盒子的width计算结果为250px,并且只是因为你的CSS声明它最多只能是250px.它被计算为一些较小的值,等于包装后的文本宽度,然后被覆盖max-width.

我认为你无法改变这种行为.

  • @Mikhail Batcer:是的,我在那里感到困惑(这是一个非常古老的答案,我必须重新阅读这个问题才能复习)。我*完全*想说的是,“导致框缩小以适应一定数量的文本”仅适用于没有足够的文本可以首先换行的情况。这实际上意味着根本没有进行任何包装。并且“盒子在换行后不会再次缩小以适应文本”仅在确实发生换行时适用,因为盒子受到最大宽度的约束。所以,你是对的,两者都不可能是真的——因为它们是相互排斥的。 (2认同)

mfl*_*ehr 7

您将需要一些 JavaScript 才能获得所需的结果。

创建一个 Range 对象来测量内容的大小。相应地设置容器的宽度。

const range = document.createRange();
const p = document.getElementById('good');
const text = p.childNodes[0];
range.setStartBefore(text);
range.setEndAfter(text);

const clientRect = range.getBoundingClientRect();
p.style.width = `${clientRect.width}px`;
Run Code Online (Sandbox Code Playgroud)
p {
  max-width: 250px;
  padding: 10px;
  background-color: #eee;
  border: 1px solid #aaa;
}

#bad {
  background-color: #fbb;
}
Run Code Online (Sandbox Code Playgroud)
<p id="bad">This box has a max width but also_too_much_padding.</p>
<p id="good">This box has a max width and the_right_amount_of_padding.</p>
Run Code Online (Sandbox Code Playgroud)


小智 5

尝试使用其中之一:

width: max-content;
width: min-content;
width: available;
width: fit-content;
Run Code Online (Sandbox Code Playgroud)

它们不是 100% 兼容,但前缀或多或少解决了这个问题。

来源: https: //developer.mozilla.org/docs/Web/CSS/width

  • 设置 `width: max-content` 和 `max-width: XPx` 解决了我的问题 (3认同)