OSSANS Project since 2020

「もし四十のおっさんがプログラミングを始めたらどう人生変わるのか」
このブログのメインテーマです
肩肘張らずにユルく、ときたま厳しくやっていきます
※プログラミング以外のことも書きます

JavaScript

2023.02.21(更新)

【お手軽だった!】画像クリックで拡大画像をポップアップ表示する方法

アイキャッチ画像
JavaScript

画像をクリックすると拡大画像が表示されるあれ!実装したいけどやり方わからない…。

こんなお悩みに答えていきます。

本記事の内容

  • 画像クリックで拡大画像をポップアップ表示する方法
  • JSライブラリー「Lightbox」の使い方
  • プラグインなし 生JSで実装してみた

本記事を対象とする方

  • フロントエンドエンジニアを目指す方
  • Webディレクターを目指す方
  • Webデザイナー

この記事を書いている僕はプログラミング歴2年3ヶ月です。webエンジニアとして”社内転職”しました。

ライブラリーの「Lightbox」を使う方法

まず最初に「Lightbox」とは何かを説明していきます。

Webページにある画像をクリックして、拡大画像をポップアップ表示させるには、CSSとJavaScriptの知識が必要になります。

普通に考えればそのコードを自分で書いて実装します。ただ、こういう挙動はよく使用され、その度にコードを書いたり、コピペするのは面倒ですよね。

世の中は大変便利なものでして、自分でCSS,JavaScriptの 準備をせずとも手軽に実装できるライブラリーというものが開発されております。

ライブラリーとは、関数やクラスが記載されており、実現したい処理が機能するようにまとめられていて、一つのアプリケーションとしてインストールできるようにしたもののことを言います。ライブラリーには様々なものがありますが、今回ご紹介するのが「Lightbox」というライブラリーです。「Lightbox」を利用することで誰でも簡単にポップアップ画像表示が実装できてしまいます。

では早速「Lightbox」を使っていきましょう。まず「Lightbox」公式サイトに飛んで、ソースファイルをダウンロードします。

公式サイトトップページ
※公式サイトトップページ
トップ画面ちょい下
※トップ画面よりちょい下にある「Github Releases page」をクリック
Source code(zip)をクリック
※Source code(zip)をクリック
使用するのはdist内にあるファイルのみ
※使用するのはdist内にあるファイルのみです

ダウンロードが終わったら、使用するファイルの読み込みを行います。使用するファイルは、lightbox.css(もしくはlightbox.min.css)lightbox.js(もしくはlightbox.min.js)の2つです。

Check

基本的に「Lightbox」を使用するには、jQueryが必要ですが、jQueryがない方でも対応できるファイルがあります。それが、lightbox-plus-jquery.js(もしくはlightbox-plus-jquery.min.js)です。

ただ、このように親切なファイルを用意してくれているライブラリーばかりではないので、jQueryをインストールしておくことをオススメします。

CSSファイルは<head>タグ内に、JSファイルは<body>タグが閉じる直前で読み込みます。以下のコードをコピペすれば読み込みは完了です。

  1. <link rel="stylesheet" href="css/lightbox.css">
  2. <script src="js/lightbox.js" type="text/javascript"></script>

さて、これで準備が整いました。あとは以下のコードのようにすればOKです。

  1. <a href="images/lbimg.jpg" rel="lightbox"><img src="images/lbimg.jpg" alt=“ライトボックスイメージ”></a> 

このようにポップアップさせたい画像をaタグで囲うだけです。ポイントは、aタグのhref属性に使用したい画像ファイルを指定し、rel属性をlightboxにすることです。これだけでポップアップ表示を実装できます。スタイリングは好みに合わせてlightbox.cssで調整可能です。

ちなみに、ポップアップさせる画像が複数ある場合は、下記のようにグループ化することも可能です。

  1. <ul>
  2.   <li><a href="lbimg1.jpg" data-lightbox="sample" data-title="サンプルイメージ1"><img src="lbimg1.jpg" alt="サンプルイメージ1"></a></li>
  3.   <li><a href="lbimg2.jpg" data-lightbox="sample" data-title="サンプルイメージ2"><img src="lbimg2.jpg" alt="サンプルイメージ2"></a></li>
  4.   <li><a href="lbimg3.jpg" data-lightbox="sample" data-title="サンプルイメージ3"><img src="lbimg3.jpg" alt="サンプルイメージ3"></a></li>
  5.   <li><a href="lbimg4.jpg" data-lightbox="sample" data-title="サンプルイメージ4"><img src="lbimg4.jpg" alt="サンプルイメージ4"></a></li>
  6.   <li><a href="lbimg5.jpg" data-lightbox="sample" data-title="サンプルイメージ5"><img src="lbimg5.jpg" alt="サンプルイメージ5"></a></li>
  7.   <li><a href="lbimg6.jpg" data-lightbox="sample" data-title="サンプルイメージ6"><img src="lbimg6.jpg" alt="サンプルイメージ6"></a></li>
  8. </ul>

