ポップアップ表示

サイト訪問時に一時的に表示されるポップアップウィンドウと、クリック操作で表示されるポップアップウィンドウの実装方法をご紹介します。

今回の記事で分かること
「お知らせ」や「キャンペーン告知」など、訪問者に伝えたい情報を、ページの移動なしでスマートに表示できるようになります。

完成デモの紹介

まずはデモをご覧ください。

See the Pen ポップアップ表示 by はなはな氏 (@wxftomuu-the-selector) on CodePen.

ソースコードについて

HTML

今回のサンプルでは、初回アクセス時に1回のみ表示するポップアップウィンドウと、ボタンをクリックするたびに開くポップアップウィンドウを実装しています。

<h3>ポップアップ表示</h3>
<div class="container">
  <div class="item">
    <p>ブラウザを閉じない限り一時的なポップアップが<br/>
      再度表示されることはありません。</p>
    <!-- id に open-popup を指定したボタンを設置 -->
    <button id="open-popup" class="button-bg" role="button" onclick="#">毎回表示のポップアップ</button>
  </div>
</div>

<!--  一時的なポップアップを利用する場合は id に onetime-popup を指定してください。 -->
<div id="onetime-popup" class="popup-hidden">
  <div class="popup-overlay"></div>
  <div class="popup-content">
    <button class="popup-close" aria-label="閉じる"></button>
    <div class="popup-title">一時的なポップアップ</div>
    <div class="popup-desc">
      <p>ポップアップは「×」ボタンまたは、画面外をクリックすることで閉じることができます。</p>
      <p>一度閉じると、ブラウザを終了するまで再び表示されることはありません。</p>
    </div>
  </div>
</div>

<!--  クリック操作で開くポップアップを利用する場合は id に popup を指定してください。 -->
<div id="popup" class="popup-hidden">
  <div class="popup-overlay"></div>
  <div class="popup-content">
    <button class="popup-close" aria-label="閉じる"></button>
    <div class="popup-title">毎回表示のポップアップ</div>
    <div class="popup-desc">
      <p>ポップアップは「×」ボタンまたは、画面外をクリックすることで閉じることができます。</p>
      <p>一度閉じても、ボタンをクリックすれば再度表示することができます。</p>
    </div>
  </div>
</div>

上記のように、一時的に表示したい場合は onetime-popup、クリックで表示したい場合は popup を id に指定することで、それぞれの用途に応じて使い分けることができます。

この動きを実現するには、CSSと、JavaScriptでのアニメーション設定が必要になります。
次に、実際のCSSとJavaScriptのコードを紹介します。

CSS

黒い半透明のオーバーレイの上に、ポップアップウィンドウが0.4秒かけて上からスライドしながら表示されるアニメーションを実装しています。

/* コンテンツスタイル
-------------------------*/
/* 
この部分は、ポップアップウィンドウを適用するための
サンプルレイアウト(見た目)のスタイルです。
実際のサイトに合わせて、自由にカスタマイズしてください。
*/
h3 {
  text-align: center;
  color: #1a8093;
}
.container {
  text-align: center;
}
.button-bg {
  letter-spacing: 1px;
  padding: 13px 20px 13px;
  border: 1px solid #333;
  border-radius: 5px;
  cursor: pointer;
  position: relative;
  background-color: rgba(0, 0, 0, 0);
  user-select: none;
  -webkit-user-select: none;
  touch-action: manipulation;
}
.button-bg:after {
  content: "";
  background-color: #b6e8f1;
  width: 100%;
  z-index: -1;
  position: absolute;
  height: 100%;
  top: 5px;
  left: 5px;
  transition: 0.3s;
  border-radius: 5px;
  transform: translateZ(-10px);
}
.button-bg:hover:after {
  top: 0px;
  left: 0px;
}
/* ポップアップスタイル
-------------------------*/

/* ポップアップの基本設定。全画面中央に固定表示 */
#onetime-popup, #popup {
  position: fixed;      /* 画面に固定表示 */
  inset: 0;             /* top, right, bottom, left をすべて0に */
  z-index: 9999;        /* 最前面に表示 */
  display: flex;
  align-items: center;
  justify-content: center;
}

/* 非表示状態を強制するためのクラス */
.popup-hidden {
  display: none !important; /* JavaScriptでの表示切り替え用 */
}

/* オーバーレイの初期状態(透明で非表示) */
.popup-overlay {
  transition: .4s ease; /* アニメーションの滑らかさ */
}

/* オーバーレイの表示時(背景に半透明の黒を表示) */
.popup-overlay.active {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, 0.3); /* 半透明の黒背景 */
  z-index: 1;
  cursor: pointer;
}

/* ポップアップの本体デザイン */
.popup-content {
  position: relative;
  background: white;
  border-radius: 10px;
  max-width: 500px;
  width: 90%;
  z-index: 2;               /* オーバーレイより上に表示 */
  opacity: 0;               /* 初期状態では透明 */
  transform: translateY(-20px); /* 上に浮かせた状態 */
  transition: opacity 0.4s ease, transform 0.4s ease; /* 表示アニメーション */
}

/* ポップアップが表示されたときのアニメーション(フェードイン+スライド) */
#onetime-popup.show .popup-content,
#popup.show .popup-content {
  opacity: 1;
  transform: translateY(0);
}

/* ポップアップのタイトル部分 */
.popup-title {
  background: #1a8093;
  padding: 15px 20px;
  color: #fff;
  font-size: 20px;
  font-weight: bold;
  text-align: center;
  border-top-left-radius: 10px;
  border-top-right-radius: 10px;
  position: relative;
}

/* 一時的ポップアップのタイトル色はオレンジ */
#onetime-popup .popup-title {
  background: #ffa500;
}

/* ポップアップ本文エリア */
.popup-desc {
  padding: 0 30px 20px;
}

/* 最後の段落にだけ余白が付かないようにする */
.popup-desc p:last-child {
  margin-bottom: 0;
}

/* ✕ボタンのスタイル(ポップアップ外に配置) */
.popup-close {
  position: absolute;
  top: -16px;
  right: -16px;
  width: 32px;
  height: 32px;
  background: white;
  border: none;
  border-radius: 50%;
  cursor: pointer;
  z-index: 3;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
  transition: 0.3s;
}

/* ✕の線(before/afterを使ってクロスを描画) */
.popup-close::before,
.popup-close::after {
  content: '';
  position: absolute;
  left: 50%;
  top: 50%;
  width: 16px;
  height: 2px;
  background-color: #333;
  transform-origin: center;
  transition: 0.3s;
}

/* 斜め線1本目 */
.popup-close::before {
  transform: translate(-50%, -50%) rotate(45deg);
}

/* 斜め線2本目 */
.popup-close::after {
  transform: translate(-50%, -50%) rotate(-45deg);
}

/* ホバー時:ボタンの背景色変更 */
.popup-close:hover {
  background-color: #1a8093;
}

/* 一時ポップアップ用ホバーカラー(オレンジ) */
#onetime-popup .popup-close:hover {
  background-color: #ffa500;
}

/* ホバー時:✕マークの色を白に変更 */
.popup-close:hover::before,
.popup-close:hover::after {
  background-color: #fff;
}

JS

1つの関数で「一度だけ表示するポップアップ」と「ボタンクリックで表示するポップアップ」の両方に対応するよう実装しています。

// DOMの読み込みが完了してから実行
document.addEventListener('DOMContentLoaded', function () {

  /**
   * 汎用ポップアップ初期化関数
   * @param {string} popupId - 対象のポップアップ要素のID
   * @param {string|null} triggerId - 表示をトリガーするボタンのID。nullの場合はページ表示時に自動表示
   * @param {boolean} once - trueの場合は1度だけ表示(セッションストレージで制御)
   */
  function initPopup(popupId, triggerId = null, once = false) {
    const popup = document.getElementById(popupId);                 // ポップアップ全体
    const overlay = popup.querySelector('.popup-overlay');         // 黒半透明のオーバーレイ
    const closeBtn = popup.querySelector('.popup-close');          // ✕ボタン

    /**
     * ポップアップを表示する関数
     * - hiddenクラスを外し、アニメーション付きで表示
     */
    const showPopup = () => {
      popup.classList.remove('popup-hidden');
      requestAnimationFrame(() => {
        overlay.classList.add('active');      // オーバーレイを表示
        popup.classList.add('show');          // ポップアップに表示用クラス付与(アニメーション開始)
      });
    };

    /**
     * ポップアップを非表示にする関数
     * - アニメーション後に非表示クラスを追加
     */
    const hidePopup = () => {
      popup.classList.remove('show');
      overlay.classList.remove('active');
      setTimeout(() => popup.classList.add('popup-hidden'), 400); // アニメーション完了後に非表示
    };

    /**
     * 表示条件の分岐処理
     */

    // 「一度だけ表示」の場合(セッションストレージで制御)
    if (once) {
      // セッションストレージに未保存(=初回)なら表示
      if (!sessionStorage.getItem(`popupDisplayed-${popupId}`)) {
        showPopup();
        sessionStorage.setItem(`popupDisplayed-${popupId}`, 'true');
      }
    }

    // トリガーIDが指定されている場合(ボタンクリックで表示)
    else if (triggerId) {
      const trigger = document.getElementById(triggerId);
      trigger.addEventListener('click', showPopup);
    }

    // 閉じる処理(✕ボタン・オーバーレイ両方)
    overlay.addEventListener('click', hidePopup);
    closeBtn.addEventListener('click', hidePopup);
  }

  // ▼ ページ読み込み時に「一度だけ表示」されるポップアップを初期化
  initPopup('onetime-popup', null, true);

  // ▼ ボタンクリックで毎回表示されるポップアップを初期化
  initPopup('popup', 'open-popup', false);
});

まとめ

今回紹介したポップアップウィンドウは訪問者に情報をスマートに伝えるためにとても有効なアニメーションです。
簡単に実装できるので、是非サイトに取り入れてみてください!

弊社では、サイトの運営に手が回らないという方のために、更新代行作業も承っております。同じ手順でやったけどうまくいかない場合は、ぜひ一度ご相談ください。

この記事が少しでも皆さまのお役に立てば幸いです。最後までお読みいただき、ありがとうございました。

おすすめの記事