HTML 5.2草案加入了新的dialog元素。但是是一种实验技术。

以前,如果我们想要构建任何形式的模式对话框或对话框,我们需要有一个背景,一个关闭按钮,将事件绑定在对话框中的方式安排我们的标记,找到一种将消息传递出去的方式对话......这真的很复杂。对话框元素解决了上述所有问题。

一、Bootstrap模态框和原生模态框的对比

下面是一个bootstrap模态框的html结构:

<!-- 按钮触发模态框 -->
<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
开始演示模态框
</button>
<!-- 模态框(Modal) -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
&times;
</button>
<h4 class="modal-title" id="myModalLabel">
模态框(Modal)标题
</h4>
</div>
<div class="modal-body">
在这里添加一些文本
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭
</button>
<button type="button" class="btn btn-primary">
提交更改
</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal -->
</div>

下面是一个原生模态框的HTML结构:

<!-- 按钮触发模态框 -->
<button type="button" class="btn">显示模态框</button> <!-- 模态框 -->
<dialog open>
HTML5原生模态框
</dialog>

二、基初的模态框样式

我们已经看到了对话框元素的最简单标记,您可能已经注意到open是上面对话框中的属性。将该属性添加到元素将强制显示对话框,否则将删除它。该对话框也将绝对定位在页面上。

上图展示了一个最基本的模态框样式。

打开浏览器可以查看到它的基本样式是这样的:

dialog{
display: block;
position: absolute;
left: 0px;
right: 0px;
width: -webkit-fit-content;
height: -webkit-fit-content;
color: black;
margin: auto;
border-width: initial;
border-style: solid;
border-color: initial;
border-image: initial;
padding: 1em;
background: white;
}

dialog元素还引入了一个新的伪类选择器::backdrop,通过浏览器查看到默认的::backdrop样式如下:

dialog::backdrop {
position: fixed;
top: 0px;
right: 0px;
bottom: 0px;
left: 0px;
background: rgba(0, 0, 0, 0.1);
}

二、设置对话框样式

我们可以像任何HTML元素一样设置dialog元素的样式,几乎所有的CSS样式都可以。通过::backdrop伪类选择器,我们可以用它来设置背景的样式。

例如:

dialog{
margin-top:200px;
width:250px;
height:250px;
text-align:center;
line-height:250px;
border-radius: 4px;
border: none;
box-shadow: 0 0 15px lightgray;
} dialog::backdrop {
background: rgba(black, .5);
}

上面的样式效果如下图:

、对话框操作API

下面是一个基本的对话框,因为没有设置open属性,所以它不会在视觉上显示任何东西。您需要使用JavaScript API来显示/隐藏它。

<dialog>这是dialog对话框!</ dialog>

dialog元素的.show().close()两个api分别是显示和关闭对话框,通过在DOM元素上使用这两个api,您可以显示和关闭对话框。

例如:

<!-- HTML -->
<dialog>
<p>这是dialog对话框!</p>
<button id="close">关闭对话框</button>
</dialog>
<button id="show">显示对话框</button> <!-- script -->
<script>
var dialog = document.querySelector("dialog"); document.querySelector("#show").onclick = function(){
dialog.show();
}; document.querySelector("#close").onclick = function(){
dialog.close();
};
</script>

你可以传递一个参数给dialog.close()。通过监听dialog元素的close事件,该dialog.returnValue属性将返回给定的值。

如:

<!--HTML-->
<dialog>
<p>这是dialog对话框!</p>
<p><input type="text" id="return_value" value="" placeholder="请输入内容"/></p>
<button id="close">关闭对话框</button>
</dialog>
<button id="show">显示对话框</button> <!--script-->
<script>
var dialog = document.querySelector("dialog"); document.querySelector("#show").onclick = function(){
dialog.showModal();
}; document.querySelector("#close").onclick = function(){
var val = document.querySelector("#return_value").value;
dialog.close(val);
}; //监听dialog元素的close事件
dialog.addEventListener("close", function(){
alert(this.returnValue);
});
</script>

显示dialog对话框的另一个api是.showModal()

如果你不希望用户与对话框以外的其他页面元素对象进行交互,那么请使用.showModal()打开对话框而不是使用.show().showModal()打开的对话框会有一个全窗口的半透明背景层,阻断用户与对话框之外的页面元素对象进行交互,同时对话框会默认显示在窗口正中间(上下左右都居中);而用.show()打开的对话框会默认显示在窗口顶部(可以通过css实现居中显示)。

关闭对话框后,close会触发一个事件。另外,用户可以通过输入“Escape”键来关闭模式对话框。这将激发cancel您可以取消使用的事件event.preventDefault()

、与表单集成使用

您可以使用form[method="dialog"]将表单与一个<dialog>元素集成使用。表单提交后,它会关闭对话框并设置dialog.returnValuevalue已使用的提交按钮。

此外,您可以使用该autofocus属性在弹出对话框时自动将焦点对准对话框内的窗体控件。

例如:

<!--HTML-->
<dialog id ="dialog">
<form method ="dialog">
<p>你是否同意使用条款?</p>
<p><textarea class ="form-control" disabled>条款要求...</textarea></p>
<button type ="submit" value ="是">是</button>
<button type ="submit" value ="否" autofocus>否</button>
</form>
</dialog>
<button id="show">显示表单对话框</button> <!--script-->
<script>
var dialog = document.querySelector("dialog"); document.querySelector("#show").onclick = function(){
dialog.showModal();
}; //监听dialog元素的close事件
dialog.addEventListener("close", function(e){
if(this.returnValue === "是"){
alert(this.returnValue)
//dosomething...
}else{
alert(this.returnValue)
//dosomething...
};
});
</script>

四、浏览器兼容性

桌面浏览器只有谷歌浏览器支持dialog的完整功能(到本博文发表时),要实现跨浏览器兼容请使用dialog-polyfill。

参考文章:对话框元素演示

教你使用HTML5原生对话框元素,轻松创建模态框组件的更多相关文章

  1. 原生js创建模态框(摘自:东窗凝残月 链接:https://www.cnblogs.com/dcncy/p/9076937.html)

    <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>Te ...

  2. 原生js创建模态框

    1.效果图如下: 2.代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...

  3. HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)

    HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...

  4. HTML5原生拖放实例分析

    HTML5提供了原生拖放功能的JavaScript API,使用起来很方便. 兼容性: 对于PC端浏览器,Firefox.Chrome.Safari支持良好,而IE和Edge浏览器有些特性不支持,如I ...

  5. HTML5 新模块元素兼容问题

    新增块元素默认样式 下列HTML5新模块元素在IE8.9版本浏览器中没有被定义默认样式.为解决该问题,给下列元素添加“block”显示属性. 代码: article, aside, details, ...

  6. HTML5中dialog元素尝鲜

    对话框(别称模态框,浮层)是web项目中用于用户交互的重要部分,我们最常见的就是js中 alert(),confirm(),但是这个对话框的不美观,也不能自定义样式,所以在开发的过程中,一般根据自己自 ...

  7. HTML5 画布canvas元素

    HTML5的canvas元素以及随其而来的编程接口Canvas API应用前景极为广泛.简单地说,canvas元素能够在网页中创建一块矩形区域,这块矩形区域可以成为画布,这其中可以绘制各种图形.可别小 ...

  8. 原生JS元素怎么取消事件

    关于原生JS元素怎么取消事件,有3种方式 常规方法:removeEventListener 案例: <body> <div id="myDIV"> div ...

  9. 用HTML5+原生js实现的推箱子游戏

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

随机推荐

  1. DataTable表头对不齐、添加参数等方法总结

    tableData: 一:写这篇博客是因为我在网上找到了改变行颜色,没有找到改变td颜色的改变文章,也许好多朋友早就找到了或感觉这个太简单,但不管怎样我还是写下了这篇没有技术含量的一篇. 前提:引入依 ...

  2. Linux下对lvm逻辑卷分区大小的调整(针对xfs和ext4不同文件系统)

    当我们在安装系统的时候,由于没有合理分配分区空间,在后续维护过程中,发现有些分区空间不够使用,而有的分区空间却有很多剩余空间.如果这些分区在装系统的时候使用了lvm(前提是这些分区要是lvm逻辑卷分区 ...

  3. Linux日志出现大量"kernel: NET: Registered protocol family 36"

    一台Linux服务器的系统错误日志出现大量的" kernel: NET: Registered protocol family 36"错误信息,如下所示: Jul  2 05:27 ...

  4. C和C++头文件大全

    C.传统 C++ #include <assert.h> //设定插入点#include <ctype.h>  //字符处理#include <errno.h>   ...

  5. 反射生成 INSERT 多个对象的 SQL 语句(批量插入)

    + View code private static void insertObject(List<?> objectList) throws IllegalAccessException ...

  6. 多文档界面的实现(DotNetBar的superTabControl)

    private void FormMain_Load(object sender, EventArgs e) { superTabControl2.Tabs.Clear(); timer1.Start ...

  7. Centos7安装搭建FTP服务器(最简便方法)

    简介: vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点. vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linu ...

  8. Python 入门:基本语法

    对于多数从其他编程语言转入Python的来说,或多或少会有些不习惯.如果沿用其他编程语言的语法来写Python代码,那么碰壁是不可避免的了. 本文是基于我看了两个小时的官方文档(Python 2.7 ...

  9. May 26. 2018 Week 21st Saturday

    Do what you say, say what you do. 做你说过的,说你能做的. Be honest to yourself, and be honest to those people ...

  10. JavaScript数据类型之文本类型

    引言 字符串(string)是一组由16位值组成的不可变的有序序列,每个字符通常来自于Unicode字符集.JavaScript通过字符串类型来表示文本.字符串的长度(length)是其所含16位值的 ...