モーダル
ライトボックス、ユーザーへの通知、または完全にカスタマイズされたコンテンツのために、サイトにダイアログを追加します。
概要
- モーダルはドキュメント内の他のすべての要素の上に配置され、
<body>
からスクロールを削除するため、モーダルコンテンツが代わりにスクロールします。 - モーダルは閉じられると *アンマウント* されます。
- Bootstrapは一度に **1つ** のモーダルウィンドウのみをサポートします。ネストされたモーダルはサポートされていませんが、どうしても必要な場合は、基盤となる
@restart/ui
ライブラリが対応可能です。 - モーダルはフォーカスをトラップし、キーボードナビゲーションがページの残りの部分ではなく、モーダル内を循環するようにします。
- Vanilla Bootstrapとは異なり、Reactが実装を処理するため、モーダルでは
autoFocus
が動作します。
例
静的マークアップ
モーダルの外観を示すために、以下に*静的な*モーダルダイアログ(配置なし)を示します。
import Button from 'react-bootstrap/Button';import Modal from 'react-bootstrap/Modal';function StaticExample() {return (<divclassName="modal show"style={{ display: 'block', position: 'initial' }}><Modal.Dialog><Modal.Header closeButton><Modal.Title>Modal title</Modal.Title></Modal.Header><Modal.Body><p>Modal body text goes here.</p></Modal.Body><Modal.Footer><Button variant="secondary">Close</Button><Button variant="primary">Save changes</Button></Modal.Footer></Modal.Dialog></div>);}export default StaticExample;
ライブデモ
ヘッダー、本文、フッターにアクションセットを含むモーダル。 <Modal/>
を他のコンポーネントと組み合わせて使用して、モーダルを表示または非表示にします。 <Modal/>
コンポーネントには、モーダルコンテンツの構築に使用できる便利な「サブコンポーネント」がいくつかあります:<Modal.Header/>
、<Modal.Title/>
、<Modal.Body/>
、および<Modal.Footer/>
。
import { useState } from 'react';import Button from 'react-bootstrap/Button';import Modal from 'react-bootstrap/Modal';function Example() {const [show, setShow] = useState(false);const handleClose = () => setShow(false);const handleShow = () => setShow(true);return (<><Button variant="primary" onClick={handleShow}>Launch demo modal</Button><Modal show={show} onHide={handleClose}><Modal.Header closeButton><Modal.Title>Modal heading</Modal.Title></Modal.Header><Modal.Body>Woohoo, you are reading this text in a modal!</Modal.Body><Modal.Footer><Button variant="secondary" onClick={handleClose}>Close</Button><Button variant="primary" onClick={handleClose}>Save Changes</Button></Modal.Footer></Modal></>);}export default Example;
静的バックドロップ
バックドロップが静的に設定されている場合、モーダルは外側をクリックしても閉じません。以下のボタンをクリックして試してください。
import { useState } from 'react';import Button from 'react-bootstrap/Button';import Modal from 'react-bootstrap/Modal';function Example() {const [show, setShow] = useState(false);const handleClose = () => setShow(false);const handleShow = () => setShow(true);return (<><Button variant="primary" onClick={handleShow}>Launch static backdrop modal</Button><Modalshow={show}onHide={handleClose}backdrop="static"keyboard={false}><Modal.Header closeButton><Modal.Title>Modal title</Modal.Title></Modal.Header><Modal.Body>I will not close if you click outside me. Do not even try to pressescape key.</Modal.Body><Modal.Footer><Button variant="secondary" onClick={handleClose}>Close</Button><Button variant="primary">Understood</Button></Modal.Footer></Modal></>);}export default Example;
アニメーションなし
モーダルはアニメーションなしにすることもできます。そのためには、animation
プロップをfalse
に設定します。
import { useState } from 'react';import Button from 'react-bootstrap/Button';import Modal from 'react-bootstrap/Modal';function Example() {const [show, setShow] = useState(false);const handleClose = () => setShow(false);const handleShow = () => setShow(true);return (<><Button variant="primary" onClick={handleShow}>Launch demo modal</Button><Modal show={show} onHide={handleClose} animation={false}><Modal.Header closeButton><Modal.Title>Modal heading</Modal.Title></Modal.Header><Modal.Body>Woohoo, you are reading this text in a modal!</Modal.Body><Modal.Footer><Button variant="secondary" onClick={handleClose}>Close</Button><Button variant="primary" onClick={handleClose}>Save Changes</Button></Modal.Footer></Modal></>);}export default Example;
モーダルヘッダー、タイトル、本文、フッターコンポーネントは、<Modal/>
コンポーネントの静的プロパティとして使用できますが、require("react-bootstrap/ModalHeader")
のように直接インポートすることもできます。
垂直方向に中央揃え
centered
プロップを渡すことで、モーダルを垂直方向に中央揃えできます。
import Button from 'react-bootstrap/Button';import Modal from 'react-bootstrap/Modal';function MyVerticallyCenteredModal(props) {return (<Modal{...props}size="lg"aria-labelledby="contained-modal-title-vcenter"centered><Modal.Header closeButton><Modal.Title id="contained-modal-title-vcenter">Modal heading</Modal.Title></Modal.Header><Modal.Body><h4>Centered Modal</h4><p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio,dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta acconsectetur ac, vestibulum at eros.</p></Modal.Body><Modal.Footer><Button onClick={props.onHide}>Close</Button></Modal.Footer></Modal>);}function App() {const [modalShow, setModalShow] = React.useState(false);return (<><Button variant="primary" onClick={() => setModalShow(true)}>Launch vertically centered modal</Button><MyVerticallyCenteredModalshow={modalShow}onHide={() => setModalShow(false)}/></>);}render(<App />);
グリッドの使用
モーダルコンテンツ内で通常のグリッドコンポーネントを使用して、モデル内でグリッドレイアウトを使用できます。
import React, { useState } from 'react';import Button from 'react-bootstrap/Button';import Col from 'react-bootstrap/Col';import Container from 'react-bootstrap/Container';import Modal from 'react-bootstrap/Modal';import Row from 'react-bootstrap/Row';function MydModalWithGrid(props) {return (<Modal {...props} aria-labelledby="contained-modal-title-vcenter"><Modal.Header closeButton><Modal.Title id="contained-modal-title-vcenter">Using Grid in Modal</Modal.Title></Modal.Header><Modal.Body className="grid-example"><Container><Row><Col xs={12} md={8}>.col-xs-12 .col-md-8</Col><Col xs={6} md={4}>.col-xs-6 .col-md-4</Col></Row><Row><Col xs={6} md={4}>.col-xs-6 .col-md-4</Col><Col xs={6} md={4}>.col-xs-6 .col-md-4</Col><Col xs={6} md={4}>.col-xs-6 .col-md-4</Col></Row></Container></Modal.Body><Modal.Footer><Button onClick={props.onHide}>Close</Button></Modal.Footer></Modal>);}function App() {const [modalShow, setModalShow] = useState(false);return (<><Button variant="primary" onClick={() => setModalShow(true)}>Launch modal with grid</Button><MydModalWithGrid show={modalShow} onHide={() => setModalShow(false)} /></>);}render(<App />);
特定の要素にフォーカス
要素のautoFocus
属性を使用して、モーダル内の要素にフォーカスできます。
import { useState } from 'react';import Button from 'react-bootstrap/Button';import Form from 'react-bootstrap/Form';import Modal from 'react-bootstrap/Modal';function Example() {const [show, setShow] = useState(false);const handleClose = () => setShow(false);const handleShow = () => setShow(true);return (<><Button variant="primary" onClick={handleShow}>Launch demo modal</Button><Modal show={show} onHide={handleClose}><Modal.Header closeButton><Modal.Title>Modal heading</Modal.Title></Modal.Header><Modal.Body><Form><Form.Group className="mb-3" controlId="exampleForm.ControlInput1"><Form.Label>Email address</Form.Label><Form.Controltype="email"placeholder="name@example.com"autoFocus/></Form.Group><Form.GroupclassName="mb-3"controlId="exampleForm.ControlTextarea1"><Form.Label>Example textarea</Form.Label><Form.Control as="textarea" rows={3} /></Form.Group></Form></Modal.Body><Modal.Footer><Button variant="secondary" onClick={handleClose}>Close</Button><Button variant="primary" onClick={handleClose}>Save Changes</Button></Modal.Footer></Modal></>);}export default Example;
オプションのサイズ
size
プロップを使用することで、Bootstrapの大規模または小規模モーダルを指定できます。
import { useState } from 'react';import Button from 'react-bootstrap/Button';import Modal from 'react-bootstrap/Modal';function Example() {const [smShow, setSmShow] = useState(false);const [lgShow, setLgShow] = useState(false);return (<><Button onClick={() => setSmShow(true)} className="me-2">Small modal</Button><Button onClick={() => setLgShow(true)}>Large modal</Button><Modalsize="sm"show={smShow}onHide={() => setSmShow(false)}aria-labelledby="example-modal-sizes-title-sm"><Modal.Header closeButton><Modal.Title id="example-modal-sizes-title-sm">Small Modal</Modal.Title></Modal.Header><Modal.Body>...</Modal.Body></Modal><Modalsize="lg"show={lgShow}onHide={() => setLgShow(false)}aria-labelledby="example-modal-sizes-title-lg"><Modal.Header closeButton><Modal.Title id="example-modal-sizes-title-lg">Large Modal</Modal.Title></Modal.Header><Modal.Body>...</Modal.Body></Modal></>);}export default Example;
フルスクリーンモーダル
fullscreen
プロップを使用して、モーダルをフルスクリーンにすることができます。ブレークポイントを指定すると、ブレークポイントサイズ**未満**の場合にのみ、モーダルがフルスクリーンとして設定されます。
import { useState } from 'react';import Button from 'react-bootstrap/Button';import Modal from 'react-bootstrap/Modal';function Example() {const values = [true, 'sm-down', 'md-down', 'lg-down', 'xl-down', 'xxl-down'];const [fullscreen, setFullscreen] = useState(true);const [show, setShow] = useState(false);function handleShow(breakpoint) {setFullscreen(breakpoint);setShow(true);}return (<>{values.map((v, idx) => (<Button key={idx} className="me-2 mb-2" onClick={() => handleShow(v)}>Full screen{typeof v === 'string' && `below ${v.split('-')[0]}`}</Button>))}<Modal show={show} fullscreen={fullscreen} onHide={() => setShow(false)}><Modal.Header closeButton><Modal.Title>Modal</Modal.Title></Modal.Header><Modal.Body>Modal body content</Modal.Body></Modal></>);}export default Example;
カスタムCSSを使用したモーダルのサイズ変更
dialogClassName
プロップを使用して、カスタムCSSをモーダルダイアログdivに適用できます。例として、幅が90%に設定されたカスタムCSSクラスを使用しています。
import { useState } from 'react';import Button from 'react-bootstrap/Button';import Modal from 'react-bootstrap/Modal';function Example() {const [show, setShow] = useState(false);return (<><Button variant="primary" onClick={() => setShow(true)}>Custom Width Modal</Button><Modalshow={show}onHide={() => setShow(false)}dialogClassName="modal-90w"aria-labelledby="example-custom-modal-styling-title"><Modal.Header closeButton><Modal.Title id="example-custom-modal-styling-title">Custom Modal Styling</Modal.Title></Modal.Header><Modal.Body><p>Ipsum molestiae natus adipisci modi eligendi? Debitis amet quae undecommodi aspernatur enim, consectetur. Cumque deleniti temporibusipsam atque a dolores quisquam quisquam adipisci possimuslaboriosam. Quibusdam facilis doloribus debitis! Sit quasi quodaccusamus eos quod. Ab quos consequuntur eaque quo rem! Mollitiareiciendis porro quo magni incidunt dolore amet atque facilis ipsumdeleniti rem!</p></Modal.Body></Modal></>);}export default Example;