搜尋
首頁web前端js教程如何使用 HTMLlt;dialog> 元素

在前端開發中,建置或使用預先建置的 UI 元件是一項常見任務。然而,這些組件通常存在限制。它們通常依賴特定的框架,並且需要複雜的、非標準化的邏輯。長期以來,對話方塊視窗等基本 UI 元件依賴自訂實現,或者在更簡單的情況下,依賴內建 JavaScript 方法,例如alert()、prompt() 和confirm()。

好消息是,您現在可以使用本機

來實作此元件。 HTML 元素,它是 HTML5 標準的一部分,並受到所有現代瀏覽器的完全支援。

HTML 標籤於 2013 年 5 月作為 W3C 工作草案的一部分引入,與

等交互元素一起推出。和解決常見的 UI 挑戰。 2014年發布的最初僅在 Google Chrome 和 Opera 中支援。完全支援 Firefox 和 Safari 直到 2022 年 3 月才出現,推遲了其在生產項目中的採用。然而,隨著主要瀏覽器兩年多的支持, 已經不再可用。元素現在足夠穩定,可以替換自訂

讓我們來探索一下

的功能更詳細。

使用的核心方面

HTML 標籤建立一個預設的隱藏對話框,可以用作彈出視窗模態視窗

彈出視窗經常用於顯示簡單的通知,例如 Cookie 訊息、消失的 Toast 警報、工具提示或右鍵單擊上下文功能表元素。

模態視窗可幫助使用者專注於特定任務,例如需要使用者確認的通知和警告、複雜的互動表單以及圖像或影片的燈箱。

彈出視窗不會阻止與頁面的交互,而模式視窗會覆蓋文件、使背景變暗並阻止其他操作。此行為無需額外的樣式或腳本即可實現;唯一的區別是打開對話框的方法。

對話方塊視窗開啟方法

— 彈出視窗:

—模態視窗:

在這兩種情況下,開啟標籤將其 open 屬性設為 true。直接設定它會將對話方塊作為彈出視窗而不是模式開啟。要渲染模態窗口,您必須使用適當的方法。不需要 JavaScript 來建立最初開啟的彈出視窗。

試試看:

  • 使用 .show() 方法開啟彈出視窗:https://codepen.io/alexgriss/pen/zYeMKJE
  • 使用 .showModal() 方法開啟模態視窗:https://codepen.io/alexgriss/pen/jOdQMeq
  • 直接更改open屬性:https://codepen.io/alexgriss/pen/wvNQzRB

對話方塊視窗關閉方法

對話方塊視窗以相同的方式關閉,無論它們如何開啟。以下是關閉彈出視窗或模式視窗的幾種方法:

——使用 .close() 方法:

——透過使用 method="dialog" 屬性觸發表單中的提交事件:

— 按 Esc 鍵:

使用 Esc 關閉僅適用於模式視窗。它首先觸發取消事件,然後關閉,從而可以輕鬆警告用戶表單中未儲存的變更。

試試看:

  • 使用 close 方法關閉對話框:https://codepen.io/alexgriss/pen/GRzwjaV
  • 透過提交表單關閉對話框:https://codepen.io/alexgriss/pen/jOdQVNV
  • 使用 Esc 鍵關閉模態視窗:https://codepen.io/alexgriss/pen/KKJrNKW
  • 防止模式視窗透過 Esc 關閉:https://codepen.io/alexgriss/pen/mdvQObN

關閉時回傳值

當使用method="dialog"屬性關閉帶有表單的對話框時,您可以捕獲提交按鈕的值。如果您想根據單擊的按鈕觸發不同的操作,這非常有用。該值儲存在 returnValue 屬性中。

試試看:https://codepen.io/alexgriss/pen/ZEwmBKx

仔細看看它是如何運作的

讓我們更深入了解對話方塊視窗的機制及其瀏覽器實現的細節。

彈出視窗的機制

開啟一個作為帶有 .show() 的彈出視窗或 open 屬性會自動將其定位為 DOM 中的position:absolute。基本 CSS 樣式(例如邊距和邊框)套用於元素,視窗內的第一個可聚焦項目將透過 autofocus 屬性自動獲得焦點。頁面的其餘部分保持互動。

模態視窗的機制

模態視窗的設計和工作方式比彈出視窗更複雜。

文件疊加

使用 .showModal() 開啟模態視窗時,

元素在覆蓋頁面整個可見區域的特殊 HTML 層中呈現。此層稱為頂層,由瀏覽器控制。在某些瀏覽器(例如​​ Google Chrome)中,每個模式都在該層內的單獨 DOM 節點中呈現,在元素檢查器中可見。

How to Use the HTMLlt;dialog> 元素

層的概念指的是堆疊上下文,它定義了元素如何沿著相對於使用者的Z軸定位。在 CSS 中設定 z-index 值會為元素建立一個堆疊上下文,其中子元素的位置是在該上下文中計算的。模態視窗始終位於該層次結構的頂部,因此不需要 z-index。

在 MDN 上了解有關 堆疊上下文 的更多資訊。

要了解有關頂層中呈現的元素的更多信息,請訪問 MDN。

文件攔截

當模態元素在頂層渲染時,會建立一個與可見文件區域大小相同的 ::backdrop 偽元素。即使設定了pointer-events: none CSS 規則,此背景也會阻止與頁面其餘部分的互動。

除了模態視窗之外的所有元素都會自動設定inert屬性,阻止使用者操作。它會停用點擊和焦點事件,並使螢幕閱讀器和其他輔助技術無法存取元素。

在 MDN 上了解有關 inert 屬性的更多資訊。

專注行為

