LoginSignup
3
8

More than 5 years have passed since last update.

《JavaScript》画像を抽出して、波打たせるようなアニメーションをcanvasに描く。

Last updated at Posted at 2017-11-23

drawImage() で、抽出と描画座標をずらして呼び出しを繰り返すと、波打つようなアニメーションが実現できます。

ずっと見ていられる感じと、素材となる画像によっていろんな表情になるのが素敵かな、と思います。

demo

マウスオ−バーすると画像が現れます。

Html


<canvas id="canvas" data-src=test.jpg" width="300" height="300"></canvas>

JavaScript


/**
 * 画像を抽出して、波打たせるようなアニメーション
 * マウスオーバーすると画像が現れる
 */
const waveAnim = () => {

  let canvas  = document.getElementById('canvas'),
      ctx     = canvas.getContext('2d'),
      canvasW = canvas.width,
      canvasH = canvas.height,
      img     = new Image();

  img.src = canvas.getAttribute('data-src');

  /**
   * 停止させるためのid
   */
  let animId;

  /**
   * 読み込み位置を管理する
   */
  let x = 1,
      r = -1;

  /**
   * 画像の横1px縦いっぱいの色情報で塗りつぶす
   */
  const wave = () => {

    /**
     * 反転させる
     */
    x == canvasW ? r = -1 : 0 == x && (r = 1);

    ctx.drawImage(img, x, 0, 1, canvasH, -x, 0, canvasW + x, canvasH);
    x += r;

    /**
     * setInterval で速さを決めたり可変させてもいい
     */
    animId = requestAnimationFrame(wave);

  };
  img.onload = wave;


  /**
   * 波打ちながら元画像が現れる
   */
  const show = () => {

    ctx.drawImage(img, x, 0, 1, canvasH, x, 0, canvasW, canvasH);
    x < canvasW ? (x++) : cancelAnimationFrame(animId);

    animId = requestAnimationFrame(show);

  };


  /**
   * アニメーションのリセット
   */
  const reset = () => {

    cancelAnimationFrame(animId);
    ctx.clearRect(0, 0, canvasW, canvasH);
    x = 1;
    r = -1;

  };

  /**
   * canvas に触れると画像が現れる
   */
  canvas.addEventListener('mouseover', () => {

    reset();
    show();

  });

};

waveAnim();

おわります。

3
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
8