JavaScript 练手小技巧:HTML5 的 dialog 标签制作对话框

这篇具有很好参考价值的文章主要介绍了JavaScript 练手小技巧:HTML5 的 dialog 标签制作对话框。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对话框,在应用中常常用来做信息提示、特定操作(如,登录、删除信息等)。

dialog html,javascript,javascript,css,html

一、传统对话框做法

以前创建对话框,需要用<div> 标签去模拟,或者使用一些框架、插件,如 artDialogboostrap 等,去创建对话框

如:使用<div> 标签去模拟对话框

<style>
    .dialog{
        background: #fff;
        padding: 15px;
        position: fixed;
        z-index: 10000;
        left:50%;
        top:50%;
        transform: translateX(-50%) translateY(-50%);
        box-shadow: 0 0 20px 0 rgba(0,0,0,0.3);
        border-radius:15px;
    }
    div.mask{
        position: fixed;
        z-index: 9999;
        left:0;
        right:0;
        bottom:0;
        top:0;
        background: rgba(0,0,100,0.6);
    }
    .dialogBtn{
        text-align: center;
        padding-top: 15px;
    }
    .dialogBtn button{
        cursor: pointer;
        padding-left: 15px;
        padding-right: 15px;
        height: 30px;
        background: #3f74e3;
        color: #fff;
        font-size: 14px;
        text-shadow: 1px -1px 0 rgba(0,0,0,0.5);
        border:none;
        border-radius: 5px;
    }
    .dialogBtn button:hover{
        background: #1846a8;
    }
    .dialogContent{
        min-width: 300px;
        min-height:80px;
        font-size: 16px;
        line-height: 1.5;
        display: flex;
        justify-content: center;
        align-items: center;
    }
</style>
<div class="dialog">
    <div class="dialogContent">
        <p>
            对话框的内容
        </p>
    </div>
    <div class="dialogBtn">
        <button type="button">确定</button>
    </div>
</div>
<div class="mask"></div>

dialog html,javascript,javascript,css,html

 特定的功能还需要自己编写 JavaScript 代码,详见博文《JavaScript练手小技巧:页面遮罩层》:JavaScript练手小技巧:页面遮罩层_stones4zd的博客-CSDN博客_js遮罩层覆盖整个页面

二、dialog 标签

<dialog> 是HTML5新增的语义化双标签,用于展示一个交互式的模态对话框

它既可以创建模态化对话框(带半透明背景遮罩层的对话框,必须完成对话框操作后,如单击【确定】或【取消】按钮等将该对话框关闭,才能进行下一步操作。),也可以创建非模态化对话框

既可以使用键盘,点击按钮关闭对话框;也可以使用 esc键 关闭对话框。

  • 模态化对话框

dialog html,javascript,javascript,css,html

  •  非模态化对话框

dialog html,javascript,javascript,css,html

三、基础使用

1. 基础结构和样式

<dialog>双标签,可以在它的头尾标签之间自定义对话框内容。如:

<dialog>
    <h1>这个是对话框的内容</h1>
    <p>
        这是一个简单的对话框
    </p>
</dialog>

默认<dialog> 标签是不可见的。

要显示对话框,需要添加 open 属性。

<dialog open>
    <h1>这个是对话框的内容</h1>
    <p>
        这是一个简单的对话框
    </p>
</dialog>

dialog html,javascript,javascript,css,html

 <dialog> 标签基础样式:

dialog {
    display: none;
    position: absolute;
    inset-inline-start: 0px;
    inset-inline-end: 0px;
    width: fit-content;
    height: fit-content;
    background-color: canvas;
    color: canvastext;
    margin: auto;
    border-width: initial;
    border-style: solid;
    border-color: initial;
    border-image: initial;
    padding: 1em;
}
dialog[open] {
    display: block;
}

注意几个细节:

  1. <dialog> 标签的显示与隐藏是通过 display:block/none; 进行操作的。意味着,<dialog> 标签默认不能进行透明度渐隐变化。

  2. <dialog> 标签默认是绝对定位的。

  3. <dialog> 标签自带有 1em 的 padding 值。

  4. <dialog> 标签是通过设置 margin:auto 实现的水平居中。

2. JS控制对话框的显示隐藏

