【javascript】Oscillatorを使って音を出してみよう

Oscillatorとは

javascriptには「WebAudio API」という技術があります。
WebAudio APIではブラウザ上で音を扱うための機能がたくさんあります。
今回作成するのはWebAudio APIの中の「Oscillator」というものを使用して、ブラウザ上で音を出力するサンプルです。

Oscillatorの生成

Oscillatorは「AudioContext」のインスタンスから生成します。

window.addEventListener( 'DOMContentLoaded', function( ){
  var audioCtx = new (window.AudioContext || window.webkitAudioContext )();
  var oscillator = audioCtx.createOscillator();
} );

これでは生成しただけなので音は出ませんが、この様に「AudioContext」からcreateOscillatorメソッドを使用して取得します。

Oscillatorによる音の出力

Oscillatorの生成で説明した通り、まずはAudioContextからOscillatorを取得します。
今回は440Hzの音(ラ音)を出力するために、Oscillator.frequencyに440Hzの値を設定します。
取得したOscillatorをAudioContext.destinationに接続してあげると、音を出力する準備が整います。
最後にstartメソッドを呼び出して音を出力し、stopメソッドで音の出力を止めます。

window.addEventListener( 'DOMContentLoaded', function( ){
  var audioCtx = new (window.AudioContext || window.webkitAudioContext )();

  var sample268Btn = document.querySelector( '#sample-268' );
  sample268Btn.addEventListener( 'click', function(){
    var oscillator = audioCtx.createOscillator();
    oscillator.frequency.value = 440;
    oscillator.connect( audioCtx.destination );
    oscillator.start();
    oscillator.stop( audioCtx.currentTime + 0.5 );
  } );
} );

※ボタンを押すと音が出ますのでご注意ください。

ここで気を付けたいのが、Oscillatorをstartしてstopして再度startする…事はできません。
ですので、ボタンを押すたびにOscillatorを生成してstartとstopを呼び出すようにしています。

サンプル

では音を出力する方法がわかったので、ピアノの鍵盤のサンプルを作ってみました。
鍵盤をクリックするとその音階の音が出力されます。

window.addEventListener( 'DOMContentLoaded', function( ){
  var audioCtx = new (window.AudioContext || window.webkitAudioContext )();

  var sample268Keys = document.querySelectorAll( '#keyboard-268 .key' );
  for( var i = 0; i < sample268Keys.length; i++ ){
    sample268Keys[ i ].addEventListener( 'click', function( e ) {
      var oscillator = audioCtx.createOscillator();
      var hz = e.target.dataset.hz || e.target.parentNode.dataset.hz;
      oscillator.frequency.value = hz;
      oscillator.connect( audioCtx.destination );
      oscillator.start();
      oscillator.stop( audioCtx.currentTime + 0.5 );
    } );
  }
} );

※音が出ますのでご注意ください。

ファ

【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

フェードインの時間

【CSS】mask-imageを使って文字や背景にテクスチャを適用してみよう

使用するスタイル

mask-image: {none | url() | linear-gradient() | image() };

概要

mask-imageのプロパティに設定した内容でマスキングをします。SVGを使用してマスクしたり、グラデーションを使ってマスクしたり、画像を使ってマスクすることができます。設定された内容のalphaの値でマスキングされます(rgbaのaの部分)。
試しに、左端をrgba( 255, 255, 255, 1 )、右端をrgba( 255, 255, 255, 0 )のグラデーションにしてみましょう。
グラデーションの作成方法はこちらをご覧ください。

サンプルテキスト Sample Text

上記のサンプルテキストのソースは下記です。

HTML
<div class="case-234"><span>サンプルテキスト Sample Text</span></div>
CSS
.case-234 { text-align: center; } .case-234 span { -webkit-mask-image: linear-gradient( to right, rgba( 255, 255, 255, 1 ), rgba( 255, 255, 255, 0 ) ); mask-image: linear-gradient( to right, rgba( 255, 255, 255, 1 ), rgba( 255, 255, 255, 0 ) ); }

