【问题标题】:Avoid mouseout when overlay is added on image tag在图像标签上添加叠加层时避免鼠标悬停
【发布时间】:2017-11-10 13:08:51
【问题描述】:

我有一个要求,我将 mouseOver 和 mouseOut 事件附加到图像标签。同样在鼠标悬停时,我在图像标签上添加了一个覆盖 div。

所以现在即使我的鼠标在图像上,由于添加了覆盖,仍然会发生 mouseOut 事件。以下是我的代码:

document.getElementsByTagName('img')[0].addEventListener('mouseover', function(event){
let Wrapper = document.createElement('div');

    Wrapper.classList.add('Wrapper');
    Wrapper.id = 'wrapper';
    
    let parentElement = event.currentTarget.parentElement;
    let elementExists = document.getElementById('wrapper');

    if (!elementExists) {
        parentElement.appendChild(Wrapper);
    }
});

document.getElementsByTagName('img')[0].addEventListener('mouseout', function(event){
    if (document.getElementById('wrapper')) {
        document.getElementById('wrapper').remove();
    }
});
.col-md-6 {
        width: 375px;
        height: 211px;
        margin: 20px;
        position: relative;
    }
    
        .Wrapper {
        display: table;
        position: absolute;
        background-color: rgba(0, 0, 0, 0.5);
        height: 100% !important;
        width: 100%;
        text-align: center;
        z-index: 1000;
        font-family: arial;
        color: #fff;
        top: 0;
    }

    .redirectCenter {
        display: table-cell;
        vertical-align: middle;
    }
<div class="col-md-6">
<img src="https://www.blog.google/static/blog/images/google-200x200.7714256da16f.png" />
</div>

正如您在上面的代码中看到的那样,mouseout 正在发生并且覆盖在闪烁,我尝试了很多但即使在添加覆盖之后也无法找到停止 mouseout 的方法。

注意:

  1. 我只想将鼠标悬停事件添加到图像标签。
  2. 另外,我想在纯 JavaScript 中执行此操作。

编辑:

document.getElementsByTagName('img')[0].addEventListener('mouseover', function(event){
    
    let elementExists = document.getElementById('wrapper'); 
    let Center = document.createElement('div');
    let Text = document.createElement('div');
     
    if (!elementExists) {
      let Wrapper = document.createElement('div');
      let parentElement = event.currentTarget.parentElement;
      Wrapper.classList.add('Wrapper');
      Wrapper.id = 'wrapper';
      
     Center.classList.add('Center');
     Text.innerHTML = "Sample text";
      
     parentElement.appendChild(Wrapper);
     Wrapper.appendChild(Center);
     Center.appendChild(Text);
    
      Wrapper.addEventListener('mouseout', function(event){
        if (document.getElementById('wrapper')) {
            document.getElementById('wrapper').remove();
        }
      });
    }
});
.col-md-6 {
        width: 375px;
        height: 211px;
        margin: 20px;
        position: relative;
    }
    
        .Wrapper {
        display: table;
        position: absolute;
        background-color: rgba(0, 0, 0, 0.5);
        height: 100% !important;
        width: 100%;
        text-align: center;
        z-index: 1000;
        font-family: arial;
        color: #fff;
        top: 0;
    }

    .Center {
        display: table-cell;
        vertical-align: middle;
    }
<div class="col-md-6">
<img src="https://www.blog.google/static/blog/images/google-200x200.7714256da16f.png" />
</div>

感谢您的帮助!我有一个更新的代码,它在鼠标悬停时再次闪烁的原因是我在包装器 div 中附加了另一个 div。

请告诉我可能的解决方案。我正在尝试控制事件对象,但不能完全做到。

