创建 ::after 伪元素导致背面可见性问题

Creating ::after pseudo element causing problems with backface-visibility

我正在尝试制作一张翻转卡片,它的阴影在翻转时会淡入淡出。我读过最有效的方法(就渲染而言)为阴影设置动画是创建一个不透明度为 0 的 ::after 伪元素并将阴影淡入。我附上了两个片段,一个没有阴影工作正常,第二个有阴影并且有奇怪的效果。本质上,当存在伪元素时,backface-visiblity 属性 似乎出现故障(或者我遗漏了一些东西)但基本上卡片的背面在它被翻转之前立即显示出来。我放慢了动画速度,并在卡片背面添加了红色阴影,以便很容易看出发生了什么。

提前致谢。

.card {
  perspective: 50rem;
  background-color: #fff;
  box-shadow: 5px 10px 10px rgba(51, 51, 51, 0.8); 
  width: 200px;
  height: 300px;}
  .card--flip {
    background: none;
    box-shadow: none; }
  .card__side {
  
    height: 400px;
    width: 100%;
    box-shadow: none;
    background-color: #777;
    transition: all 3s ease;
    position: absolute;
    top: 0;
    left: 0;
    backface-visibility: hidden; }
    .card__side--front::after {
      box-shadow: 5px 10px 10px rgba(51, 51, 51, 0.8);    
      opacity: 1;
      transition: all 3s ease; }
    .card__side--back {
      transform: rotateY(-180deg); }
      .card__side--back::after {
        box-shadow: 5px 10px 10px rgba(255, 0, 0, 0.8);
        opacity: 0;
        transition: all 3s ease; }
  .card:hover .card__side--front {
    transform: rotateY(180deg); }
    .card:hover .card__side--front::after {
      opacity: 0; }
  .card:hover .card__side--back {
    transform: rotateY(0); }
    .card:hover .card__side--back::after {
      opacity: 1; }
  .card__header {
    padding: 2rem; }
  .card__main {
    padding: 2rem; }
      WORKING
      <div class="card card--flip">
        <div class="card__side card__side--front">
          <div class="card__header">
            <h1>FRONT</h1>
          </div>
          <div class="card__main">front</div>
        </div>
        <div class="card__side card__side--back">
          <div class="card__header">
            <h1>BACK</h1>
          </div>
          <div class="card__main">back</div>
        </div>
      </div>

.card {
  height: 400px;
  width: 200px;
  perspective: 50rem;
  background-color: #fff;
  box-shadow: 5px 10px 10px rgba(51, 51, 51, 0.8); }
  .card--flip {
    background: none;
    box-shadow: none; }
  .card__side {
    width: 100%;
    box-shadow: none;
    background-color: #777;
    transition: all 3s ease;
    position: absolute;
    top: 0;
    left: 0;
    backface-visibility: hidden; }
    
 /* ADDED PSEUDO ELEMENT */
    .card__side::after {
      content: "";
      position: absolute;
      top: 0;
      left: 0;
      z-index: -10;
      width: 100%;
      height: 100%; }
 
  
    .card__side--front::after {
      box-shadow: 5px 10px 10px rgba(51, 51, 51, 0.8);
      opacity: 1;
      transition: all 3s ease; }
    .card__side--back {
      transform: rotateY(-180deg); }
      .card__side--back::after {
        box-shadow: 5px 10px 10px rgba(255, 0, 0, 0.8);
        opacity: 0;
        transition: all 3s ease; }
  .card:hover .card__side--front {
    transform: rotateY(180deg); }
    .card:hover .card__side--front::after {
      opacity: 0; }
  .card:hover .card__side--back {
    transform: rotateY(0); }
    .card:hover .card__side--back::after {
      opacity: 1; }
  .card__header {
    padding: 2rem; }
  .card__main {
    padding: 2rem; }
      NOT WORKING
      (added pseudo ::after class)
      <div class="card card--flip">
        <div class="card__side card__side--front">
          <div class="card__header">
            <h1>FRONT</h1>
          </div>
          <div class="card__main">front</div>
        </div>
        <div class="card__side card__side--back">
          <div class="card__header">
            <h1>BACK</h1>
          </div>
          <div class="card__main">back</div>
        </div>
      </div>

将以下内容添加到您的 class:

  .card {
  ...
  -webkit-transform-style: preserve-3d;
  transform-style: preserve-3d;
  }