ポップアップウィンドウ 実装解説|JavaScript CSS Popup Window Guide

ポップアップウィンドウ デザイン見本

ボタンクリックで画面下から現れて自動で消えるポップアップウィンドウの実装解説。@keyframes を使った基本パターンと表示位置のバリエーションのコピペ用コードを掲載。

① 基本のポップアップ — @keyframes で下からフワッと表示・自動消去

ボタンを押すと画面下にポップアップが現れます

Have a nice day!

下からフワッと現れて自動で消えます。

HTML
<div class="pp-btn-wrap">
  <button id="pp-btn">ポップアップ表示</button>
</div>
<div id="pp-popup" class="pp-popup">
  <p class="pp-headline">Have a nice day!</p>
  <p class="pp-body">下からフワッと現れて自動で消えます。</p>
</div>
CSS
.pp-btn-wrap {
  display: flex;
  justify-content: center;
  padding: 24px 0;
}

#pp-btn {
  display: block;
  padding: 11px 28px;
  border: none;
  border-radius: 8px;
  background: #3b82f6;
  color: #fff;
  font-size: 0.9rem;
  font-weight: 600;
  cursor: pointer;
}

#pp-btn:hover {
  opacity: 0.8;
}

.pp-popup {
  position: fixed;
  left: 50%;
  bottom: -200px;
  transform: translateX(-50%);
  z-index: 9999;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  background: #fff;
  border-radius: 12px;
  padding: 18px 28px;
  min-width: 260px;
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.22);
  border: 2px solid #3b82f6;
}

.pp-popup.pp-active {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  bottom: 24px;
  animation: ppAnim 3.4s ease forwards;
}

@keyframes ppAnim {
  0% {
    transform: translateX(-50%) translateY(20px);
    opacity: 0;
  }
  15%, 80% {
    transform: translateX(-50%) translateY(0);
    opacity: 1;
  }
  100% {
    transform: translateX(-50%) translateY(20px);
    opacity: 0;
  }
}

.pp-headline {
  font-size: 1rem;
  font-weight: 700;
  color: #1e40af;
  margin: 0 0 4px;
}

.pp-body {
  font-size: 0.83rem;
  color: #555;
  margin: 0;
}
JS
var ppBtn = document.querySelector('#pp-btn');
var ppPopup = document.querySelector('#pp-popup');

if (ppBtn && ppPopup) {
  ppBtn.addEventListener('click', function() {
    ppPopup.className = 'pp-popup pp-active';
  });
  ppPopup.addEventListener('animationend', function(e) {
    if (e.animationName === 'ppAnim') {
      ppPopup.className = 'pp-popup';
    }
  });
}
@keyframes でアニメーションを定義する

@keyframes にアニメーション名と各時点でのスタイル変化を記述します。0% が開始状態、15%〜80% が表示中、100% が終了状態です。animation プロパティに名前と再生時間を指定するだけで適用できます。forwards は「アニメーション終了後も最後の状態を維持する」指定です。

animationend イベントでクラスをリセットする

アニメーション終了後に自動でクラスをリセットするには animationend イベントを使います。pp-active クラスを取り除くことで、次にボタンを押したときにも同じアニメーションが再生されます。

② 表示位置のバリエーション — position: fixed の配置オプション

ボタンで各位置のポップアップを確認できます

表示位置: -

ポップアップ

右下に表示

HTML
<div class="pp-btn-wrap">
  <button id="pp-btn">ポップアップ表示</button>
</div>
<div id="pp-popup" class="pp-popup">
  <p class="pp-headline">ポップアップ</p>
  <p class="pp-body">右下に表示</p>
</div>
CSS
.pp-btn-wrap {
  display: flex;
  justify-content: center;
  padding: 24px 0;
}

#pp-btn {
  padding: 11px 28px;
  border: none;
  border-radius: 8px;
  background: #3b82f6;
  color: #fff;
  font-weight: 600;
  cursor: pointer;
}

.pp-popup {
  position: fixed;
  right: 20px;
  bottom: -200px;
  z-index: 9999;
  opacity: 0;
  visibility: hidden;
  background: #fff;
  border-radius: 12px;
  padding: 18px 28px;
  min-width: 220px;
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.22);
  border: 2px solid #6366f1;
}

.pp-popup.pp-active {
  opacity: 1;
  visibility: visible;
  bottom: 24px;
  animation: ppAnim 3s ease forwards;
}

@keyframes ppAnim {
  0% { opacity: 0; transform: translateY(20px); }
  15%, 80% { opacity: 1; transform: translateY(0); }
  100% { opacity: 0; transform: translateY(20px); }
}

.pp-headline {
  font-size: 1rem;
  font-weight: 700;
  color: #1e40af;
  margin: 0 0 4px;
}

.pp-body {
  font-size: 0.83rem;
  color: #555;
  margin: 0;
}
JS
var ppBtn = document.querySelector('#pp-btn');
var ppPopup = document.querySelector('#pp-popup');

if (ppBtn && ppPopup) {
  ppBtn.addEventListener('click', function() {
    ppPopup.className = 'pp-popup pp-active';
  });
  ppPopup.addEventListener('animationend', function(e) {
    if (e.animationName === 'ppAnim') {
      ppPopup.className = 'pp-popup';
    }
  });
}
position: fixed で画面に固定配置する

position: fixed はスクロールに関わらず常に画面の同じ位置に要素を固定します。right / left / bottom / top の値の組み合わせで表示位置を決めます。中央揃えには left: 50%; transform: translateX(-50%); を使います。


当サイトで公開しているWebデザインやUIの実装例は、一覧として以下記事に纏めています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次