aタグのrel属性の代わりにdata-lightbox属性を使い、全ての画像に同じネーミングをつけてあげるとグループ化されます。グループ化された画像はカルーセルUIが自動的に付き、矢印ボタンでスライドできるようになります。さらにdata-title属性をつけると、それぞれの画像にタイトルを付与することができます。

めちゃくちゃ簡単ですよね!?

さらに「Lightbox」にはオプション設定があり、下記コードをbodyタグが閉じる前で読み込ませることで実現できます。

  1. <script>
  2.   lightbox.option({
  3.     'resizeDuration': 200,
  4.     'wrapAround': true
  5.   })
  6. </script>

‘resizeDuration’: 200、’wrapAround’: true の部分がオプションです。オプションには色々ありまして、公式サイトで確認できます。興味のある方は試してみてください。

ちなみに、僕はWordPressで当サイトを制作しているので、lightboxoption.jsファイルを作って、functions.phpでfooterに読み込ませています。デモページを用意しましたので下記リンクからご覧ください。今回は下記3つのオプションを設定してみました。

  1. lightbox.option({
  2.   'alwaysShowNavOnTouchDevices': true,
  3.   'wrapAround': true,
  4.   'albumLabel': "イメージ %1 (全%2枚)"
  5. })

生JSで実装する方法

「Lightbox」を利用するのではなく、生JSでの実装に取り組んでみました。

「Lightbox」を利用すると、とても簡単にポップアップ表示を実装できます。ただ、「この実装、Lightbox使うまでもねんじゃね?」と思ったので生JSで実装してみました。下記リンクからデモページをご覧頂けます。あくまでポップアップ表示なので、Lightboxにおけるオプション関連は盛り込んでいません。HTML,CSS,JavaScriptのコードは下記の通りです。

【HTML】

  1. <ul>
  2.   <li><a href=""><img src="lbimg1.jpg" alt="サンプルイメージ1"></a></li>
  3.   <li><a href=""><img src="lbimg2.jpg" alt="サンプルイメージ2"></a></li>
  4.   <li><a href=""><img src="lbimg3.jpg" alt="サンプルイメージ3"></a></li>
  5.   <li><a href=""><img src="lbimg4.jpg" alt="サンプルイメージ4"></a></li>
  6.   <li><a href=""><img src="lbimg5.jpg" alt="サンプルイメージ5"></a></li>
  7.   <li><a href=""><img src="lbimg6.jpg" alt="サンプルイメージ6"></a></li>
  8. </ul>

【CSS】

  1. :root {
  2.   --w_h: 0px;
  3. }
  4. .cover-lb {
  5.   display: flex;
  6.   flex-direction: column;
  7.   min-height: 100vh;
  8.   padding: var(--s4);
  9.   padding-bottom: 0;
  10. }
  11. .cover-lb > * {
  12.   margin-top: var(--s4);
  13.   margin-bottom: var(--s4);
  14. }
  15. .cover-lb > :first-child {
  16.   margin-top: 0;
  17. }
  18. .cover-lb > :last-child {
  19.   margin-bottom: 0;
  20. }
  21. #overlay {
  22.   background-color: rgba(0, 0, 0, 0.8588235294);
  23.   box-sizing: border-box;
  24.   height: var(--w_h);
  25.   max-width: none;
  26.   margin-top: 0;
  27.   opacity: 0;
  28.   position: fixed;
  29.   top: 0;
  30.   left: 0;
  31.   transition: all 1s;
  32.   width: 100vw;
  33.   z-index: 9999;
  34. }
  35. #overlay.show {
  36.   opacity: 1;
  37. }
  38. .cover-main {
  39.   margin-bottom: 0;
  40. }
  41. .cover-main img {
  42.   border: 3px solid #ffffff;
  43.   border-radius: 1rem;
  44.   vertical-align: top;
  45.   width: 100%;
  46. }
  47. .cover-main img.scale {
  48.   -webkit-animation-name: scale;
  49.           animation-name: scale;
  50.   -webkit-animation-duration: 1s;
  51.           animation-duration: 1s;
  52. }
  53. @-webkit-keyframes scale {
  54.   0% {
  55.     opacity: 0;
  56.     transform: scale(0, 0);
  57.   }
  58.   100% {
  59.     opacity: 1;
  60.     transform: scale(1, 1);
  61.   }
  62. }
  63. @keyframes scale {
  64.   0% {
  65.     opacity: 0;
  66.     transform: scale(0, 0);
  67.   }
  68.   100% {
  69.     opacity: 1;
  70.     transform: scale(1, 1);
  71.   }
  72. }
  73. .cover-main button {
  74.   display: block;
  75.   margin-left: auto;
  76.   opacity: 0;
  77.   transition: all 0.2s;
  78. }
  79. .cover-main button img {
  80.   border: none;
  81. }
  82. .cover-main button.show {
  83.   opacity: 1;
  84. }
  85. .cover-footer {
  86.   margin-top: 0;
  87.   margin-left: auto;
  88. }

