模态框
为您的网站添加对话框,用于灯箱、用户通知或完全自定义内容。
概述
- 模态框位于文档中的所有其他内容之上,并从
<body>
中移除滚动,以便模态框内容滚动。 - 模态框在关闭时会卸载。
- Bootstrap 仅支持一次一个模态框窗口。不支持嵌套模态框,但如果您确实需要它们,基础
@restart/ui
库可以支持它们,如果您愿意。 - 模态框会“捕获”它们中的焦点,确保键盘导航在模态框中循环,而不是页面上的其他地方。
- 与原生 Bootstrap 不同,
autoFocus
在模态框中有效,因为 React 处理实现。
示例
静态标记
下面是一个静态模态框对话框(没有定位),用于演示模态框的外观和感觉。
结果
正在加载...
实时编辑器
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。例如,使用自定义 CSS 类将宽度设置为 90%。
结果
正在加载...
实时编辑器
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;