サンプル

mask-imageを使用してサンプルを作成しました。

mask-imageでヒョウ柄の文字を作成

あらかじめヒョウ柄のテクスチャーを用意して、透明度を設定しておきます。
必要ならここから落としてください。

.sample1-234 {
  color: hotpink;
  font-size: 60px;
  font-weight: 600;
  -webkit-mask-image: url( http://creakazukin.wp.xdomain.jp/wp-content/uploads/2018/02/hyou.png );
  mask-image: url( http://creakazukin.wp.xdomain.jp/wp-content/uploads/2018/02/hyou.png );
  -webkit-mask-size: 40px;
  mask-size: 40px;
  text-shadow: 1px   1px black,
                      -1px   1px black,
                        1px -1px black,
                      -1px -1px black;
}

豹柄の文字だよ

【javascript】cookieとlocalStorageとsessionStorageの違い

cookieの使い方はこちら
localStorageの使い方はこちら
sessionStorageの使い方はこちら

サーバーにデータを送信するかしないか

cookieではページのリクエスト(リンクを踏んで移動する時など)を送信した際に、cookieの情報もサーバーに送信される。一方localStorageとsessionStorageはサーバーに送信されないという違いがある。

容量の違い

cookieは5KB程度までしかデータを保存できないが、localStorage、sessionStorageでは利用するブラウザによって容量が違うが、およそ5MBぐらいはデータを保存できる。

有効期限の違い

cookieは有効期限を設定する事ができる。ただし、設定しなかった場合はブラウザを閉じるとデータが消去される。localStorageでは半永久的にデータが保存され、sessionStorageではそのページを開いている間だけ使用する事ができる。

アクセスできる範囲(スコープ)の違い

cookieとlocalStorageでは、別ウィンドウでも同じデータにアクセスする事ができるが、sessionStorageでは開いているウィンドウで設定したデータは、その開いているウィンドウでしかアクセスすることができない。

まとめ

cookieとlocalStorageとsessionStorageの違いを表にまとめると、下記のようになります。

種類 サーバに送信 容量 有効期限 スコープ
cookie 5KB程度 設定による 共有
localStorage × 5MB(ブラウザによる) 半永久 共有
sessionStorage × 5MB(ブラウザによる) ウィンドウ・タブを閉じるまで そのウィンドウ・タブのみ

【javascript】sessionStorageを使ってデータを保存してみよう

sessionStorageとは

sessionStorageとはlocalStorageと同じようにクライアント側(ブラウザ)でデータを保存することができます。
しかし、sessionStorageを使用した場合はページのセッションが終了したとき(ページを閉じたとき)に保存したデータも消去されます。
localStorageを使ったデータの保存方法はこちら

sessionStorageの操作方法

sessionStorageに値を保存する

sessionStorage.setItem( [key], [value] );

keyとvalueを引数に設定し、sessionStorageにkeyとvalueのセットを保存します。

sessionStorageからデータを取得する

sessionStorage.getItem( [key] );

keyを引数に設定し、指定されたkeyでsessionStorageに保存した値を取得します。

sessionStorageに登録されているセットを削除する

sessionStorage.removeItem( [key] );

keyを引数に設定し、指定されたkeyをsessionStorageから削除します。

サンプル

sessionStorageに値をセットしたり削除したりするサンプル

サンプルコード

window.addEventListener( 'load', function( ){
    var key219 = document.querySelector( '#key-219' );
    var value219 = document.querySelector( '#value-219' );
    var setBtn219 = document.querySelector( '#set-btn-219' );
    var removeBtn219 = document.querySelector( '#remove-btn-219' );
    var sessionStorage219 = document.querySelector( '#sessionStorage-219' );
    displaySessionStorage();

    setBtn219.addEventListener( 'click', handleSetBtnClick, false );
    function handleSetBtnClick( e ){
        var key = key219.value;
        var value = value219.value;
        if( key ){
            sessionStorage.setItem( key, value );
            displaySessionStorage();
        }
    }

    removeBtn219.addEventListener( 'click', handleRemoveBtnClick, false );
    function handleRemoveBtnClick( e ){
        var key = key219.value;
        sessionStorage.removeItem( key );
        displaySessionStorage();
    }

    function displaySessionStorage( ){
        sessionStorage219.innerText  = "";
        for( var i = 0; i < sessionStorage.length; i++ ){
            if( i > 0 )
                sessionStorage219.innerText += ", ";

            var key = sessionStorage.key( i );
            sessionStorage219.innerText += key + ":" + sessionStorage.getItem( key );
        }
    }
} );

下のテキストボックスの「keyの値」と「valueの値」何か入力し、「setItem」ボタンを押すと入力したデータを保存する。
「keyの値」に登録されているkeyを入力し、「removeItem」ボタンを押すとkeyに対応するデータを削除する。
keyの値:
valueの値:


現在のsessionStorage:

【javascript】localStorageを使ってデータを保存してみよう

localStorageとは

localStorageとはcookieのようにクライアント側(ブラウザ)でデータを保存することができます。
cookieを使ったデータの保存方法はこちら

localStorageの操作方法

localStorageに値を保存する

localStorage.setItem( [key], [value] );

keyとvalueを引数に設定し、localStorageにkeyとvalueのセットを保存します。

localStorageからデータを取得する

localStorage.getItem( [key] );

keyを引数に設定し、指定されたkeyでlocalStorageに保存した値を取得します。

localStorageに登録されているセットを削除する

localStorage.removeItem( [key] );

keyを引数に設定し、指定されたkeyをlocalStorageから削除します。

サンプル

localStorageに値をセットしたり削除したりするサンプル

サンプルコード

window.addEventListener( 'load', function( ){
    var key214 = document.querySelector( '#key-214' );
    var value214 = document.querySelector( '#value-214' );
    var setBtn214 = document.querySelector( '#set-btn-214' );
    var removeBtn214 = document.querySelector( '#remove-btn-214' );
    var localStorage214 = document.querySelector( '#localStorage-214' );
    displayLocalStorage();

    setBtn214.addEventListener( 'click', handleSetBtnClick, false );
    function handleSetBtnClick( e ){
        var key = key214.value;
        var value = value214.value;
        if( key ){
            localStorage.setItem( key, value );
            displayLocalStorage();
        }
    }

    removeBtn214.addEventListener( 'click', handleRemoveBtnClick, false );
    function handleRemoveBtnClick( e ){
        var key = key214.value;
        localStorage.removeItem( key );
        displayLocalStorage();
    }

    function displayLocalStorage( ){
        localStorage214.innerText  = "";
        for( var i = 0; i < localStorage.length; i++ ){
            if( i > 0 )
                localStorage214.innerText += ", ";

            var key = localStorage.key( i );
            localStorage214.innerText += key + ":" + localStorage.getItem( key );
        }
    }
} );

下のテキストボックスの「keyの値」と「valueの値」何か入力し、「setItem」ボタンを押すと入力したデータを保存する。
「keyの値」に登録されているkeyを入力し、「removeItem」ボタンを押すとkeyに対応するデータを削除する。
keyの値:
valueの値:


現在のlocalStorage:

【javascript】cookieを使ってデータを保存してみよう

cookieの設定方法

document.cookie = '[key]=[value]';

document.cookieに[key]=[value]の形の文字列を代入することでcookieにデータを設定したり、更新したりすることができる。

cookieからデータを取得する方法

let data = document.cookie;

document.cookieでアクセスすることでcookieの値を取得する事ができる。ただし、document.cookieは文字列を保持しているにすぎないので、複数の値を設定している場合は各々の[key]=[value];を連結した値が返される。
例えば、

document.cookie = 'fruit=apple';
document.cookie = 'sport=soccer';
console.log( document.cookie );

cookieに二つのkeyとvalueのセットをした後にcookieの値を取得してコンソールに出力すると、
出力:fruit=apple;sport=soccer;
という結果になる。
keyとvalueの連想配列として取得したい場合は、文字列を分割して連想配列を作る関数を別途用意してあげる必要がある。

サンプル

window.addEventListener( 'load', function( e ){
  let value1 = document.querySelector( '#value1-200' );
  let value2 = document.querySelector( '#value2-200' );
  let cookieText = document.querySelector( '#cookie-200' );
  
  value1.addEventListener( 'change', handleOnChangeValue1 );
  function handleOnChangeValue1( e ){
    document.cookie = 'key1=' + encodeURIComponent( this.value );
    displayCookie();
  }

  value2.addEventListener( 'change', handleOnChangeValue2 );
  function handleOnChangeValue2( e ){
    document.cookie = 'key2=' + encodeURIComponent( this.value );
    displayCookie();
  }

  function displayCookie(){
    cookieText.innerText = decodeURIComponent( document.cookie );
  }
} );

下のテキストボックスに何か入力すると、「現在のdocument.cookie」の後ろにcookieの情報が表示されます。
key1のcookieの値:
key2のcookieの値:
現在のdocument.cookie:

【CSS】変数を使ってみよう

使用スタイル

:root{ --foo-bar: white; }

カスタムプロパティの設定方法

CSSで変数を使用するにはカスタムプロパティの記述が必要です。カスタムプロパティの指定方法は「--foo-bar」のように最初に「--」を付けることがルールになっています。
擬似クラスの「:root」のブロック内にカスタムプロパティを記述するとグローバル変数として扱うことができ、好きなところで使用できます。また、カスタムプロパティは継承をする事ができます。「:root」で定義したカスタムプロパティを子要素で上書きすることができます。

カスタムプロパティの値の使用

var()関数を使ってカスタムプロパティの値を使用する事ができます。「background-color: var(--foo-bar);」のように関数を使って変数の値にアクセスします。

サンプル

カスタムプロパティを使ってCSSを適用させます。

:root {
  --sample-box-width: 300px;
  --sample-box-height: 100px;
}

#parent194 div{
  color: white;
}

#parent194 {
  --sample-color: red;
}

