根据我动态悬停的图标显示文本

Showing text depending on what Icon I have hovered over dynamically

所以我不久前完成了一个编码训练营,但我还是 Javascript 的新手。我在寻找创建动态代码的解决方案时遇到问题。基本上,我在团队中的每个员工下面都有一个电子邮件图标,当鼠标悬停在该图标上时,我希望它显示他们的电子邮件。我可以对此进行硬编码,但我们有多个团队页面,其中包含不同数量的员工。

                <div class="member">
                    <img class="member-img" src="/assets/images/signage/example.png" alt="">
                    <h5 class="member-details">example</h5>
                    <img onmouseover="showEmail()" onmouseleave="hideEmail()" class="email-icon" id="emailIcon2" src="/assets/images/email-asset-128-fix.png" alt="">
                    <h5 class="email-txt" id="emailTxt">example@email.com</h5>
                </div>

特别是在这个页面上,我为每个团队成员提供了另外 3 个这样的 div。我已使用以下代码将图标和电子邮件文本 h5s 放入数组中。

const allIcons = [];

$('.email-icon').each(function() {
    allIcons.push(this);
});

console.log(allIcons);

const allEmails = [];

$('.email-txt').each(function() {
    allEmails.push(this);
})

console.log(allEmails);

作为 Javascript 的新手,我正在努力弄清楚我应该在这里做什么,但我无法在网上找到类似的解决方案。我希望它是当我将鼠标悬停在图标 1 上时它显示电子邮件 1 等等,同样适用于 onmouseleave 我只是想再次隐藏 h5。我的 css 电子邮件文本如下。

.email-txt {
    color: #474747;
    margin: 0;
    padding: 3px;
    transform: translateY(-260%);
    border-style: solid;
    border-radius: 5px;
    border-color: #474747;
    background-color: darkgray;
    color: black;
    display: none;
}

我试过这个解决方案

我不知道是我做的不对还是无法让它发挥作用。

也请随意判断我的代码,建议越多越好:)。谢谢!

假设电子邮件地址在一个数组中,您需要做的就是生成一个新图像,并将其 title 属性设置为每个数组条目的电子邮件地址:

["1@2.com", "3@4.com", "4@5.com", "5@6.com"].forEach(function(item){
  let link = document.createElement("a");               // Create dynamic anchor
  link.href = "mailto:" + item;                         // Set link to go to array item
  let img = document.createElement("img");              // Create dynamic image
  img.alt = item;                                       // Set the required alt attribute
  img.src = "https://illustoon.com/photo/dl/2751.png";  // Set image source
  img.title = item;                                     // Set the tooltip for the image to the array item
  link.append(img);                                     // Put the image in the anchor
  document.body.append(link);                           // Put the anchor on the page
});
img { width: 30px; }
<p>Hover over each icon to see the email address

注释:

不要在数组中存储 HTML 元素 - 它们已经在 DOM 中,因此没有理由再维护它们的第二个列表。只需将要使用的数据存储在数组中即可。

不要使用标题 (<h1>...<h6>),因为浏览器会设置文本样式。标题用于定义文档结构,对于那些使用辅助技术(如屏幕阅读器)浏览网页的人来说是必不可少的。 <h5> 只会用于 sub-divide 现有的 <h4> 部分。 <h4> 应该只用于 sub-divide 和 <h3> 部分,依此类推。

您正在代码中使用 JQuery。虽然 JQuery 本身并没有什么问题,但它被广泛过度用于解决简单的编码场景。你这里的情况很简单,确实不能保证JQuery。在学习 JavaScript 库和框架之前先学习 JavaScript。

您可以使用 CSS 来处理悬停效果,如果可能的话 CSS 比 JS 更适合处理这些场景:

const employees = [{
  email: "member1@email.com",
  img: ""
}, {
  email: "member2@email.com",
  img: ""
}, {
  email: "member3@email.com",
  img: ""
}, {
  email: "member4@email.com",
  img: ""
}]


employees.forEach(d => {
  const html = ` <div class="member">
                    <div class="member-img">${d.img} </>
                    <h5 class="member-details">${d.email.match(/.*(?=@)/)}</h5>
                    <div class="email-icon">✉️<h5 class="email-txt" id="emailTxt">${d.email}</h5></div>
                </div>`
  root.innerHTML += html
})
#root {
  display: flex;
  justify-content: center;
}

.member {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.email-icon {
  position: relative;
  font-size: 3rem;
  cursor: pointer;
}

.email-txt {
  display: none;
  position: absolute;
  top: 0;
  left: 0;
  transform: translateX(-50%);
}

.email-icon:hover .email-txt {
  display: block;
}
<div id="root"></div>