投稿日:2019年12月30日
実は、前回の面付けの記事 で、表と裏の関係を静止した状態ではなく、CSSアニメーションでクルクル回そうかと目論んでいました。
▼こんな感じに。
▲ 1(7) | ▲ 16(22) |
▲ 8(14) | ▲ 9(15) |
▲ 15(21) | ▲ 2(8) |
▲ 10(16) | ▲ 7(13) |
.orichoRotate {
animation: rotate 3s linear infinite;
}
@keyframes rotate {
0% {
transform: rotateY(0deg);
}
100% {
transform: rotateY(360deg);
}
}
これはCSS Animationのキーフレームアニメーションと呼ばれる物です。
@keyframes
でアニメーション名をrotate
と設定。
0%〜100%の間で動きを設定、セレクタにanimation: rotate 3s linear infinite;
という形で渡しています。
3s
は、3秒という意味。
linear
イージングと呼ばれるものlinear
は開始から終了まで直線的(一定)の動き。
infinite
繰り返しinfinite
は永続的な繰り返し。
表面と裏面を重ねて表示し、表面が裏返ったら非表示にし、裏面を正向きに表示する。
裏面が裏返ったら非表示にし、表面を正向きに表示する。
クルクルクルクルと。。。
重ねて表示するにはposition:absolute;
top:0;
left:0;
で可能だし、裏返ったら非表示にするのはbackface-visibility: hidden;
で可能です。
ところが、裏面は始めからtransform: rotateY(180deg);
で180度反転した状態にしておかなければいけない。
▼こんな感じに。
▲ 15(21) | ▲ 2(8) |
▲ 10(16) | ▲ 7(13) |
この状態でbackface-visibility: hidden;
を当てると消えてしまいます。
▼こんな感じに。
▲ 15(21) | ▲ 2(8) |
▲ 10(16) | ▲ 7(13) |
当たり前の結果ですね。。。
なので、180度で非表示な物をCSSの回転アニメーションで表示させるのは不可能だとわかりました。
そこでJavaScript(jQuery)を使います。
対象のオブジェクトが180度回転、もしくはすでに180度になっていたら非表示にし、正向きになったら表示させるようなプログラムを書きます。
frontRotate("#table01F", 0);
frontRotate("#table01B", 180);
function frontRotate(selector, num) {
var n = 0 + num;
(function animeLoop() {
var requestAnime = window.requestAnimationFrame(animeLoop);
var rotateDeg = n++;
if (rotateDeg == 360) {
n = 0;
}
if (rotateDeg >= 90 && rotateDeg <= 270) {
$(selector).css("backface-visibility", "hidden");
} else {
$(selector).css("backface-visibility", "visible");
}
console.log(rotateDeg);
$(selector).css("transform", "rotateY(" + rotateDeg + "deg)");
})();
}
▲ 1(7) | ▲ 16(22) |
▲ 8(14) | ▲ 9(15) |
▲ 15(21) | ▲ 2(8) |
▲ 10(16) | ▲ 7(13) |
requestAnimationFrame()
を使います。
cssのkeyframes
やJavaScriptのsetinterval()
では秒指定できますがrequestAnimationFrame()
はできません。
しかし、requestAnimationFrame()
はタブが非アクティブな状態などではブラウザがパフォーマンスを落とす仕組みになっており、メモリリークを避けることができます。
こちらの使用が推奨されています。
CSSアニメーションには、今回は触れませんでしたがCSS Transition
というものもあります。
CSS、JavaScriptを使い分けてより良いサイトを作りましょう。
最後まで読んでくださりありがとうございました。