質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

3903閲覧

javascriptでhtml内の<li>タグの順番をアクセス毎に並び替えたい。

LKawauso

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/05/05 18:00

最近javascriptをやり始めたばかりですが、行き詰まってしまいました。
やりたい事は、タイトルの通りでhtml内にあるliタグの順番をアクセス毎に並び替えたいと言うものです。
jQueryではなく、ピュア?jsでやりたいですが、ご教授頂けたら嬉しいです。

該当のソースコード

html

1<ul id="worksFigure"> 2 <li> 3 <img src="images/○○.jpg" alt=""> 4 </li> 5 <li> 6 <img src="images/○○.jpg" alt=""> 7 </li> 8 <li> 9 <img src="images/○○.jpg" alt=""> 10 </li> 11 <li> 12 <img src="images/○○.jpg" alt=""> 13 </li> 14 <li> 15 <img src="images/○○.jpg" alt=""> 16 </li> 17 <li> 18 <img src="images/○○.jpg" alt=""> 19 </li> 20 </ul>

javascript

1 // 要素の取得 2 let worksFigu = document.getElementById("worksFigure"); 3 let figuLi = worksFigu.childElementCount; 4 let figuLiLeng = worksFigu.getElementsByTagName("li"); 5 6 // ランダム関数 7 function rand() { 8 var Mrand = Math.floor(Math.random() * figuLiLeng.length -1 ); 9 return Mrand; 10 } 11 12 figuLiLeng[rand()];//li.lengthのランダム関数ができる 13 14 // 要素の数だけ繰り返す 15 for(i = 0; i < figuLiLeng.length; i++ ) { 16 let numb = Math.floor(Math.random() * figuLiLeng.length );//0~13をランダムで返す 17 console.log(numb); 18 }

試したこと

liが14個ほど並びます。js側で画像を配列にして<ul>の中に入れるのはわかるのですが、今後の更新も兼ねてjsを弄るよりはhtml側に<li>を増やすだけで良くしたいです。
私のロジックでは 1,要素(DOM)の取得。2,要素(li)数だけランダムを繰り返す。3,ランダムだと同じ数字を吐き出すので重複させない。4,html側に吐き出す。
3番目の重複させないと言うものが調べても全く理解できません。乱数を重複させないで有名な何とか法てものも見ましたが…。
ちなみに画像名は別々で、決まりもないです。なのでliに対して操作したいです。伝え方が下手ですが、宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

別のアプローチで作りました。

<ul>のスタイルをflex及び縦方向にして、 <li>のスタイルをdisplay:list-item block;にすることで、[order](https://developer.mozilla.org/ja/docs/Web/CSS/order)による並び替えが出来ます。

DOMをイジらないので、<li>が増えても負荷はほとんどかからないかと思います。

Html

1<ul id="worksFigure" style="display: flex;flex-direction: column"> 2 <li style="display:list-item block; "> 3 1 4 </li> 5 <li style="display:list-item block;"> 6 2 7 </li> 8 <li style="display:list-item block;"> 9 3 10 </li> 11 <li style="display:list-item block;"> 12 4 13 </li> 14 <li style="display:list-item block;"> 15 5 16 </li> 17 <li style="display:list-item block;"> 18 6 19 </li> 20 <li style="display:list-item block;"> 21 7 22 </li> 23 <li style="display:list-item block;"> 24 8 25 </li> 26 <li style="display:list-item block;"> 27 9 28 </li> 29 </ul> 30</ul>

JS

1 // 要素の取得 2 let li = document.querySelectorAll("#worksFigure li"); 3 4 // ランダム関数 5 function rand() { 6 var Mrand = Math.floor(Math.random() * li.length -1 ); 7 return Mrand; 8 } 9 10 // <li>のorderだけ修正して並び直す 11 Array.from(li).forEach( elm =>{ elm.style.order=rand()}); 12

…display:list-item blockは知らんかった。

投稿2020/05/06 06:30

oikashinoa

総合スコア2826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun68ykt

2020/05/06 06:49

こういう手があったんですね。CSSに order というのがあるのを初めて知りました ????
oikashinoa

2020/05/06 07:18

orderで順番指定するだけなので、HTMLElementをshuffleする時と比べて負荷は低いですし、shuffleミスによるElement重複は考えなくていいのばメリットですね。 orderで同じ番号有った時はブラウザ側で良しなにしてくれます(たぶん実体が早いほうが上に来る…ハズ)
jun68ykt

2020/05/06 07:39

なるほど、納得です ????
guest

0

ベストアンサー

こんにちは

配列の要素をランダムに並び替える、いわゆるシャッフル(shuffle)するアルゴリズムを書く必要があり、自分で書くのもよいですが、定評あるサンプルを読んで理解するほうがよいかと思います。

30 秒で理解できるコード集という趣旨の 30secondsofcode に載っているshuffle を使うと、一例として以下のように書けます。

javascript

1const worksFigu = document.getElementById("worksFigure"); 2const items = worksFigu.getElementsByTagName("li"); 3const randomItems = shuffle(items); 4 5worksFigu.innerHTML = ''; 6randomItems.forEach(item => { 7 worksFigu.appendChild(item); 8});

または、配列やオブジェクトの操作に便利なライブラリ lodash の _.shuffle を使うならば、上記のコードでrandomItems を作る行を以下に修正します。

javascript

1const randomItems = _.shuffle([...items]);

投稿2020/05/05 19:07

編集2020/05/06 01:09
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LKawauso

2020/05/05 19:25

回答ありがとうございます。 コードみたり記載頂いたサイト見ても理解するのが難しいので、 自分で書くとなると程遠い道のりですがjs楽しいので頑張ります。 ありがとうございました。
jun68ykt

2020/05/05 19:31 編集

どういたしまして???? 転載したshuffleのコードは、俗に「フィッシャー–イェーツのシャッフル」と呼ばれるアルゴリズムです。検索するといろいろな解説記事が出ていると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問