【JavaScript】

  1. 'use strict';
  2. let w_h = window.innerHeight;
  3. document.documentElement.style.setProperty('--w_h', w_h + 'px');
  4. const img = document.querySelectorAll('ul li img');
  5. function popUpimg (img_src) {
  6.   const overlay = document.createElement('div');
  7.   overlay.id = "overlay";
  8.   overlay.classList.add('cover-lb', 'center');
  9.   /* cover-main部分 */
  10.   const cover_main = document.createElement('div');
  11.   cover_main.classList.add('cover-main');
  12.   const cover_main_img = document.createElement('img');
  13.   cover_main_img.src = img_src;
  14.   const cover_main_btn = document.createElement('button');
  15.   const cover_btn_img = document.createElement('img');
  16.   cover_btn_img.src = '/images/icon/xmark-solid.svg';
  17.   cover_btn_img.classList.add('icon2');
  18.   cover_main_btn.appendChild(cover_btn_img);
  19.   cover_main.appendChild(cover_main_img);
  20.   cover_main.appendChild(cover_main_btn);
  21.   overlay.appendChild(cover_main);
  22.   main.appendChild(overlay);
  23.   overlay.classList.add('show');
  24.   cover_main_img.classList.add('scale');
  25.   cover_main_img.addEventListener('animationend', () => {
  26.     cover_main_btn.classList.add('show');
  27.   });
  28.   overlay.addEventListener('click', () => {
  29.     overlay.classList.remove('show');
  30.     cover_main_img.classList.remove('scale');
  31.     cover_main_btn.classList.remove('show');
  32.     overlay.addEventListener('transitionend', () => {
  33.       overlay.remove();
  34.     });
  35.   });
  36.   
  37.   cover_main_btn.addEventListener('click', () => {
  38.     overlay.classList.remove('show');
  39.     cover_main_img.classList.remove('scale');
  40.     cover_main_btn.classList.remove('show');
  41.     overlay.addEventListener('transitionend', () => {
  42.       overlay.remove();
  43.     });
  44.   });
  45. }
  46. img.forEach( img => {
  47.   img.addEventListener('click', e => {
  48.     e.preventDefault();
  49.     popUpimg(img.src);
  50.   });
  51. });
Point

liの子要素の画像をクリックしたらデフォルトのイベント設定を無効化(e.preventDefault)

その上で拡大表示領域であるoverlay、拡大画像であるimgをDOMに追加(createElement(‘div’)、createElement(‘img’))

liの子要素の画像ソースを拡大表示する画像のソースに割り当て(img.src)

拡大表示アニメーションをCSSで設定(scaleクラス、showクラス)

overlay、buttonをクリックしたらscaleクラス、showクラスを外す

scaleクラス、showクラスが外れたら拡大表示領域をDOMから取り除く(overlay.remove)

いかがでしょうか?

生JSで実装してもそこまで難しくなかったです。JavaScriptの基礎が備わっていれば十分実装可能でしょう。CSSのレイアウト設定の説明に関しては割愛させて頂きますね。(もっと短い記述方法をご存知の方が入れば是非教えてください!)

