跳到主要内容位置

HTML Dialog 对话框原生元素使用教程

以前,我们创建 Dialog 对话框的时候,需要手动创建弹出层和背景遮罩,或者使用 Bootstrap 等前端框架来帮我们实现。现在 HTML 原生支持使用 <Dialog />元素来创建对话框了,既可以创建模态的,也就是带背景遮罩的,对话框外的不可点击,也可以创建非模态的,并且支持良好的可访问性,可用按钮关闭对话框,也可以通过键盘 esc 键关闭。

这个视频我们来学习一下如何使用 Dialog 元素,打开和关闭对话框,编写 CSS 美化对话框。

基本用法

先来看一个最简单的对话框,我们可以使用 dialog 元素定义对话框,在开合标签中间,编写对话框上的内容,这里我们使用一个 h1 和一个 p 元素来展示一些简单的文本,这是一个信息类的对话框:

<dialog>
<h1>Welcome!</h1>
<p>This is a simple dialog</p>
</dialog>

然后 css 里设置了一些基本的样式:

body {
box-sizing: border-box;
padding: 0;
margin: 0;
font-family: Verdana, "PingFang SC", "Microsoft Yahei", sans-serif;
}

main {
display: grid;
place-items: center;
height: 100vh;
background-color: hsl(0deg, 0%, 98%);
}

form {
display: grid;
gap: 24px;
justify-content: end;
}

input {
padding: 12px;
font-size: 14px;
outline: none;
}

button {
border: none;
border-radius: 4px;
color: white;
font-weight: bold;
background: linear-gradient(45deg, hsl(218, 100%, 50%), hsl(187, 100%, 51%));
padding: 12px 24px;
}

使用 VS Code 的 Live Server 插件预览一下,可以看到现在页面上是空白的。这是因为对话框默认是隐藏的,我们可以给 dialog 加上一个 open 属性:

<dialog open>
<h1>Welcome!</h1>
<p>This is a simple dialog</p>
</dialog>

这样就可以看到对话框了。 不过这个对话框还没有关闭按钮,不方便关闭,只能按 esc 键。那我们可以在 dialog 内容的下方,添加一个 form 元素,然后 method 设置为 dialog,这样他里边的按钮就能够关闭对话框了,我们在 form 里边添加一个 button 元素,然后设置一下 label:

<dialog open>
<h1>Welcome!</h1>
<p>This is a simple dialog</p>
<form method="dialog">
<button>Close</button>
</form>
</dialog>

回到页面上,点击一下按钮,可以看到对话框关闭了。

我们可以给对话框设置一下样式,例如去掉边框,加上阴影等等:

dialog {
border: none;
border-radius: 8px;
padding: 24px 32px;
box-shadow: 0 0 48px hsl(0deg, 0%, 0%, 0.1);
}

JS 打开 Dialog

一般情况下,我们需要用户点击按钮才显示对话框,这时就需要使用 JavaScript 控制了。 我们先给 html 添加一个 JavaScript 文件:

<script src="./index.js"></script>

之后给 dialog 设置 id 属性,值为 dialog:

<dialog id="dialog"></dialog>

再在 dialog 下方添加一个按钮,用于打开对话框,id 设置为 showDialog:

</dialog>
<button id="showDialog">Show Dialog</button>

在 js 文件中:

  • 根据 id 获取 dialog 对话框的实例
  • 然后获取 showDialog 打开对话框按钮的实例
  • 之后给按钮添加点击事件,调用 dialog 实例的 showModal() 方法,打开一个模态的对话框,也就是带有背景遮罩,且其他区域不可点击,也可以调用 show() 方法打开一个非模态的对话框。
const dialog = document.getElementById("dialog");
const showDialogBtn = document.getElementById("showDialog");

showDialogBtn.addEventListener("click", () => {
dialog.showModal();
});

回到页面上,我们点击一下按钮,可以看到对话框就打开了,点击对话框中的按钮,对话框就关闭了。 我们可以在 css 中通过 ::backdrop 伪类来设置背景遮罩的颜色:

dialog::backdrop {
background-color: hsl(0deg, 0%, 0%, 0.3);
}

JS 关闭 Dialog

如果需要自行关闭 dialog,也就是不用 form 的形式,那么可以在事件中调用 dialog.close() 方法关闭对话框。

自动获得焦点

如果对话框的内容是表单,那么首先它会把焦点设置为第一个能设置焦点的元素上。假如说我们的对话框是一个注册表单,它的 HTML 结构包含一个用户名输入框和密码输入框,下边有确认和取消按钮:

<dialog id="dialog">
<h1>Register</h1>
<form method="dialog">
<input type="text" name="username" placeholder="username" />
<input type="password" name="password" placeholder="password" />
<div>
<button value="cancel">Cancel</button>
<button value="ok">OK</button>
</div>
</form>
</dialog>

先预览一下效果,点击按钮,可以看到对话框中的表单显示出来了,并且焦点自动放到了第一个输入框上,也就是用户名这里。

保存表单信息

把 form 的 method 设置为 dialog 之后,后面如果点击表单中的任何一个按钮,表单信息都会保存,即使对话框已经关闭。这里我们在表单中输入一些信息,然后点击确认,关闭对话框,再点击按钮打开对话框,可以看到表单信息还在,点击取消按钮也是如此。

获取返回值

当点击按钮关闭对话框时,可以监听对话框的 close 事件,在里边可以获得点击的按钮的 value 属性值,用于判断是点击了哪个按钮,或者其它自定义的功能逻辑。 在 index.js 中,我们监听 dialog 的 close 事件,然后 console.log 打印一下 dialog 示例的 returnValue 属性:

dialog.addEventListener("close", () => {
console.log(dialog.returnValue);
});

现在,取消按钮的 value 是 cancel,确认按钮的 value 是 ok,我们回到页面上,打开浏览器的开发者工具,然后打开对话框,点击取消按钮,可以看到控制台打印了 cancel,再打开对话框,点击 ok,可以看到控制台打印出了 ok。

小结

好了,这个就是 HTML 原生 Dialog 元素的使用方法。你学会了吗?如果有帮助请三连并关注,想学更多的开发知识,可以在评论区留言,感谢观看!

提示

一系列的课程让你成为高级前端工程师。课程覆盖工作中所有常用的知识点和背后的使用逻辑,示例全部都为工作项目简化而来,学完即可直接上手开发!

即使你已经是高级前端工程师,在课程里也可能会发现新的知识点和技巧,让你的工作更加轻松!

《React 完全指南》课程,包含 React、React Router 和 Redux 详细介绍,所有示例改编自真实工作代码。点击查看详情。

《Vue 3.x 全家桶完全指南与实战》课程,包括 Vue 3.x、TypeScript、Vue Router 4.x、Vuex 4.x 所有初级到高级的语法特性详解,让你完全胜任 Vue 前端开发的工作。点击查看详情。

《React即时通信UI实战》课程,利用 Storybook、Styled-components、React-Spring 打造属于自己的组件库。

《JavaScript 基础语法详解》本人所著图书,包含 JavaScript 全面的语法知识和新特性, 可在京东、当当、淘宝等各大电商购买