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

CSS动画opacity导致背景图片消失问题求助

问题:添加含opacity的关键帧动画后,3D旋转Tile的背景图片消失

开发配对游戏时,Tile通过3D旋转展示背面图片,原本功能正常。添加包含opacity属性的关键帧动画后,Tile的背景图片直接消失——即使关键帧中opacity设为1也无效;移除opacity属性后恢复正常。已在Firefox和Edge(目标浏览器)测试,问题一致。

复现代码

CSS代码

@keyframes tileComplete {
  0% {
    transform: rotate3d(0, 1, 0, 0deg);
  }
  50% {
    transform: rotate3d(0, 1, 0, 180deg) scale(1);
    opacity: 1;
  }
  100% {
    transform: rotate3d(1, 1, 0, 540deg) scale(3);
    opacity: 0;
  }
}

div.tiles {
  transform-style: preserve-3d;
  transform-origin: center;
  perspective: 800px;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
}

div.tiles div.tile {
  transform-style: preserve-3d;
  transform-origin: center;
  width: 150px;
  height: 150px;
  margin: 5px;
  background-color: #000066;
  transition-property: opacity;
  transition-duration: 1s;
  opacity: 1;
  transform: rotate3d(0, 1, 0, 0deg);
  position: relative;
  cursor: pointer;
}

div.tiles div.tile div.tile-image {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-image: url("images/test.jpg");
  background-position: center;
  background-size: cover;
  transform: rotate3d(0, 1, 0, 180deg);
  z-index: 5;
  -webkit-backface-visibility: hidden;
}

div.tiles div.complete {
  animation-delay: 1s;
  animation-name: tileComplete;
  animation-duration: 2s;
  animation-delay: 0s;
  pointer-events: none;
}

HTML代码

<!doctype html>
<div>
  <div class="tiles">
    <div id="tile_0" class="tile complete">
      <div class="tile-image" style="background-image: url(images/memory_game/1.jpg);"></div>
    </div>
  </div>
</div>

问题原因

opacity属性会创建新的堆叠上下文,同时强制扁平化子元素的3D变换。当给父元素(.tile.complete)添加含opacity的动画时,子元素(.tile-image)的backface-visibility:hidden效果会失效,3D旋转的渲染逻辑被破坏,导致背景图无法正确显示。

解决方案

方案一:替换opacity为visibility/scale实现消失效果

避免在父元素动画中使用opacity,改用visibility或transform: scale(0)实现最终消失的效果,不干扰3D渲染:

@keyframes tileComplete {
  0% {
    transform: rotate3d(0, 1, 0, 0deg);
    visibility: visible;
  }
  50% {
    transform: rotate3d(0, 1, 0, 180deg) scale(1);
    visibility: visible;
  }
  100% {
    transform: rotate3d(1, 1, 0, 540deg) scale(3);
    visibility: hidden;
    /* 也可以用 transform: rotate3d(1,1,0,540deg) scale(0); 实现缩放消失 */
  }
}

方案二:分离旋转动画与透明度动画

将3D旋转动画保留在父元素,把opacity动画移到子元素(.tile-image)上,避免堆叠上下文影响3D变换:

@keyframes tileComplete {
  0% {
    transform: rotate3d(0, 1, 0, 0deg);
  }
  50% {
    transform: rotate3d(0, 1, 0, 180deg) scale(1);
  }
  100% {
    transform: rotate3d(1, 1, 0, 540deg) scale(3);
  }
}

@keyframes tileImageFade {
  0%, 50% {
    opacity: 1;
  }
  100% {
    opacity: 0;
  }
}

div.tiles div.complete {
  animation-name: tileComplete;
  animation-duration: 2s;
  pointer-events: none;
}

div.tiles div.complete .tile-image {
  animation-name: tileImageFade;
  animation-duration: 2s;
  animation-fill-mode: forwards;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:35:39