css 绝对定位元素上的nowrap和max-width的问题

lvmkulzt  于 2023-04-13  发布在  其他
关注(0)|答案(7)|浏览(195)

我猜这两个属性实际上并不起作用,但我的情况是:
我正在尝试创建一个工具提示组件。我的工具提示是绝对定位的,因为我不知道内容的长度是多少,所以没有宽度。所以使用宽度相关的css,文本只是形成一个又高又瘦的列。我尝试了max-width,但它本身没有任何作用。所以我决定尝试white-space: nowrap,虽然它很好地没有 Package 文本,它似乎也没有以一种有用的方式荣誉max-width,文本反而超出了元素的边界。
我想不出如何解决我的问题,如果有一个干净的解决方案。我想有一个绝对定位的div,扩大到适合它的内容,直到最大值,在这一点上它 Package 。我看到的一个建议是使元素的flexbox,但从我可以告诉,这不是伟大的IE,所以我不认为是可行的,在我的情况。任何建议?

.wrapper {
  position: relative;
  display: inline;
}

.info {
  position: absolute;
  bottom: 1.2em;
  left: 0;
}
<div class="wrapper">
  <span>[ ? ]</span>
  <div class="info">Any long text can go in here to test what goes wrong with wrapping.</div>
</div>
uemypmqf

uemypmqf1#

避免使用white-space:nowrap,因为这会将文本限制在一行。max-width应该与具有display absolute的块级元素一起工作,而不是在inline元素中。为了解决这个问题,我将工具提示放在 Package 器块之外,并使用javascript将其定位在鼠标位置。
这里有一个简单的解决方案。点击“打开工具提示”以显示工具提示,然后移动滑块以更改max-width的值。

showContext = function() {
    var e = window.event;

    var posX = e.clientX;
    var posY = e.clientY;
    var info = document.getElementById("info");
    info.style.top = posY + "px";
    info.style.left = posX + "px";
    info.style.display = "block";
}

changeWidth = function(value) {
		var info = document.getElementById("info");
    info.style.maxWidth = value + "px";
}
.wrapper {
    position: relative;
}

.info {
    position: absolute;
    max-width:300px;
    display:none;
    border:1px solid black;
    background-color:white;
}

.range {
  margin:10px 0px 10px 0px;
  display:block;
}
<div class="wrapper">
    max-width slider
    <input id="range" class="range" type="range" min="100" max="600" oninput="changeWidth(this.value)"/>
    <input type="button" value="open tooltip" onclick="javascript:showContext();" />
</div>
<div id="info" class="info">Any long text can go in here to test what goes wrong with wrapping.</div>
niwlg2el

niwlg2el2#

我不太确定你的目标是什么,因为有很多矛盾的事情正在发生。但我会尝试,希望你能引导我走向你想要的解决方案:
https://jsfiddle.net/q7dyf6xh/

.wrapper {
    position: relative;
    display: run-in;
}

.info {
    position: absolute;
    max-width: 200px;
    white-space: pre-line;
}

看看这个小提琴,你可以看到工具提示现在有一个最大宽度。看看我在使用什么:
display: run-in;:根据上下文将元素显示为块或内嵌
white-space: pre-line;:空格序列将折叠成单个空格。必要时文本将换行,并在换行符处换行

为了更好地理解事情是如何工作的,请看这里:
空白:如果使用nowrap,文本将永远不会换行到下一行。文本将继续在同一行,直到遇到标记!

这表示你的max-width仍然可以工作,但是使用nowrap你现在 overflow 了你的元素。尝试给予你的元素一个background-color,你会发现它实际上只有你的max-width定义的那么宽。
看看它是如何溢出元素的:https://jsfiddle.net/fcnh1qeo/
现在宽度overflow: hidden只有你的框内的文本将被显示。其他一切都被切断!看这里:https://jsfiddle.net/0qn4wxkg/
我现在使用的是display: run-in;white-space: pre-line;以及max-width: 200px,希望它们能给予您提供所需的解决方案。不知道您使用它的上下文和代码与其说是答案,不如说是猜测。但也许我可以指导您找到适合您需求的解决方案
干杯!

xriantvc

xriantvc3#

添加min-width:100%white-space: nowrap;

.wrapper {
  position: relative;
  display: inline;
}
 
.info {
  position: absolute;
  min-width: 100%;
  white-space: nowrap;
}
<div class="wrapper">
    <span>[ ? ]</span>
    <div class="info">Any long text can go in here to test what goes wrong with wrapping.</div>
