在Chrome和Edge中使用jQuery闪烁隐藏和显示元素

时间:2016-11-23 13:13:06

标签: javascript jquery css google-chrome animation

我正在尝试使用jQuery创建一个简单的动画,它在Firefox中运行得非常好,但它在Chrome和Edge中闪烁,这里是jsfiddle,这里是代码:

HTML

<div id="boxes-wrapper">
  <div class="box"></div><div class="box"></div><div class="box"></div>
</div>

CSS

.box {
  width: 150px;
  height: 150px;
  display: inline-block;
  margin: 0;
  padding: 0;
  vertical-align: top;
}

.box:first-child {
  background: pink;
}

.box:nth-child(2) {
  background: skyblue;
}

.box:nth-child(3) {
  background: gold;
}

.box.hover {
  position: relative;
  z-index: 20;
}

html, body {
  position: relative;
  width: 100%;
  height: 100%;
}

#shadow {
  display: none;
  position: absolute;
  left: 0;
  top: 0;
  background: black;
  opacity: 0.7;
  z-index: 10;
  width: 100%;
  height: 100%;
}

的JavaScript

$('.box').hover(function() {
    $(this).addClass('hover');
  $('#shadow').show();
}, function() {
    $(this).removeClass('hover');
  $('#shadow').hide();
});

我在SO上挖了几个问题,但没有人回答如何摆脱闪烁。

1 个答案:

答案 0 :(得分:2)

好的,问题是你的叠加层覆盖了非悬停的盒子,所以它当前需要消失才能悬停其他盒子。

闪光灯是由您的盒子之间的空间引起的 - 只要鼠标离开,叠加层就会被隐藏。

为了解决这个问题,你需要混合使用css并将覆盖的悬停移动到盒子包装器(代码中的注释):

&#13;
&#13;
// remove overlay from this:
$('.box').hover(function() {
  $(this).addClass('hover');
}, function() {
  $(this).removeClass('hover');
});

// add this:
$('#boxes-wrapper').hover(function() {
  $('#shadow').show();
}, function() {
  $('#shadow').hide();
});
&#13;
html,
body {
  position: relative;
  width: 100%;
  height: 100%;
}
#boxes-wrapper {
  float: left;
  /*this makes the wrapper the same width as the boxes, you may need to add a clear fix after this*/
}
.box {
  width: 150px;
  height: 150px;
  display: inline-block;
  margin: 0;
  padding: 0;
  vertical-align: top;
}
.box:first-child {
  background: pink;
}
.box:nth-child(2) {
  background: skyblue;
}
.box:nth-child(3) {
  background: gold;
}
.box.hover {
  position: relative;
  z-index: 20;
}
#shadow {
  display: none;
  position: absolute;
  left: 0;
  top: 0;
  background: black;
  opacity: 0.7;
  z-index: 10;
  width: 100%;
  height: 100%;
  /* add the following - means that the mouse hover will "go through" the overlay */
  pointer-events: none;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="boxes-wrapper">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>

<div id="shadow"></div>
&#13;
&#13;
&#13;