马黑黑 发表于 2026-2-3 13:22

dialog标签应用举例

<style>
        .artBox { font-size: 20px; margin: 30px auto; max-width: 1200px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; color: #333; }
        .artBox > p { margin: 15px 0; line-height: 1.8; text-align: justify; }
        .artBox blockquote { background: #f9f9f9; border-left: 4px solid #1a73e8; padding: 15px 20px; margin: 20px 0; font-style: italic; color: #555; }
        .artBox code { background: #eee; padding: 2px 6px; border-radius: 3px; font-family: 'Consolas', 'Monaco', monospace; font-size: 0.95em; }
        .artBox button, .artBox input { font-size: 18px; }
        .artBox .mid { text-align: center; }
        .dialog { border: none; border-radius: 16px; box-shadow: 1px 1px 4px rgba(0,0,0,0.5); }
</style>

<div class="artBox">
        <dialog id="loginDialog" class="dialog">
                <p>
                        <strong>模拟登录窗口:</strong><br><br>
                        <label for="uName">姓名:</label>
                        <input type="text" id="uName" value="匿名"><br><br>
                        <label for="uPass">密码:</label>
                        <input type="password" id="uName" value="123456">
                        <p class="mid"><br><button type="button" id="btnLogin" onclick="loginDialog.close()">登录解锁本页面</button></p>
                </p>
        </dialog>
        <p>如你所见,<code>dialog</code>标签可以是一个模态窗口(Modal Dialog)。模态窗口在保留主界面显示的同时禁用主界面的用户交互,子界面交互完毕返回正常的主界面。本文模拟的模态窗口是一个登录窗口,只是模拟,不做任何事情,但从中应该可以感受到<code>dialog</code>标签的强大——在H5以前,做这样的模态窗口是个繁重且繁琐的事情,而现在简单到令人难以置信:</p>
        <div class="codebox" data-prev="1">
&lt;dialog id="dialog1"&gt;
        &lt;p&gt;这是一个 dialog 模态窗口&lt;/p&gt;
        &lt;P&gt;&lt;button onclick="dialog1.close()" title="Esc"&gt;关闭(Esc)&lt;/button&gt;&lt;/P&gt;
&lt;/dialog&gt;
&lt;p&gt;&lt;button onclick="dialog1.showModal()"&gt;打开模态窗口&lt;/button&gt;&lt;/p&gt;
        </div>
        <p><code>dialog</code>标签默认不显示,需要通过 <code>元素.showModal()</code> 激活它。所以上面的示例代码设置了一个按钮用于激活dialog模态窗口,dialog标签内也加入一个按钮,点击该按钮会触发 <code>元素.close()</code> 事件,dialog窗口会自动关闭。上述代码可以在线预览效果,效果中因为是在预览页面中演示,预览页面的关闭按钮层级设置得很高,其交互功能不受到dialog窗口的影响。</p>
        <p>dialog模态窗口集成快捷键关闭功能,按Esc键可关闭该窗口。所以,模态窗口中即使不设置关闭按钮,一样可以关闭它,提供交互按钮可以提升人机对话的友好性。</p>
        <p>dialog窗口还能以非模态窗口方式渲染,有两种实现方法:其一,使用html属性 <code>open</code> 令其一开始就自动激活;其二,使用 <code>元素.show()</code> 方法。以下代码演示的是第二种方法:</p>
        <div class="codebox" data-prev="1">
&lt;!-- 使用下一行代码替代第三行自动激活非模态窗口 --&gt;
&lt;!-- dialog id="player" open --&gt;
&lt;dialog id="player"&gt;
        &lt;p&gt;&lt;audio id="aud" src="https://music.163.com/song/media/outer/url?id=2115755857" controls&gt;&lt;/audio&gt;&lt;/p&gt;
        &lt;P&gt;&lt;button onclick="player.close()" title="Esc"&gt;关闭窗口和音乐(Esc)&lt;/button&gt;&lt;/P&gt;
&lt;/dialog&gt;
&lt;p&gt;&lt;button onclick="player.show();aud.play();"&gt;打开 dialog 非模态窗口&lt;/button&gt;&lt;/p&gt;
&lt;p&gt;&lt;button onclick="alert('主界面在非模态弹窗激活时仍然可以交互')"&gt;测试按钮&lt;/button&gt;&lt;/p&gt;

&lt;script&gt;
        player.onclose = () =&gt; aud.currentTime = aud.duration;
&lt;/script&gt;
        </div>
        <p>非模态窗口就是普通的弹窗,它不屏蔽主窗口的交互。上例中,窗口弹出后主界面上的测试按钮依然可以正常工作。例中的JS代码不是dialog弹窗必须的,这里加入它目的有二:一是演示 dialog 标签的 <code>close</code> 监听事件,可以通过监听窗口的关闭事件做需要做的事情,例如例中的停止音乐。dialog 还有一个 cancel 事件可以监听。</p>
        <p>显然,dialog标签简化了弹窗的操作,使用者甚至可以不依赖过多的JS编程就可以实现一些高级功能,非常实用。</p>
</div>

<script type="module">
        import linenumber from 'https://638183.freep.cn/638183/web/helight/linenumber.js';
        linenumber();

        document.addEventListener("DOMContentLoaded", (e) => {
                loginDialog.showModal();
        }, false);
</script>

马黑黑 发表于 2026-2-3 13:34

本页面的模拟登录窗口 Esc 键似乎不灵,原因可能与 Discuz!定义了相关快捷键有关,在我的站点操作正常:

      dialog标签应用举例

另外,一楼的两个演示代码由于另开页面,不受 Discuz!的设置影响,可以正常使用 Esc 键关闭模态窗口。

小辣椒 发表于 2026-2-3 13:35

黑黑,我打开这个要登录,哈哈我直接输入小辣椒进来了?

小辣椒 发表于 2026-2-3 13:36

马黑黑 发表于 2026-2-3 13:34
本页面的模拟登录窗口 Esc 键似乎不灵,原因可能与 Discuz!定义了相关快捷键有关,在我的站点操作正常:
...

好吧我再试一次

小辣椒 发表于 2026-2-3 13:37

好像不登录也是进来了

霜染枫丹 发表于 2026-2-3 15:37

马老师下午好,我在看“天书“{:4_189:},只是不登录我只能看不能回复,登录后就正常了{:4_190:}{:4_204:}

樵歌 发表于 2026-2-3 17:43

不管三七二十八,我直接进来了,一看啥也不懂傻眼了{:4_196:}

马黑黑 发表于 2026-2-3 17:48

樵歌 发表于 2026-2-3 17:43
不管三七二十八,我直接进来了,一看啥也不懂傻眼了

懂得“登录”就成{:4_189:}

马黑黑 发表于 2026-2-3 17:48

霜染枫丹 发表于 2026-2-3 15:37
马老师下午好,我在看“天书“,只是不登录我只能看不能回复,登录后就正常了
...

“登录”只是一个模拟

马黑黑 发表于 2026-2-3 17:49

小辣椒 发表于 2026-2-3 13:37
好像不登录也是进来了
模拟而已,不是真正的登录,但要交互以下,否则不能回复

马黑黑 发表于 2026-2-3 17:50

小辣椒 发表于 2026-2-3 13:35
黑黑,我打开这个要登录,哈哈我直接输入小辣椒进来了?

输不输入都可以的,点一下登录按钮或按一下Esc键就成

樵歌 发表于 2026-2-3 18:14

马黑黑 发表于 2026-2-3 17:48
懂得“登录”就成

这两字还是认识的{:4_173:}

马黑黑 发表于 2026-2-3 18:48

樵歌 发表于 2026-2-3 18:14
这两字还是认识的

你认得的字很多很多
页: [1]
查看完整版本: dialog标签应用举例