HTML-工具提示相对于鼠标指针的位置

如何对齐工具提示的自然样式: 鼠标右下方的指针?

<!DOCTYPE html>
<html>
<head>
<title>Tooltip with Image</title>
<meta charset="UTF-8">
<style type="text/css">
.tooltip {
text-decoration:none;
position:relative;
}
.tooltip span {
display:none;
}
.tooltip span img {
float:left;
}
.tooltip:hover span {
display:block;
position:absolute;
overflow:hidden;
}
</style>
</head>
<body>
<a class="tooltip" href="http://www.google.com/">
Google
<span>
<img alt="" src="http://www.google.com/images/srpr/logo4w.png">
</span>
</a>
</body>
</html>
258153 次浏览

对于默认的工具提示行为,只需添加 title属性。

<div title="regular tooltip">Hover me</div>

在您澄清这个问题之前,我用纯 JavaScript 完成了这项工作,希望您会发现它很有用。图像将弹出并跟随鼠标。

JsFiddle

JavaScript

var tooltipSpan = document.getElementById('tooltip-span');


window.onmousemove = function (e) {
var x = e.clientX,
y = e.clientY;
tooltipSpan.style.top = (y + 20) + 'px';
tooltipSpan.style.left = (x + 20) + 'px';
};

CSS

.tooltip span {
display:none;
}
.tooltip:hover span {
display:block;
position:fixed;
overflow:hidden;
}

扩展多个元素

对于多个元素的一个解决方案是更新所有工具提示 span,并在鼠标移动时将它们设置在光标下。

JsFiddle

var tooltips = document.querySelectorAll('.tooltip span');


window.onmousemove = function (e) {
var x = (e.clientX + 20) + 'px',
y = (e.clientY + 20) + 'px';
for (var i = 0; i < tooltips.length; i++) {
tooltips[i].style.top = y;
tooltips[i].style.left = x;
}
};

我们可以在 Angularjs 使用“指令”来达到同样的目的。

            //Bind mousemove event to the element which will show tooltip
$("#tooltip").mousemove(function(e) {
//find X & Y coodrinates
x = e.clientX,
y = e.clientY;


//Set tooltip position according to mouse position
tooltipSpan.style.top = (y + 20) + 'px';
tooltipSpan.style.left = (x + 20) + 'px';
});

你可以查看这篇文章了解更多细节。 Http://www.ufthelp.com/2014/12/tooltip-directive-angularjs.html

您可以使用 jQueryUI 插件,以下是引用 URL

对于工具提示相对于鼠标指针的位置,将跟踪设置为 TRUE 例如。

$('.tooltip').tooltip({ track: true });

我更喜欢这种方法:

function showTooltip(e) {
var tooltip = e.target.classList.contains("tooltip")
? e.target
: e.target.querySelector(":scope .tooltip");
tooltip.style.left =
(e.pageX + tooltip.clientWidth + 10 < document.body.clientWidth)
? (e.pageX + 10 + "px")
: (document.body.clientWidth + 5 - tooltip.clientWidth + "px");
tooltip.style.top =
(e.pageY + tooltip.clientHeight + 10 < document.body.clientHeight)
? (e.pageY + 10 + "px")
: (document.body.clientHeight + 5 - tooltip.clientHeight + "px");
}


var tooltips = document.querySelectorAll('.couponcode');
for(var i = 0; i < tooltips.length; i++) {
tooltips[i].addEventListener('mousemove', showTooltip);
}
.couponcode {
color: red;
cursor: pointer;
}


.couponcode:hover .tooltip {
display: block;
}


.tooltip {
position: absolute;
white-space: nowrap;
display: none;
background: #ffffcc;
border: 1px solid black;
padding: 5px;
z-index: 1000;
color: black;
}
Lorem ipsum dolor sit amet, <span class="couponcode">consectetur
adipiscing<span class="tooltip">This is a tooltip</span></span>
elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
ut aliquip ex ea commodo consequat. Duis aute irure dolor in <span
class="couponcode">reprehenderit<span class="tooltip">This is
another tooltip</span></span> in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est <span
class="couponcode">laborum<span class="tooltip">This is yet
another tooltip</span></span>.

