[JS][CSS3] jQuery を使わずに fadeIn / fadeOut のアニメーションを実装する方法
jQuery を使わずに、CSS3・requestAnimationFrame メソッド・setTimeout 関数で fadeIn / fadeOut のアニメーション表現を行うということをやってみました。jQuery を使えば fadeIn()、fadeOut() だけの記述で済むことですが、いざそれを使わずにとなると大変だなという印象です…。
各サンプルは、マウスオーバー時にフェードアウト・マウスアウト時にフェードインします。 HTML は共通で以下のようになっています。
<div id="box">FadeIn/Out</div>
CSS3 でフェードイン・アウトする
opacity の変化を transition プロパティでアニメーションにします。transition を設定するだけでアニメーションにしてくれるのでとても簡単です。transition は IE10以上で対応しています。
See the Pen CSS3でフェイドイン/アウト by Saomocari (@Saomocari) on CodePen.
CSSコード
#box{
width: 150px;
height: 100px;
〜略〜
opacity:1;
transition:all 0.3s;
}
#box:hover{
opacity:0.5;
transition:all 0.3s;
}
JavaScript の requestAnimationFrame メソッドを使ってフェードイン・アウトする
JavaScript の requestAnimationFrame メソッドを使い、マウスオーバー時 opacity を 0.5 の値に、マウスアウト時に opacity を 1 の値に戻すということをアニメーションにしています。この requestAnimationFrame メソッドもまた、IE10以上でないと使えません…。
See the Pen requestAnimationFrame メソッドでフェードイン・アウト by Saomocari (@Saomocari) on CodePen.
JavaScript コード
window.onload = function(){
var box = document.getElementById('box');
// ↑フェードさせたい要素のIDを(' ')内に指定
var boxOpa;
box.style.opacity = 1;
// フェードアウト時のアニメーション設定
function fadeOut(){
var boxOpa = parseFloat(box.style.opacity);
var opaValue = .05;
var limit = 0.5;
// ↑ opacity値の限度
//(この設定だと opacity:0.5 まで透明に)
if(boxOpa > limit){
boxOpa = boxOpa - opaValue;
box.style.opacity = boxOpa;
requestAnimationFrame(fadeOut);
// ↑ requestAnimationFrame で opacity値 が 0.5 になるまで
// 透明度を0.05ずつ減らして行く
}
}
// フェードイン時のアニメーション設定
function fadeIn(){
var boxOpa = parseFloat(box.style.opacity);
var opaValue = .05;
if(boxOpa < 1){
boxOpa = boxOpa + opaValue;
box.style.opacity = boxOpa;
requestAnimationFrame(fadeIn);
// ↑ requestAnimationFrame で opacity値 が 1 になるまで
// 透明度を0.05ずつ足して行く
}
}
// マウスオーバー時に fadeOut アニメーションを実行
box.onmouseover = function(){
fadeOut();
}
// マウスアウト時に fadeIn アニメーションを実行
box.onmouseout = function(){
fadeIn();
}
}
JavaScript の setTimeout を使ってフェードイン・アウトする
JavaScript の setTimeout 関数を使い、マウスオーバー時に opacity を 0.5 の値へ、マウスアウト時に 1 の値へ、1/100 秒ごとに 0.05 ずつ opacity 値を足したり引いたりすることで、アニメーションにしています。動作確認は IE7 までOKでした。
See the Pen JavaScript の setTimeout を使ってフェードイン・アウトフェードイン・アウト by Saomocari (@Saomocari) on CodePen.
JavaScript コード
window.onload = function(){
var box = document.getElementById('box') ;
// ↑フェードさせたい要素のIDを(' ')内に指定
var limit = 0.5;
// ↑ opacity値の限度
// フェイドアウトアニメーション設定
var fadeOut_timer;
function fadeOutTimer(opaValue){
if (opaValue > limit && opaValue > 0.05){
box.style.filter = "alpha(opacity:"+(opaValue*100)+")";
box.style.opacity = opaValue;
opaValue = opaValue - 0.05;
fadeOut_timer = setTimeout(function(){ fadeOutTimer(opaValue); }, 10);
// ↑ setTimeout で opacity値 が 0.5 になるまで
// 透明度を0.05ずつ減らして行くことを 1/100 秒毎に繰り返す
// タイマーを設定する
} else {
clearTimeout(fadeIn_timer);
// ↑ opacity値 が 0.5 になったらタイマーを止める
box.style.filter = "alpha(opacity:"+(limit*100)+")";
box.style.opacity = limit;
// limit 値の透明度を設定
}
}
// フェイドインアニメーション設定
var fadeIn_timer;
function fadeInTimer(opaValue){
if (opaValue < 1){
box.style.filter = "alpha(opacity:"+(opaValue*100)+")";
box.style.opacity = opaValue;
opaValue = opaValue + 0.05;
fadeIn_timer = setTimeout(function(){fadeInTimer(opaValue);}, 10);
// ↑ setTimeout で opacity値 が 1 になるまで
// 透明度を0.05ずつ足して行くことを 1/100 秒毎に繰り返す
// タイマーを設定する
} else {
clearTimeout(fadeIn_timer);
// ↑ opacity値 が 1 になったらタイマーを止める
box.style.filter = "alpha(opacity:100)";
box.style.opacity = 1;
}
}
// マウスオーバー時に fadeOut アニメーションを実行
box.onmouseover = function(){
clearTimeout(fadeIn_timer);
// ↑ 連続してマウスアウトした時のために
// fadeOutアニメーションを止める処理
// (jQuery の stop() のようなもの)
var opaValue = 1;
fadeOutTimer(opaValue);
}
// マウスアウト時に fadeIn アニメーションを実行
box.onmouseout = function(){
clearTimeout(fadeOut_timer);
var opaValue = limit;
fadeInTimer(opaValue);
}
}
以上、3パターンのコードでした。
jQuery を使わずにクロスブラウザでアニメーションしたい場合は、最後の setTimeout 関数を使う方法になりますが、とてもコードが長くなってしまいました。
JavaScript の勉強のため色々コードを書いてみてるので、こういうエントリーになりましたが、そこまでパフォーマンスを気にしなくてもよい場合は、やはり jQuery などのライブラリーを使うのが効率的ですね…。
CSS3 のアニメーションは直感的に使えて楽しいので、もっと普通に使える場面が増えるといいなと思います。
いまさらrequestAnimationFrameを理解する – console.lealog();
window.requestAnimationFrame – Web API インターフェイス | MDN
No Comments & Tracbacks