當模式開啟時,其中的第一個可聚焦元素會自動獲得焦點。若要變更最初聚焦的元素,可以使用 autofocus 或 tabindex 屬性。無法為對話方塊元素本身設定 tabindex,因為它是頁面上唯一不套用惰性邏輯的元素。

對話方塊關閉後,焦點回到開啟它的元素。

解決模態視窗的使用者體驗問題

不幸的是,

的本機實作無法實現。 element 並沒有涵蓋與模式視窗互動的所有面向。接下來,我想回顧一下使用模態視窗時可能出現的主要使用者體驗問題以及如何解決它們。

滾動阻塞

儘管原生 HTML5 模式視窗創建了一個 ::backdrop 偽元素來阻止與其下方內容的交互,但頁面滾動仍然處於活動狀態。這可能會分散使用者的注意力,因此建議在模式開啟時截斷正文的內容:

每次開啟和關閉模態視窗時,都必須動態新增和刪除這樣的 CSS 規則。這可以透過操作包含以下 CSS 規則的類別來實現:

如果 :has 選擇器的支援狀態滿足專案的要求,您也可以使用。

試試看:https://codepen.io/alexgriss/pen/XWOyVKj

透過點選視窗外部關閉對話框

這是模態視窗的標準 UX 場景,可以透過多種方式實現。這裡有兩種方法可以解決這個問題:

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

點選 ::backdrop 偽元素被視為點選對話方塊元素本身。因此,如果將模式視窗的整個內容包裝在附加的

中,然後覆蓋對話方塊元素本身,您可以確定單擊的方向 - 在背景上還是在模式視窗內容上。

不要忘記重置瀏覽器的的預設填滿和邊框樣式。防止模態視窗因意外點擊而關閉的元素:

現在,我們將模態視窗邊框和邊距的常見樣式僅套用於內部包裝器。

我們需要編寫一個函數,僅在點擊背景而不是內部包裝元素時關閉模態視窗:

試試看:https://codepen.io/alexgriss/pen/mdvQXpJ

一種基於確定對話方塊視窗大小的方法

此方法與第一個方法不同,第一個方法需要一個額外的包裝器來容納模態內容。在這裡,您不需要任何額外的包裝。所需要做的只是檢查點擊時間標的位置是否超出元素區域:

試試看:https://codepen.io/alexgriss/pen/NWoePVP

設定對話框視窗的樣式

element 在樣式方面比許多原生 HTML 元素更靈活。以下是一些對話方塊視窗樣式的範例:

使用 ::backdrop 選擇器設定背景樣式:https://codepen.io/alexgriss/pen/ExrOQEO

動畫對話方塊視窗開啟與關閉:https://codepen.io/alexgriss/pen/QWYJQJO

作為側邊欄的模態視窗:https://codepen.io/alexgriss/pen/GRzwxgr

無障礙

很長一段時間,元素存在一些輔助功能問題,但現在它可以很好地與屏幕閱讀器等主要輔助技術配合使用(VoiceOverTalkBackNVDA)。

當出現時開啟後,螢幕閱讀器會將焦點移至對話方塊。對於模態視窗,焦點保留在對話框內,直到它關閉。

預設情況下,元素被輔助技術識別為具有 ARIA 屬性 role="dialog"。模態對話框將被識別為具有 ARIA 屬性 aria-modal="true"。

以下是一些提高

的可訪問性的方法。元素:

詠嘆調標記者

始終在對話方塊視窗中包含標題,並為

指定 aria-labelledby 屬性。元素,其值設定為標題的 id。

如果您需要設定 ::backdrop 偽元素的樣式,請確保將這些樣式也套用到對應的 .backdrop 元素,以確保與舊版瀏覽器的相容性:

建議透過動態匯入連接polyfill,並且僅適用於不支援

的瀏覽器。元素:

結論

原生 HTML5

element 是一個相對簡單但功能強大的工具,用於實作模式視窗和彈出視窗。它受到現代瀏覽器的良好支持,可以成功地用於基於 vanilla JS 和任何前端框架的專案。

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

  • 出現問題元素求解;
  • 與的互動元素的 API;
  • 對話方塊視窗如何在瀏覽器層級運作;
  • 模態框的常見問題及其解決方案;
  • 改進了的可訪問性螢幕閱讀器等輔助技術的元素;
  • 擴充瀏覽器對 的支援元素。

最後,我邀請您查看純 JS 中的模態視窗組件實現,其中考慮了文章中討論的主要方面:https://codepen.io/alexgriss/pen/abXPOPP

這就是我想分享的關於使用

的全部內容。 HTML 元素。我希望這篇文章能夠激勵您進行實驗!

以上是如何使用 HTMLlt;dialog> 元素的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Java vs JavaScript:開發人員的詳細比較Java vs JavaScript:開發人員的詳細比較May 16, 2025 am 12:01 AM

javaandjavascriptaredistinctlanguages:javaisusedforenterpriseandmobileapps,while javascriptifforInteractiveWebpages.1)JavaisComcompoppored,statieldinglationallyTypted,statilly tater astrunsonjvm.2)

JavaScript數據類型:瀏覽器和nodejs之間是否有區別?JavaScript數據類型:瀏覽器和nodejs之間是否有區別?May 14, 2025 am 12:15 AM

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScript評論:使用//和 / * * / * / * /JavaScript評論:使用//和 / * * / * / * /May 13, 2025 pm 03:49 PM

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python vs. JavaScript:開發人員的比較分析Python vs. JavaScript:開發人員的比較分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

Python vs. JavaScript:選擇合適的工具Python vs. JavaScript:選擇合適的工具May 08, 2025 am 12:10 AM

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

北端:融合系統,解釋
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
4 週前By尊渡假赌尊渡假赌尊渡假赌
<🎜>掩蓋:探險33-如何獲得完美的色度催化劑
2 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具