(另见 这把小提琴)

在没有 JS 的情况下实现这一点的一种方法是使用 hover 操作来显示一个隐藏的 HTML 元素,参见下面的 codepen:

Http://codepen.io/c0un7z3r0/pen/lzwxew

注意,包含工具提示内容的 span 是相对于父 li 的:

ul#list_of_thrones li > span{
display:none;
}
ul#list_of_thrones li:hover > span{
position: absolute;
display:block;
...
}

正如您所看到的,span 是隐藏的,除非列表项悬停在上面,这样就显示了 span 元素,span 可以包含您需要的任何 html。在所附的 codepen 中,我还为箭头使用了一个: after 元素,但是这个元素当然是完全可选的,并且只是出于美观的目的才包含在这个示例中。

我希望这有所帮助,因为所有其他的答案都包括了 JS 解决方案,但 OP 只要求 HTML/CSS 解决方案,所以我不得不发布。

这可以用纯 HTML 和 css 来完成。这可能不是最好的方法,但我们都有不同的局限性。根据你的具体情况,有3种方法可能是有用的。

  1. 第一种方法包括在链接顶部覆盖一个不可见的表,并在每个显示图像的单元格上进行悬停操作。

#imagehover td:hover::after{
content: "             ";
white-space: pre;
background-image: url("http://www.google.com/images/srpr/logo4w.png");
position: relative;
left: 5px;
top: 5px;
font-size: 20px;
background-color: transparent;
background-position: 0px 0px;
background-size: 60px 20px;
background-repeat: no-repeat;
  

}




#imagehover table, #imagehover th, #imagehover td {
border: 0px;
border-spacing: 0px;
}
<a href="https://www.google.com">
<table id="imagehover" style="width:50px;height:10px;z-index:9999;position:absolute" cellspacing="0">
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>


</table>
Google</a>

  1. 第二种方法依赖于能够提供您自己的光标图像

#googleLink{


cursor: url(data:application/octet-stream;base64,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),auto;


}
<a href="https://www.google.com" id="googleLink">Google</a>

  1. While the normal title tooltip doesn't technically allow images it does allow any unicode characters including block letters and emojis which may suit your needs.

<a href="https://www.google.com" title="🅶🅾️🅾️🅶🅻🅴🔎" alt="🅶🅾️🅾️🅶🅻🅴🔎">Google</a>

function showTooltip(e) {
var tooltip = e.target.classList.contains("tooltip")
? e.target
: e.target.querySelector(":scope .tooltip");
tooltip.style.left =
(e.clientX + tooltip.clientWidth + 10 < document.documentElement.clientWidth)
? (e.clientX + 10 + "px")
: (document.documentElement.clientWidth + 5 - tooltip.clientWidth + "px");
tooltip.style.top =
(e.clientY + tooltip.clientHeight + 10 < document.documentElement.clientHeight)
? (e.clientY + 10 + "px")
: (document.documentElement.clientHeight + 5 - tooltip.clientHeight + "px");
}


var tooltips = document.querySelectorAll('.hastip');
for(var i = 0; i < tooltips.length; i++) {
tooltips[i].addEventListener('mousemove', showTooltip);
}
.hastip {
border-bottom: 1px dotted black;
position: relative;
display: inline-block;
cursor: pointer;
}


.hastip:hover .tooltip {
display: block;
}


.tooltip {
position: fixed;
white-space: nowrap;
display: none;
background-color: #ffffcc;
border: 1px solid black;
color: #000;
padding: 5px;
border-radius: 6px;
z-index: 1000;
font-size: 13pt;
font-weight: initial;
}
Lorem ipsum dolor sit amet, <span class="hastip">consectetur
adipiscing<span class="tooltip">This is a tooltip</span></span>
elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
ut aliquip ex ea commodo consequat. Duis aute irure dolor in <span
class="hastip">reprehenderit<span class="tooltip">This is
another tooltip</span></span> in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id est <span
class="hastip">laborum<span class="tooltip">This is yet
another tooltip</span></span>.