可以看到不管是哪种方式唤起的弹窗都会主动聚焦到第一个输入框中,当然也可以通过设置 autofocus
属性来手动指定打开弹窗后需要聚焦到哪一个元素,如果同时给多个元素设置了 autofocus
时,只有第一个设置的元素会生效。
其实不仅仅是打开有两种方式,关闭弹窗也有两种方式:
<dialog />
内部嵌套一层 <form />
,同时设置 method="dialog"
属性,再搭配上一个不设置 type
属性或者 type
属性的值不为 reset
和 submit
的 <button />
就可以关闭了,示例如下:dialog.close()
方法关闭我相信大多数人都会选择第二种,因为第一种不光有局限性,还会增加额外的 DOM 元素,有点得不偿失。
对话框的事件有两个,分别为:cancel
和 close
,是的,没有类似于 open
/show
等这种监听弹窗展示的事件,可能是考虑到弹窗展示这种行为大多数是由程序触发的,在程序内部知道什么时候会打开这个弹窗,而关闭的时机确是不可知的,所以只有关闭的事件而没有打开的事件。
顾名思义,当对话框被关闭的时候触发,而不论是以哪种方式关闭的弹窗。
当使用 .showModel()
方法打开弹窗,并按下 Esc
按键时则会触发 cancel
事件,同时还将触发 close
事件,而 cancel
事件会在 close
事件之前触发,所以可以在 cancel
事件内部通过调用 event.preventDefault()
来阻止对话框的默认行为(关闭弹窗)。
最后是样式相关的部分,可以给弹窗进入时设置动画样式,因为原生的展示实在是太生硬了,以下代码实现了一个位移显示的动画:
除此之外,你还可以通过 ::backdrop
伪类来设置遮罩层的样式,通过 :modal
和使用 :not()
结合 :modal
来设置样式以区分是否包含遮罩层:
最后,你还可以使用以下代码结合文中所有的知识点进行学习:
以上。