トップへ(mam-mam.net/)

Javascriptのanimate()でアニメーション再生

検索:

Javascriptのanimate()メソッドでアニメーションを再生する

element.animate(キーフレーム, オプション)

オプション

delay:
アニメーション開始を遅らせるミリ秒数
direction:
アニメーションの方向と反復で以下のいずれかを指定できる
  • 'normal' : 順方向
  • 'reverse' : 逆順
  • 'alternate' : 順方向から開始して反復
  • 'alternate-reverse' : 逆順から開始して反復
duration:
アニメーションが完了するまでにかかるミリ秒
easing:
アニメーションの変化率で以下のような値を指定できる
  • 'linear' : 線形補間
  • 'ease' : 補間がゆっくりと始まり、急激に加速し、最後に向かって徐々に遅くなる
  • 'ease-in: 補間がゆっくりと開始され、最後まで徐々に速度が上がり、終了時点で突然停止する'
  • 'ease-out : 補間が突然始まり、最後に向かって徐々に速度が低下する'
  • 'ease-in-out : 補間がゆっくりと開始され、速度が上がり、最後に近づくにつれて速度が低下する'
  • 'step-start' : 補間が直ちに最終状態にジャンプし、最後までその状態が維持される
    'steps(1, jump-start)' または 'steps(1, start)' を表します
  • 'step-end' : 補間が最後まで初期状態に留まり、その時点で最終状態に直接ジャンプする
    'steps(1, jump-end)' または 'steps(1, end)' を表します
  • 'cubic-bezier(0.42,0,0.58,1)'
endDelay:
終了後に遅延するミリ秒数
fill:
アニメーションの前後に効果を要素に反映するか
  • 'backforwards' : アニメーションの効果を再生前に要素に反映する
  • 'forwards' : アニメーションの再生が完了した後も保持する
  • 'both' : 両方(backforwards+forwards)
  • 'none' : 無し
iterationStart:
反復のどの時点でアニメーションを開始するか
例えば iterationStart:0.5, で1回目の反復の途中(真ん中)で再生を開始する
iterations
反復回数
pseudoElement:
指定したエレメントではなく指定した疑似要素にアニメーションさせることができる
例えば pseudoElement: "::before", で疑似要素::beforeに適用することができる

サンプル

背景「白⇒黒⇒白」、文字色「赤⇒緑⇒赤」にアニメーション

ここがアニメーションします

<input type="button" onclick="ani1()" value="アニメーション開始">
<span id="ani1" style="font-weight:bold;font-size:18px;color:#ff0000;background:#fff;">
  ここがアニメーションします
</span>
<script>
  function ani1(){
    const ani1=document.querySelector("#ani1");
    ani1.animate(
      [
        {color:'#ff0000',background:'#fff'},
        {color:'#00ff00',background:'#000'},
        {color:'#ff0000',background:'#fff'},
      ],{
        delay: 0,
        direction: 'normal',
        duration: 2000,
        easing: 'linear',
        endDelay: 0,
        fill: 'both',
        iterationStart: 0.0,
        iterations: 1,
      }
    );
  }
</script>

不透明度(opacity)「1⇒0⇒1」にアニメーション

ここがアニメーションします

<input type="button" onclick="ani2()" value="アニメーション開始">
<span id="ani2" style="font-weight:bold;font-size:18px;color:#ff0000;background:#fff;">
  ここがアニメーションします
</span>
<script>
  function ani2(){
    const ani2=document.querySelector("#ani2");
    ani2.animate(
      [
        {opacity:1}, {opacity:0}, {opacity:1}
      ],{
        delay: 0,
        direction: 'normal',
        duration: 1000,
        easing: 'linear',
        endDelay: 0,
        fill: 'both',
        iterationStart: 0.0,
        iterations: 1,
      }
    );
  }
</script>

360度回転(rotateY)するアニメーション

ここがアニメーションします

<input type="button" onclick="ani3()" value="アニメーション開始">
<span id="ani3" style="font-weight:bold;font-size:18px;color:#000;display:inline-block;">
  ここがアニメーションします
</span>
<script>
  function ani3(){
    const ani3=document.querySelector("#ani3");
    ani3.animate(
      [
        {transform: 'rotateY(0deg)'}, {transform: 'rotateY(360deg)'}
      ],{
        delay: 0,
        direction: 'normal',
        duration: 2000,
        easing: 'linear',
        endDelay: 0,
        fill: 'both',
        iterationStart: 0.0,
        iterations: 1,
      }
    );
  }
</script>

360度回転(rotateZ)、大きさ(scale)[100%⇒10%⇒100%]するアニメーション

ここがアニメーションします

<input type="button" onclick="ani4()" value="アニメーション開始">
<span id="ani4" style="font-weight:bold;font-size:18px;color:#000;display:inline-block;">
  ここがアニメーションします
</span>
<script>
  function ani4(){
    const ani4=document.querySelector("#ani4");
    ani4.animate(
      [
        {transform: 'scale(100%,100%) rotateZ(  0deg)'},
        {transform: 'scale( 10%, 10%) rotateZ(180deg)'},
        {transform: 'scale(100%,100%) rotateZ(360deg)'}
      ],{
        delay: 0,
        direction: 'normal',
        duration: 2000,
        easing: 'linear',
        endDelay: 0,
        fill: 'both',
        iterationStart: 0.0,
        iterations: 1,
      }
    );
  }
</script>

疑似要素::beforeにアニメーション

←ここがアニメーションします

<input type="button" onclick="ani5()" value="アニメーション開始">
<span id="ani5" style="font-weight:bold;font-size:18px;color:#000;display:inline-block;position:relative;padding-left:1em;box-sizing:border-box;">
  ←ここがアニメーションします
</span>
<style>
  #ani5::before{
    content:"■";
    position:absolute;
    left:0;
  }
</style>
<script>
  function ani5(){
    const ani5=document.querySelector("#ani5");
    ani5.animate(
      [
        {transform: 'translate( 0.0em, 0.0em) rotateZ(  0deg)', color:'#000'},
        {transform: 'translate( 0.5em, 0.5em) rotateZ( 90deg)', color:'#f00'},
        {transform: 'translate( 0.0em, 0.0em) rotateZ(180deg)', color:'#0f0'},
        {transform: 'translate(-0.5em,-0.5em) rotateZ(270deg)', color:'#00f'},
        {transform: 'translate( 0.0em, 0.0em) rotateZ(360deg)', color:'#000'}
      ],{
        delay: 0,
        direction: 'normal',
        duration: 2000,
        easing: 'linear',
        endDelay: 0,
        fill: 'both',
        iterationStart: 0.0,
        iterations: 1,
        pseudoElement: "::before",
      }
    );
  }
</script>