这是我第一次使用 HTML <dialog>
元素。 我已经知道它有一段时间了,但还没有尝试过。 它有一些非常酷炫和引人注目的功能。 我无法为您决定是否应该在您网站的生产环境中使用它,但我认为现在开始使用是可能的。
它不仅仅是一个语义元素,它还有 API 和特殊的 CSS。
我们稍后会谈到这些内容,但值得注意的是,它使得浏览器支持内容变得很重要。
当我们第一次获得 HTML5 元素(如 <article>
)时,浏览器是否支持它并不重要,因为在那些情况下,即使你使用了它,也不会有什么损失。 你可以把它设为块级元素,它就像你原本会使用的无意义的 div 一样。
也就是说,我不会仅仅将 <dialog>
用作“更具语义的 <div>
替换”。 它功能太强大,不适合这种用途。
让我们看看浏览器支持情况。
在我写这篇文章的时候
- Chrome 支持它(37+),所以 Edge 即将支持它。
- Firefox 已经将用户代理 (UA) 样式到位(69+),但功能在
dom.dialog_element.enabled
标志之后。 即使有了这个标志,它也不像我们还没有获得 CSS 内容一样。 - Safari 不支持。
它是 可填充的。
使用支持更好的功能当然更吸引人,但我认为它很接近,如果你本来就喜欢填充,它可能很快就会跨越界限。
让我们进入更有趣的内容。
open
,要么不是。
对话框要么是 <dialog>
I'm closed.
</dialog>
<dialog open>
I'm open.
</dialog>
它们有一些 UA 样式。
它似乎在 Chrome 和 Firefox 中匹配。 UA 样式表将它居中,并使用自动边距,厚实的黑色线条,大小根据内容而定。
查看代码笔
基本的打开对话框 由 Chris Coyier (@chriscoyier)
在 CodePen 上。
就像任何 UA 样式一样,您几乎肯定会用自己的精美对话框样式覆盖它们——阴影、排版以及其他与您网站风格匹配的内容。
有一个 JavaScript API 用于打开和关闭它们。
假设您有一个名为 dialog
的元素的引用
dialog.show();
dialog.hide();
查看代码笔
基本的可切换对话框 由 Chris Coyier (@chriscoyier)
在 CodePen 上。
您可能应该使用更明确的命令
dialog.showModal();
这就是使背景工作的原因(我们很快就会谈到它)。 我不确定我是否完全理解它,但是 规范中谈到了一个“待处理对话框堆栈”,这个 API 将在该堆栈中打开模式窗口。 以下是一个可以打开第二个堆叠模式窗口的模式窗口
查看代码笔
基本的打开对话框 由 Chris Coyier (@chriscoyier)
在 CodePen 上。
还有一个基于 HTML 的方法来关闭它们。
如果您在其中放置了一种特殊的表单,则提交表单将关闭模式窗口。
<form method="dialog">
<button>Close</button>
</form>
查看代码笔
带有关闭对话框的表单的对话框 由 Chris Coyier (@chriscoyier)
在 CodePen 上。
请注意,如果您以编程方式打开对话框,您将获得一个背景覆盖。
这始终是构建您自己的对话框中最棘手的事情之一。 一个常见的 UI 模式是在对话框后面的背景中变暗,以将注意力集中在对话框上。
使用 <dialog>
,我们可以免费获得它,假设您通过 JavaScript 打开它。 您可以使用 ::backdrop
伪元素控制它的外观。 代替默认的低不透明度黑色,让我们使用带条纹的红色
查看代码笔
自定义对话框背景 由 Chris Coyier (@chriscoyier)
在 CodePen 上。
酷炫的额外功能:您可以使用 backdrop-filter
来做一些事情,比如模糊背景。
查看代码笔
本地对话框 由 Chris Coyier (@chriscoyier)
在 CodePen 上。
它为您移动焦点
我不太了解这些东西,但我可以在我的 Mac 上启动 VoiceOver 并看到对话框进入焦点,当触发打开模式窗口的按钮时,我看到这一点。
它不会将焦点保留在那里,我听说这对模式窗口来说是理想的。 我们有一个 利用 CSS 的巧妙想法,您可以尝试。
Rob Dodson 说:“模式窗口实际上是网络无障碍的最终挑战。” 很高兴原生浏览器版本可以帮助解决很多问题。 您甚至可以自动获得 Escape 键关闭功能,这很棒。 不过,没有点击外部关闭的功能。 也许有一天,根据用户反馈,这个功能会实现。
Ire 的文章是构建您自己的对话框以及在使用它们时需要考虑的众多无障碍性因素的必备资源。
它在 Internet Explorer 10 及更高版本中有效吗?
我建议不要使用
<dialog>
。 引用无障碍专家 Scott O’Hara(来自他的同事 Leonie Watson、Adrian Roselli 和 Eric Bailey 的反馈)https://www.scottohara.me/blog/2019/03/05/open-dialog.html
您能添加填充吗? 在我的 iPad 上,什么都不起作用,这在现实情况中是不可接受的。
我在这里尝试了一下:https://codepen.io/chriscoyier/pen/oNvRMaQ,但它似乎对我不起作用。 我假设是我做错了。
酷! 我真的很感兴趣!
很棒的东西。感谢您一直让我了解最新的酷炫事物。
我上次使用它时,无法使其与 recaptcha v2 一起使用(对话框出现在 recaptcha“选择 n 辆汽车”工具提示的顶部)。
也许 v3 不是问题。
dialog
元素的访问性存在一些问题。使
dialog
元素在可用性方面与非辅助技术用户保持一致所需的 ARIA 支持各不相同。令人沮丧的是,支持包括对浏览器和辅助技术两端的考虑。值得注意的问题包括过于详细的公告、未宣布对话框角色、将焦点返回到模态生成的页面或视图以及辅助功能不足。Scott O’Hara 在一些非常彻底的测试中发现了问题,并撰写了两篇深入的文章。
从大局来看,我喜欢
dialog
所代表的意义。HTML 应该为流行的 UI 模式铺平道路。当这些模式伴随着开发人员可能忽略的棘手的实现问题(尤其是当这些问题涉及到辅助功能时)时,他们尤其应该这样做。我只是希望浏览器能够以与他们关注其他问题相同的程度关注这些元素的已报告问题。您好,我正在使用对话框作为某些链接的划分,但当我打开对话框时,它覆盖了我的网站数据,我该如何使用对话框进行划分,而不会覆盖数据。
帮帮我
谢谢
我非常期待这个元素获得更多关注。
感觉有点别扭,而且我还没有尝试过它的 POC,但是对于“点击外部关闭”,你不能在对话框上注册一个点击事件并使用处理程序来检查点击的位置吗?背景是伪元素,所以技术上仍然是元素的一部分,但不是其框的一部分 - 对吗?
使用
getBoundingClientRect()
和事件坐标的 POC:https://codepen.io/cautionbug/pen/JjjdYLj没有隐藏方法,但你应该使用关闭
示例
https://mdn.org.cn/en-US/docs/Web/HTML/Element/dialog
对话框未在 iPhone 12 -iOS 14 设备上显示,有什么解决方案吗?