【问题讨论】:

  • 如果你把一个元素与 img 重叠,那么就没有移动,正如我在演示中看到的那样
  • 您可以使用JQuery UI's Tooltips 浏览此问题
  • @ÁlvaroTouzón 我不能这样做,实际上它超出了范围。我只需要将事件附加到图像标签。
  • 您可以在图像悬停时附加 mousemove 事件,然后跟踪直到鼠标离开图像位置并分离事件
  • @Logar 是的,这就是我正在尝试做的事情。如果你能帮助我编写代码,那就太好了。

标签: javascript html mouseover mouseout


【解决方案1】:

我认为你应该跟踪你的鼠标何时从包装中出来。因为当您添加包装器时,所有鼠标移动都将被跟踪为从图像中移出,导致包装器与图像重叠。像这样

   document.getElementsByTagName('img')[0].addEventListener('mouseenter', function(event){

let elementExists = document.getElementById('wrapper'); 
let Center = document.createElement('div');
let Text = document.createElement('div');
 
if (!elementExists) {
  let Wrapper = document.createElement('div');
  let parentElement = event.currentTarget.parentElement;
  Wrapper.classList.add('Wrapper');
  Wrapper.id = 'wrapper';
  
 Center.classList.add('Center');
 Text.innerHTML = "Sample text";
  
 parentElement.appendChild(Wrapper);
 Wrapper.appendChild(Center);
 Center.appendChild(Text);

  Wrapper.addEventListener('mouseleave', function(event){
    if (document.getElementById('wrapper')) {
        document.getElementById('wrapper').remove();
    }
  });
}
});
   

   .col-md-6 {
        width: 375px;
        height: 211px;
        margin: 20px;
        position: relative;
    }
    
        .Wrapper {
        display: table;
        position: absolute;
        background-color: rgba(0, 0, 0, 0.5);
        height: 100% !important;
        width: 100%;
        text-align: center;
        z-index: 1000;
        font-family: arial;
        color: #fff;
        top: 0;
    }

    .Center {
        display: table-cell;
        vertical-align: middle;
    }
<div class="col-md-6">
<img src="https://www.blog.google/static/blog/images/google-200x200.7714256da16f.png" />
</div>

【讨论】:

  • 感谢您的帮助!我已经更新了我的问题。请让我知道可能的解决方案。谢谢!
  • 我想建议你听听“mouseenter”和“mouseleave”事件。与“鼠标悬停”和“鼠标悬停”的区别。不考虑元素内部的转换。 Mouseenter / mouseleave 事件不会弹出。所以我更新了我的答案,检查一下。
  • 非常感谢!真的很有帮助。如果它可以帮助其他人,请接受我的问题。再次感谢。
【解决方案2】:

“包装器”位于图像上方,因此鼠标移出将在插入后立即发生。将 mouseout 处理程序添加到包装器,而不是 img。

document.getElementsByTagName('img')[0].addEventListener('mouseover', function(event){
    
    let elementExists = document.getElementById('wrapper');
    if (!elementExists) {
      let Wrapper = document.createElement('div');
      let parentElement = event.currentTarget.parentElement;
      Wrapper.classList.add('Wrapper');
      Wrapper.id = 'wrapper';
      parentElement.appendChild(Wrapper);
    
      Wrapper.addEventListener('mouseout', function(event){
        if (document.getElementById('wrapper')) {
            document.getElementById('wrapper').remove();
        }
      });
    }
});
.col-md-6 {
        width: 375px;
        height: 211px;
        margin: 20px;
        position: relative;
    }
    
        .Wrapper {
        display: table;
        position: absolute;
        background-color: rgba(0, 0, 0, 0.5);
        height: 100% !important;
        width: 100%;
        text-align: center;
        z-index: 1000;
        font-family: arial;
        color: #fff;
        top: 0;
    }

    .redirectCenter {
        display: table-cell;
        vertical-align: middle;
    }
<div class="col-md-6">
<img src="https://www.blog.google/static/blog/images/google-200x200.7714256da16f.png" />
</div>

【讨论】:

  • 感谢您的帮助!我已经更新了我的问题。请让我知道可能的解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2015-03-29
  • 2021-12-23
相关资源
最近更新 更多