【javascript】canvasでフェードインのアニメーションを作ってみよう

フェードインの作成方法

canvasの2次元の描画用コンテキストには、globalAlphaというプロパティで透明度を設定することができる。
この透明度の値を0(透明)から1(不透明)に徐々に変えていくことでフェードインのアニメーションを作成することができます。
globalAlpha 0 で画像を描画する。
globalAlpha 0.1 で画像を描画する。
…中略
globalAlpha 1 で画像を描画する。
このglobalAlphaの値を0~1に変える時間がフェードインのアニメーションの時間になります。

globalAlphaの値が0の場合

alphaの値が0なので透明の状態です。

window.addEventListener( 'DOMContentLoaded', function( ) {
  var canvas = document.querySelector( '#canvas-alpha0-255' );
  var context2d = canvas.getContext( '2d' );
  var x = 0;
  var y = 0;
  var width;
  var height;
  var alpha = 0;
  var img = new Image();
  img.src = 'http://creakazukin.wp.xdomain.jp/wp-content/uploads/2018/02/cat2.jpg';
  img.onload = function( ) {
    width = Math.min( img.width, canvas.width );
    height = Math.min( img.height, canvas.height );
    draw();
  };

  function draw(){
    context2d.clearRect(0, 0, canvas.width, canvas.height);
    context2d.globalAlpha = alpha;
    context2d.drawImage( img, x, y, width, height );
  }
  
} );

CANVAS

globalAlphaの値が0.5の場合

alphaの値が0.5なので半分透明な状態です。

window.addEventListener( 'DOMContentLoaded', function( ) {
  var canvas = document.querySelector( '#canvas-alpha50-255' );
  var context2d = canvas.getContext( '2d' );
  var x = 0;
  var y = 0;
  var width;
  var height;
  var alpha = 0.5;
  var img = new Image();
  img.src = 'http://creakazukin.wp.xdomain.jp/wp-content/uploads/2018/02/cat2.jpg';
  img.onload = function( ) {
    width = Math.min( img.width, canvas.width );
    height = Math.min( img.height, canvas.height );
    draw();
  };

  function draw(){
    context2d.clearRect(0, 0, canvas.width, canvas.height);
    context2d.globalAlpha = alpha;
    context2d.drawImage( img, x, y, width, height );
  }
  
} );

CANVAS

globalAlphaの値が1の場合

alphaの値が1なので不透明な状態です。

window.addEventListener( 'DOMContentLoaded', function( ) {
  var canvas = document.querySelector( '#canvas-alpha100-255' );
  var context2d = canvas.getContext( '2d' );
  var x = 0;
  var y = 0;
  var width;
  var height;
  var alpha = 1;
  var img = new Image();
  img.src = 'http://creakazukin.wp.xdomain.jp/wp-content/uploads/2018/02/cat2.jpg';
  img.onload = function( ) {
    width = Math.min( img.width, canvas.width );
    height = Math.min( img.height, canvas.height );
    draw();
  };

  function draw(){
    context2d.clearRect(0, 0, canvas.width, canvas.height);
    context2d.globalAlpha = alpha;
    context2d.drawImage( img, x, y, width, height );
  }
  
} );

CANVAS

サンプル

画像をフェードインで表示するサンプルです。
下のバーを動かしてフェードインの時間を設定できます。
描画はrequestAnimationのタイミングで実行されるので、時間は目安程度になります。
大体requestAnimationだと1秒間に60回ほど描画されるそうです。

window.addEventListener( 'DOMContentLoaded', function( ) {
  var canvas = document.querySelector( '#canvas-255' );
  var context2d = canvas.getContext( '2d' );
  var fadeinRange = document.querySelector( '#fadein-time-255' );
  var fadeinLabel = document.querySelector( '#fadein-label-255' );
  var retryBtn = document.querySelector( '#retry-255' );
  var x = 0;
  var y = 0;
  var width;
  var height;
  var alpha = 0;
  var time;
  var img = new Image();
  img.src = 'http://creakazukin.wp.xdomain.jp/wp-content/uploads/2018/02/cat2.jpg';
  img.onload = function( ) {
    width = Math.min( img.width, canvas.width );
    height = Math.min( img.height, canvas.height );
    window.requestAnimationFrame( draw );
  };

  function draw(){
    context2d.clearRect(0, 0, canvas.width, canvas.height);
    context2d.globalAlpha = alpha;
    context2d.drawImage( img, x, y, width, height );
    
    alpha += ( 1 / 60 ) / time;
    window.requestAnimationFrame( draw );
  }

  fadeinRange.addEventListener( 'change', setTime );
  retryBtn.addEventListener( 'click', resetAlpha );

  function setTime() {
    time = fadeinRange.value / 10;
    fadeinLabel.innerText = time;
    resetAlpha();
  }
  setTime();

  function resetAlpha() {
    alpha = 0;
  }
  
} );

CANVAS

フェードインの時間

【javascript】canvasでアニメーションを作ろう

使用するクラス

HTMLCanvasElement

関数

  • getContext(contextType)

CanvasRenderingContext2D

関数

  • fillRect(x, y, width, height)
  • fillText(text, x, y)

プロパティ

  • fillStyle
  • font

アニメーションの考え方

canvasでアニメーションを作るには、setInterval関数やrequestAnimationFrame関数などの一定時間毎に繰り返し描画処理を実行してあげます。canvasの内容を消して、新しく描く。canvasの内容を消して、新しく描く。これを短い間隔で繰り返しながら位置を変えてあげたり、大きさを変えたり、色を変えたりすることによって表現できます。

サンプル

文字列を動かすアニメーションのサンプルです。動く速さや文字列を変えると、サンプルのcanvasに反映されます。このサンプルでは文字列ですが、丸や四角などのアニメーションも簡単に作れます。
丸や四角などの図形の描画方法は「【javascript】canvasに丸や四角や文字などを描いてみよう」こちらの記事に書いてあります。

window.addEventListener( 'load', function(){
  let canvas = document.querySelector('#sample-canvas70');
  let context = canvas.getContext('2d');
  context.font = "bold 20px 'Courier'";
  let x = 0;
  let y = 24;
  let moveX = 0.6;
  let moveY = 1;
  let text = 'javascript';
  let paddingX = text.length * 26 / 2;
 let paddingY = 24;
  function draw(){
    context.fillStyle = 'rgba(255, 255, 255, 1)';
    context.fillRect(0, 0, canvas.width, canvas.height);    
    context.fillStyle = 'rgb(255, 120, 25)';
    context.fillText(text, x, y);
    x += moveX;
    y += moveY;
    if(x < 0)
      moveX = Math.abs(moveX);
    if(canvas.width - paddingX < x )
      moveX = -Math.abs(moveX);
    if(y < 0 + paddingY)
      moveY = Math.abs(moveY);
    if(canvas.height < y)
      moveY = -Math.abs(moveY);
    window.requestAnimationFrame(draw);
  }
  window.requestAnimationFrame(draw);
  let moveXEle = document.querySelector('#move-x70');
  let moveYEle = document.querySelector('#move-y70');
  let canvasText = document.querySelector('#canvas-text70');
  moveXEle.addEventListener('change', function(){
    moveX = moveX < 0 ? -Math.abs(this.value / 10) : this.value / 10;
  });
  moveYEle.addEventListener('change', function(){
    moveY = moveY < 0 ? -Math.abs(this.value / 10) : this.value / 10;
  });
  canvasText.addEventListener('change', function(){
    text = this.value;
    paddingX = text.length * 26 / 2;
  });
});


横軸の動く速さ


縦軸の動く速さ


動いている文字