如何在鼠标悬停时在工具提示中显示对象的值?
How to display value from object in tooltip on mouseover?
在我的项目中,玩家可以生成具有随机名称和属性的项目。每个项目都有自己的一组属性,如名称、攻击值、防御值等。
我想制作一个工具提示,在鼠标悬停时显示项目值:
1-我不能硬写在 HTML 中(我可能会为每个项目创建一个带有元素的 div 和 link 一个 class 到 show/hide悬停...但这会很乏味,而且我不确定它在长时间 运行(100 多个项目?)中是否会表现出色。
2- 我想避免使用 JQuery / boostrap 和其他库,除非没有它们是不可能的。
我看过带有数据属性的基本解决方案,但每个项目可能有十几个 key:value 可以在数百个中显示,所以,可能对我没有用。
我试图制作一个由 JS 函数修改的 CSS 变量,但是......嗯,这不是 CSS var 的方式。显然有效。
let myObject = {
prop1 : "name",
prop2 : 12,
};
document.getElementById("myID").addEventListener('mouseenter', function() {
displayEquipmentStats(myObject);
})
function displayEquipmentStats(item) {
let toDisplayContent = "";
toDisplayContent += item.prop1 + " att : ";
toDisplayContent += item.prop2;
document.body.style.setProperty("--EquipmentStats", toDisplayContent);
}
:root {
--Content: "";
}
#myID:hover::after {
white-space: pre;
content: "hi there"; /* I wanted to display var(--Content) here, sadly, it's not possible */
position: absolute;
top: 1.5em;
left: 3em;
z-index: 1;
padding: 0.4em;
background: #413219;
color: #fff;
border-radius: 4px;
}
<div id="myID"> some random text</div>
这是一个片段,或多或少显示了我想要实现的目标(同样,我知道 CSS var 不会那样工作)。
在这一点上欢迎任何对类似方法的见解,谢谢。
在不了解您的数据结构、数据传输方法等的情况下,基本上是一个过于宽泛的问题,很可能因此而被关闭,这是一个您可以在现代上做的事情的快速示例即使有一百多个元素,常青浏览器也应该做得很好。
这只是一个 proof-of-concept 示例,大多数人会向您收取更多的时间,因为它通常 out-of-scope 用于快速问答网站,但可能会让您的创造力源源不断。您还可以更改为 mouseover
事件,并仅在事件开始的静态位置显示工具提示。干杯。
const tooltip = document.getElementById('tooltip-example'),
dummyData = [
{
"id": "0",
"name": "Mickey Mouse",
"attack": "melee",
"damage": "42",
"range": "157",
"defense": "turrets",
"faction": "lost souls"
},
{
"id": "1",
"name": "Tinker Bell",
"attack": "sword",
"damage": "34",
"range": "157",
"defense": "cannons",
"faction": "south side"
},
{
"id": "2",
"name": "Goofy",
"attack": "archer",
"damage": "55",
"range": "987",
"defense": "tigers",
"faction": "westside"
},
{
"id": "3",
"name": "Donald Duck",
"attack": "fire",
"damage": "97",
"range": "533",
"defense": "bears",
"faction": "killer koalas"
},
{
"id": "4",
"name": "Minnie Mouse",
"attack": "roundhouse",
"damage": "76",
"range": "234",
"defense": "squirrels",
"faction": "rabid kittens"
},
{
"id": "5",
"name": "Daisy Duck",
"attack": "lightning",
"damage": "45",
"range": "534",
"defense": "looks",
"faction": "angry puppies"
}
];
handleEvents = () => {
const items = document.querySelectorAll('[data-attribs]');
items.forEach(
item => item.addEventListener('mousemove', function (e) {
tooltip.style.display = 'block';
let x = event.clientX,
y = event.clientY;
const attribs = JSON.parse(e.target.dataset.attribs);
tooltip.style.left = `${x}px`;
tooltip.style.top = `${y}px`;
tooltip.innerHTML = `
<table>
<tr><td>Name [id]</td><td>${attribs.name} [${attribs.id}]</td></tr>
<tr><td>Attack</td><td>${attribs.attack}</td></tr>
<tr><td>Damage</td><td>${attribs.damage}</td></tr>
<tr><td>Range</td><td>${attribs.range}</td></tr>
<tr><td>Defense</td><td>${attribs.defense}</td></tr>
<tr><td>Faction</td><td>${attribs.faction}</td></tr>
</table>
`;
}));
items.forEach(
item => item.addEventListener('mouseout', function (e) {
tooltip.style.display = 'none';
}));
}
generateItems = () => {
for (let i = 0, x = dummyData.length; i < x; i++) {
const newItem = document.createElement('div');
newItem.className = 'default-item';
newItem.style.backgroundColor = `#${(Math.random()*0xFFFFFF<<0).toString(16)}`;
newItem.style.color = "#000";
newItem.innerText = dummyData[i].name;
newItem.dataset.attribs = JSON.stringify(dummyData[i]);
document.body.appendChild(newItem);
}
handleEvents();
}
generateItems();
body {
padding: 2rem;
}
.default-item {
display: inline-block;
padding: .5rem;
margin: .25rem;
color: #212121;
cursor: pointer;
border: #212121 1px solid;
}
#tooltip-example {
color: #fff;
background-color: rgba(0,0,0,.8);
position: absolute;
z-index: 99999999;
cursor: pointer;
padding: .5rem;
pointer-events: none;
display: none;
}
#tooltip-example table {
border-collapse: collapse;
}
#tooltip-example table td {
padding: .15rem .5rem;
white-space: nowrap;
}
#tooltip-example table td:first-child {
text-align: right;
border-right: #fff 1px solid;
}
<div id="tooltip-example"></div>
在我的项目中,玩家可以生成具有随机名称和属性的项目。每个项目都有自己的一组属性,如名称、攻击值、防御值等。
我想制作一个工具提示,在鼠标悬停时显示项目值:
1-我不能硬写在 HTML 中(我可能会为每个项目创建一个带有元素的 div 和 link 一个 class 到 show/hide悬停...但这会很乏味,而且我不确定它在长时间 运行(100 多个项目?)中是否会表现出色。
2- 我想避免使用 JQuery / boostrap 和其他库,除非没有它们是不可能的。
我看过带有数据属性的基本解决方案,但每个项目可能有十几个 key:value 可以在数百个中显示,所以,可能对我没有用。 我试图制作一个由 JS 函数修改的 CSS 变量,但是......嗯,这不是 CSS var 的方式。显然有效。
let myObject = {
prop1 : "name",
prop2 : 12,
};
document.getElementById("myID").addEventListener('mouseenter', function() {
displayEquipmentStats(myObject);
})
function displayEquipmentStats(item) {
let toDisplayContent = "";
toDisplayContent += item.prop1 + " att : ";
toDisplayContent += item.prop2;
document.body.style.setProperty("--EquipmentStats", toDisplayContent);
}
:root {
--Content: "";
}
#myID:hover::after {
white-space: pre;
content: "hi there"; /* I wanted to display var(--Content) here, sadly, it's not possible */
position: absolute;
top: 1.5em;
left: 3em;
z-index: 1;
padding: 0.4em;
background: #413219;
color: #fff;
border-radius: 4px;
}
<div id="myID"> some random text</div>
这是一个片段,或多或少显示了我想要实现的目标(同样,我知道 CSS var 不会那样工作)。
在这一点上欢迎任何对类似方法的见解,谢谢。
在不了解您的数据结构、数据传输方法等的情况下,基本上是一个过于宽泛的问题,很可能因此而被关闭,这是一个您可以在现代上做的事情的快速示例即使有一百多个元素,常青浏览器也应该做得很好。
这只是一个 proof-of-concept 示例,大多数人会向您收取更多的时间,因为它通常 out-of-scope 用于快速问答网站,但可能会让您的创造力源源不断。您还可以更改为 mouseover
事件,并仅在事件开始的静态位置显示工具提示。干杯。
const tooltip = document.getElementById('tooltip-example'),
dummyData = [
{
"id": "0",
"name": "Mickey Mouse",
"attack": "melee",
"damage": "42",
"range": "157",
"defense": "turrets",
"faction": "lost souls"
},
{
"id": "1",
"name": "Tinker Bell",
"attack": "sword",
"damage": "34",
"range": "157",
"defense": "cannons",
"faction": "south side"
},
{
"id": "2",
"name": "Goofy",
"attack": "archer",
"damage": "55",
"range": "987",
"defense": "tigers",
"faction": "westside"
},
{
"id": "3",
"name": "Donald Duck",
"attack": "fire",
"damage": "97",
"range": "533",
"defense": "bears",
"faction": "killer koalas"
},
{
"id": "4",
"name": "Minnie Mouse",
"attack": "roundhouse",
"damage": "76",
"range": "234",
"defense": "squirrels",
"faction": "rabid kittens"
},
{
"id": "5",
"name": "Daisy Duck",
"attack": "lightning",
"damage": "45",
"range": "534",
"defense": "looks",
"faction": "angry puppies"
}
];
handleEvents = () => {
const items = document.querySelectorAll('[data-attribs]');
items.forEach(
item => item.addEventListener('mousemove', function (e) {
tooltip.style.display = 'block';
let x = event.clientX,
y = event.clientY;
const attribs = JSON.parse(e.target.dataset.attribs);
tooltip.style.left = `${x}px`;
tooltip.style.top = `${y}px`;
tooltip.innerHTML = `
<table>
<tr><td>Name [id]</td><td>${attribs.name} [${attribs.id}]</td></tr>
<tr><td>Attack</td><td>${attribs.attack}</td></tr>
<tr><td>Damage</td><td>${attribs.damage}</td></tr>
<tr><td>Range</td><td>${attribs.range}</td></tr>
<tr><td>Defense</td><td>${attribs.defense}</td></tr>
<tr><td>Faction</td><td>${attribs.faction}</td></tr>
</table>
`;
}));
items.forEach(
item => item.addEventListener('mouseout', function (e) {
tooltip.style.display = 'none';
}));
}
generateItems = () => {
for (let i = 0, x = dummyData.length; i < x; i++) {
const newItem = document.createElement('div');
newItem.className = 'default-item';
newItem.style.backgroundColor = `#${(Math.random()*0xFFFFFF<<0).toString(16)}`;
newItem.style.color = "#000";
newItem.innerText = dummyData[i].name;
newItem.dataset.attribs = JSON.stringify(dummyData[i]);
document.body.appendChild(newItem);
}
handleEvents();
}
generateItems();
body {
padding: 2rem;
}
.default-item {
display: inline-block;
padding: .5rem;
margin: .25rem;
color: #212121;
cursor: pointer;
border: #212121 1px solid;
}
#tooltip-example {
color: #fff;
background-color: rgba(0,0,0,.8);
position: absolute;
z-index: 99999999;
cursor: pointer;
padding: .5rem;
pointer-events: none;
display: none;
}
#tooltip-example table {
border-collapse: collapse;
}
#tooltip-example table td {
padding: .15rem .5rem;
white-space: nowrap;
}
#tooltip-example table td:first-child {
text-align: right;
border-right: #fff 1px solid;
}
<div id="tooltip-example"></div>