任意のコンテンツ(今回は3つのdiv)をjsのsetIntervalで無限に表示非表示を切り替えるサンプル
■前提
「変数」「関数」「if文」といった単語と機能のざっくりとした理解
※ここまではProgateの無料版までで理解できそう。
※let、var、constの違いもわかっているとよさそう。
■目標と考え方
jqから脱却し、普通のjavascript(PureJS/VanillaJS)に慣れたい。
初期コストとハードルを下げるためにも、はじめは使えたら楽しそう+htmlペライチで完結するものをできるだけ多くこなす。
例)表示切り替え、モーダル(バーガーメニュー)、スライドトグル(開閉メニュー)、おみくじ、スライドショー、ページング、神経衰弱等
①ifや簡単な関数はわかるけど、同時に効率のよい処理を考えるのが苦手なので、まずは冗長でも実現するための手順を考える。
②簡潔かつ最新の書き方を目指すために、冗長な記述に対し、AIや学習サイトでしらべ、
すぐに思いつかなかった配列・プロパティ・関数といった記述を採用していく
※AIを使う場合、サービスによって記法が古かったり、たまに適当なことを言ってくるのでそのへんを留意。
また、解禁情報や案件で使用している単語などを入力しないように注意。
③調べながらコメントをつけて自分の理解を残す。
④採用した記述から、「javascriptでできること」の見識が広がるので、効率化可能か設計を見直す。
※理解を深めたい場合は都度ピンポイントで用途・意味や記法バリエーション、応用を調べたり、AIでテストを作成・採点しても効果的と思います。
■html側を基準に、おおまかな設計を考える
①cssでopacity0と1のクラスを作っておく※フェード効果のためにtransitionも入れておく
②各divには一意のid「div+連番」を付与し、初回のみ表示したいdivにopacityが1になるクラス「show」をつけておく
③一意のidを取得・変数格納→「show」の有無を判定してclassを付け替える関数を作成
④setIntervalで関数を実行
デモ↓
>css
.roop { position:absolute; width: 100%;}
#div1{ z-index: 1;}
#div2{ z-index: 2;}
#div3{ z-index: 3;}
.fade {
opacity: 0;
transition: opacity 3s;
}
.show {
opacity: 1;
}
>html
<div id="div1" class="roop fade show">いち</div>
<div id="div2" class="roop fade">に</div>
<div id="div3" class="roop fade">さん</div>
>js
//1~3までの変数をそれぞれ定義
const el1 = document.getElementById('div1');
const el2 = document.getElementById('div2');
const el3 = document.getElementById('div3');
function showElement() {
if(el1.classList.contains('show')){
el1.classList.remove('show');
el2.classList.add('show');
el3.classList.remove('show');
}else if(el2.classList.contains('show')){
el1.classList.remove('show');
el2.classList.remove('show');
el3.classList.add('show');
}else if(el3.classList.contains('show')){
el1.classList.add('show');
el2.classList.remove('show');
el3.classList.remove('show');
}
}
setInterval(function(){
showElement();
}, 3000);
↓
■目標の「②」「③」(簡潔かつ最新の書き方)をやってみる
変数を配列化し、ifでの記述をやめ、実行時に初期値を更新、forEach+toggleによる比較・クラス付け替えに変更
const els = [
document.getElementById('div1'),
document.getElementById('div2'),
document.getElementById('div3'),
];
let current = 0;
const toggle = () => {
els.forEach((el, idx) => el.classList.toggle('show', idx === current));
current = (current + 1) % els.length;
console.log(current);
};
setInterval(toggle, 3000);