#first-child194 {
  --sample-color: blue;
}

#first-child194 {
  width: var( --sample-box-width );
  height: var( --sample-box-height );
  background-color: var( --sample-color );
}

#second-child194 {
  width: var( --sample-box-width );
  height: var( --sample-box-height );
  background-color: var( --sample-color );
}
背景色に、継承したカスタムプロパティが反映される
背景色に、親の(id=”parent194″)のカスタムプロパティが反映される

【javascript】requestFullScreenをつかって全画面表示してみよう

使用する関数

  • requestFullScreen

要素を全画面表示にする

全画面にしたい要素を取得して、requestFullScreen()を呼び出すと、全画面表示ができる。videoの再生を全画面表示にしたり、画像を全画面表示にしたり、一部分を詳しく見てもらいたいときに活用できると思います。
html5ではwebrtcなどの技術を使って、デバイスのカメラの映像を交換することで、ビデオチャットも出来るので、こういったときにも使えるのではないかと思います。

サンプル

Video全画面表示サンプル

サンプルコード

window.addEventListener( 'load', function(){
  let fullScreenBtn = document.querySelector( '#full-screen-btn' );
  fullScreenBtn.addEventListener( 'click', function(){
    let target = document.querySelector( '#sample-view164' );
    if(target.requestFullScreen){
      target.requestFullScreen();
    }else if(target.webkitRequestFullScreen){
      target.webkitRequestFullScreen();
    }else if(target.mozRequestFullScreen){
      target.mozRequestFullScreen();
    }else{
      alert('全画面表示できません。');
    }
  });
});
全画面表示サンプル

画像全画面表示サンプル

画像をクリックすると全画面表示になります。

【CSS】animationを使ってみよう

使用スタイル

animation(duration | timing-function | delay |
iteration-count | direction | fill-mode | play-state | name );

duration

durationには一回のアニメーションの再生時間を記載します。単位はミリ秒(ms)と秒(s)を指定する事ができます。

timing-function

timing-functionはアニメーションの再生の進行度合いを設定できます。早い段階で多くのアニメーションを進行させ、最後の段階ではゆっくり進行させるなど、どのように進行させるかを決められます。初期値はeaseという開始と終了の進行度合いをゆっくりにして滑らかにします。cubic-bezier()を指定して自由に進行度合いを決めたり、stepを指定して段階的に進行させることもできます。

delay

delayにはアニメーションを再生する前に待つ時間を指定できます。こちらも単位はミリ秒(ms)と秒(s)を指定する事ができます。

iteration-count

iteration-countにはアニメーションの再生回数を指定できます。再生回数を数字で指定する事ができ、infiniteを指定する事で無限に繰り返す事もできます。

direction

directionにはアニメーションの再生方向を指定できます。normal,reverse,alternate,alternate-reverseを指定する事ができ、各々でアニメーションの再生方向が違います。左から右に移動するアニメーションだと仮定して説明します。

