在绝对定位的元素上遇到nowrap和max-width问题

时间:2017-08-29 22:43:09

标签: css css3 tooltip css-position textwrapping

我猜这两个属性并没有真正协同工作,但我的情况是:

我正在尝试创建工具提示组件。我的工具提示绝对定位,因为我不知道内容的长度是多少,没有宽度。因此,与宽度相关的CSS,文本只是形成一个高,瘦的列。我试过了max-width,但就它本身而言,它什么也没做。所以我决定尝试white-space: nowrap,虽然它很好地没有包装文本,但它似乎也没有以有用的方式表达最大宽度,而文本却超出了界限元素。

如果有一个干净的解决方案,我无法想到如何解决我的问题。我希望有一个绝对定位的div扩展到适合它的内容,直到达到最大值,此时它会包含。我看到的一个建议是将元素设置为弹性框,但据我所知,这对于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>
&#13;
&#13;
&#13;

6 个答案:

答案 0 :(得分:4)

避免使用white-space:nowrap因为这会将文本限制在一行。 max-width应该使用具有显示绝对值但不在内联元素内的块级元素。要解决此问题,我将工具提示放在包装器块之外,并使用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>

答案 1 :(得分:3)

我不确定你的目标是什么,因为有很多矛盾的事情正在发生。但我会尝试,希望你可以指导我找到你想要的解决方案:

https://jsfiddle.net/q7dyf6xh/

-stc=c99

看看这个小提琴,你可以看到工具提示现在有一个最大宽度。看看我正在使用的是什么:

.wrapper { position: relative; display: run-in; } .info { position: absolute; max-width: 200px; white-space: pre-line; } :根据上下文

将元素显示为块或内联

display: run-in;:空格的序列将折叠成一个空格。文本将在必要时包装,并在换行符

为了更好地了解工作原理,请点击此处:

white-space :如果您使用 nowrap 文字,则永远不会换行到下一行。文本在同一行继续,直到遇到标记!

这表示您的white-space: pre-line;仍在使用,但现在您已经溢出您的元素了。尝试为您的元素max-width提供一个background-color,您会发现它实际上只有max-width定义的宽度。

请在此处查看元素如何溢出:https://jsfiddle.net/fcnh1qeo/

现在宽度overflow: hidden仅显示包装盒内的文字。其他一切都被切断了!见这里:https://jsfiddle.net/0qn4wxkg/

我现在使用的是display: run-in;white-space: pre-line;以及max-width: 200px,它们可以为您提供所需的解决方案。不知道你使用它的上下文和代码更像是一个猜测而不是答案。但也许我可以引导您找到适合您需求的解决方案

干杯!

答案 2 :(得分:1)

添加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>

答案 3 :(得分:1)

不是那个时候我自己也有类似的问题。我使用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%)
}

我还将其复制到Connection Mux,以防你想看一下。 (:

答案 4 :(得分:1)

你这是行不通的。

如果您允许使用BR标签,这是一个有效的解决方案。我曾经多次使用工具提示,这是我拥有的最佳解决方案。

Codepen: https://codepen.io/btn-ninja/pen/JNJrgp

它的工作原理是使用带有css translate的white-space 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; }

答案 5 :(得分:1)

display="runin"该元素生成一个run-in框。导入元素的作用类似于内联或块,具体取决于周围的元素。那是: 如果导入框包含块框,则与块相同。 如果在插件框后面有一个块框,则该插件框将成为块框的第一个内联框。 如果跟随一个内联框,则该插件框将成为一个块框。

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;

}