<dialog> 标签常用方法:

(1)show()

非模态化显示对话框,对其添加open属性。在非模态化下,不能使用 esc 键让对话框消失。

如:点击按钮,显示对话框。

let btn = document.getElementById("btn");
let myDialog = document.querySelector("#myDialog"); // 获取对话框标签
btn.addEventListener("click",function (e) {
    myDialog.show();
});

dialog html,javascript,javascript,css,html

(2)showModal()

模态化显示对话框,对其添加open属性并且显示遮罩层同时按ESC键可以关闭对话框。

let btn = document.getElementById("btn");
let myDialog = document.querySelector("#myDialog"); // 获取对话框标签
btn.addEventListener("click",function (e) {
    myDialog.showModal();
});

模态化<diglog> 的样式:

dialog:modal {
    position: fixed;
    inset-block-start: 0px;
    inset-block-end: 0px;
    max-width: calc((100% - 6px) - 2em);
    max-height: calc((100% - 6px) - 2em);
    user-select: text;
    visibility: visible;
    overflow: auto;
}

遮罩层是 <diglog> 的伪标签::backdrop。其默认样式为:

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

因此,修改遮罩层就修改::backdrop的样式。

注意几个细节:

  1. 模态化<dialog> 标签的样式是通过 dialog:modal 控制,区别于普通状态的 <dialog>

  2. 模态化<dialog> 标签和遮罩层,都是固定定位的。

  3. 模态化<dialog> 标签是通过设置 margin:auto 实现的水平居中

    垂直居中模态化<dialog> 标签,可以使用以下样式。

.myDialog{
    top:50%;
    transform: translateY(-50%);
}

(3)close()

关闭对话框,删除其open属性,同时将close方法参数保留至dialog.returnValue属性上。

如,以下代码会在第二次显示对话框的时候,输出“abc”。

let btn = document.getElementById("btn");
let btn2 = document.getElementById("btn2");
let myDialog = document.querySelector("#myDialog"); // 获取对话框标签
btn.addEventListener("click",function (e) {
    myDialog.show();
    console.info(myDialog.returnValue);
});
btn2.addEventListener("click",function (e) {
    myDialog.close("abc");
});

利用该方法,可以给对话框添加自定义的“关闭”按钮。

<dialog class="myDialog" id="myDialog">
    <div class="myDialogClose" onclick="this.parentNode.close()">关闭</div>
    <h1>这个是对话框的内容</h1>
    <p>
        这是一个简单的对话框
    </p>
</dialog>
.myDialogClose{
    width: 40px;
    height: 40px;
    background: #f90;
    color: #fff;
    line-height: 40px;
    font-size: 12px;
    text-align: center;
    position: absolute;
    right:-20px;
    top:-20px;
    cursor: pointer;
}

dialog html,javascript,javascript,css,html

3. 对话框事件

(1)close 事件

当对话框关闭时触发。

myDialog.addEventListener("close",function(e){  
   console.info(e.target);  // 输出对话框标签
});

(2)cancel 事件

当按下ESC关闭模态对话框时触发,同时也会触发 close 事件。

myDialog.addEventListener("close",function(e){
    console.info(e.target);
});
myDialog.addEventListener("cancel",function(e){
    console.info("esc");
});

dialog html,javascript,javascript,css,html

 注意顺序:先 cancel 事件,后 close 事件。

四、应用

1. 点击 dialog 关闭对话框

有时候,我们需要点击遮罩层(也属于<dialog> 标签的一部分)就要关闭对话框。

但是,点击对话框的内容,也在点击<dialog> 标签。

因此,要判断点击对象的 nodeName 是否是 dialog,是,就说明点击了遮罩层,关闭对话框;不是,就是点击了<dialog> 标签里的内容,不需要关闭对话框。

为了保证最佳点击效果,强烈建议对话框的内容用一个div单独包裹,而不是把内容直接堆在<dialog> 标签里。

<button type="button" id="btn">点击显示对话框</button>
<button type="button" id="btn2">点击删除对话框</button>
<dialog class="myDialog" id="myDialog">
    <div class="myDialogClose" id="closeDiv">关闭</div>
    <!-- 对话框内容 -->
    <div class="dialogContent">
        <h1>这个是对话框的内容</h1>
        <p>
            这是一个简单的对话框
        </p>
    </div>
    <!-- 对话框内容 end -->
