国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) web前端 js教程 如何使用 HTMLlt;dialog> 元素

如何使用 HTMLlt;dialog> 元素

Dec 27, 2024 pm 07:03 PM

在前端開(kāi)發(fā)中,構(gòu)建或使用預(yù)構(gòu)建的 UI 組件是一項(xiàng)常見(jiàn)任務(wù)。然而,這些組件通常存在局限性。它們通常依賴(lài)于特定的框架,并且需要復(fù)雜的、非標(biāo)準(zhǔn)化的邏輯。長(zhǎng)期以來(lái),對(duì)話框窗口等基本 UI 組件依賴(lài)于自定義實(shí)現(xiàn),或者在更簡(jiǎn)單的情況下,依賴(lài)于內(nèi)置 JavaScript 方法,例如alert()、prompt() 和confirm()。

好消息是,您現(xiàn)在可以使用本機(jī)

來(lái)實(shí)現(xiàn)此組件。 HTML 元素,它是 HTML5 標(biāo)準(zhǔn)的一部分,并受到所有現(xiàn)代瀏覽器的完全支持。

HTML 標(biāo)簽于 2013 年 5 月作為 W3C 工作草案的一部分引入,與

等交互元素一起推出。和<摘要>解決常見(jiàn)的 UI 挑戰(zhàn)。 2014年發(fā)布的最初僅在 Google Chrome 和 Opera 中受支持。完全支持 Firefox 和 Safari 直到 2022 年 3 月才出現(xiàn),推遲了其在生產(chǎn)項(xiàng)目中的采用。然而,隨著主要瀏覽器兩年多的支持, 已經(jīng)不再可用。元素現(xiàn)在足夠穩(wěn)定,可以替換自定義

讓我們探索一下

的功能更詳細(xì)。

使用的核心方面

HTML 標(biāo)簽創(chuàng)建一個(gè)默認(rèn)隱藏的對(duì)話框,可以用作彈出窗口模態(tài)窗口。

彈出窗口經(jīng)常用于顯示簡(jiǎn)單的通知,例如 Cookie 消息、消失的 Toast 警報(bào)、工具提示或右鍵單擊上下文菜單元素。

模態(tài)窗口幫助用戶(hù)專(zhuān)注于特定任務(wù),例如需要用戶(hù)確認(rèn)的通知和警告、復(fù)雜的交互表單以及圖像或視頻的燈箱。

彈出窗口不會(huì)阻止與頁(yè)面的交互,而模式窗口會(huì)覆蓋文檔、使背景變暗并阻止其他操作。此行為無(wú)需額外的樣式或腳本即可實(shí)現(xiàn);唯一的區(qū)別是打開(kāi)對(duì)話框的方法。

對(duì)話框窗口打開(kāi)方法

— 彈出窗口:

<dialog>





<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");

popUpElement.show();

—模態(tài)窗口:

<dialog>





<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");

modalElement.showModal();

在這兩種情況下,打開(kāi)<對(duì)話框>標(biāo)簽將其 open 屬性設(shè)置為 true。直接設(shè)置它會(huì)將對(duì)話框作為彈出窗口而不是模式打開(kāi)。要渲染模態(tài)窗口,您必須使用適當(dāng)?shù)姆椒?。不需?JavaScript 來(lái)創(chuàng)建最初打開(kāi)的彈出窗口。

<dialog open>Hi, I'm a popup!</dialog>

嘗試一下:

  • 使用 .show() 方法打開(kāi)彈出窗口:https://codepen.io/alexgriss/pen/zYeMKJE
  • 使用 .showModal() 方法打開(kāi)模態(tài)窗口:https://codepen.io/alexgriss/pen/jOdQMeq
  • 直接更改open屬性:https://codepen.io/alexgriss/pen/wvNQzRB

對(duì)話框窗口關(guān)閉方法

對(duì)話框窗口以相同的方式關(guān)閉,無(wú)論它們?nèi)绾未蜷_(kāi)。以下是關(guān)閉彈出窗口或模式窗口的幾種方法:

——使用 .close() 方法:

<dialog>





<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");

popUpElement.show();

——通過(guò)使用 method="dialog" 屬性觸發(fā)表單中的提交事件:

<dialog>





<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");

modalElement.showModal();

— 按 Esc 鍵:

使用 Esc 關(guān)閉僅適用于模式窗口。它首先觸發(fā)取消事件,然后關(guān)閉,從而可以輕松警告用戶(hù)表單中未保存的更改。

