我在相同的元素上有一个mouseover
和mouseleave
事件监听器,当你mouseover
添加一个类并且mouseleave
删除该类时。
我正在运行forEach
,以便当您mouseover
某个特定项目时,它会显示该项目的特定文本块。这就是为什么我使用JS而不是简单的CSS。
我正在寻找一种优化以下代码的方法。
const pageNavRings = document.querySelectorAll('.page-nav-ring')
pageNavRings.forEach((pageRing) => {
pageRing.addEventListener('mouseover', (e) => {
const pageRingParent = e.target.closest('.page-nav__list--item')
pageRingParent.querySelector('.page-nav-label').classList.add('is-visible')
})
pageRing.addEventListener('mouseleave', (e) => {
const pageRingParent = e.target.closest('.page-nav__list--item')
pageRingParent.querySelector('.page-nav-label').classList.remove('is-visible')
})
})
似乎这段代码可以写得更好,更强 DRY 。所有和任何帮助将不胜感激。
答案 0 :(得分:1)
我试图让它更紧凑和清晰。不确定你的html,所以用parentElement
来获取标签。
const rings = document.querySelectorAll('.page-nav-ring')
rings.forEach((ring) => {
const label = ring.parentElement.querySelector('.page-nav-label');
ring.addEventListener('mouseover', () => { label.classList.add("is-visible") });
ring.addEventListener('mouseleave', () => { label.classList.remove("is-visible") });
});
答案 1 :(得分:0)
我不使用JavaScript而是使用CSS来解决这个问题:
.page-nav-ring > .page-nav__list--item {
opacity: 1;
}
.page-nav-ring > .page-nav__list--item:hover {
opacity: 0.1;
}

<ul class="page-nav-ring">
<li class="page-nav__list--item">Hello World</li>
<li class="page-nav__list--item">Hello World 2</li>
<li class="page-nav__list--item">Hello World 3</li>
</ul>
&#13;
不再需要JS。当然,您可以将opacity
属性更改为您需要的属性。
答案 2 :(得分:0)
const pageNavRings = document.querySelectorAll('.page-nav-ring')
pageNavRings.forEach(pageRing => {
// Move everything into `handler` function
// to make use of scoping (you will see why later)
pageRing.addEventListener('mouseover', handler);
})
function handler(e){
// Cache these values using variable
const className = 'is-visible';
const pageRingParent = e.target.closest('.page-nav__list--item')
const pageRingLabel = pageRingParent.querySelector('.page-nav-label');
pageRingLabel.classList.add(className);
// Add `mouseleave` event listener in this handler is fine
// Because it doesn't need to listen to this event
// before everything started anyway
this.addEventListener('mouseleave', e => {
// Using the values from the const above,
// You don't have to use `e.target.closest` and `querySelector` again
pageRingLabel.classList.remove(className);
});
}