Dialog 对话框

在保留当前页面状态的情况下告知用户。

基础用法

Dialog 弹出一个对话框,适合需要定制化的场景。

通过设置 model-value / v-model 属性为 Boolean 来控制 Dialog 的显示与隐藏。 Dialog 分为 bodyfooter 两部分,后者需要一个名为 footerslottitle 属性用于定义标题,它是可选的,默认值为空。 最后,本例还展示了 before-close 的用法。

提示

before-close 仅当用户通过点击关闭图标或遮罩层关闭 Dialog 时起作用。 如果你在 footer 具名插槽中有关闭 Dialog 的按钮,你可以直接在按钮的点击事件处理器中添加 before-close 中的操作。

自定义内容

Dialog 的内容可以是任何东西,甚至是一个表格或表单。 本例展示了如何在 Dialog 中使用 Element Plus 的 Table 和 Form 组件。

自定义页眉

header 插槽可用于自定义显示标题的区域。 为了维护可访问性,除了使用此插槽外,请使用 title 属性,或者使用 titleId 插槽属性来指定哪个元素应被读取为对话框标题。

嵌套对话框

如果一个 Dialog 嵌套在另一个 Dialog 中,则需要设置 append-to-body 属性。

通常我们不建议使用嵌套对话框。 如果你需要在页面上渲染多个对话框,你可以简单地将它们平级放置。 如果你必须在一个对话框内嵌套另一个对话框,请将嵌套对话框的 append-to-body 设置为 true,它将追加到 body 而不是其父节点,这样两个对话框都能被正确渲染。

内容居中

Dialog 的内容可以水平居中。

center 设置为 true 将使对话框的页眉和页脚水平居中。 center 仅影响 Dialog 的页眉和页脚。 Dialog 的主体内容可以是任何东西,因此有时居中可能看起来并不好。 如果你也希望主体内容居中,则需要编写一些 CSS。

提示

Dialog 的内容是懒渲染的,这意味着默认插槽直到第一次打开时才会渲染到 DOM 中。 因此,如果你需要执行 DOM 操作或使用 ref 访问组件,请在 open 事件回调中进行。

垂直居中对话框

从屏幕中央打开对话框。

align-center 设置为 true 将使对话框在水平和垂直方向上都居中。 属性 top 将不再起作用,因为对话框是在 flex 容器中垂直居中的。

关闭时销毁

开启此功能时,默认插槽下的内容将通过 v-if 指令销毁。 当你有性能方面的考量时可以开启此功能。

注意,启用此功能后,在 transition.beforeEnter 触发之前内容不会渲染,届时只会存在 overlayheader(如果有)footer(如果有)

可拖拽对话框

试着拖拽 header 部分。

设置 draggabletrue 即可拖拽。 设置 overflow 2.5.4true 可以拖拽出视口之外。

提示

当使用 modal = false 时,请确保 append-to-body 已设置为 true,因为 Dialog 是通过 position: relative 定位的。当 modal 被移除时,Dialog 将基于 DOM 中的当前位置定位,而不是 Document.Body,从而导致样式错乱。

全屏

设置 fullscreen 属性来打开全屏对话框。

提示

如果 fullscreen 为 true,widthtopdraggable 属性将不起作用。

modal 设置为 false 将隐藏对话框的遮罩层(overlay)。

从版本 2.10.5 开始,添加了 modal-penetrable 属性,可以设置遮罩层可穿透。

自定义动画 2.10.5

通过 transition 属性自定义对话框动画,该属性接受以下两种形式:

  • 过渡动画名称 (string)

  • Vue 过渡动画配置 (object)

示例包括缩放、滑动、淡入淡出、回弹动画以及带有自定义事件处理器的基于对象的配置。

提示

动画类名是根据过渡名称动态生成的。 为了对动画行为进行精细控制,你可以显式定义这些类。 详情请参考 自定义过渡类名

事件

