除了单击Esc
按钮外,如何通过单击dialog
框外部来关闭dialog
框?
<!DOCTYPE html>
<html>
<body>
<p>Click the button to show the dialog.</p>
<button onclick="myFunction()">Show dialog</button>
<p><b>Note:</b> Use the "Esc" button to close the modal.</p>
<p><b>Note:</b> The dialog element is only supported in Chrome 37+, Safari 6+ and Opera 24+.</p>
<dialog id="myDialog">This is a dialog window</dialog>
<script>
function myFunction() {
document.getElementById("myDialog").showModal();
}
</script>
</body>
</html>
5条答案
按热度按时间mm5n2pyu1#
HTMLDialogElement接口的showModal()方法将对话框显示为模式对话框,位于可能存在的任何其他对话框的顶部。它与::background伪元素一起显示在顶层。对话框外部的交互被阻止,对话框外部的内容被呈现为惰性。MDN documentation
正如你所看到的,在dialog之外,所有其他的html节点都将被阻塞。但是,我们可以添加一个子节点作为我们内容的 Package 器,这样我们就把我们的内容与外部区域分开了。让我们用css从dialog中移除额外的填充,并将其添加到模态类中。
xnifntxz2#
一般来说,你可以使用onblur-或者onfocusout-事件,当你离开元素或者点击另一个元素时,这两个事件都会触发(尽管我还没有用对话框专门测试过)。
lmyy7pcs3#
我知道这有点不切实际,但你可以添加一个像整个屏幕一样大的div,当你点击“显示对话框”时,div的显示是块,当你点击屏幕大小的div时,对话框消失。
qxgroojn4#
.showModal()
使用了一个::backdrop
,它是一个伪元素,对于DOM是不可见的,因此是不可触及的。下面的示例显示了如何使用.show()
方法,以便在<dialog>
之外进行单击。xnifntxz5#
你也可以试试亚当·阿盖尔描述的方法:https://web.dev/building-a-dialog-component/#adding-light-dismiss
1.获取对话框元素并向对话框元素添加事件侦听器
1.创建处理函数,检查dialog元素是否触发了事件。如果是,调用.close()方法。这是因为,默认情况下,dialog元素创建了一个背景,覆盖了页面上的所有其他元素,然后点击那里===点击dialog元素本身。这不会影响dialog内部的子元素,所以点击那里不会关闭对话框。
顺便说一句,我推荐阅读这本精彩的dialog tutorial。