僕はJavaScriptのJの字もわからなかった雑魚エンジニアですが、参考程度でご覧いただく分には悪くないかと思います。ただ、「Lightbox」を利用すると開発スピードが格段に上がるので、本番では「Lightbox」を利用することをオススメします。

JavaScript初学者がレベルアップするための書籍紹介

最後に書籍を一つ紹介します。初学者から確実にレベルアップできる内容かと思います。

この本は一通りJavaScriptの基礎を終えたものの、今一つ理解度に自信がない方がもう一段階レベルアップするのに役に立つ本です。

この本の特徴を以下に記します。

  • 逆引きというタイトルの通り、「こういう場合はどうしたらいいのか?」という観点から知識を得られる
  • 文字の量が必要最低限で読みやすい
  • 実例コードが載っているので、手を動かしながら学ぶことが可能
  • 図や表などを用いて解説してあるので、直感的に理解しやすい
  • 986ページある書籍なので持ち運びなどには適していない(ページがめくりづらいかも?)

僕は、ドットインストールとMDNドキュメントの二本立てでJavaScriptの勉強をしましたが、MDNは基本文字ベースなので理解しにくいこともありました。

その点、この書籍では図や表などを用いて解説してあるので、直感的に理解しやすいです。特に初学者では理解しづらい、非同期(Promise、fetch)クラスオブジェクトコンストラクターなどの説明は、MDNドキュメントと比べると段違いに理解しやすいかと思います。

また、用法の説明では、バグを呼び寄せる原因になる理由から、「避けるべき」「お勧め」「〜しないでください」という文言が頻出します。これは実務の経験値がないと説明できないことなので、そういった点でもMDNドキュメントやその他のネット情報とは一線を画す内容となっています。

先にも述べたように、初学者がレベルアップするのももちろんですが、JavaScript経験者が「復習」のために使用するのも多いにアリです。実際に使用するシーンを特定した説明があるので、手元に置いておくと心強い書籍になるでしょう。

今回のまとめ

今回は画像クリックで拡大画像をポップアップ表示する方法について紹介しました。最後まで読んで頂きありがとうございました。

オプション設定も豊富な「Lightbox」ライブラリーを使えば簡単に実装できる

生JSで実装することも十分可能

関連記事

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2023.03.04(更新)

    【実例コードあり】覚えておきたいパララックスデザインの3つの基本

  • JavaScript
    ブログアイキャッチ画像
    JavaScript

    【ユーザー離脱阻止!】画面遷移アニメーション実装時の注意点

  • JavaScript
    ブログアイキャッチ画像
    JavaScript

    【図解あり】JavaScript / 要素の高さや位置の取得まとめ

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2022.11.19(更新)

    「一瞬でトップへ戻るボタン」を実装する方法【jQuery不要】

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2023.02.02(更新)

    【CSSとJavaScriptのみ】ページ内リンクでスムーススクロールさせる方法

  • JavaScript
    ブログアイキャッチ画像
    JavaScript
    2022.11.25(更新)

    【5分で完了!】webデザインにおけるスマホファーストビュー高さ設定方法

CATEGORY カテゴリー別最新記事

  • CSS
    アイキャッチ画像
    CSS

    【CSS】margin?position?要素の中央寄せで使うプロパティとは?

  • Docker
    アイキャッチ画像
    Docker
    2022.10.03(更新)

    【簡単設定!】DockerでWordPressをローカル開発する方法

  • HTML
    アイキャッチ画像
    HTML
    2023.02.18(更新)

    【図解あり】aタグの入れ子ルールとHTMLの入れ子ルールを覚える方法

  • JavaScript
    アイキャッチ画像
    JavaScript
    2023.03.04(更新)

    【実例コードあり】覚えておきたいパララックスデザインの3つの基本

  • Python
    アイキャッチ画像
    Python
    2023.02.09(更新)

    【やらなきゃ損!】2日でできるPythonのExcelコピペ自動化!

  • Study
    アイキャッチ画像
    Study
    2023.02.16(更新)

    稼ぐために始めたプログラミングのこれまでの振り返り。勉強方法や役立った本も紹介。

  • web site
    アイキャッチ画像
    web site
    2022.11.26(更新)

    ページ表示速度アップ!npmでソースファイルを軽量化する方法【サクッと簡単!】

  • WordPress
    アイキャッチ画像
    WordPress
    2022.10.26(更新)

    【コピペ可】WordPressサイトをPWA化するためにService Workerを実装してみた。