1. はじめに
JavaScriptの勉強を始めて約2週間くらいの人間による備忘録です。
間違い、冗長なコードがあります。
頑張ってんな~。くらいの気持ちで見ていただけると幸いです。
1-1. 動作確認
- ボタン押下で画面遷移
- 4秒間ボタン操作がない場合、自動でスライドを遷移する
- スライド時間は0.7秒
- スライド遷移中(0.7秒間)はボタン操作禁止
自動画面遷移
ボタンを押下時の画面遷移
ボタン押下+自動画面遷移
クリック押下後、4秒間放置で自動で画面遷移していることを確認
1-2.目標
楽天市場のスライドショーを模写しました。
※実装中にどうやら仕様が異なったよう。
カーソル置いたら自動更新止まる仕様になってるやん...
自動遷移の直前で戻るボタン押下したら、
一旦スライドは戻るがすぐに自動遷移するバグなくなってるやん...
1-3. 得た知識
- 要素のコピー
- アニメーション終了処理
- CSSからクラス要素の適応(追加)
- CSSからクラス要素の適応(削除)
- X秒後に実行する処理
- タイマー処理を終了する
- クリックした後にイベント実行
- クリックを禁止する
- HTML読込み完了後にイベント実行
1-4. なぜ、JavaScriptだけなのか
- ループするスライドショーの記事を検索してもjQueryを用いた記事がほとんどだった。
- JavaScriptを勉強し始めたてのため、ライブラリを使わずに実装したかった。
1-5. 注意事項
- ドットインストールの有料コンテンツである
以下2つの動画をベースに作成したため、
HTMLとCSSのコードは割愛します。- JavaScriptでカルーセルを作ろう
- JavaScriptでストップウォッチを作ろう
2.仕組み
2-1.ループ処理
2-1-1.実態画像をコピーし、前後に追加する
手順
- イメージ画像を3枚用意。
- 先頭の要素(画像1)をコピーし、最後尾(画像3)の後ろに追加。
- 画像1´が追加される。
- 最後尾の要素から1つ前(画像3)をコピーし、先頭(画像1)の前に追加。
- 画像3´が追加される。
両端の1と3はコピー要素です。(1´、3´とする)
2-1-2.コピー要素に遷移した直後、すぐに(0sかけて)実態要素へ遷移
今、画像3が表示されている状態です。
画像1´に遷移した直後、すぐに(0sかけて)画像1へ遷移しています。
動画わかりにくっ...すみません...
2-1-3.参考文献
2-2.画面表示
2-2-1.画像を表示する
手順
- 「変数名:currentIndex」という、画像を表示させる参照ポインタを用意。
- ボタン押下で「currentIndex」が増減
- 時間経過でで「currentIndex」が増加
- 「currentIndex」が示す画像を表示
2-2-2.画像の遷移
ドットインストールの有料コンテンツのため割愛
2-2-3.参考文献
3.実装
3-1.要素のコピー
3-1-1.やりたいこと
3-1-2.コード
const elementFirstItem = document.querySelectorAll('li')[0];
const copyElementFirstItem = elementFirstItem.cloneNode(true);
const setElementLastItem = document.querySelectorAll('li')[slides.length];
carouselArea.insertBefore(copyElementFirstItem, setElementLastItem);
const elementLastItem = document.querySelectorAll('li')[slides.length - 2];
const copyElementLastItem = elementLastItem.cloneNode(true);
const setElementFirstItem = document.querySelectorAll('li')[0];
carouselArea.insertBefore(copyElementLastItem, setElementFirstItem);
3-1-3. 学び
要素のコピー
親要素.insertBefore(コピー, コピー位置);
※コピー位置の前にコピーが挿入される
3-1-4.参考文献
3-2. 画面遷移フロー(次へ)
3-2-1. やりたいこと
3-2-2. コード
function slideFlowNext() {
currentIndexNext(); //現在インデックスの更新
slideTransformNext(); //アニメーションスタイルの適応
slideNext(); //画面遷移処理
//=>アニメーション終了処理へ
carouselArea.addEventListener('transitionend', ()=> {
if(currentIndex === 4){
slideFlowNext();
}
});
}
3-2-3. 学び
アニメーション終了処理
addEventListener:transitionend
※アニメーションが0sの時は効かない
3-2-4. 参考文献
3-3. 現在インデックスの更新
3-3-1. やりたいこと
「currentIndex」が要素の最後(図1´)に来たら、
実態要素へ「currentIndex」を合わせる。
3-3-2. コード
function currentIndexNext() {
if(currentIndex >= 4){
currentIndex = 1;
}
else{
currentIndex++;
}
}
3-3-3. ポイント
>=の理由
「currentIndex」が4(最終ページ)以上になったときでも戻ってくるようにする。
画像遷移中に爆速クリックしたとき「currentIndex」が4以上になった。
後述するが、画面遷移中にクリック禁止処理追加で修正完了
3-4. アニメーションスタイルの適応
3-4-1. やりたいこと
- クラス要素を用いてスライド遷移時間を適応させる
- スライド遷移時間は0.7秒
※ドットインストールのベースを独自に変更したためCSSのコードを記載する
3-4-2. コード
.transform-on {
transition: transform .7s;
}
.transform-off {
transition: transform 0s;
}
function slideTransformNext() {
if(currentIndex === 1) {
carouselArea.classList.remove('transform-on');
carouselArea.classList.add('transform-off');
}
else {
carouselArea.classList.remove('transform-off');
carouselArea.classList.add('transform-on');
}
}
3-4-3. 学び
CSSからクラス要素の適応(追加)
要素.classList.add('クラス');
CSSからクラス要素の適応(削除)
要素.classList.remove('クラス');
3-4-4. 参考文献
3-5. 画面遷移処理
3-5-1. やりたいこと
- 画面を遷移させる
3-5-2. コード
ドットインストールの有料コンテンツのため割愛
3-5-2. 学び
画面遷移の仕組み
3-5-3.参考文献
3-6. 自動画面遷移処理
3-6-1. やりたいこと
- 4秒後に自動で画面遷移
- 関数コール時、画像遷移中に更新してる時間をキャンセルさせる
- 0.7秒後(画面遷移と同じ時間)経過後、4s計測再開
- 画面遷移フロー(次へ)のコール
- クリック禁止処理
3-6-2. コード
const slidePageTime = 700; //ms
function slideAuto() {
timeCount = setTimeout(() => {
clearTimeout(timeCount);
setTimeout(slideAuto,slidePageTime);
slideFlowNext();
pointerNoneFlow();
}, 4000);//ms後に実行
}
3-6-3. 学び
X秒後に実行する処理
setTimeout(() => {}, 時間);
知らん間に非同期処理に片足突っ込んでた...
X秒後に実行する処理
setTimeout(関数,時間);
タイマー処理を終了する
clearTimeout();
3-6-4. ポイント
画面遷移時間と次回の処理実行時間を合わせることで、
ほぼ同タイミングで計測再開してくれる
3-6-5. 参考文献
3-7. ボタンを押下したときの処理(次へ)
3-7-1. やりたいこと
3-6. 自動画面遷移処理とほぼ同じのため割愛
ボタンに対応させただけ
3-7-2. コード
next.addEventListener('click', () => {
clearTimeout(timeCount);
setTimeout(slideAuto,slidePageTime);
slideFlowNext();
pointerNoneFlow();
});
3-7-3. 学び
クリックした後にイベント実行
addEventListener:click
3-8. クリック禁止/解除フロー
3-8-1. やりたいこと
※ドットインストールのベースを独自に変更したためCSSのコードを記載する
3-8-2. コード
.pointer-none {
pointer-events: none;
}
//クリック許可
function addPointerNone() {
next.classList.add('pointer-none');
prev.classList.add('pointer-none');
}
//クリック禁止
function removePointerNone() {
next.classList.remove('pointer-none');
prev.classList.remove('pointer-none');
}
//クリック禁止/解除フロー
const slidePageTime = 700;//ms
function pointerNoneFlow() {
addPointerNone();
setTimeout(removePointerNone,slidePageTime);
}
3-8-3. 学び
クリックを禁止する
pointer-events: none;
3-8-4. ポイント
画面遷移時間とクリック禁止解除時間を合わせることで、
画面遷移中はクリックを無効にする
3-8-5. 参考文献
3-9. HTML読込み完了後の処理
3-9-1. やりたいこと
- 「currentIndex」を画像1にしておく
- HTML読込み完了後、
3-6. 自動画面遷移処理を実行する
3-9-2. コード
window.addEventListener('DOMContentLoaded',() => {
currentIndexNext();
slideNext();
slideAuto();
});
3-9-3. 学び
HTML読込み完了後にイベント実行
addEventListener:DOMContentLoaded
3-9-4. 参考文献
4. まとめ
楽天市場のスライドショーを模写しました。
4-1. 得た知識
- 要素のコピー
- アニメーション終了処理
- CSSからクラス要素の適応(追加)
- CSSからクラス要素の適応(削除)
- X秒後に実行する処理
- タイマー処理を終了する
- クリックした後にイベント実行
- クリックを禁止する
- HTML読込み完了後にイベント実行
4-2. なぜ、JavaScriptだけなのか
- ループするスライドショーの記事を検索してもjQueryを用いた記事がほとんどだった。
- JavaScriptを勉強し始めたてのため、ライブラリを使わずに実装したかった。
4-3.やってみて
-
制作時間、約1週間時間のため滅茶苦茶しんどかった。
ただ、Progateやドットインストールでの学びより、数十倍の学びを得ることができた。 -
楽天市場のHPの欠陥気付けたときは面白かった。
あの時、キャプチャしておけば...
4-4. 次やってみたいこと
- 非同期処理
- オブジェクト指向
5.備考
5-1. 記事作成までにやったこと
- Progate:JavaScript:1周
- ドットインストール
- はじめてのJavaScript:100%
- 詳解JavaScript 基礎文法編:100%
- 詳解JavaScript オブジェクト編:77%
- 詳解JavaScript DOM編:88%
- JavaScriptでカルーセルを作ろう:100%
- JavaScriptでストップウォッチを作ろう:50%
- JavaScript[完全]入門:適宜確認
ドットインストールは、必要そうな動画を視聴しただけで、コーディングはしていません。
常に2倍速で、不明な点は何回も何回も視聴しました。
5-2. 開発環境
ブラウザ:GoogleChrome(100.0.4896.88)
VScode :1.68.1