0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【備忘録】最速でモーダルウィンドウをNext.jsで実装する

Posted at

はじめに

この記事は react-modal の使い方の備忘録です。

インストール

npm install react-modal

TypeScript環境下 なら 型ファイル も取得する必要があります。

npm install -D @types/react-modal

最小セットでモーダルウィンドウを実装する

app/page.tsx
"use client";

import { useState } from "react";
import Modal from "react-modal";

Modal.setAppElement(".App");

export default function Home() {
  const [ modalIsOpen, setIsOpen ] = useState(false);

  return (
    <div className="App">
      <button onClick={() => setIsOpen(true)}>Open Modal</button>
      <Modal isOpen={modalIsOpen}>
        <button onClick={() => setIsOpen(false)}>Close Modal</button>
      </Modal>
    </div>
  );
}

ModalコンポーネントisOpen Propstrue なら
Modalコンポーネント の中が モーダルウィンドウ として 描画 されます。
・逆に ModalコンポーネントisOpen Propsfalse なら
Modalコンポーネント の中は 描画 されません。
Modal.setAppELementモーダルウィンドウ で隠れた部分を 指定すると良いようです。

image.png

最小セット では "モーダルウィンドウ" がこのように 描画 されます。

モーダルウィンドウの見た目を変更する

app/page.tsx
"use client";

import { useState } from "react";
import Modal from "react-modal";

Modal.setAppElement(".App");

const modalStyle = {
  overlay: {
    position: "fixed",
    top: 0,
    left: 0,
    backgroundColor: "rgba(0,0,0,0.85)"
  },
  content: {
    position: "absolute",
    top: "5rem",
    left: "5rem",
    right: "5rem",
    bottom: "5rem",
    backgroundColor: "paleturquoise",
    borderRadius: "1rem",
    padding: "1.5rem"
  }
};

export default function Home() {
  const [ modalIsOpen, setIsOpen ] = useState(false);

  return (
    <div className="App">
      <button onClick={() => setIsOpen(true)}>Open Modal</button>
      <Modal isOpen={modalIsOpen} style={modalStyle}>
        <button onClick={() => setIsOpen(false)}>Close Modal</button>
      </Modal>
    </div>
  );
}

Modalコンポーネントstyle Props
CSSを記述したオブジェクト を渡すことで モーダルウィンドウ見た目変更 します。

CSSを記述したオブジェクトoverlaycontent という プロパティ を持ちます。
overlay には モーダルウィンドウの外側適用したいCSS
content には モーダルウィンドウの内側適用したいCSS
それぞれ記述します。

image.png

実装例はこのように 描画 されます。

CSSを記述したオブジェクトpositionプロパティ を渡していますが、
TypeScript環境下 だと 型エラー が発生します。
これは デフォルトpositionプロパティ が当てられていることが関係していると思うので 指定しない で大丈夫だと思います。

モーダルウィンドウの外側をクリックしてモーダルウィンドウを閉じる

app/page.tsx
"use client";

import { useState } from "react";
import Modal from "react-modal";

Modal.setAppElement(".App");

const modalStyle = {
  overlay: {
    position: "fixed",
    top: 0,
    left: 0,
    backgroundColor: "rgba(0,0,0,0.85)"
  },
  content: {
    position: "absolute",
    top: "5rem",
    left: "5rem",
    right: "5rem",
    bottom: "5rem",
    backgroundColor: "paleturquoise",
    borderRadius: "1rem",
    padding: "1.5rem"
  }
};

export default function Home() {
  const [ modalIsOpen, setIsOpen ] = useState(false);

  return (
    <div className="App">
      <button onClick={() => setIsOpen(true)}>Open Modal</button>
      <Modal isOpen={modalIsOpen} style={modalStyle} onRequestClose={() => setIsOpen(false)}>
        <button onClick={() => setIsOpen(false)}>Close Modal</button>
      </Modal>
    </div>
  );
}

ModalコンポーネントonRequestClose Props に渡した callback関数
モーダルウィンドウ外側クリック された時に 発火 します。

モーダルウィンドウ開閉フラグcallback関数内falsyな値 にしておくことで
モーダルウィンドウの外側クリック した時に
モーダルウィンドウ閉じる ことができます。

さいごに

学習させていただいた先・ライブラリの公式ドキュメントです。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?