blue-phoenix
@blue-phoenix

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

javascriptにおける画像ランダム表示について

javascriptでちょっとしたアプリを作っている者です。
ボタンを押してランダムに画像を表示させたいのですが、よく分かりません。
スクリーンショット 2024-09-16 141727.png

html,JSで作ったもので、数字の代わりに画像を表示させたいです。
ですが、JSの部分でどうやって画像にすれば良いでしょうか?

html

<main>
<section>
    <h1>ランダム数字</h1>
    <p id = "result">?</p>
</section>
<button id = "btn">ボタン</button>
</main> 
<script src = "omikuji.js"></script> 

JS

'use strict';
{
const btn = document.getElementById('btn');
const result = document.getElementById('result');
btn.addEventListener('click', () => {
const results = ['1', '2', '3'];
const n = Math.floor(Math.random() * results.length); //
result.textContent = results[n];
});
}

記述はランダム配列で今は1~3としています。
ここをresultsから画像にするべくimgを入力してもできません。
元から画像の切り替え自体が分かっていないのでお手上げ状態です。
配列内に入れるにはどうすれば良いか御教授お願いします。

0

4Answer

Comments

  1. @blue-phoenix

    Questioner

    これはボタンを押したら画像が出るというコードですか?
    このsetAttributsとか初めて見るんですけど、ボタンとどうやってつなげるんですか?

  2. 解決するイメージが沸かないのであれば、問題を分解して考えましょう。
    「ボタンを押してランダムに画像を表示させたい」というのを分解していきます。

    • ボタンを押すと何かを処理する
    • 画像をjavascriptで表示する
    • ランダムな要素を作る
    • ...

    「ボタンを押すと何かを処理する」や「ランダムな要素を作る」はすでに実現されているようですね。
    私が示したコードは「画像をjavascriptで表示する」の一例です。
    これらを組み合わせることで実現するイメージができそうでしょうか?
    まだ難しいのであれば「何ができればゴールに近づけそうか」を考えてみましょう。

  3. @blue-phoenix

    Questioner

    もう少しでなんとかやれそうです・・・がんばってみます。

直接的な回答ではありませんが、画像パスが格納されている文字列から画像を表示する処理を実装できますか?

const imagePath = "path/to/img.jpg"

// imagePathの画像をブラウザ上に表示する処理
2Like