</div>
mbzjlibv

mbzjlibv4#

display="runin"元素生成一个插入框。插入元素的作用类似于内联或块,具体取决于周围的元素。即:如果插入框包含一个块框,则与block相同。如果插入框后面有一个块框,则插入框成为块框的第一个行内框。如果后面有一个行内框,则插入框成为块框。
pre-line折叠空格序列。行在换行符处、<br>处断开,并根据需要填充行框。下表总结了各种white-space值的行为:
max-width CSS属性设置元素的最大宽度。它防止使用的width属性值大于max-width.指定的值

.wrapper {
  position: relative;
  display: run-in;
  top: 100px;
 }

.info {
 position: absolute;
 bottom: 1.2em;
 left: 0;
 max-width: 200px;
 white-space: pre-line;
 background-color: #ddd;

}

yqkkidmi

yqkkidmi5#

并不是说我自己也有一个非常类似的问题。我用flexbox修复了它,这已经在这里的评论中建议了。
我的代码看起来像这样:

.has-tooltip {
  display: inline-flex; align-items: flex-start
}

.has-tooltip > .tooltip {
  padding: 1em;
  max-width: 300px;
  background: #bdc3c7;
  word-wrap: break-word;
  transform: translate(-50%,-110%)
}

我也把它复制到了this fiddle中,以防你想看看。

wgx48brx

wgx48brx6#

你是对的,这不起作用。
这里有一个解决方案,如果你被允许使用BR标签。我已经工作了很多次的工具提示,这是最好的解决方案,我有。
Codepen:https://codepen.io/btn-ninja/pen/JNJrgp
它的工作原理是使用css翻译的空白nowrap:

<button type="button" class="btn btn-block hasTooltip">
  Tooltip on top
  <i class="tip">Most tooltips are short<br>but you can add line breaks.</i>
</button>

<button type="button" class="btn btn-block hasTooltip right">
  Tooltip on the right.
  <i class="tip">Tooltip on right<br>vertically centered.</i>
</button>     

.hasTooltip .tip {
    position: absolute;
    bottom: 100%; left: 50%; 
    transform: translateX(-50%); }

.hasTooltip.right .tip {
    bottom: auto; left: 100%; top:50%; 
    transform: translateY(-50%); }

平移允许绝对定位的工具提示相对于内容水平或垂直居中。带BR的白色可实现长内容的换行,同时允许较短的工具提示与工具提示文本的宽度匹配。
以下是完整的CSS:

.hasTooltip { 
  position:relative; }

.hasTooltip .tip {
  display:block;
  background: #333; color: #fff;
  box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.5);
  font-size:inherit; 
  font-style:normal;
  line-height: 1rem;
  text-align:center;
  padding: 8px 16px;
  border-radius:4px;
  margin-bottom:5px;
  pointer-events: none;
  position: absolute;
  bottom: 100%; left: 50%; transform: translateX(-50%);
  opacity: 0;
  transition: opacity .34s ease-in-out;
  white-space:nowrap;  
  z-index:99; }

.hasTooltip .tip:before {
  content: "";
  display:block; position:absolute; left:0; bottom:-5px; 
  width:100%; height:5px; }

.hasTooltip .tip:after {
  border-left: solid transparent 6px;
  border-right: solid transparent 6px;
  border-top: solid #333 6px;
  bottom: -4px;
  content: "";
  height: 0;
  left: 50%;
  margin-left: -6px;
  position: absolute;
  width: 0; }

.hasTooltip:focus .tip,
.hasTooltip:hover .tip {
  opacity: 1;
  pointer-events: auto; }

.hasTooltip.right .tip {
  bottom: auto; left: 100%; top:50%; transform: translateY(-50%);
  margin-bottom:0; 
  margin-left:5px; }

.hasTooltip.right .tip:before {
  left:-5px; bottom:auto; }

.hasTooltip.right .tip:after {
  border-left: 0;
  border-top: solid transparent 6px;
  border-bottom: solid transparent 6px;
  border-right: solid #333 6px;
  bottom:auto; 
  left: -4px;
  top:50%;
  margin-left: 0; 
  margin-top: -6px; }
kqhtkvqz

kqhtkvqz7#

width: max-contentmax-width结合使用。
例如:

.tooltip {
  width: max-content;
  max-width: 200px;
}

内容现在仅在超过最大宽度时换行。
标签:position: absolute child element - Don't wrap text until max-width?

相关问题