normal
normalを指定すると常に通常の方向に再生します。つまり、常に左から右に移動します。
reverse
reverseを指定すると常に逆の方向に再生します。つまり、常に右から左に移動します。
alternate
alternateを指定すると、奇数回目は通常方向、偶数回目は逆の方向に再生します。つまり、1回目は左から右に移動し、2回目は右から左に移動し、3回目は左から右に移動します。4回目は…となります。
alternate-reverse
alternate-reverseを指定すると、奇数回目は逆方向、具数回目は通常の方向に再生します。つまり、1回目は右から左に移動し、2回目は左から右に移動し、3回目は右から左に移動します。4回目は…となります。

fill-mode

fill-modeにはアニメーション再生前・再生後の状態を指定する事ができます。none, backwards, forwards, bothを指定する事ができ、再生後の状態が各々で変わります。左から右に移動するアニメーションだと仮定して説明します。

none
アニメーションの再生後はキーフレームの値に関係なく、元のスタイルに戻ります。
backwards
アニメーションの再生後はキーフレームで指定された0%あるいはfromのスタイルが適用されます。
forwards
アニメーションの再生後はキーフレームで指定された100%あるいはtoのスタイルが適用されます。delayで指定された時間分待っている間は元のスタイルが適用されます。
both
アニメーションの再生後はキーフレームで指定された100%あるいはtoのスタイルが適用されます。forwardsと違う点はdelayで指定された時間分待っている間はキーフレームで指定された0%あるいはfromのスタイルが適用されます。

play-state

play-stateではアニメーションを再生するか、一時停止するかを指定できます。running, pausedを指定する事ができ、runningが指定されている最中はアニメーションが再生され、pausedが指定されている最中は指定されたときの状態で一時停止します。再度runningを指定して再生した際は、最初から再生しなおすわけではなく、一時停止の状態から再生されます。

name

nameではキーフレームを指定する事ができます。「@keyframes XXX」のXXX部分を指定する事で、キーフレームを選択できます。キーフレームを選択しないと、animationは実行されません。

サンプル

#animation-view155{
  box-sizing: content-box;
  height: 1.5em;
  overflow: hidden;
  width: 16em;
}

#animation-contents155{
  -moz-animation: 4s steps(15) 0s infinite normal none running typing;
  -webkit-animation: 4s steps(15) 0s infinite normal none running typing;
  animation: 4s steps(15) 0s infinite normal none running typing;
  display: inline-block;
  float: right;
  text-shadow: 1px 1px 3px rgba(128, 128, 128, .6);
  width: 0em;
  word-break: break-all;
}

@-moz-keyframes typing{
  0%{ width: 0em; }
  100%{ width: 16em; }
}

@-webkit-keyframes typing{
  0%{ width: 0em; }
  100%{ width: 16em; }
}

@keyframes typing{
  0%{ width: 0em; }
  100%{ width: 16em; }
}
HTML CSS javascriptのまとめ