You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSS鼠标悬停时Overlay遮罩层闪烁问题求助

问题:鼠标悬停时Overlay遮罩层闪烁问题解决

我想要实现鼠标悬停时Overlay遮罩层的淡入淡出效果:默认状态下Overlay的透明度为0.4,鼠标悬停时透明度变为0。但当前实现出现了闪烁问题,尝试了两种方案均未解决:

第一种方案(使用transition)

.MainPageCountry {
  display: flex;
}
.MainPageCountryContent {
  position: relative;
}
.overlay {
  position: absolute;
  top: 0;
  left: 0;
  background-color: #000;
  width: 100%;
  height: 100%;
  z-index: 2;
  opacity: 0.4;
  transition: 0.5s ease;
}
.overlay:hover {
  opacity: 0;
}
.overlay-country-name {
  font-size: 20px;
  margin: 0;
  padding: 3px 6px;
  border-radius: 5px;
  color: #fff;
  position: absolute;
  bottom: 15px;
  left: 15px;
  background-color: #000;
  z-index: 3;
}

第二种方案(使用@keyframes)

.MainPageCountry {
  display: flex;
}
.MainPageCountryContent {
  position: relative;
}
.overlay {
  position: absolute;
  top: 0;
  left: 0;
  background-color: #000;
  width: 100%;
  height: 100%;
  z-index: 2;
  opacity: 0.4;
}
.overlay:hover {
  animation: fadeOverlay 1s forwards;
}
@keyframes fadeOverlay {
  10% {
    opacity: 0;
  }
}
.overlay-country-name {
  font-size: 20px;
  margin: 0;
  padding: 3px 6px;
  border-radius: 5px;
  color: #fff;
  position: absolute;
  bottom: 15px;
  left: 15px;
  background-color: #000;
  z-index: 3;
}

对应的HTML代码

<div class="MainPageCountry">
  <div class="MainPageCountryContent">
    <img class="MainPageCountryImage" src="..." alt="flag" />
    <div class="overlay"></div>
    <p class="overlay-country-name">Country Name</p>
  </div>
</div>

解决方案

闪烁的核心原因是:直接给.overlay绑定hover事件后,当遮罩层透明度变为0时,鼠标会“穿透”遮罩层,触发鼠标离开事件,导致遮罩层重新恢复透明度,接着又触发hover,循环往复造成闪烁。

正确的做法是把hover事件绑定到父容器.MainPageCountryContent上,父容器始终存在,不会因为遮罩层的透明度变化而丢失鼠标的hover状态。以下是修改后的代码(推荐使用transition方案,更简洁):

.MainPageCountry {
  display: flex;
}
.MainPageCountryContent {
  position: relative;
  /* 确保父容器能接收hover事件 */
  cursor: pointer;
}
.overlay {
  position: absolute;
  top: 0;
  left: 0;
  background-color: #000;
  width: 100%;
  height: 100%;
  z-index: 2;
  opacity: 0.4;
  transition: opacity 0.5s ease; /* 明确指定过渡属性,更规范 */
}
/* 父容器hover时,修改子元素overlay的透明度 */
.MainPageCountryContent:hover .overlay {
  opacity: 0;
}
.overlay-country-name {
  font-size: 20px;
  margin: 0;
  padding: 3px 6px;
  border-radius: 5px;
  color: #fff;
  position: absolute;
  bottom: 15px;
  left: 15px;
  background-color: #000;
  z-index: 3;
}

HTML代码无需修改,保持原样即可。这样修改后,鼠标悬停在父容器区域内时,遮罩层会平滑过渡到透明度0,离开时恢复0.4,不会出现闪烁问题。


内容的提问来源于stack exchange,提问作者turanarican

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:22:36