html cssアニメーション @keyframes と javascript の複合についての質問
以下は矢印ワンクリックで数字の書かれた1コマ(400*400px)ずつがスライドするのですが,これをセレクトボックスと実行ボタンで選択した番号コマまで自動で移動する方法をご教示ください。
**現状 >>> **0コマ目(初期状態)から4コマ目の移動には,1,2,3コマ目と途中4回(1回1秒×4回=4秒かけて移動)[送り]ボタンクリックする方式。
希望 >>> 各コマ数が書かれた[プルダウン]と[実行]ボタンを配置の上,0コマ目(初期状態)の状態からプルダウンで4コマ目へ移動という項目を選択,実行ボタンで1,2,3コマ目とアニメーションで通過しながら(通過時間1回1秒×4コマ=4秒間かけて)移動という方式にしたい。また再び別の番号の項目選択でそのコマ数まで移動
追加 回答をいただいた各アニメーション終了後に以下の拡大縮小アニメーションを追加するにはどうすればよいでしょうか。後片付けで大変申し訳ございません
from { transform: scale(0.9,0.9); } to { transform: scale(1,1);
html
<div class="parent"> <span class="child" id="box"> <div style=" width:400px;height:400px; background-color: #999;">0</div> <div style=" width:400px;height:400px; background-color: #555;">1</div> <div style=" width:400px;height:400px; background-color: #999;">2</div> <div style=" width:400px;height:400px; background-color: #555;">3</div> <div style=" width:400px;height:400px; background-color: #999;">4</div> <div style=" width:400px;height:400px; background-color: #555;">5</div> <div style=" width:400px;height:400px; background-color: #999;">6</div> <div style=" width:400px;height:400px; background-color: red;">7</div> </span> </div> <input type="button" onclick="move(1);" value=" 送り " id="btn"/> <input type="button" onclick="move(2);" value=" 戻し " id="btn"/>
CSS
div.parent { position: relative; width: 400px; height: 400px; border: 1px solid #ddd; overflow: hidden; } span.child { position: absolute; width : 400px; height: 3200px; left: 0px; top:0px; animation-duration: 1s; animation-iteration-count: 1; animation-timing-function: linear; animation-fill-mode: forwards; } @keyframes moveDown { 100% { transform:translateY(-400px); } } @keyframes moveUp { 100% { transform:translateY(400px); } }
JS
var x, y; // box の座標 // 移動 1=上, 2=下 function move(direct) { const objBox = document.getElementById("box"); const cssStyle = window.getComputedStyle(objBox); y = parseInt(cssStyle.top.match(/(.*)px/)[1]); let anim = ''; switch (direct) { case 1: if (y >= -2400) { anim = 'moveDown'; } break; case 2: if (y <= -400) { anim = 'moveUp'; } break; } if (anim !== '') { objBox.style.animationName = anim; // アニメ開始 btnsDisabled(true); // ボタン無効化 } } // animation 終了時の処理 document.addEventListener('animationend', () => { const objBox = document.getElementById("box"); const cssStyle = window.getComputedStyle(objBox); const arr = cssStyle.transform.match(/((.*))/)[1].split(","); // 文字列 matrix(a, b, c, d, cx, cy) を分解 y += parseInt(arr[5]); // transform.y の値を加える objBox.style.transform = ''; // アニメした transform を消す objBox.style.top = y + 'px'; objBox.style.animationName = ''; // animationName を消す。こうしないと、次回に同じ方向のアニメが効かない。 btnsDisabled(false); // ボタン有効化 }); // 矢印ボタンの有効化/無効化 function btnsDisabled(arg) { let btns = document.getElementsByTagName("input"); for (let i = 0; i < btns.length; i++) { btns[i].disabled = arg; } }
お手数をおかけしますが何卒よろしくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー