home
twitter
ページトップへ
目次
  • モーダルウィンドウとは何か?
  • 特徴
  • ポップアップとの違い
  • モーダルウィンドウの作り方!
  • ふわっと表示されるように変更してみる
  • 作成時のポイント!重なり順(z-index)を調整する
  • まとめ!
about
categories
page
archive
皇帝ペンギンブログ

2024/12/06 (更新日:2024/12/06)

【JavaScript】モーダルウィンドウの作り方!【分かりやすい】

Categories > JavaScriptの入門編
こんばんは!初めましての方は初めまして!
しゅーた(@chibasyuta)です!

今回は、モーダルウィンドウの作り方の解説をします!Webサイト制作者なら、よくあるモーダルウィンドウはちゃちゃっと作れてほしいのもです。

そんなモーダルウィンドウですがこの記事では「JavaScript」だけで作る方法の解説をします。なのでライブラリなどは使わない基本的な作り方になりますが、これが最も重要でもあると思います。

この記事の内容!

  • モーダルウィンドウとは何か?
  • JavaScriptでモーダルウィンドウを作る方法!
また、下の動画でも「モーダルウィンドウの作り方」について詳しく解説しているので、一緒に実際にコードを書きながら学びたい方はこちらをどうぞ!

それでは内容へ入ります!

目次
非表示
  • モーダルウィンドウとは何か?
  • 特徴
  • ポップアップとの違い
  • モーダルウィンドウの作り方!
  • ふわっと表示されるように変更してみる
  • 作成時のポイント!重なり順(z-index)を調整する
  • まとめ!

モーダルウィンドウとは何か?

https://chibasyuta.org/wp-content/uploads/2024/12/modal_demo_new.mp4
まずはモーダルウィンドウについて簡単に解説します。

「モーダルウィンドウ」とは、ふわっと画面上にでてくる小さなウィンドウのことです。

特徴

「モーダルウィンドウ」の特徴は下記の通りです。

  • 親ウィンドウをロックする
  • ふわっと画面上にでてくる小さなウィンドウ

モーダルウィンドウが開いている間、親ウィンドウ(背景)の操作ができなくなります。

名前の由来は”modal” は「モードを持つ」という意味。モーダルウィンドウが表示されている間、アプリケーションの状態は「ユーザーの応答待ちモード」になります。

ポップアップとの違い

ポップアップとの違いは下記の通りです。

ポップアップ 別ウィンドウとして開き、他のウィンドウと一緒に操作可能
モーダルウィンドウ その画面の操作が終わるまで他の操作ができない

例えば、ポップアップは広告表示に使われることが多いのに対し、モーダルウィンドウはログインフォームや確認ダイアログに使われます。

モーダルウィンドウの作り方!

それでは早速、JavaScriptを使ったモーダルウィンドウの基本的な作り方をみていきましょう。
<div id="mask" class="hidden"></div>

<div class="container">
    <div class="card hidden">
        <h2>皇帝ペンギンのサブスク!</h2>
        <ul>
            <li>実践的で</li>
            <li>さらに踏み込んだコンテンツが</li>
            <li>約月額1000円で見放題!</li>
            <li>プログラミングを学習するなら</li>
            <li>皇帝ペンギンプログラミング!</li>
            <li>略して「皇プロ!」</li>
        </ul>
        <button id="close">閉じる!</button>
    </div>
</div>

<button id="open">詳しくみる!</button>
@charset "utf-8";

html {
    font-size: 16px;
}
* {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}

.container {
    width: 1000px;
    margin: 200px auto;
}
.card {
    width: 400px;
    border: 2px solid #333;
    border-radius: 4px;
    padding: 30px;
    list-style-position: inside;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    background-color: white;
    transition-duration: 1s;
    z-index: 2;
}
h2 {
    margin-bottom: 20px;
}
ul {
    margin-bottom: 30px;
}
button {
    all: unset;
    border: 2px solid #333;
    padding: 8px 0;
    text-align: center;
    font-size: 20px;
    width: 200px;
    margin: 0 auto;
    display: block;
    transition-duration: 1s;
    cursor: pointer;
}
#mask {
    position: fixed;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    background-color: rgba(0, 0, 0, 0.3);
    transition-duration: 1s;
    z-index: 1;
}
.hidden {
    display: none;
}
const card = document.querySelector('.card');
const open = document.getElementById('open');
const close = document.getElementById('close');
const mask = document.getElementById('mask');

open.addEventListener('click', () => {
  card.classList.toggle('hidden');
  mask.classList.toggle('hidden');
  open.classList.toggle('hidden');
});

close.addEventListener('click', () => {
  card.classList.toggle('hidden');
  mask.classList.toggle('hidden');
  open.classList.toggle('hidden');
});

これでシンプルなモーダルウィンドウの完成です!

ふわっと表示されるように変更してみる

<div id="mask" class="hidden opacity"></div>

<div class="container">
    <div class="card hidden opacity">
        <h2>皇帝ペンギンのサブスク!</h2>
        <ul>
            <li>実践的で</li>
            <li>さらに踏み込んだコンテンツが</li>
            <li>約月額1000円で見放題!</li>
            <li>プログラミングを学習するなら</li>
            <li>皇帝ペンギンプログラミング!</li>
            <li>略して「皇プロ!」</li>
        </ul>
        <button id="close">閉じる!</button>
    </div>
</div>

<button id="open">詳しくみる!</button>
@charset "utf-8";

html {
    font-size: 16px;
}
* {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}

.container {
    width: 1000px;
    margin: 200px auto;
}
.card {
    width: 400px;
    border: 2px solid #333;
    border-radius: 4px;
    padding: 30px;
    list-style-position: inside;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    background-color: white;
    transition-duration: 1s;
    z-index: 2;
}
h2 {
    margin-bottom: 20px;
}
ul {
    margin-bottom: 30px;
}
button {
    all: unset;
    border: 2px solid #333;
    padding: 8px 0;
    text-align: center;
    font-size: 20px;
    width: 200px;
    margin: 0 auto;
    display: block;
    transition-duration: 1s;
    cursor: pointer;
}
.hidden {
    display: none;
}
.opacity {
    opacity: 0;
}
#mask {
    position: fixed;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    background-color: rgba(0, 0, 0, 0.3);
    transition-duration: 1s;
    z-index: 1;
}

"use strict";


const card = document.querySelector('.card');
const open = document.getElementById('open');
const close = document.getElementById('close');
const mask = document.getElementById('mask');

let isCardVisible = false;
function toggleCard() {
  if (isCardVisible) {
    card.classList.toggle('opacity');
    setTimeout( () => {
      card.classList.toggle('hidden');
    }, 1000 );
    isCardVisible = false;
  } else {
    card.classList.toggle('hidden');
    setTimeout( () => {
      card.classList.toggle('opacity');
    }, 10 );
    isCardVisible = true;
  }
}
let isMaskVisible = false;
function toggleMask() {
  if (isMaskVisible) {
    mask.classList.toggle('opacity');
    setTimeout( () => {
      mask.classList.toggle('hidden');      
    }, 1000 );
    isMaskVisible = false;
  } else {
    mask.classList.toggle('hidden');
    setTimeout( () => {
      mask.classList.toggle('opacity');
    }, 10 );
    isMaskVisible = true;
  }
}
let isOpenButtonVisible = true;
function toggleOpenButton() {
  if (isOpenButtonVisible) {
    open.classList.toggle('hidden');
    isOpenButtonVisible = false;
  } else {
    open.classList.toggle('hidden');
    isOpenButtonVisible = true;
  }
}

open.addEventListener('click', () => {
  toggleCard();
  toggleMask();
  toggleOpenButton();
});

close.addEventListener('click', () => {
  toggleCard();
  toggleMask();
  toggleOpenButton();
});

作成時のポイント!重なり順(z-index)を調整する

モーダルウィンドウが背景より前面に表示されるよう、z-indexを適切に設定しましょう。

まとめ!

モーダルウィンドウは、ユーザーに特定の情報を強調して伝えたい場合や、確認が必要な場面で非常に便利な機能です。今回紹介した方法を参考に、ぜひご自身のサイト制作に取り入れてみてください!

今後はもっと応用的なモーダルウィンドウの使い方を紹介予定です!お楽しみに!

また、下の動画でも「モーダルウィンドウの作り方」について詳しく解説しているので、一緒に実際にコードを書きながら学びたい方はこちらをどうぞ!

それではまたっ!

自分のロゴ!

皇帝ペンギン

全力で、書きます。
少しでもお役に立てたら幸いです。
楽しんで読んで下さい 。-_- 。
よろしくお願いします!

x(旧twitter) youtube
Categories
  • トップへ
  • ITパスポート (1)
  • programming (168)
    • CSSのアニメーション編 (26)
    • CSSのグリッドレイアウト編 (1)
    • CSSのセレクター編 (58)
    • CSSのフレックスボックス編 (1)
    • CSSのメディアクエリー編 (7)
    • CSSの基本編 (34)
    • HTMLのformタグ編 (1)
    • HTMLの基本編 (3)
    • JavaScriptの入門編 (30)
    • JavaScriptの基本編 (5)
    • Web制作をする環境を整えよう! (1)
  • Uncategorized (23)
  • VScode (1)
  • おすすめ商品! (1)
  • クラロワ (2)
  • マーケティング (17)
  • 大学生活 (7)
  • 心理学 (9)
  • 映画 (1)
  • 法学 (4)
  • 経済学 (4)
  • 読書 (7)
Pages
  • プライバシーポリシー
  • 免責事項
  • プロフィール
Archive
  • 2025年3月 (1)
  • 2025年1月 (9)
  • 2024年12月 (13)
  • 2024年11月 (5)
  • 2024年10月 (10)
  • 2024年9月 (15)
  • 2024年8月 (5)
  • 2024年7月 (6)
  • 2024年6月 (5)
  • 2024年5月 (10)
  • 2024年4月 (24)
  • 2024年3月 (11)
  • 2024年2月 (6)
  • 2024年1月 (10)
  • 2023年12月 (4)
  • 2023年11月 (3)
  • 2023年10月 (2)
  • 2023年9月 (3)
  • 2023年8月 (6)
  • 2023年7月 (3)
  • 2023年6月 (8)
  • 2023年5月 (2)
  • 2023年3月 (1)
  • 2023年2月 (1)
  • 2022年10月 (2)
  • 2022年9月 (2)
  • 2022年8月 (8)
  • 2022年7月 (2)
  • 2022年6月 (6)
  • 2022年5月 (9)
  • 2022年4月 (2)
  • 2022年2月 (4)
  • 2021年12月 (1)
  • 2021年11月 (4)
  • 2021年10月 (8)
  • 2021年9月 (14)
  • 2021年8月 (6)
  • 2021年6月 (1)
  • 2021年5月 (2)
  • 2021年4月 (1)
  • 2021年3月 (1)
  • 2021年2月 (2)
  • 2020年10月 (1)
  • 2020年7月 (1)
  • 2020年4月 (1)
  • 2020年1月 (1)
  • 2019年12月 (2)
© Copyright Syuta Chiba, 2019 All Rights Reserved.