Comments

  1. @blue-phoenix

    Questioner

    画像の記載そのものはできます。でも、配列内に入れる方法が分からなくて・・・。
    ええっと、const変数から画像を取り出して。
    例えば const results = ["img1", "img2","img3"]; とすれば良いですか?
    できなかったです(;ω;)
    スクリーンショット 2024-09-16 190630.png

  2. 画像の記載そのものはできます。

    画像パスが格納されている文字列から画像を表示する処理は実装できたと受け取りました。

    あとは以下のような感じで実装すればちょちょいのちょいかと。

    'use strict';
    {
    const btn = document.getElementById('btn');
    const results = ["path/to/img1.jpg", "path/to/img2.jpg", "path/to/img3.jpg"]; // 変更点1
    const result = document.getElementById('result');
    btn.addEventListener('click', () => {
    const n = Math.floor(Math.random() * results.length); //
    const imagePath = results[n];
    // imagePathの画像をブラウザ上に表示する処理 // 変更点2
    });
    }
    

    でも、配列内に入れる方法が分からなくて・・・。
    ええっと、const変数から画像を取り出して。

    このあたりはよくわからず。
    なんのために、どの配列に、どの値を入れようとしている?
    const変数とはどの変数のことを指してる?変数名で教えて。
    「画像を取り出して」というのは具体的に何を取り出してる?画像パス?imgタグオブジェクト?

  3. @blue-phoenix

    Questioner

    'use strict';
    {
    const btn = document.getElementById('btn');
    const result = document.getElementById('result');
    btn.addEventListener('click', () => {
    const results = ["path/to/img3.png", "path/to/img4.png", "path/to/img5.png"];
    const n = Math.floor(Math.random() * results.length);
    const imagePath = results[n];
    });
    }
    

    できないです、何も変わりません・・・。
    resultsにあるpath/toってどういう意味ですか?

  4. あなたが作った「画像パスが格納されている文字列から画像を表示する処理は実装」を const imagePath = results[n]; の次の行に追加してください。

    私の書いたコードはあくまでサンプルであり、動作を保証するものではありません。

    resultsにあるpath/toってどういう意味ですか?

    私はあなたがどこから画像を持ってこようとしてるか知りません。
    path/toは適当に書いただけで意味はなく、適宜あなたのほうで適切なファイルパスへ書き換えてください。

  5. @blue-phoenix

    Questioner

    スクリーンショット 2024-09-17 141225.png

    で、できないです・・・うおおお、今回は先に見せるしかないぃぃィ。
    1つのファイルの中にこうやって入れてます。
    この場合はどうやって記述すれば良いですか?

  6. 直接的な回答ではありませんが、画像パスが格納されている文字列から画像を表示する処理を実装できますか?

    画像の記載そのものはできます。

    上記の処理は実装できたんですよね?
    その際に使った imagePath の値を配列に入れるだけですよ。

    「できない」と書いていますが、それでは全く伝わりません。具体的かつ客観的に正しいと言える根拠を添えて、なにができないのかを書いてください。また、どこまではできたのかも合わせて書くとよりGoodです。

  7. @blue-phoenix

    Questioner

    html

    <section>
        <h1>ランダム数字</h1>
        <p id = "imagePath">?</p>
    </section>
    

    JS

    const btn = document.getElementById('btn');
    const result = document.getElementById('result');
    btn.addEventListener('click', () => {
    const results = ["img3.png", "img4.png", "img5.png"];
    const n = Math.floor(Math.random() * results.length);
    const imagePath = results[n];
    });
    

    もう一度きちんと提示し直します、これらはどこかおかしいですか?
    resultsよりimagePathをhtmlのidとして代入させたんですけど。
    それともresultsをidに代入するのですか?
    htmlのpタグidはどこへつなげれば良いかすらよく分かりません。

  8. @blue-phoenix

    Questioner

    もっと具体的に書かなくてはァ。
    「pタグに書いた?の代わりに画像を載せる
     →さらにbtn.addEventListenerでクリックする度に表示
     →document.getElementByIdを通して3つの配列作る
     →それをresultsとして変数に変えて・・・」
    ここから先が分かりません(';ω;')

  9. 私の能力不足で回答が難しいので、他の方の回答をもとに頑張って答えにたどり着いてください!

  10. @blue-phoenix

    Questioner

    後もう少しなので頑張ります・・・必ず成功させたいです。

既に上の方が適切な回答をされておりますが...改めて回答いたしますね!

まずディレクトリ構造を下記のような構成でイメージしてください

File
 ├ index.html
 └ image
    ├ img1.png
    ├ img2.png
    └ img3.png

index.htmlでimg.1pngの画像を呼び出したいとき、画像のパスは「./image/img1.png」になります。

ですので下記のように組めばご質問者様の意図通り動くのではと思います。
・それぞれの画像のパスを文字列として格納した配列を定義
・出力したランダムな値に応じた、配列の要素をimgタグのsrc属性にセットする

<body>
    <div class="container">
        <img id="box" src=""></img>
    </div>
    <button id="btn">ランダムに表示する</button>

    /*----------
    JS
    ----------*/
    <script>
      // ボタンを押すとランダムに値を出し、値に応じてパスを切り替える
      const btn = document.getElementById("btn");

      // ボタンのクリックイベント
      btn.addEventListener("click", () => {
        // 画像のパスを格納した配列を定義
        const path =["./image/img1.png","./image/img2.png","./image/img3.png"];
        // ランダムな値を抽出
        const number = Math.floor(Math.random() * 3);
        //imgタグのsrc属性に配列の要素を設定
        document.getElementById("box").setAttribute("src",path[number]);
      });

※補足
パスを切り替えて画像の切り替えを行うより、CSSで表示を切り替えるほうがスムーズな挙動になるのでは...と個人的には思います。
下記参考までにCSSで画像を切り替える案を掲載しておきます。

