【问题标题】:CSS3 animation won't stop on the last frameCSS3 动画不会在最后一帧停止
【发布时间】:2015-06-26 00:45:05
【问题描述】:

我遇到了一个问题,我的 sprite-sheet 动画不会在最后一帧停止 - 我已将 animation-iteration-count 更改为“1”并将 animation-fill-mode 更改为“转发”,但它似乎没有工作。

动画也不会回到第一帧,它会运行到最后,然后跳回到精灵表最后一行的第一帧。

所以我觉得我快到了,但也许我错过了什么?

我在这里整理了一个例子来演示。

.container {
  width: 64px;
  height: 64px;
  position: relative;
}

@-webkit-keyframes spritex {
  0% {
    background-position-x: 0%;
    background-position-y: 0%;
  }
  20% {
    background-position-x: -500%;
    background-position-y: 0%;
  }
  20.01% {
    background-position-x: 0%;
    background-position-y: -100%;
  }
  40% {
    background-position-x: -500%;
    background-position-y: -100%;
  }
  40.01% {
    background-position-x: 0%;
    background-position-y: -200%;
  }
  60% {
    background-position-x: -500%;
    background-position-y: -200%;
  }
  60.01% {
    background-position-x: 0%;
    background-position-y: -300%;
  }
 80% {
    background-position-x: -500%;
    background-position-y: -300%;
  }
  
  80.01% {
    background-position-x: 0%;
    background-position-y: -400%;
  }
  99.99% {
    background-position-x: -500%;
    background-position-y: -400%;
  }
  100% {
    background-position-x: -500%;
    background-position-y: -400%;
  }
}

.sprite {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-image: url(http://i296.photobucket.com/albums/mm182/CodeH4x0r/explosion17.png);
  background-size: 500% 500%;
  -webkit-animation: spritex 3s steps(5) 1;
  -webkit-animation-fill-mode: forwards;
  animation: spritex 3s steps(5) 1;
  animation-fill-mode: forwards;
}
}
<div class="container">
<div class="sprite"></div>
</div>

(View in Codepen)

【问题讨论】:

    标签: css animation css-animations


    【解决方案1】:

    您的位置不正确。 正确位置不应高于 100%。

    这是正确的

    .container {
      width: 64px;
      height: 64px;
      position: relative;
    }
    
    @-webkit-keyframes spritex {
      0% {
        background-position-x: 0%;
        background-position-y: 0%;
      }
      20% {
        background-position-x: 100%;
        background-position-y: 0%;
      }
      20.01% {
        background-position-x: 0%;
        background-position-y: 25%;
      }
      40% {
        background-position-x: 100%;
        background-position-y: 25%;
      }
      40.01% {
        background-position-x: 0%;
        background-position-y: 50%;
      }
      60% {
        background-position-x: 100%;
        background-position-y: 50%;
      }
      60.01% {
        background-position-x: 0%;
        background-position-y: 75%;
      }
     80% {
        background-position-x: 100%;
        background-position-y: 75%;
      }
      80.01% {
        background-position-x: 0%;
        background-position-y: 100%;
      }
      100% {
        background-position-x: 100%;
        background-position-y: 100%;
      }
    }
    
    .sprite {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-image: url(http://i296.photobucket.com/albums/mm182/CodeH4x0r/explosion17.png);
      background-size: 500% 500%;
      -webkit-animation: spritex 3s steps(4) 1;
      -webkit-animation-fill-mode: forwards;
      animation: spritex 3s steps(4) 1;
      animation-fill-mode: forwards;
    }
    }
    <div class="container">
    <div class="sprite"></div>
    </div>

    【讨论】:

      【解决方案2】:

      这里实际上有两个问题。首先,您在 step 函数中有一个错误。起始位置不应包含在传递给 step 函数的步数中。

      来自MDN

      steps(4, end)

      第二个问题是您似乎对background-position 中的百分比值代表什么有错误的认识。同样,来自MDN

      background-position CSS 属性设置初始位置, 相对于由 background-origin 定义的背景位置层 对于每个定义的背景图像。

      [...]

      百分比是指背景定位区域的大小减去 背景图像的大小; size 是指水平方向的宽度 偏移量和垂直偏移量的高度

      在这种情况下,“背景定位区域的大小”是整个精灵表的大小,“背景图像的大小”是该表中一个图像的大小。所以在这种情况下,这意味着 100% 等于精灵表中恰好 4 个空格的宽度 (5 - 1),因此 25% 等于精灵表中恰好一个空格的宽度。

      这意味着background-position-x: -500%; background-position-y: -400%; 不是您认为的位置。这就是为什么在动画结束时显示的精灵是错误的。

      所以把所有这些知识放在一起,我们最终得到了:

      .container {
        width: 64px;
        height: 64px;
        position: relative;
      }
      
      @-webkit-keyframes spritex {
        0% {
          background-position-x: 0%;
          background-position-y: 0%;
        }
        20% {
          background-position-x: 100%;
          background-position-y: 0%;
        }
        
        20.01% {
          background-position-x: 0%;
          background-position-y: 25%;
        }
        40% {
          background-position-x: 100%;
          background-position-y: 25%;
        }
        
        40.01% {
          background-position-x: 0%;
          background-position-y: 50%;
        }
        60% {
          background-position-x: 100%;
          background-position-y: 50%;
        }
        
        60.01% {
          background-position-x: 0%;
          background-position-y: 75%;
        }
        80% {
          background-position-x: 100%;
          background-position-y: 75%;
        }
        
        80.01% {
          background-position-x: 0%;
          background-position-y: 100%;
        }
        99.99% {
          background-position-x: 100%;
          background-position-y: 100%;
        }
      
        100% {
          background-position-x: 100%;
          background-position-y: 100%;
        }
      }
      
      .sprite {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background-image: url(http://i296.photobucket.com/albums/mm182/CodeH4x0r/explosion17.png);
        background-size: 500% 500%;
        -webkit-animation: spritex 3s steps(4) 1;
        -webkit-animation-fill-mode: forwards;
        animation: spritex 3s steps(4) 1;
        animation-fill-mode: forwards;
      }
      <div class="container">
        <div class="sprite"></div>
      </div>

      (View in Codepen)

      【讨论】:

        猜你喜欢
        • 2016-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-02
        相关资源
        最近更新 更多