嘗試一下:

  • 使用 close 方法關(guān)閉對(duì)話框:https://codepen.io/alexgriss/pen/GRzwjaV
  • 通過(guò)提交表單關(guān)閉對(duì)話框:https://codepen.io/alexgriss/pen/jOdQVNV
  • 使用 Esc 鍵關(guān)閉模態(tài)窗口:https://codepen.io/alexgriss/pen/KKJrNKW
  • 防止模式窗口通過(guò) Esc 關(guān)閉:https://codepen.io/alexgriss/pen/mdvQObN

關(guān)閉時(shí)返回值

當(dāng)使用method="dialog"屬性關(guān)閉帶有表單的對(duì)話框時(shí),您可以捕獲提交按鈕的值。如果您想根據(jù)單擊的按鈕觸發(fā)不同的操作,這非常有用。該值存儲(chǔ)在 returnValue 屬性中。

嘗試一下:https://codepen.io/alexgriss/pen/ZEwmBKx

仔細(xì)看看它是如何工作的

讓我們更深入地了解對(duì)話框窗口的機(jī)制及其瀏覽器實(shí)現(xiàn)的細(xì)節(jié)。

彈出窗口的機(jī)制

打開(kāi)一個(gè)<對(duì)話框>作為帶有 .show() 的彈出窗口或 open 屬性會(huì)自動(dòng)將其定位為 DOM 中的position:absolute?;?CSS 樣式(例如邊距和邊框)應(yīng)用于元素,窗口內(nèi)的第一個(gè)可聚焦項(xiàng)目將通過(guò) autofocus 屬性自動(dòng)獲得焦點(diǎn)。頁(yè)面的其余部分保持互動(dòng)。

模態(tài)窗口的機(jī)制

模態(tài)窗口的設(shè)計(jì)和工作方式比彈出窗口更復(fù)雜。

文檔疊加

使用 .showModal() 打開(kāi)模態(tài)窗口時(shí),

元素在覆蓋頁(yè)面整個(gè)可見(jiàn)區(qū)域的特殊 HTML 層中呈現(xiàn)。該層稱(chēng)為頂層,由瀏覽器控制。在某些瀏覽器(例如 Google Chrome)中,每個(gè)模式都在該層內(nèi)的單獨(dú) DOM 節(jié)點(diǎn)中呈現(xiàn),在元素檢查器中可見(jiàn)。

How to Use the HTMLlt;dialog> 元素

層的概念指的是堆疊上下文,它定義了元素如何沿著相對(duì)于用戶(hù)的Z軸定位。在 CSS 中設(shè)置 z-index 值會(huì)為元素創(chuàng)建一個(gè)堆疊上下文,其中子元素的位置是在該上下文中計(jì)算的。模態(tài)窗口始終位于該層次結(jié)構(gòu)的頂部,因此不需要 z-index。

在 MDN 上了解有關(guān) 堆疊上下文 的更多信息。

要了解有關(guān)頂層中呈現(xiàn)的元素的更多信息,請(qǐng)?jiān)L問(wèn) MDN。

文件攔截

當(dāng)模態(tài)元素在頂層渲染時(shí),會(huì)創(chuàng)建一個(gè)與可見(jiàn)文檔區(qū)域大小相同的 ::backdrop 偽元素。即使設(shè)置了指針事件:未設(shè)置 CSS 規(guī)則,此背景也會(huì)阻止與頁(yè)面其余部分的交互。

除了模態(tài)窗口之外的所有元素都會(huì)自動(dòng)設(shè)置 inert 屬性,阻止用戶(hù)操作。它會(huì)禁用單擊和焦點(diǎn)事件,并使屏幕閱讀器和其他輔助技術(shù)無(wú)法訪問(wèn)這些元素。

在 MDN 上了解有關(guān) inert 屬性的更多信息。

專(zhuān)注行為

當(dāng)模式打開(kāi)時(shí),其中的第一個(gè)可聚焦元素會(huì)自動(dòng)獲得焦點(diǎn)。要更改最初聚焦的元素,可以使用 autofocus 或 tabindex 屬性。無(wú)法為對(duì)話框元素本身設(shè)置 tabindex,因?yàn)樗琼?yè)面上唯一不應(yīng)用惰性邏輯的元素。

對(duì)話框關(guān)閉后,焦點(diǎn)返回到打開(kāi)它的元素。

解決模態(tài)窗口的用戶(hù)體驗(yàn)問(wèn)題

不幸的是,