<body>
    <div class="container">
      <div class="box first"></div>
      <div class="box second"></div>
      <div class="box third"></div>
    </div>
    <button id="btn">ランダムに表示する</button>
    <script>
      // ボタンを押すとランダムでactiveクラスが付与され、表示(display:block)を行う
      const btn = document.getElementById("btn");

      // ボタンのクリックイベント
      btn.addEventListener("click", () => {
        // 初期化
        document.querySelectorAll(".box").forEach((e) => {
          if (e.classList.contains("active")) {
            e.classList.remove("active");
          }
        });
        // ランダムな値を抽出
        const number = Math.floor(Math.random() * 3);

        // numberの値に応じて条件分岐、activeクラスの付与を行う
        console.log(number);
        switch (number) {
          case 0:
            document.querySelector(".first").classList.add("active");
            break;
          case 1:
            document.querySelector(".second").classList.add("active");
            break;
          case 2:
            document.querySelector(".third").classList.add("active");
            break;
          default:
            console.log("Error");
        }
      });
    </script>
1Like

Comments

  1. @blue-phoenix

    Questioner

    3行目に書いてある "./img/icon_01.png"は何ですか?
    後、html内でimageに関する記述が見当たらないですけど。
    class="container"のコンテナもどこから反映されてるか分からないです。

  2. @blue-phoenix

    Questioner

    スクリーンショット 2024-09-17 194030.png

    後もう少しでできそうな気がします、左上に見覚えあるアイコンが。
    画像コードは認識されている証拠ですよね?

  3. もう少しっぽさそうですね!
    おそらく画像のパスが適切でないため画像が表示できてないのでは?と思います。ですので、ファイル構造と画像のパスを確認してみるとよいかもです!

    GoogleのDeveloperツールのElement(要素)の箇所で、imgタグにsrc属性のパスが適切に反映されているか改めて確認してみると良いかと思います。

    参考記事:https://willcloud.jp/knowhow/dev-tools-01/#Elements

    下記、ご質問箇所細かく回答しておきますね。

    3行目に書いてある "./img/icon_01.png"は何ですか?
    →ここコードの検証時の消し忘れです。「src=""」でブランクにしておいて大丈夫です。

    ごめんなさい、書き方がよくなかったですね...!
    もう少し簡略化しつつ、htmlとJS分けて書きますね。
    ↓HTML

    <body>
      <img id="box" src=""></img>
      <button id="btn">ランダムに表示する</button>
    </body>
    

    ↓JavaScript

    // ボタンを押すとランダムに値を出し、値に応じてパスを切り替える
    const btn = document.getElementById("btn");
    
    // ボタンのクリックイベント
    btn.addEventListener("click", () => {
    // 画像のパスを格納した配列を定義
    //ファイル名はご自身の画像のファイル名にしてください
    const path =["./image/img1.png","./image/img2.png","./image/img3.png"];
    // ランダムな値を抽出
    const number = Math.floor(Math.random() * 3);
    //imgタグのsrc属性に配列の要素を設定
    document.getElementById("box").setAttribute("src",path[number]);
    

    html内でimageに関する記述が見当たらないですけど。

    imgタグがimageに関する要素にあたります。
    ※それともalt属性のことでしょうか?alt属性は一般的に記述した方がよいとされていますが動作には関係ないのでなくても大丈夫です。

    class="container"のコンテナもどこから反映されてるか分からないです。

    検証時にスタイルを整えるためにimgタグの親要素に付したクラスでした...ややこしくさせてしまったので消しときました!

    もしどうしてもうまく動かないようであれば、HTMLとJavaScriptのスクリプトとファイル構造が確認できるものを掲載いただけると、回答しやすいのでたすかります!!

  4. @blue-phoenix

    Questioner

    gazo.png

    画像が映ったけど、ボタンが消えてしまいました。
    現在のコードはこれです、imageだけ消したら映りました。

    html

    <body>
    <div class="container">
    <img id="box" src=""></img>
    </div>
    <button id="btn">ランダムに表示する</button> 
    </body>
    

    JS

    'use strict';
    {
    // ボタンを押すとランダムに値を出し、値に応じてパスを切り替える
    const btn = document.getElementById("btn");
    // ボタンのクリックイベント
    btn.addEventListener("click", () => {
    // 画像のパスを格納した配列を定義
    const path =["./img1.png","./img2.png","./img3.png"];
    // ランダムな値を抽出
    const number = Math.floor(Math.random() * 3);
    //imgタグのsrc属性に配列の要素を設定
    document.getElementById("box").setAttribute("src",path[number]);
    });
    }
    

    後はボタンが残れば・・・完成です。あともうすこし・・・すこし

  5. ナイスファイト!良い感じですね!!

    特に記述自体に問題があるわけではなさそうなので、
    ボタンが隠れてしまったのは、おそらくスタイルの都合とかかな...?

    一旦htmlのheadに下記みたにテキトーに追加してみてください。

    <!DOCTYPE html>
    <html lang="ja">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
      <!-- 追加ここから -->
        <style>
          #box{
            display: block;
            width: 50px;
            height: 50px;
          }
        </style>
      <!-- 追加ここまで -->
      </head>
    <body>
     <!-- 省略 -->
    </body>
    </html>
    

    もし無事に表示されるようであれば、お好みでCSSスタイルを当てるだけでよいかと...

    今回にご質問いただいたことに関連することとして下記復習してみると良いかもです!
    ・相対パスと絶対パス
    ・HTML/CSSの知識(JavaScriptはDOM操作が基本なので大切!)

    あと先にお伝えいたしましたGoogleDeveloperツールもJavaScriptの動作検証をする上で非常に有効ですので試してみると良いかもです!

    あと少し、ファイト!!

にらめっこ.png

ブロログガゴモォオホホブエェ、できたあああああああああああああああああああああああああああああああああああああああああああああああああああああ!!!!
やったぞおおおおおおおおおおおおおおおおおおおおおおおおあおおお!!!

0Like

Comments

  1. @blue-phoenix

    Questioner

    もう無理なんじゃないかって一瞬思ってしまいました!
    勝機は・・・#くっついたbox、この書き方初めて見たんですけど。
    これが決め手コードじゃああああああああああああああああああああ!!!!

    html

    <body>
    <div class="container">
    <img id="box" src=""></img>
    </div>
    <button id="btn"><img class = "img22" src = "img22.png"></button>
    <p>笑ったら人生負け組</p>
    <script src = "omikuji.js"></script>   
    </body>
    <style>
    #box{
    display: block;
    width: 300px;
    height: 300px;
    }
    </style>
    

    JS

    'use strict';
    {
    const btn = document.getElementById("btn");
    btn.addEventListener("click", () => {
    const path =["./img1.png","./img2.png","./img3.png"];
    const number = Math.floor(Math.random() * 3);
    document.getElementById("box").setAttribute("src",path[number]);
    });
    }
    

    画像の切り替えだけでこんなに手間取るなんてみくびってました。
    とりあえず疲れたので今日はこれでおわりにします。
    ありがとうございましたあああああああ、神様あああああああああ!!!

  2. お疲れ様でした!
    ナイスファイト!!

    最後にお節介かと思いますが、下記2点記載しておきます。

    ①「#box」に関して
    →CSSのセレクタの違いですので「.box」でスタイルを指定するのと、ほぼ同じです。

    <!--例:class属性 セレクタは「.class名」-->
    <p class="box">サンプル</p>
    
    <!--CSS-->
    <style>
    .box{
     color:red;
    }
    </style>
    
    <!--例2:id属性 セレクタは「#id名」-->
    <p id="box">サンプル</p>
    
    <!--CSS-->
    <style>
    #box{
     color:red;
    }
    </style>
    

    参考資料置いておくので、良ければ!
    セレクタについて:https://saruwakakun.com/html-css/reference/selector
    idとclassの違い;https://qiita.com/mzmz__02/items/a1d3c708d7d830023f03

    ②マジックナンバーの修正
    コードを書くとき、可読性と汎用性の観点からマジックナンバーの使用は避けた方がよいので、ランダムな数字を出す処理について下記に修正した方がBetterです。
    (ご質問者様がもともと書いていた書き方が、より良い書き方ということですので、是非そちらに修正してみてください!)

    //↓修正前
    //const number = Math.floor(Math.random()*3);
    //修正後
    const number = Math.floor(Math.random()*path.length);
    
  3. @blue-phoenix

    Questioner

    な、なるほど・・・JavaScriptもけっこう奥が深いんですね。
    おかげさまでもっと何かを作ってみたくなりました!
    感謝しています!!

Your answer might help someone💌