HTML - 如何仅在激活省略号时显示工具提示

IT技术 javascript html css tooltip ellipsis
2021-02-08 13:45:37

我的页面中有一个带有动态数据的跨度,带有ellipsis样式。

.my-class
{
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;  
  width: 71px;
}
<span id="myId" class="my-class"></span>
document.getElementById('myId').innerText = "...";

我想添加具有相同内容的元素工具提示,但我希望它仅在内容很长并且省略号出现在屏幕上时才出现。

有什么办法吗?
浏览器在ellipsis激活时是否抛出事件

*浏览器:Internet Explorer

6个回答

这是一种使用内置省略号设置的方法,并title根据 Martin Smith 的评论按需添加属性(使用 jQuery):

$('.mightOverflow').bind('mouseenter', function(){
    var $this = $(this);

    if(this.offsetWidth < this.scrollWidth && !$this.attr('title')){
        $this.attr('title', $this.text());
    }
});
它在 IE10 上不起作用 - offsetWidth 与 scrollWidth 相同,两者都给我截断的宽度。
2021-03-17 13:45:37
如果您希望在文本不再溢出时自动删除工具提示,请修改为: $(document).on('mouseenter', '.mightOverflow', function() { var $t = $(this); var title = $ t.attr('title'); if (!title){ if (this.offsetWidth < this.scrollWidth) $t.attr('title', $t.text()) } else { if (this.offsetWidth > = this.scrollWidth && title == $t.text()) $t.removeAttr('title') } });
2021-03-26 13:45:37
谢谢,就像一个魅力!但是,如果您想让它更高效,您可以考虑将 bind() 替换为 on(),如下所示: $(document).on('mouseenter', '.mightOverflow', function() { ... });
2021-03-28 13:45:37
mouseenter 是我们绑定或监听的事件。在有人真正将鼠标悬停在元素上之前,我们实际上不必将工具提示添加到元素中。因此,我们将添加推迟到 mouseenter 在任何一个具有“mightoverflow”类的 DOM 元素上的那个点。即时工具提示
2021-03-31 13:45:37
"As of jQuery 1.7, the .on() method is the preferred method for attaching event handlers to a document"有关更多信息,请参阅api.jquery.com/bindapi.jquery.com/on
2021-04-04 13:45:37

这是一个纯 CSS 解决方案。不需要 jQuery。它不会显示工具提示,而是会在鼠标悬停时将内容扩展到其全长。

如果您的内容被替换,效果会很好。这样您就不必每次都运行 jQuery 函数。

.might-overflow {
    text-overflow: ellipsis;
    overflow : hidden;
    white-space: nowrap;
}

.might-overflow:hover {
    text-overflow: clip;
    white-space: normal;
    word-break: break-all;
}
感谢这个很好的答案,它完美地满足了我的需求。使用一些 JavaScript,我们可以想象让块绝对定位,这样它就不会破坏布局。
2021-03-19 13:45:37
它不如工具提示好,因为它可能会破坏布局。
2021-03-23 13:45:37
工具提示的问题在于它们不适用于移动设备,至少目前是这样。这个答案可能(阅读:可能会)破坏布局,但它可以适应,例如,悬停元素具有不同的背景颜色。这仍然不适用于移动设备,但它是桌面的另一种选择。
2021-03-23 13:45:37
这是一个很好的答案,比在 css 问题上膨胀 javascript 更好。显然省略号应该有一个自动标题选项,目前它的实现方式缺乏意义。太糟糕了 css 不允许只 :hover 如果最后一个字符是 '...'
2021-04-12 13:45:37
当页面上有水平滚动条时,工具提示内容显示在页面的不同位置而不是悬停元素附近。有什么建议吗?
2021-04-13 13:45:37

这是另外两个纯 CSS 解决方案:

  1. 在原地显示截断的文本:

.overflow {
  overflow: hidden;
  -ms-text-overflow: ellipsis;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.overflow:hover {
  overflow: visible;
}

.overflow:hover span {
  position: relative;
  background-color: white;

  box-shadow: 0 0 4px 0 black;
  border-radius: 1px;
}
<div>
  <span class="overflow" style="float: left; width: 50px">
    <span>Long text that might overflow.</span>
  </span>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad recusandae perspiciatis accusantium quas aut explicabo ab. Doloremque quam eos, alias dolore, iusto pariatur earum, ullam, quidem dolores deleniti perspiciatis omnis.
</div>

  1. 显示任意的“工具提示”

.wrap {
  position: relative;
}

.overflow {
  white-space: nowrap; 
  overflow: hidden;
  text-overflow: ellipsis;
  
  pointer-events:none;
}

.overflow:after {
  content:"";
  display: block;
  position: absolute;
  top: 0;
  right: 0;
  width: 20px;
  height: 15px;
  z-index: 1;
  border: 1px solid red; /* for visualization only */
  pointer-events:initial;

}

.overflow:hover:after{
  cursor: pointer;
}

.tooltip {
  /* visibility: hidden; */
  display: none;
  position: absolute;
  top: 10;
  left: 0;
  background-color: #fff;
  padding: 10px;
  -webkit-box-shadow: 0 0 50px 0 rgba(0,0,0,0.3);
  opacity: 0;
  transition: opacity 0.5s ease;
}


.overflow:hover + .tooltip {
  /*visibility: visible; */
  display: initial;
  transition: opacity 0.5s ease;
  opacity: 1;
}
<div>
  <span class="wrap">
    <span class="overflow" style="float: left; width: 50px">Long text that might overflow</span>
    <span class='tooltip'>Long text that might overflow.</span>
  </span>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad recusandae perspiciatis accusantium quas aut explicabo ab. Doloremque quam eos, alias dolore, iusto pariatur earum, ullam, quidem dolores deleniti perspiciatis omnis.
</div>

优秀的解决方案,正是我需要的。谢谢 !
2021-03-24 13:45:37
这正是我要找的!
2021-03-27 13:45:37

uosɐſ 的回答从根本上是正确的,但您可能不想在 mouseenter 事件中这样做。每次将鼠标悬停在元素上时,它都会进行计算以确定是否需要它。除非元素的大小发生变化,否则没有理由这样做。

最好在将元素添加到 DOM 后立即调用此代码:

var $ele = $('#mightOverflow');
var ele = $ele.eq(0);
if (ele.offsetWidth < ele.scrollWidth)
    $ele.attr('title', $ele.text());

或者,如果您不知道它是何时添加的,则在页面加载完成后调用该代码。

如果您需要使用多个元素来执行此操作,那么您可以为它们提供所有相同的类(例如“mightOverflow”),并使用此代码来更新它们:

$('.mightOverflow').each(function() {
    var $ele = $(this);
    if (this.offsetWidth < this.scrollWidth)
        $ele.attr('title', $ele.text());
});
它在 IE10 上不起作用 - offsetWidth 与 scrollWidth 相同,两者都给我截断的宽度。
2021-03-18 13:45:37
不,这只是防止它再次添加标题属性。计算,以确定是否需要这种耐心仍在进行。this.offsetWidth < this.scrollWidth甚至可能!$this.attr('title')每次将鼠标悬停在元素上时都会执行检查
2021-03-19 13:45:37
+1,在页面加载时执行此操作似乎更简单,但也提供了更多可能性。IE。您可能希望为这个元素设置样式,该元素具有带有虚线下划线的工具提示,以“表示”工具提示。$(".mightOverflow").each(function() { if( $(this).offsetWidth < $(this).scrollWidth && !$(this).attr('title')){ $(this).attr('title', $(this).text()); $(this).css('border-bottom', '1px dotted #A8A8A8'); } });
2021-03-24 13:45:37
'每次鼠标悬停'是错误的(至少现在 - 我不知道答案是否更新)它确实检查它是否以前计算过'&& !$this.attr('title')'
2021-04-06 13:45:37
这种方法的问题是所有元素都被一次检查(潜在的性能影响)并且它只计算一次,所以如果用户缩小浏览器导致东西被截断或扩展,导致它们不再被截断,你不能更新工具提示的存在。再次将代码附加到窗口调整大小会产生性能问题,因为每个项目都会检查其大小。通过使用事件委托 "$(document).on('mouseenter', '.mightOverflow', ..." 并延迟检查直到鼠标悬停在元素上,您可以动态更新并且一次只检查 1 个元素
2021-04-08 13:45:37

这是我的 jQuery 插件:

(function($) {
    'use strict';
    $.fn.tooltipOnOverflow = function() {
        $(this).on("mouseenter", function() {
            if (this.offsetWidth < this.scrollWidth) {
                $(this).attr('title', $(this).text());
            } else {
                $(this).removeAttr("title");
            }
        });
    };
})(jQuery);

用法:

$("td, th").tooltipOnOverflow();

编辑:

我已经为这个插件做了一个要点。 https://gist.github.com/UziTech/d45102cdffb1039d4415

嗯,我们有一个公司政策,我们支持的最低 IE 版本是 10。也因为我们的很多客户(一些银行和各种机构)仍然使用 IE10。那好吧。
2021-03-15 13:45:37
@SsjCosty 是的,这是大公司的问题。IT 没有钱摆脱 5 年不兼容的浏览器。但别担心,管理层会收到很多奖金...... :-)) 我知道有点跑题了。
2021-04-04 13:45:37
它在 IE10 上不起作用 - offsetWidth 与 scrollWidth 相同,两者都给我截断的宽度。
2021-04-08 13:45:37
@SsjCosty 为什么要在 IE 10 上进行测试?此时应该没有人使用 IE 10,因为任何可以安装 IE 10 的人都可以安装 IE 11。
2021-04-14 13:45:37