カテゴリー
【Sassで作るCssミニゲーム】Cssミニゲームで使えるアニメーションテクニックの基礎
※ 当ページには【広告/PR】を含む場合があります。
2021/07/30
2023/12/20
transition
animation
transitionを使ったCSSゲームの基礎
実装の中身
<div id="wrapper">
<input type="checkbox" id="move1">
<input type="checkbox" id="move2">
<input type="checkbox" id="move3">
<label for="move0">0</label>
<label for="move1">1</label>
<label for="move2">2</label>
<label for="move3">3</label>
<div class="mentaco"></div>
</div>
#wrapper {
width: 100%;
height: 300px;
background-color: darkgray;
box-sizing: border-box;
position:relative;
.mentaco{
position: absolute;
display: block;
padding: 0 0 0 0;
transition: all 1s cubic-bezier(.68,-0.55,.27,1.55);
top: 20px;
left: 0;
width: 80px;
height: 72px;
background: transparent url('https://raw.githubusercontent.com/tacoskingdom/commonBlogMaterial/main/deep-tacopots/blog116/mentaco.png') no-repeat 0 0;
background-size: 80px 72px;
}
#move1:checked ~ .mentaco {
transform: translateX(120px) translateY(120px);
}
#move2:checked ~ .mentaco {
transform: translateX(90px) translateY(-20px);
}
#move3:checked ~ .mentaco {
transform: translateX(200px) translateY(10px);
}
input {
position: absolute;
top: 0px;
&#move1 { left: 0px; }
&#move2 { left: 20px; }
&#move3 { left: 40px; }
}
label {
background-color: aqua;
width: 20px;
height: 20px;
display: block;
border-radius: 50%;
position: absolute;
z-index: 1;
text-align: center;
&[for="move0"] { top: 46px; left: 28px; }
&[for="move1"] { top: 165px; left: 148px; }
&[for="move2"] { top: 22px; left: 118px; }
&[for="move3"] { top: 55px; left: 228px; }
}
}
プログラムの解説
2点間
往復
2 --> 0
1 --> 3
モダンなtransitionの記述法
transform
#move1:checked ~ .mentaco {
transform: translateX(120px) translateY(120px) rotate(45deg) scale(1.4);
}
#move2:checked ~ .mentaco {
transform: translateX(90px) translateY(-20px) rotate(-72deg) scale(0.9);
}
#move3:checked ~ .mentaco {
transform: translateX(200px) translateY(10px) rotate(132deg) scale(1.2);
}
border
#move1:checked ~ .mentaco {
translate: 120px 120px;
rotate: 45deg;
scale: 1.4;
}
#move2:checked ~ .mentaco {
translate: 90px -20px;
rotate: -72deg;
scale: 0.4;
}
#move3:checked ~ .mentaco {
translate: 200px 10px;
rotate: 192deg;
scale: 1.2;
}
tranform
transform
translate
rotate
scale
skew
matrix
animationを使ったCSSゲームの基礎
デモプログラムの中身
<form id="wrapper">
<input type="reset" value="リセット">
<input type="checkbox" id="move1">
<input type="checkbox" id="move2">
<input type="checkbox" id="move3">
<label for="move0">0</label>
<label for="move1">1</label>
<label for="move2">2</label>
<label for="move3">3</label>
<div class="mentaco"></div>
</form>
form
#wrapper {
width: 100%;
height: 300px;
background-color: darkgray;
box-sizing: border-box;
position:relative;
.mentaco{
position: absolute;
display: block;
padding: 0 0 0 0;
top: 20px;
left: 0;
width: 80px;
height: 72px;
background: transparent url('https://raw.githubusercontent.com/tacoskingdom/commonBlogMaterial/main/deep-tacopots/blog116/mentaco.png') no-repeat 0 0;
background-size: 80px 72px;
}
#move1:checked ~ .mentaco {
animation: xy1 2s cubic-bezier(.45,.05,.55,.95) forwards;
@keyframes xy1 {
0% {
top: 20px;
left: 0px;
}
30% {
top: 50px + 20px;
left: 280px;
}
70% {
top: 170px + 20px;
left: 200px;
}
100% {
top: 120px + 20px;
left: 120px;
}
}
}
#move2:checked ~ .mentaco {
animation: xy2 2s cubic-bezier(.45,.05,.55,.95) forwards;
@keyframes xy2 {
0% {
top: 120px + 20px;
left: 120px;
}
30% {
top: -40px + 20px;
left: 150px;
}
70% {
top: 50px + 20px;
left: 10px;
}
100% {
top: -20px + 20px;
left: 90px;
}
}
}
#move3:checked ~ .mentaco {
animation: xy3 2s cubic-bezier(.45,.05,.55,.95) forwards;
@keyframes xy3 {
0% {
top: -20px + 20px;
left: 90px;
}
30% {
top: 140px + 20px;
left: 70px;
}
70% {
top: 110px + 20px;
left: 190px;
}
100% {
top: 10px + 20px;
left: 200px;
}
}
}
input {
position: absolute;
top: 0px;
&#move1 { left: 0px; }
&#move2 { left: 20px; }
&#move3 { left: 40px; }
&[type="reset"] {
left: 80px;
}
}
label {
background-color: aqua;
width: 20px;
height: 20px;
display: block;
border-radius: 50%;
position: absolute;
z-index: 1;
text-align: center;
&[for="move0"] { top: 46px; left: 28px; }
&[for="move1"] { top: 165px; left: 148px; }
&[for="move2"] { top: 22px; left: 118px; }
&[for="move3"] { top: 55px; left: 228px; }
}
}
ブログラムの解説
一方通行
0 > 1 > 2 > 3 > [リセット]
再生不可逆
@keyframes
結論
+ CSSアニメーションには、transitionかanimationを使う
+ transitionを使うと2点間を往復するアニメーションが作れる
+ animationを使うと始状態から終状態まで@keyframesで定義したアニメーションが作れる
+ transitionはアニメーションの逆再生(巻き戻し)ができるが、
animationは巻き戻しできない
+ transitionは2点間を直線的にしか移動できないが、
animationはフレームごとに定義した座標を通過するパスで
細かくアニメーション軌道上を移動できる
+ CSSアニメーションを作る際には、transitionとanimationを混ぜない方がベター
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー