【ソーコード】番外編:複数画像をホバーで切り替え

目次

※コーディングの解説はCSS、JavaScriptのコメントを参照

ディレクトリ構成

    
extra6
 ├─img
 │  ├─mainvisual1.jpg
 │  ├─mainvisual2.jpg
 │  ├─mainvisual3.jpg
 │  ├─mainvisual4.jpg
 │  └─mainvisual5.jpg
 │
 ├─css
 │  └─style.css
 │
 ├─js
 │  └─main.js
 │
 └─index.html
    
  

HTML(index.html)

別タブで開く
index.html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>タイトル</title>
    <meta name="description" content="テキストテキストテキストテキストテキストテキスト">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css">
    <link rel="stylesheet" href="css/style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="js/main.js"></script>
  </head>

  <body>
    <div class="content">
      <div id="mainvisual">
        <img src="img/mainvisual1.jpg" alt="">
      </div>
      <ul id="thumbnail">
        <li><img src="img/mainvisual1.jpg" alt=""></li>
        <li><img src="img/mainvisual2.jpg" alt=""></li>
        <li><img src="img/mainvisual3.jpg" alt=""></li>
        <li><img src="img/mainvisual4.jpg" alt=""></li>
        <li><img src="img/mainvisual5.jpg" alt=""></li>
      </ul>
    </div>
  </body>
</html>

CSS(style.css)

別タブで開く
style.css

@charset "UTF-8";

html {
  font-size: 100%;
}
img {
  max-width: 100%;
  vertical-align: bottom;
}
ul {
  list-style: none;
}

.content {
  max-width: 1000px;
  padding: 0 20px;
  margin: 20px auto;
}

#mainvisual {
  padding: 10px;
}
#thumbnail {
  display: flex;
}
#thumbnail li {
  width: 20%;
  padding: 10px;
}

/*-------------------------------------------
SP
-------------------------------------------*/
@media screen and (max-width: 600px) {
  .content {
    padding: 0 10px;
    margin: 10px auto;
  }

  #mainvisual {
    padding: 5px;
  }
  #thumbnail li {
    padding: 5px;
  }
}

JavaScript(main.js)

別タブで開く
main.js

$(function(){
  /*=================================================
  画像切り替え
  ===================================================*/
  // サムネイルの画像をホバーした際の処理
  $('#thumbnail img').on('mouseover', function(){

    // ホバーされた画像のパスを取得
    // $(this)はイベントが発生した要素を指すため、1つ目のサムネイルがホバーされた際は1つ目のsrcを、
    // 2つ目のサムネイルがホバーされた際は2つ目のsrcを取得する
    let img_src = $(this).attr("src");

    // メイン画像と同じサムネイルがホバーされた際は画像切り替えを実行しない
    // (メイン画像のsrcとホバーされた画像のsrcが異なる場合のみ実行)
    if($('#mainvisual img').attr("src") != img_src) {

      // メイン画像を0.5秒かけてフェードアウトし、フェードアウトが完了したら
      // メイン画像のsrcをホバーされたサムネイルのsrcに変更して
      // メイン画像を0.5秒かけてフェードインする
      // ※「フェードアウトが完了した後に実行」のように、何かの処理が終わったあとに実行させたい場合は、
      // 今回のようのコールバック関数を使用します。詳しくは「コールバック関数」で調べてみてください
      $('#mainvisual img').fadeOut(500, function() {
        $("#mainvisual img").attr({src:img_src});
        $("#mainvisual img").fadeIn(500);
      })
    }
  });
});