的本機(jī)實(shí)現(xiàn)無(wú)法實(shí)現(xiàn)。 element 并沒(méi)有涵蓋與模式窗口交互的所有方面。接下來(lái),我想回顧一下使用模態(tài)窗口時(shí)可能出現(xiàn)的主要用戶(hù)體驗(yàn)問(wèn)題以及如何解決它們。

滾動(dòng)阻塞

盡管原生 HTML5 模式窗口創(chuàng)建了一個(gè) ::backdrop 偽元素來(lái)阻止與其下方內(nèi)容的交互,但頁(yè)面滾動(dòng)仍然處于活動(dòng)狀態(tài)。這可能會(huì)分散用戶(hù)的注意力,因此建議在模式打開(kāi)時(shí)截?cái)嗾牡膬?nèi)容:

<dialog>





<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");

popUpElement.show();

每次打開(kāi)和關(guān)閉模態(tài)窗口時(shí),都必須動(dòng)態(tài)添加和刪除這樣的 CSS 規(guī)則。這可以通過(guò)操作包含以下 CSS 規(guī)則的類(lèi)來(lái)實(shí)現(xiàn):

<dialog>





<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");

modalElement.showModal();

如果 :has 選擇器的支持狀態(tài)滿(mǎn)足項(xiàng)目的要求,您也可以使用。

<dialog open>Hi, I'm a popup!</dialog>

嘗試一下:https://codepen.io/alexgriss/pen/XWOyVKj

通過(guò)單擊窗口外部關(guān)閉對(duì)話框

這是模態(tài)窗口的標(biāo)準(zhǔn) UX 場(chǎng)景,可以通過(guò)多種方式實(shí)現(xiàn)。這里有兩種方法可以解決這個(gè)問(wèn)題:

基于 ::backdrop 偽元素行為的方法

單擊 ::backdrop 偽元素被視為單擊對(duì)話框元素本身。因此,如果將模式窗口的整個(gè)內(nèi)容包裝在附加的

中,然后覆蓋對(duì)話框元素本身,您可以確定單擊的方向 - 在背景上還是在模式窗口內(nèi)容上。

不要忘記重置瀏覽器的的默認(rèn)填充和邊框樣式。防止模態(tài)窗口因意外點(diǎn)擊而關(guān)閉的元素:

<dialog>





<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");

popUpElement.show();

現(xiàn)在,我們將模態(tài)窗口邊框和邊距的常見(jiàn)樣式僅應(yīng)用于內(nèi)部包裝器。

我們需要編寫(xiě)一個(gè)函數(shù),僅在單擊背景而不是內(nèi)部包裝元素時(shí)關(guān)閉模態(tài)窗口:

<dialog>





<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");

modalElement.showModal();

嘗試一下:https://codepen.io/alexgriss/pen/mdvQXpJ

一種基于確定對(duì)話框窗口大小的方法

此方法與第一個(gè)方法不同,第一個(gè)方法需要一個(gè)額外的包裝器來(lái)容納模態(tài)內(nèi)容。在這里,您不需要任何額外的包裝。所需要做的只是檢查單擊時(shí)光標(biāo)的位置是否超出元素區(qū)域:

<dialog open>Hi, I'm a popup!</dialog>

嘗試一下:https://codepen.io/alexgriss/pen/NWoePVP

設(shè)置對(duì)話框窗口的樣式

element 在樣式方面比許多原生 HTML 元素更靈活。以下是一些對(duì)話框窗口樣式的示例:

使用 ::backdrop 選擇器設(shè)置背景樣式:https://codepen.io/alexgriss/pen/ExrOQEO

動(dòng)畫(huà)對(duì)話框窗口打開(kāi)和關(guān)閉:https://codepen.io/alexgriss/pen/QWYJQJO

作為側(cè)邊欄的模態(tài)窗口:https://codepen.io/alexgriss/pen/GRzwxgr

無(wú)障礙

很長(zhǎng)一段時(shí)間,元素存在一些輔助功能問(wèn)題,但現(xiàn)在它可以很好地與屏幕閱讀器等主要輔助技術(shù)配合使用(VoiceOver、TalkBack、NVDA)。

當(dāng)出現(xiàn)時(shí)打開(kāi)后,屏幕閱讀器會(huì)將焦點(diǎn)移至對(duì)話框。對(duì)于模態(tài)窗口,焦點(diǎn)保留在對(duì)話框內(nèi),直到它關(guān)閉。

