昔からよく見かける動きですが、下のように「複数の小さな画像(サムネイル)をクリック(タップ)すると、メインの大きな画像が切り替わる」という機能を実装する機会がありました。
小さな画像をクリック(タップ)するとメインの大きな画像が切り替わる
この実装って、最近ではlabel,input要素を使って、JavaScriptを使わずに似たようなことができる方法もありますね。
私は通常はlabel,input要素を使って実装していますが、コードの書き方、見せ方によってはJavaScriptを使う必要もありました。
いろんなパターンで実装できることを覚えておくと、今後使える選択肢が増えるので、この機会にやりかたをメモ書きました。
クリック(タップ)で画像を切り替えるサンプル
codepenにサンプルを書きましたので「似たようなことがしたい」という場合は、ご参考ください。
html
<div id="content"> <div id="featured_img"> <img id="img" src="https://www.imamura.biz/blog/wp-content/uploads/image01.png"> </div> <div id="thumb_img" class="cf"> <img class="active" src="https://www.imamura.biz/blog/wp-content/uploads/image01_thumb.png" onclick="changeimg('https://www.imamura.biz/blog/wp-content/uploads/image01.png',this);"> <img src="https://www.imamura.biz/blog/wp-content/uploads/image02_thumb.png" onclick="changeimg('https://www.imamura.biz/blog/wp-content/uploads/image02.png',this);"> <img src="https://www.imamura.biz/blog/wp-content/uploads/image03_thumb.png" onclick="changeimg('https://www.imamura.biz/blog/wp-content/uploads/image03.png',this);"> </div> </div>
JavaScript
クリック(タップ)した際に「今その画像を表示しているよ」ということをわかりやすくするため、class名に「active」を付与してCSSで枠線を付けています。
「active」の処理がいらないな、という場合は、該当する箇所を削除してしまえばいいですね。(その場合は、3~8行目をごっそり削除できます)
function changeimg(url,e) { document.getElementById("img").src = url; let nodes = document.getElementById("thumb_img"); let img_child = nodes.children; //id名「thumb_img」配下の子要素を取得 for (i = 0; i < img_child.length; i++) { //要素の数ループさせる img_child[i].classList.remove('active') //要素に付与されているすべてのclass名「active」を削除する } e.classList.add('active'); //クリック(タップ)した要素にclass名「active」を付与する }
CSS(SCSS)
.cf:before, .cf:after{ content:""; display:table; } .cf:after{ clear:both; } .cf{ zoom:1; } #content { max-width: 650px; margin: 3rem auto; text-align: center; } #featured_img img, #thumb_img img { max-width: 100%; } #thumb_img { margin-top:2%; img { float:left; max-width: 32%; width: 32%; cursor: pointer; margin-right:2%; border:2px solid #eee; box-sizing:border-box; &.active{ border:2px solid #cac6b8; } &:last-child{ margin-right:0; } } }
おまけ:srcset属性が指定されている場合はこうする
最近では、閲覧する端末(retinaなど)によって、読み込む画像を変更する「srcset」属性が指定されている場合も多くなってきました。
もし今回ご紹介したコードを使用して画像を切り替えたい場合は、src要素のURLだけ切り替えても「画像が変わらないじゃない!」ということがあります。
その場合は、src,srcsetそれぞれの属性に指定されている画像のURLを変更してあげればOKです。
secsetが指定されている場合も切り替えてあげる
function changeimg(url,e) { document.getElementById("img").src = url; document.getElementById("img").srcset = url; //途中省略 }
私はこんな感じで実装しましたが、他にももっといい方法があるかもしれませんね。もしご存知でしたら、ぜひともご教示いただけますとうれしいです。
このページを共有する