我想创建一种效果,如果我将鼠标悬停在某个元素上,则将逐步显示一个段落元素,反之亦然(如果光标不再悬停在该元素上,则该段落应逐渐消失)。我已经使用纯CSS创建了效果,但是它有点麻烦,并且只有在该段落是我要悬停的元素的直接子元素时,它才会起作用(这使它更加麻烦)。但是这是我使用CSS创建的方式:
* {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
body {
overflow: hidden;
}
.FlexContainerRow {
display: flex;
flex-direction: row;
justify-content: center;
z-index: 1;
}
.FlixItem_Images {
width: 50rem;
}
#CheiftianTwo {
-webkit-transform: scaleX(-1);
transform: scaleX(-1);
}
#welcome {
position: absolute;
z-index: 2;
font-family: Calibri;
font-weight: bold;
font-size: 2em;
text-align: center;
transition: background-color color linear;
transition-duration: 1s;
color: transparent;
background-color: transparent;
margin-left: 13.75em;
margin-top: 6.4em;
padding: 0.2em;
border-radius: 0.4em;
}
#divForLayers {
position: absolute;
z-index: 1;
}
#divForhover {
height: 33.5em;
width: 100rem;
position: absolute;
z-index: 3;
}
#divForhover:hover #welcome {
transition: background-color color linear;
color: white;
background-color: black;
transition-duration: 1s;
}
<header>
<div id="divForhover">
<div id="divForLayers">
<div id="HeaderImagesContainer" class="FlexContainerRow">
<div>
<img src="https://www.nexusindustrialmemory.com/wp-content/uploads/2017/04/OriginalTank.jpg" class="FlixItem_Images" id="CheiftianOne" />
</div>
<div>
<img src="https://www.nexusindustrialmemory.com/wp-content/uploads/2017/04/OriginalTank.jpg" class="FlixItem_Images" id="CheiftianTwo" />
</div>
</div>
</div>
<p id="welcome">Welcome to te Cheftian Mk.2 Main Battle Tank guide!</p>
</div>
</header>
<nav></nav>
<footer></footer>
但是我刚刚了解到,您可以使用JavaScript进行相同的操作,这会简单得多:
addEventListner('mouseover', function(evt) {
document.body.querySelector( /*ID_of_the_element*/ ).style.property = 'value';
})
问题是,我只知道当用户将鼠标悬停在元素上时如何显示段落,仅此而已。如果光标不再位于元素上,则该段落仍将显示。我不知道如何撤消 addEventListener
。我尝试使用removeEventListener
来执行此操作,但显然语法错误。请告诉我该怎么做。
以下是带有JavaScript的版本:
document.querySelector("#welcome").style.visibility = "hidden";
var imgOne = document.body.querySelector("#CheiftianOne");
imgOne.addEventListener('mouseover', function(evt) {
var textBox = document.querySelector("#welcome");
textBox.style.visibility = "visible";
});
imgOne.removeEventListener('mouseover', function(evt) {
var textBox = document.querySelector("#welcome");
textBox.style.visibility = "hidden";
});
* {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
body {
overflow: hidden;
}
.FlexContainerRow {
display: flex;
flex-direction: row;
justify-content: center;
z-index: 1;
}
.FlixItem_Images {
width: 50rem;
}
#CheiftianTwo {
-webkit-transform: scaleX(-1);
transform: scaleX(-1);
}
#welcome {
position: absolute;
z-index: 2;
font-family: Calibri;
font-weight: bold;
font-size: 2em;
text-align: center;
transition: background-color color linear;
transition-duration: 1s;
color: white;
background-color: black;
margin-left: 13.75em;
margin-top: 6.4em;
padding: 0.2em;
border-radius: 0.4em;
}
#divForLayers {
position: absolute;
z-index: 1;
}
<header>
<div id="divForhover">
<div id="divForLayers">
<div id="HeaderImagesContainer" class="FlexContainerRow">
<div>
<img src="https://www.nexusindustrialmemory.com/wp-content/uploads/2017/04/OriginalTank.jpg" class="FlixItem_Images" id="CheiftianOne" />
</div>
<div>
<img src="https://www.nexusindustrialmemory.com/wp-content/uploads/2017/04/OriginalTank.jpg" class="FlixItem_Images" id="CheiftianTwo" />
</div>
</div>
</div>
<p id="welcome">Welcome to te Cheftian Mk.2 Main Battle Tank guide!</p>
</div>
</header>
<nav></nav>
<footer></footer>
答案 0 :(得分:5)
将事件处理程序函数分配给变量,或为其指定适当的名称。然后添加并删除那个。
您的removeEventListener
调用失败,因为您正在向其传递唯一函数。
此外,您实际上并不想 undo 取消事件监听器以实现所需的效果。相反,请监听单独的事件:mouseover
和mouseout
。例如:
var btn = document.getElementById('btn');
var par = document.getElementById('par');
btn.addEventListener('mouseover', function (e) {
par.style.visibility = 'visible';
});
btn.addEventListener('mouseout', function (e) {
par.style.visibility = 'hidden';
});
<button id="btn">Hover over me</button>
<p id="par" style="visibility: hidden;">This shows when hovering over the button</p>
当鼠标悬停在某个元素上时发生mouseover
事件,相反,当鼠标离开该元素时发生mouseout
事件。
答案 1 :(得分:2)
调用removeEventListener
时,必须将传递给addEventListener
的 same 函数传递给它,而不是不同但等效的函数。这将永远不会删除侦听器:
imgOne.removeEventListener('mouseover', function (evt) { /* ... */ });
...由于定义,该功能以前从未添加过。
记住您在添加时使用的那个,并在删除时使用相同的那个。
分别:添加处理程序,然后立即删除它没有多大意义。在代码中对addEventListener
和removeEventListener
的调用之间不会触发处理程序。 (编辑:啊,rossipedia知道了为什么要这么做,his answer告诉您要这么做。)
答案 2 :(得分:0)
谢谢大家。我想出了没有removeEventListener的方法。 (我使用了两个addEventListener)。
再次感谢!