摘要:dialog 是HTML5新增的语义化双标签,用于展示一个交互式的模态对话框。它既可以创建模态对话框(用户不能与打开对话框的页面进行交互,直到对话框关闭,模态对话带半透明背景...
dialog 是HTML5新增的语义化双标签,用于展示一个交互式的模态对话框。
它既可以创建模态对话框(用户不能与打开对话框的页面进行交互,直到对话框关闭,模态对话带半透明背景遮罩层的对话框,也可以使用 esc键 关闭对话框),也可以创建非模态对话框(用户可以与打开对话框的页面进行交互,同时也可以与对话框进行交互,只能点击按钮关闭对话框,不能使用 esc键 关闭对话框)。
一、 基础结构
<dialog> 是双标签,可以在它的头尾标签之间自定义对话框内容。如:
<dialog> <h1>这个是对话框的内容</h1> <p> 这是一个简单的对话框 </p> </dialog>
默认<dialogo> 标签是不可见的。
要显示对话框,需要添加 open 属性。
<dialog open> <h1>这个是对话框的内容</h1> <p> 这是一个简单的对话框 </p> </dialog>
注意几个细节:
<dialog> 标签的显示与隐藏是通过 display:block/none; 进行操作的。意味着 <dialog> 标签默认不能进行透明度渐隐变化。
<dialog> 标签默认是绝对定位的。
<dialog> 标签自带有 1em 的 padding 值。
<dialog> 标签是通过设置 margin:auto 实现的水平居中。
二、JS控制对话框的显示隐藏
1. show()
非模态化显示对话框,对其添加open属性。在非模态化下,不能使用 esc 键让对话框消失。
如:点击按钮,显示对话框。
let btn = document.getElementById("btn"); let myDialog = document.querySelector("#myDialog"); // 获取对话框标签 btn.addEventListener("click",function (e) { myDialog.show(); });
2.showModal()
模态化显示对话框,对其添加open属性并且显示遮罩层,同时按ESC键可以关闭对话框。
let btn = document.getElementById("btn"); let myDialog = document.querySelector("#myDialog"); // 获取对话框标签 btn.addEventListener("click",function (e) { myDialog.showModal(); });
3.close()
关闭对话框
let myDialog = document.querySelector("#myDialog"); // 获取对话框标签 myDialog.close();
三、CSS样式控制
/** 非模态化样式 **/ dialog { position: fixed; top: 50%; left: 50%; height: 200px; width: 400px; margin-top:-100px; margin-left:-200px; border: 1px solid #ddd; border-radius: 2px; padding: 10px; box-shadow:1px 1px 50px rgba(0,0,0,.3) } /** 模态化样式 **/ dialog:modal { padding: 15px; max-width: calc((100% - 6px) - 2em); max-height: calc((100% - 6px) - 2em); border-radius: 2px; border:1px solid #ddd; box-shadow:1px 1px 50px rgba(0,0,0,.3) } /** 模态化 遮罩层样式 **/ dialog::backdrop { position: fixed; top: 0px; right: 0px; bottom: 0px; left: 0px; background: rgba(0, 0, 0, 0.3); }
四、综合案例
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>dialog弹窗</title> <style> dialog:modal { padding: 15px; max-width: calc((100% - 6px) - 2em); max-height: calc((100% - 6px) - 2em); border-radius: 2px; border: 1px solid #ddd; box-shadow: 1px 1px 50px rgba(0, 0, 0, .3) } dialog::backdrop { position: fixed; top: 0px; right: 0px; bottom: 0px; left: 0px; background: rgba(0, 0, 0, 0.3); } </style> </head> <body> <!-- 弹框 --> <dialog closeByMask id="dialog"> <p>调查问卷</p> <form action="" onsubmit="return submitForm(this)"> <div> 姓名:<input type="text" name="name"> </div> <div> 年龄:<input type="text" name="age"> </div> <div> <input type="submit" value="确定"> <button type="button" id="btn-close">关闭</button> </div> </form> </dialog> <button id="btn-open">打开对话</button> <script> var btnOpen = document.querySelector("#btn-open"); var btnClose = document.querySelector("#btn-close"); var dialog = document.querySelector("#dialog"); // 打开弹窗 btnOpen.addEventListener("click", function() { // dialog.show(); // 非模态弹窗 dialog.showModal(); // 模态弹窗 }); // 关闭弹窗 btnClose.addEventListener("click", function() { dialog.close(); }); // 表单提交 function submitForm(obj) { console.log('姓名:', obj.name.value); console.log('年龄:', obj.age.value); dialog.close(); return false; } // 点击遮罩层关闭弹窗(如不需要点击遮罩层关闭,可以删除) function closeDialog(event) { if (event.target === dialog) { dialog.close(); } } // 点击遮罩层关闭弹窗(如不需要点击遮罩层关闭,可以删除) dialog.addEventListener("click", closeDialog); </script> </body> </html>