默認(rèn)情況下,元素被輔助技術(shù)識(shí)別為具有 ARIA 屬性 role="dialog"。模態(tài)對(duì)話框?qū)⒈蛔R(shí)別為具有 ARIA 屬性 aria-modal="true"。

以下是一些提高

的可訪問(wèn)性的方法。元素:

詠嘆調(diào)標(biāo)記者

始終在對(duì)話框窗口中包含標(biāo)題,并為

指定 aria-labelledby 屬性。元素,其值設(shè)置為標(biāo)題的 id。

<dialog>





<pre class="brush:php;toolbar:false">const popUpElement = document.getElementById("pop-up");

popUpElement.show();

如果您需要設(shè)置 ::backdrop 偽元素的樣式,請(qǐng)確保將這些樣式也應(yīng)用到相應(yīng)的 .backdrop 元素,以確保與舊版瀏覽器的兼容性:

<dialog>





<pre class="brush:php;toolbar:false">const modalElement = document.getElementById("modal");

modalElement.showModal();

建議通過(guò)動(dòng)態(tài)導(dǎo)入連接polyfill,并且僅適用于不支持

的瀏覽器。元素:

<dialog open>Hi, I'm a popup!</dialog>

結(jié)論

原生 HTML5

element 是一個(gè)相對(duì)簡(jiǎn)單但功能強(qiáng)大的工具,用于實(shí)現(xiàn)模式窗口和彈出窗口。它受到現(xiàn)代瀏覽器的良好支持,可以成功地用于基于 vanilla JS 和任何前端框架的項(xiàng)目。

在本文中,我們討論了以下主題:

  • 出現(xiàn)問(wèn)題元素求解;
  • 與的交互元素的 API;
  • 對(duì)話框窗口如何在瀏覽器級(jí)別工作;
  • 模態(tài)框的常見(jiàn)問(wèn)題及其解決方案;
  • 改進(jìn)了的可訪問(wèn)性屏幕閱讀器等輔助技術(shù)的元素;
  • 擴(kuò)展瀏覽器對(duì) 的支持元素。

最后,我邀請(qǐng)您查看純 JS 中的模態(tài)窗口組件實(shí)現(xiàn),其中考慮了文章中討論的主要方面:https://codepen.io/alexgriss/pen/abXPOPP

這就是我想分享的關(guān)于使用

的全部?jī)?nèi)容。 HTML 元素。我希望這篇文章能夠激勵(lì)您進(jìn)行實(shí)驗(yàn)!

以上是如何使用 HTMLlt;dialog> 元素的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語(yǔ)言,各自適用于不同的應(yīng)用場(chǎng)景。Java用于大型企業(yè)和移動(dòng)應(yīng)用開(kāi)發(fā),而JavaScript主要用于網(wǎng)頁(yè)開(kāi)發(fā)。

JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)象有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開(kāi)始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫(kù);4.處理時(shí)區(qū)問(wèn)題建議使用支持時(shí)區(qū)的庫(kù),如Luxon。掌握這些要點(diǎn)能有效避免常見(jiàn)錯(cuò)誤。

為什么要將標(biāo)簽放在的底部? 為什么要將標(biāo)簽放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript與Java:開(kāi)發(fā)人員的全面比較 JavaScript與Java:開(kāi)發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

什么是在DOM中冒泡和捕獲的事件? 什么是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。1.事件捕獲通過(guò)addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助于精確控制JavaScript響應(yīng)用戶(hù)操作的時(shí)機(jī)和方式。

JavaScript:探索用于高效編碼的數(shù)據(jù)類(lèi)型 JavaScript:探索用于高效編碼的數(shù)據(jù)類(lèi)型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

如何減少JavaScript應(yīng)用程序的有效載荷大小? 如何減少JavaScript應(yīng)用程序的有效載荷大??? Jun 26, 2025 am 12:54 AM

如果JavaScript應(yīng)用加載慢、性能差,問(wèn)題往往出在payload太大,解決方法包括:1.使用代碼拆分(CodeSplitting),通過(guò)React.lazy()或構(gòu)建工具將大bundle拆分為多個(gè)小文件,按需加載以減少首次下載量;2.移除未使用的代碼(TreeShaking),利用ES6模塊機(jī)制清除“死代碼”,確保引入的庫(kù)支持該特性;3.壓縮和合并資源文件,啟用Gzip/Brotli和Terser壓縮JS,合理合并文件并優(yōu)化靜態(tài)資源;4.替換重型依賴(lài),選用輕量級(jí)庫(kù)如day.js、fetch

See all articles