一起來看 HTML 5.2 中新的原生元素 <dialog>

原文地址:Meet the New Dialog Element
作者:Keith

不到一個月前,HTML 5.2 正式成為 W3C 的推薦標(biāo)準(zhǔn)(REC),其中,推出了一個新的原生模態(tài)對話框元素 <dialog>,乍一看,可能感覺它就是一個新增的元素,然而,作者最近在玩的時候,發(fā)現(xiàn)它確實是一個值得期待和很有意思的元素,在這里分享給大家

這是 <diglog> 最基礎(chǔ)的示例

<dialog open>
    Native dialog box!
</dialog>

其中,open 屬性表示此時 dialog 是可見的,如果沒有 opendialog 將會隱藏,你可以使用 JavaScipt 將它顯現(xiàn)出來,此時,dialog 渲染如下

絕對定位 于頁面之上,就如我們期望的一樣,出現(xiàn)在內(nèi)容的上方,并且 水平居中,默認(rèn)情況下,它 和內(nèi)容一樣寬

基本操作

JavaScipt 有幾個 方法屬性 可以很方便地處理 dialog 元素,使用最多的可能還是 showModal()close()

const modal = document.querySelector('dialog');

// makes modal appear (adds `open` attribute)
modal.showModal();

// hides modal (removes `open` attribute)
modal.close();

當(dāng)你使用 showModal() 來打開 dialog 時,將會在 dialog 周圍加一層陰影,阻止用戶與 非 diglog 元素的交互,默認(rèn)情況下,陰影是 完全透明 的,你可以使用 CSS 來修改它

Esc 可以關(guān)閉 dialog,你也可以提供一個按鈕來觸發(fā) close()

還有一個方法是 show(),它也可以讓 dialog 顯現(xiàn),但與 showModal() 不同的是它沒有陰影,用戶可以與非 dialog 元素進(jìn)行交互

瀏覽器支持和 Polyfill

目前,只有 chrome 支持 <dialog>Firefox 需要在 about:config 里允許 dom.dialog_element.enabled 才能正常使用,我猜想,Firefox 在不久的將來就會支持

上圖為 caniuse.com 關(guān)于 dialog 特性主流瀏覽器的兼容情況

幸運的是,我們可以使用 dialog-polyfill 來緩解這種尷尬,它既提供了 JavaScript 的行為,也包含了默認(rèn)的樣式,我們可以使用 npm 來安裝它,也可以使用 <script> 標(biāo)簽來引用它。目前,它已支持各主流瀏覽器,包括 IE 9 及其以上版本

只是,在使用它時,每個 dialog 需要使用下面語句進(jìn)行初始化

dialogPolyfill.registerDialog(dialog);

并且,它并不會取代瀏覽器原生的行為

樣式

打開和關(guān)閉模態(tài)框是最基本的,但這是肯定不夠的,<dialog> 最開始時樣式是不怎么好看的,因此,我們需要自定義它的樣式,此外,我們可以通過設(shè)置偽元素 ::backdrop 來優(yōu)化 <dialog> 顯現(xiàn)時背影的樣式

dialog {
    padding: 0;
    width: 478px;
    text-align: center;
    vertical-align: middle;
    border-radius: 5px;
    border: 0;
}

dialog::backdrop {
    background-color: rgba(0, 0, 0, 0.1);
}

為了兼容老的瀏覽器,使用 polyfill 時,::backdrop 是不起作用的,但 polyfill 會在 dialog 后面添加一個 .backdrop 元素,我們可以像下面這樣定位它

dialog + .backdrop {
  background-color: rgba(0, 0, 0, 0.4);
}

接下來,是時候向 bialog 里添加更多的內(nèi)容,一般包括 headerbodyfooter

<dialog id="sweet-modal">
  <h3 class="modal-header">sweet dialog</h3>
  <div class="modal-body">
    <p>This is a sweet dialog, which is much better.</p>
  </div>
  <footer class="modal-footer">
    <button id="get-it" type="button">Get</button>
  </footer>
</dialog>

最后,在添加一些 CSS,你就能得到你想要的

進(jìn)階操作

通常,我們期望能從 dialog 中獲取一些用戶的信息。關(guān)閉 dialog 時,我們可以給 close() 傳遞一個 string,然后通過 dialog 元素的 returnValue 屬性來獲取

modal.close('Accepted');

console.log(modal.returnValue); // logs `Accepted`

當(dāng)然,還存在額外的事件我們可以監(jiān)聽,其中,最常用的可能是 close(關(guān)閉 dialog 時觸發(fā)),還有 cancel (用戶按 Esc 關(guān)閉 dialog 時觸發(fā))

此外,我們可能還期望點擊 dialog 旁邊的陰影來關(guān)閉,當(dāng)然,這也是有解決辦法的。點擊陰影會觸發(fā) dialog 的點擊事件,如果 dialog 的子元素占滿了整個 dialog,那么我們可以通過監(jiān)聽 dialog 的點擊,當(dāng) targetmodal 時來關(guān)閉它

modal.addEventListener('click', (event) => {
    if (event.target === modal) {
        modal.close('cancelled');
    }
});

當(dāng)然,這不是完美的,但它確實是有效的,如果你有更好的方式,歡迎在評論中交流

總結(jié)

說了這么多,不如自己實際演練一番,作者也做了一個 demo,歡迎參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,702評論 2 370