打开开发者控制台 (ctrl + shift + J) 查看事件顺序。

API

属性

名称描述类型默认值
model-value / v-modelDialog 的可见性booleanfalse
titleDialog 的标题。 也可通过具名插槽传入(见下表)string''
widthDialog 的宽度,默认为 50%string / number''
全屏显示Dialog 是否占据全屏booleanfalse
Dialog CSS 的 margin-top 值,默认为 15vhstring''
遮罩层是否显示遮罩层booleantrue
遮罩层可穿透 2.10.5遮罩层是否可穿透。 modal 属性必须为 falsebooleanfalse
遮罩层类名遮罩层的自定义类名string
页眉类名 2.9.3页眉容器的自定义类名string
主体类名 2.9.3主体容器的自定义类名string
页脚类名 2.9.3页脚容器的自定义类名string
插入至 body是否将 Dialog 自身追加到 body。 嵌套对话框应将此属性设置为 truebooleanfalse
追加至 2.4.3Dialog 追加到的元素。 将覆盖 append-to-bodyCSSSelector / HTMLElementbody
锁定滚动当 Dialog 显示时是否禁用 body 滚动booleantrue
打开延迟打开前的延迟时间(毫秒)number0
关闭延迟关闭前的延迟时间(毫秒)number0
点击遮罩层关闭是否可以通过点击遮罩层来关闭 Dialogbooleantrue
close-on-press-escape是否可以通过按下 ESC 键来关闭 Dialogbooleantrue
show-close是否显示关闭按钮booleantrue
关闭前回调Dialog 关闭前的回调,会阻止 Dialog 关闭。使用 done 来关闭对话框Function
draggable为 Dialog 启用可拖拽功能booleanfalse
溢出视口 2.5.4可拖拽的 Dialog 是否可以超出视口booleanfalse
居中是否将页眉和页脚居中对齐booleanfalse
垂直居中 2.2.16对话框是否水平和垂直对齐booleanfalse
关闭时销毁当关闭时销毁 Dialog 中的元素booleanfalse
关闭图标自定义关闭图标,默认为 Closestring / Component
z-index同原生 CSS 中的 z-index,设置对话框的堆叠顺序number
页眉 ARIA 级别 a11y页眉的 aria-level 属性string2
过渡动画 2.10.5对话框动画的自定义过渡配置。可以是一个字符串 (过渡名称) 或一个带有 Vue 过渡 props 的对象string / object对话框渐变 (dialog-fade)
自定义类名 已弃用Dialog 的自定义类名string''

警告

custom-class 已被弃用,并将于 2.4.0 版本中移除,请使用 class

插槽

名称描述
defaultDialog 的默认内容
headerDialog 页眉的内容; 替换此插槽会移除标题,但不会移除关闭按钮。
footerDialog 页脚的内容
标题 已弃用与 header 插槽效果相同。 请改用插槽。

警告

title 已被弃用,并将于 3.0.0 版本中移除,请使用 header

事件

名称描述类型
openDialog 打开时触发Function
已打开Dialog 打开动画结束时触发Function
关闭Dialog 关闭时触发Function
已关闭Dialog 关闭动画结束时触发Function
打开后自动聚焦Dialog 打开且内容获得焦点后触发Function
关闭后自动聚焦Dialog 关闭且内容获得焦点后触发Function

暴露

名称描述类型
重置位置 2.8.1重置位置Function
处理关闭 2.9.8关闭对话框Function

常见问题

在 SFC 中使用 Dialog,scoped 样式不生效

典型问题: #10515

注:由于 Dialog 是使用 Teleport 渲染的,建议根节点的样式写在全局样式中。

当 Dialog 显示或隐藏时,页面元素会出现左右抖动的情况

典型问题: #10481

注:建议将滚动区域放在 vue 挂载的节点内部(例如 <div id="app" />),并为 body 使用 overflow: hidden 样式。

来源

组件源码样式源码文档源码

贡献者