</dialog>
myDialog.addEventListener("click",function(e){
    if(e.target.nodeName.toLowerCase() == "dialog"){
        myDialog.close();
    }
});

可以约定一个属性closeByMask,若标签上存在该属性,则可以进行点击遮罩层进行关闭:

<dialog closeByMask></dialog>
<dialog closeByMask></dialog>

然后添加以下脚本即可:

document.querySelectorAll("dialog[closeByMask]").forEach(dialog => {
    dialog.addEventListener("click",function(e){
        if(e.target.nodeName.toLowerCase() == "dialog") {
            this.close();
        }
    }
});

这样页面中所有的模态化对话框,点击遮罩层都可以关闭。

2. dialog 跟表单结合

可以在 dialog 标签里添加表单,增加按钮,实现数据传递等。

<dialog class="myDialog" id="myDialog">
    <div class="myDialogClose" id="closeDiv">关闭</div>
    <!-- 对话框内容 -->
    <div class="dialogContent">
        <h1>这个是对话框的内容</h1>
        <p>
            这是一个简单的对话框
        </p>
        <div class="form">
            <form method="dialog">
                <button type="submit">确定</button>
                <button type="button">取消</button>
            </form>
        </div>
    </div>
    <!-- 对话框内容 end -->
</dialog>

dialog html,javascript,javascript,css,html

注意:

  1. <form> 标签添加属性 method = "dialog",当点击submit 按钮的时候就会关闭对话框。

  2. 如果,有多个 submit 按钮,可以给按钮添加 value 属性。在 close 事件里,利用returnValue 属性判断点击了哪个 submit按钮。从而可以选择执行不同的代码。

  3. 但是在执行完代码后,记得清空 returnValue 的值,否则会一直保留在 myDialog上。

<dialog class="myDialog" id="myDialog">
    <div class="myDialogClose" id="closeDiv">关闭</div>
    <!-- 对话框内容 -->
    <div class="dialogContent">
        <h1>这个是对话框的内容</h1>
        <p>
            这是一个简单的对话框
        </p>
        <div class="form">
            <form method="dialog">
                <button type="submit" value="ok">确定</button>
                <button type="submit" value="no">取消</button>
            </form>
        </div>
    </div>
    <!-- 对话框内容 end -->
</dialog>
myDialog.addEventListener("close",function(e){
    console.info("close");
    let rV = myDialog.returnValue;
    console.info( rV );
    if(rV =="ok"){
        console.info("你点了确定");
    }else if(rV =="no"){
        console.info("你点了取消");
    }else{
        console.info("其它操作");
    }
    myDialog.returnValue = ""; // 清空该值,否则会一直保留到对话框上。
});

3. 隐藏显示添加动画

默认,<dialog> 标签的显示与隐藏是通过 display:block/none; 进行操作的。意味着,<dialog> 标签默认不能进行透明度渐隐变化。

因此,要修改为 opacity 属性来实现渐隐变化。

但是,隐藏的时候 opacity:0 ,用户仍然可以点击<dialog> 标签。所以,还要结合 visibility:hidden; 属性来让用户不能点击透明度为 0 的对话框标签。

dialog {
    display: block;
    opacity: 0;
    visibility: hidden;
    transition: all 0.2s;
}
dialog[open] {
    display: block;
    opacity: 1;
    visibility: visible;
}

兼容性

目前主流浏览器都支持 <diglog> 标签,可以放心使用。

dialog html,javascript,javascript,css,html文章来源地址https://www.toymoban.com/news/detail-807184.html

到了这里,关于JavaScript 练手小技巧:HTML5 的 dialog 标签制作对话框的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript 练手小技巧:键盘事件

    键盘事件应该是鼠标事件之外,使用频率最高的 JS 事件了吧? 一般用于 全局 或者 表单 。 键盘事件由用户击打键盘触发,主要有 keydown 、 keypress 、 keyup 三个事件。 keydown :按下键盘时触发。Ctrl、Shift、Alt 等和其它 按键组合 时,组合键的事件监听通常要使用 keydown 。 ke

    2024年02月09日
    浏览(31)
  • [HTML]Web前端开发技术16(HTML5、CSS3、JavaScript )表格课后练习网页标题:域标签的使用网页标题:美家装饰联系我们网页标题:登录界面网页标题问卷调查——喵喵画网页

    希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 表格课后练习 网页标题:域标签的使用 网页标题:美家装饰联系我们 网页标题:登录界面 网页标题

    2024年01月24日
    浏览(37)
  • HTML5 <rt> 标签、HTML5 <ruby> 标签

    HTML5 rt标签用于表示为ruby标签中的注释内容。 一个 ruby 注释: 尝试一下 » IE 9+、Firefox、Opera、Chrome 和 Safari 支持 rt 标签。 注释: IE 8 或更早版本的 IE 浏览器不支持 rt 标签。 rt 标签定义字符(中文注音或字符)的解释或发音。 将 rt 标签与 ruby 和 rp 标签一起使用: ruby 元素

    2023年04月23日
    浏览(95)
  • HTML5 <s> 标签、HTML5 <sub> 和 <sup> 标签

    s 标签定义加删除线的文本。HTML 5 中不再支持这个标签。请使用 CSS 代替。 在 HTML 4.01 中不赞成使用 s 标签。 在 HTML 5 中不支持 s 标签。 提示:请使用 del 标签代替。 关于s 标签的详细详细,你可以参考本站的“HTML s 标签”一节! HTML5 sub和sup标签分别为文档中的内容定义下标

    2024年02月01日
    浏览(54)
  • 【HTML5系列】第一章 · HTML5新增语义化标签

            Hello大家好, 我是【 麟-小白 】,一位 软件工程 专业的学生,喜好 计算机知识 。希望大家能够一起 学习进步 呀!本人是一名 在读大学生 ,专业水平有限,如发现 错误 或 不足之处 ,请多多指正!谢谢大家!!!         如果 小哥哥小姐姐们 对我的文章感兴趣

    2024年02月04日
    浏览(42)
  • 【HTML5】HTML5 多媒体标签 ① ( audio 音频标签 | 音频标签常见属性值设置 | 音频标签默认代码设置 | 音频标签设置多种类型音频文件 )

    传统 HTML 开发中 , 如果想要向网页中嵌入音频和视频 , 需要 使用 Flash 浏览器插件才能实现 ; 在 HTML5 中 , 使用 多媒体标签 , 即可实现向浏览器中插入音视频 , 多媒体标签如下 : 音频标签 : audio 视频标签 : video HTML 5 的 audio 音频标签 , 支持 ogg / mp3 / wav 三种格式的音频 , 不同的

    2024年02月15日
    浏览(40)
  • HTML-常见标签、HTML5新特性

    (1) C/S架构即Client/Server(客户机/服务器)结构。 (2) C/S 架构特点 ​ C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。但是该结构的程序是针对性开发,变更不够灵活,维护和管理的难度较大。通常只

    2024年02月11日
    浏览(56)
  • 【HTML5高级第三篇】drag拖拽、音频视频、defer/async属性、dialog应用

    原生JavaScipt案例合集 JavaScript +DOM基础 JavaScript 基础到高级 Canvas游戏开发 1.1 拖拽事件 ondrag: 拖拽 ondragenter: 拖拽进入 ondragleave: 拖拽离开 ondragstart: 拖拽开始 ondragend: 拖拽结束 ondragover:悬浮 ondrop: 丢弃事件 该事件有一个bug,dargover事件中的默认行为阻止了ondrop事件不能够执行,

    2024年02月09日
    浏览(36)
  • HTML5前端标签练习

    标签的分类 标签的嵌套 a标签 验证form表单朝后端提交数据 效果 代码

    2024年02月08日
    浏览(44)
  • HTML5新增的标签

    header :头部标签 nav :导航标签 article :内容标签 section :定义文档某个区域 aside :侧边栏标签 footer :尾部标签 当前audio仅支持三种视频格式:尽量使用mp3格式 常见属性: 属性 值 描述 autoplay autoplay 如果出现该属性,则音频在就绪后马上播放 controls controls 如果出现该属性,则向用户

    2024年02月04日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包