もくじ
JavaScriptで既存のHTML要素をランダムに表示する(並び替える)方法を解説します。
また、先頭の要素は固定してそれ以外の要素をランダムに表示する方法も解説しています。
ランダムアルゴリズムとして、偏りが少ないといわれているFisher-Yatesを採用してます。
【サンプル】既存のHTML要素をランダムに並び替え
ページを更新するたびに、下記画像がランダムな順番で表示されます。
【実装コード】既存のHTML要素をランダムに並び替え
下記HTML・CSS・JavaSctiptをコピペすることで既存のHTML要素をランダムに表示することができます。
HTML
Copy
<div class="random_box">
<div class="random_item">
<img src="image URL" alt="サンプル">
</div>
<div class="random_item">
<img src="image URL" alt="サンプル">
</div>
<div class="random_item">
<img src="image URL" alt="サンプル">
</div>
<div class="random_item">
<img src="image URL" alt="サンプル">
</div>
<div class="random_item">
<img src="image URL" alt="サンプル">
</div>
<div class="random_item">
<img src="image URL" alt="サンプル">
</div>
</div>
CSS
Copy
.random_box {
display: flex;
gap: 30px;
flex-wrap: wrap;
padding: 0 20px;
}
.random_item {
width: calc((100% - 60px) / 3);
}
.random_item img {
width: 100%;
height: auto;
}
JavaSctipt
Copy
//読み込み時に実行
shuffleElements();
function shuffleElements() {
let randomBox = document.querySelectorAll('.random_box');
// randomBoxがnullまたはundefinedであるかチェック
if (!randomBox || randomBox === 0) {
return; // 要素が見つからない場合、関数を終了
}
for (let i = 0; i < randomBox.length; i++) {
let elements = randomBox[i].querySelectorAll('.random_item');
// elementsがnullまたはundefinedであるかチェック
if (!elements || elements.length === 0) {
return; // 要素が見つからない場合、関数を終了
}
let elementsArray = Array.from(elements);
// Fisher-Yatesで配列をランダムに並び替え
for (let j = elementsArray.length - 1; j > 0; j--) {
let randomIndex = Math.floor(Math.random() * (j + 1));
[elementsArray[j], elementsArray[randomIndex]] = [elementsArray[randomIndex], elementsArray[j]];
}
// randomBoxをクリア
while (randomBox[i].firstChild) {
randomBox[i].removeChild(randomBox[i].firstChild);
}
// ランダムに並び替えた要素を再配置
elementsArray.forEach(function(element) {
randomBox[i].appendChild(element);
});
}
}
【サンプル】先頭のHTML要素は固定して、その他の要素をランダムに並び替え
ページを更新するたびに、先頭の画像(サイコロ1)は固定のままで、それ以外の画像ははランダムな順番で表示されます。
【実装コード】先頭のHTML要素は固定して、その他の要素をランダムに並び替え
下記HTML・CSS・JavaSctiptをコピペすることで先頭のHTML要素は固定して、その他の要素をランダムに並び替えることができます。
HTML
Copy
<div class="fixed_random-box">
<div class="random_item -fixed">
<img src="image URL" alt="サンプル">
</div>
<div class="random_item">
<img src="image URL" alt="サンプル">
</div>
<div class="random_item">
<img src="image URL" alt="サンプル">
</div>
<div class="random_item">
<img src="image URL" alt="サンプル">
</div>
<div class="random_item">
<img src="image URL" alt="サンプル">
</div>
<div class="random_item">
<img src="image URL" alt="サンプル">
</div>
</div>
CSS
Copy
.fixed_random-box {
display: flex;
gap: 30px;
flex-wrap: wrap;
padding: 0 20px;
}
.random_item {
width: calc((100% - 60px) / 3);
}
.random_item img {
width: 100%;
height: auto;
}
JavaSctipt
Copy
//読み込み時に実行
fixedShuffleElements();
function fixedShuffleElements() {
let fixedRandomBox = document.querySelectorAll('.fixed_random-box');
// fixedRandomBoxがnullまたはundefinedであるかチェック
if (!fixedRandomBox || fixedRandomBox === 0) {
return; // 要素が見つからない場合、関数を終了
}
for (let i = 0; i < fixedRandomBox.length; i++) {
let elements = fixedRandomBox[i].querySelectorAll('.random_item');
// elementsがnullまたはundefinedであるかチェック
if (!elements || elements.length === 0) {
continue; // 要素が見つからない場合、処理をスキップ
}
let elementsArray = Array.from(elements);
// -fixedクラスを持つ要素を取得
let fixedElements = elementsArray.filter(function(element) {
return element.classList.contains('-fixed');
});
// -fixedクラスを持つ要素を除いた要素を取得
let nonFixedElements = elementsArray.filter(function(element) {
return !element.classList.contains('-fixed');
});
// 非固定要素をFisher-Yatesでランダムに並び替え
for (let j = nonFixedElements.length - 1; j > 0; j--) {
let randomIndex = Math.floor(Math.random() * (j + 1));
[nonFixedElements[j], nonFixedElements[randomIndex]] = [nonFixedElements[randomIndex], nonFixedElements[j]];
}
// fixedRandomBoxをクリア
while (fixedRandomBox[i].firstChild) {
fixedRandomBox[i].removeChild(fixedRandomBox[i].firstChild);
}
// 固定要素を先頭に、それ以外の要素を後ろに配置
fixedElements.forEach(function(element) {
fixedRandomBox[i].appendChild(element);
});
nonFixedElements.forEach(function(element) {
fixedRandomBox[i].appendChild(element);
});
}
}
アルゴリズムを学びたい方におすすめの1冊
リンク
HTMLとCSSの知識がありJavaScriptを学びたいという方におすすめの1冊
リンク
もみじ
HTMLとCSSの知識がありJavaScriptを学びたいという方に入門書としておすすめの書籍です。
実務で役立つサンプルを手を動かしながら学ぶことができ、実践的なスキルを身に付けることができます。
JavaScriptのフロントエンドエンジニアを目指している方におすすめの1冊
リンク
もみじ
この本はJavaScript初心者からフロントエンドエンジニアを目指す方にぴったりの1冊です。
非同期処理やAJAXなど、現代の開発で必要なスキルがわかりやすく解説されており、実務で役立つスキルを学ぶことができます。
もみじ
アルゴリズムとそれを支える数学について基礎から学びたい人にオススメの一冊です。