【HTML5高级第三篇】drag拖拽、音频视频、defer/async属性、dialog应用

news2024/11/29 14:53:28

文章目录

    • 一、拖拽事件
      • 1.1 拖拽事件
      • 1.2 案例:拖拽丢弃图片
    • 二、音频和视频
    • 三、defer 与 async 属性
      • 3.1 概述
      • 3.2 示例一:
      • 3.3 示例二:
    • 四、dialog 元素

一、拖拽事件

原生JavaScipt案例合集
JavaScript +DOM基础
JavaScript 基础到高级
Canvas游戏开发

1.1 拖拽事件

  • ondrag: 拖拽

  • ondragenter: 拖拽进入

  • ondragleave: 拖拽离开

  • ondragstart: 拖拽开始

  • ondragend: 拖拽结束

  • ondragover:悬浮

  • ondrop: 丢弃事件

    该事件有一个bug,dargover事件中的默认行为阻止了ondrop事件不能够执行,所以要给一个元素添加该事件,必须要给该元素添加ondragover事件并阻止默认事件

var img = document.querySelector("img");

//ondrag 拖拽事件
// img.ondrag = function(e){
//     console.log("ondrag...");
//     // this.style.left = e.clientX + "px";
//     // this.style.top = e.clientY + "px";
// }

// ondragstart 拖拽开始
img.ondragstart = function(){
    console.log("拖拽开始...")
}
// ondragend: 拖拽结束
img.ondragend = function(e){
    console.log("拖拽结束...",e)
    // this.style.left = e.clientX + "px";
    // this.style.top = e.clientY + "px";
}


// // ondragenter: 拖拽进入
// img.ondragenter = function(){
//     console.log("拖拽进入....")
// }

// // ondragleave: 拖拽离开
// img. ondragleave = function(){
//     console.log("拖拽离开....")
// }

// ondragover:悬浮
img.ondragover = function(e){
    e.//阻止默认事件
    //preventDefault()[dom标准写法(ie678不兼容)]
    //ie678用returnValue
    //或者利用return false也能阻止默认行为,没有兼容问题(只限传统注册方式)
    preventDefault();
    console.log("拖拽悬浮....")
}

// ondrop: 丢弃事件
img.ondrop = function(){
    console.log("丢弃成功....")
}
//ondrop 丢弃事件有一个 bug 需要 ondragover 配合使用,然后再 ondragover 中阻止默认行为  才能触发ondrop

1.2 案例:拖拽丢弃图片

<img src="./images/1.png" alt="" id="drop1">
<img src="./images/trash.png" alt="" id="trash">
<script>
    //将页面中的图片拖到垃圾桶中丢弃
    var drop1 = document.getElementById("drop1");
    var trash = document.getElementById("trash");

     var elem = null;
   drop1.ondragstart = function(){
       elem = this;
    }

    // 垃圾桶丢弃事件
   trash.ondragover = function(e){
         e.preventDefault();
   }
  trash.ondrop = function(){
         // drop1.remove()
         elem.remove();
}
</script>

二、音频和视频

  • play() 播放音频或视频

  • pause() 暂停播放

  • audio.volume 获取音量在这里插入图片描述
    上面报错,超出[0,1]范围,也就是说音量范围在 0-1之间,那就是 0.1 ,0.2 …

  • audio.muted 设置是否静音,默认是false,非静音状态 设置true,为静音状态

  • muted 属性是一个 boolean(布尔) 属性。

  • muted 属性设置或返回音频/视频是否应该被静音(关闭声音)。

  • audio.currentTime 获取和设置当前播放进度

  • audio.duration 获取播放总时间

html代码:

<!-- <audio src="./video/3.mp3" controls id="audio"></audio> -->
<video src="./video/2.mp4" controls id="audio"></video>
<button id="play">播放</button>
<button id="pause">暂停</button>
<button id="add">音量+</button>
<button id="reduce">音量-</button>
<button id="muted">静音</button>
<div id="bar">
    <div class="progress"></div>
    <div class="block"></div>
    <div class="complete"></div>
</div>

css代码:

#bar{
    width: 450px;
    height: 50px;
    background-color: red;
    position: relative;
}

.progress{
    width: 430px;
    height: 6px;
    background-color: blue;
    position: absolute;
    left: 10px;
    top: 25px;
    transform: translateY(-50%);
}

.block{
    width: 10px;
    height: 20px;
    background-color: orange;
    position: absolute;
    left: 10px;
    top: 25px;
    transform: translateY(-50%);
    /* transition:all .1s; */
}

.complete{
    /* width: 300px; */
    height: 6px;
    background-color: orange;
    position: absolute;
    left: 10px;
    top: 25px;
    transform: translateY(-50%);
}

JS代码:

$("#play").onclick = function(){
    $("#audio").play();
}

$("#pause").onclick = function(){
    $("#audio").pause();
}

$("#add").onclick = function(){
    // var vol = $("#audio").volume;
    // vol += 0.1;
    // $("#audio").volume = vol > 1 ?  vol = 1 : vol;
    // 使用小数可以实现音量的增减 但是JS有精度损失问题  所以能不用则不用

    var vol = $("#audio").volume * 10; // [0,1] * 10 = [1,10]
    vol = ++vol > 10 ? vol = 10 : vol;
    $("#audio").volume = vol / 10;

    console.log($("#audio").volume)
}

$("#reduce").onclick = function(){
    // var vol = $("#audio").volume;
    // vol -= 0.1;
    // $("#audio").volume = vol < 0 ?  vol = 0 : vol;


    var vol = $("#audio").volume * 10;
    vol = --vol > 10 ? vol = 10 : vol;
    $("#audio").volume = vol / 10;

    console.log($("#audio").volume)
}

$("#muted").onclick = function(){
    $("#audio").muted ? this.innerHTML = "静音" : this.innerHTML = "恢复";
    $("#audio").muted = !$("#audio").muted;
}

$(".block").onmousedown = function(){
    $(".progress").onmousemove = function(e){
        // console.log(e.clientX)
        var ml = e.clientX - 10;
        $(".block").style.left = ml + "px";
        $(".complete").style.width = ml + "px";
        var r = ml / this.clientWidth;
        console.log(r)
        $("#audio").currentTime = $("#audio").duration * r;
    }
}

function $(selector){
    return document.querySelector(selector);
}

浏览器:

音频:

在这里插入图片描述

视频:

在这里插入图片描述

三、defer 与 async 属性

3.1 概述

在 HTML5 之前,加载页面过程中,如果某个 script 标签引入一个外部的 js 脚本文件,浏览器在读取该 js 脚本过程中会暂停页面的加载工作,发送一个请求去下载 js 脚本文件,脚本下载完毕后才继续执行页面的加载工作。如果脚本文件比较庞大,那么脚本的下载工作必然会成为页面加载时一个性能方面的瓶颈。

在 HTML5 中,针对 script 元素,新增 defer 与 async 属性,来加快页面的加载速度。当使用这两个属性时,浏览器发出下载脚本的请求并开始下载工作后,会立即继续执行页面的加载工作。脚本下载完毕时触发一个 onload 事件,通过监听该事件来指定当脚本文件下载完毕后所需要执行的一些操作。

两个属性的区别仅在于何处执行 onload 事件处理函数:

  • 使用 async 属性,脚本下载完毕后,立即执行 onload 事件处理函数。引入多个脚本文件且都添加 async 属性时,按照脚本下载时间执行脚本文件(不按照代码书写顺序执行)
  • 使用 defer 属性,脚本下载完毕后,等待页面全部加载完毕后,才执行 onload 事件处理函数。引入多个脚本文件且都添加 defer 属性时,则在页面加载完毕后按照代码中外部脚本的引用顺序依次执行对应的 onload 事件处理函数(不按照脚本下载时间顺序执行)

注意:由于外部脚本文件的下载工作也属于整个页面加载工作的一部分,所以外部脚本文件的 onload 事件处理函数优先于浏览器窗口对象(window 对象)或 body 元素的 onload 时间处理函数执行。

3.2 示例一:

对比两个属性使用时较未使用时页面加载速度

脚本文件代码:

function myInit(){
	let x = "示例文字,很多的样子...";
	alert(x);
}

script引入时三种情况:

<script src="./js/test.js" onload="myInit()"></script>
<script src="./js/test.js" defer onload="myInit()"></script>
<script src="./js/test.js" async onload="myInit()"></script>

浏览器 Timeline 中观察三种情况页面的加载时间:

在这里插入图片描述

3.3 示例二:

在页面中引入两个外部脚本文件,test.js 脚本文件内容较多,test2.js 脚本文件内容较少。对这两个外部脚本文件均使用 async 或 defer属性。观察这两个引入文件的执行顺序。

<script src="./js/test.js" defer onload="myInit()"></script>
<script src="./js/test2.js" defer onload="myInit2()"></script>

// 或

<script src="./js/test.js" async onload="myInit()"></script>
<script src="./js/test2.js" async onload="myInit2()"></script>

四、dialog 元素

dialog 元素代表一个对话框。

默认情况下,dialog 元素处于隐藏状态,可以在 JS 脚本中使用元素的 show 方法显示 dialog 元素,可以使用元素的 close 方法隐藏 dialog 元素。

如果想要以模态框(模式对话框)的形式显示 dialog ,则需要使用元素的 showModal() 方法。

如下,点击“打开对话框”按钮,弹出模态框;点击模态框中的“关闭”按钮,关闭当前模态框:

在这里插入图片描述

在这里插入图片描述

HTML代码:

<!-- dialog对话框,元素默认处于隐藏状态,可以在脚本中使用元素的show方法显示dialog元素,close方法隐藏dialog元素 -->
<button id="open">打开对话框</button>
<dialog id="dg">
    <h1>用户登录</h1>
    <form action="#">
        <p><label for="uname">用户名:</label><input type="text" placeholder="请输入用户名"></p>
        <p><label for="pwd">密码:</label><input type="password" placeholder="请输入密码"></p>
        <p><button id="login-btn">登录</button><button id="close-btn">关闭</button></p>
    </form>
</dialog>

CSS代码:

*{margin: 0;padding: 0;}
#dg{
    width: 30%;
    padding: 20px 10px;
    text-align: center;
    line-height: 3;

    position: fixed;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
}

label{
    display: inline-block;
    width: 100px;
    text-align: right;
}

#dg button{
    margin: 0 10px;
}

JS代码:

let open = document.getElementById("open"),
    dg = document.getElementById("dg"),
    closeBtn = document.getElementById('close-btn');

open.onclick = function(){
    // show() 显示dialog元素
    // dg.show();
    // showModal() 以模态框的形式显示dialog元素
    dg.showModal();
}

closeBtn.onclick = function(){
    // close() 方法隐藏dialog元素
    dg.close();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/986964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW利用局部放电分析高压电气设备状态诊断

LabVIEW利用局部放电分析高压电气设备状态诊断 目前&#xff0c;高压电气设备状态的监控系统解决了早期故障检测的问题。局部放电起源于电力电气装置的绝缘。局部放电会导致绝缘层逐渐磨损和加速老化&#xff0c;因此可能导致绝缘完全击穿。因此&#xff0c;局部放电检测及其特…

gitLab(git)误提交命令

1.先使用下面命令查看一下分支上已提交的信息 git log 2.回退到之前的版本 git reset —hard 你要删除的提交哈希码&#xff08;一般是离这个命令最近的一串数字&#xff09; 3.覆盖掉远端的版本信息&#xff0c;使远端的仓库也回退到相应的版本 注意&#xff1a;切换到你提…

安装K8s基础环境软件(二)

所有节点执行 1、安装docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.reposudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin systemctl…

解决报错之org.aspectj.lang不存在

一、IDEA在使用时&#xff0c;可能会遇到maven依赖包明明存在&#xff0c;但是build或者启动时&#xff0c;报找不存在。 解决办法&#xff1a;第一时间检查Setting->Maven-Runner红圈中的√有没有选上。 二、有时候&#xff0c;明明依赖包存在&#xff0c;但是Maven页签中…

SI3262 低功耗 SOC +13.56mhz刷卡+触摸三合一芯片,适用于智能锁方案

Si3262 是一款高度集成的低功耗 SOC 芯片&#xff0c;其集成了基于 RISC-V 核的低功耗MCU 和工作在 13.56MHz 的非接触式读写器模块。 MCU 模块具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16 位精度的 ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、…

【FAQ】安防视频监控/视频汇聚平台EasyCVR服务重启,海康SDK设备无法上线的原因排查

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。旭帆科技平台既具备传统安防视频监控…

将目标检测项目移植到linux上出现OSERROR

在windows上运行项目正常&#xff0c;但是在centos9上运行出现找到资源&#xff0c;第一次遇到这个问题&#xff0c;通过代码回找&#xff0c;一步一步发现&#xff0c;读取数据没问题&#xff0c;但是在预测的时候无法读取&#xff0c;查到的资料 说明显示字体问题&#xff0c…

Maven中导入jQuery,前端页面中引用jQuery

第一步pom文件中&#xff0c;配置maven坐标。 第二步&#xff0c;在前端页面中引用jQuery 注&#xff1a;该前端页面需要在web根目录即webapp目录下。可认为在maven中导入jQuery后&#xff0c;jquery.min.js文件放在目录webapp/webjars/jquery/3.3.1下。

大模型扫盲之小白入门手记

本篇内容来自小米集团数据科学部负责人刘汉武老师的数据特训营笔记。不涉及深入的知识&#xff0c;仅在扫盲。 首先一个问题&#xff1a;大模型和大语言模型的区别是什么&#xff1f; 有人说大模型像是连接数据的星辰&#xff0c;能给我们提供前所未有的见解和洞察。现有的大模…

【精读Uboot】its文件语法

前面我们分析了SPL汇编的执行过程&#xff0c;在SPL之后就要进入另一个loader加载镜像了。在正式分析跳转流程之前&#xff0c;我们需要搞清楚在我们平时下载的imx-boot-xxx这个镜像是如何组成的。 在编译完Uboot、optee和ATF之后&#xff0c;会产生u-boot-spl.bin&#xff0c…

element-plus 踩的坑

原来node版本是16.17.0,装element-plus死活装不上&#xff0c;结果要把node版本升级到18以上&#xff0c;真坑呀&#xff0c;也没人告诉我要这么干

如何调用Zabbix API获取主机信息

自Zabbix 1.8版本被引进以后&#xff0c;Zabbix API开始扮演着越来越重要的角色&#xff0c;它可以为批量操作、第三方软件集成以及其他应用提供可编程接口。 在运维实践中&#xff0c;Zabbix API还有更多巧妙的应用。 面对规模庞大的监控设备&#xff0c;可能会出现某台机器发…

Python接口自动化测试 —— logging日志

logging模块的日志级别&#xff1a;日志级别一共有5个从低到高如下&#xff0c; 作用是在当你给python函数赋予日志器时&#xff0c; 需要自己标记日志级别&#xff08;后面会用到&#xff09; debug&#xff08;调试级别&#xff09;&#xff1a;严重程度最低级别&#xff0c…

2.6 PE结构:导出表详细解析

导出表&#xff08;Export Table&#xff09;是Windows可执行文件中的一个结构&#xff0c;记录了可执行文件中某些函数或变量的名称和地址&#xff0c;这些名称和地址可以供其他程序调用或使用。当PE文件执行时Windows装载器将文件装入内存并将导入表中登记的DLL文件一并装入&…

三显智能氮气柜温度、湿度和氧含量控制介绍

三显智能氮气柜是用来存放易氧化物料&#xff0c;利用氮气达到防潮防氧化目的的柜体&#xff0c;通过多种技术实现温度、湿度和氧含量的显示和控制。 一、温度控制&#xff1a;智能氮气柜一般配备温度传感器和恒温控制装置。温度传感器会实时监测柜内温度&#xff0c;并将数据反…

【Spring AOP】

目录 &#x1f957;1 AOP 的思想 &#x1f35a;2 AOP 的组成 &#x1f95a;2.1 切面 &#x1f359;3 AOP 的实现 &#x1f364;3.1 添加 Spring AOP 依赖 &#x1f96b;3.2 定义切面 &#x1f363;3.3 定义切点 &#x1f373;3.4 实现通知 &#x1f354;4 AOP 实现的一个例子 1…

算法通关村第十七关:白银挑战-贪心高频问题

白银挑战-贪心高频问题 1. 区间问题 所有的区间问题&#xff0c;参考下面这张图 1.1 判断区间是否重叠 LeetCode252 https://leetcode.cn/problems/meeting-rooms/ 思路分析 因为一个人在同一时刻只能参加一个会议&#xff0c;因此题目的本质是判断是否存在重叠区间 将区…

报错解决:RuntimeError: expected scalar type Long but found Float

文章目录 报错信息原因代码示例错误版改正 报错信息 RuntimeError: expected scalar type Long but found Float原因 nn.Linear需要作用于浮点数&#xff0c;这里可能输入了整数类型的张量作为参数。 代码示例 错误版 import torch import torch.nn as nn a torch.tensor…

53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面

基于注解开发 WebSocket –注解就是&#xff1a; OnOpen、 OnClose 、 OnMessage 、OnError这些 ★ WebSocket的两种开发方式 ▲ Spring Boot为WebSocket提供了两种开发方式&#xff1a; 基于spring-boot-starter-websocket.jar开发WebSocket 基于Spring WebFlux开发WebSoc…

常用消息中间件有哪些

RocketMQ 阿里开源&#xff0c;阿里参照kafka设计的&#xff0c;Java实现 能够保证严格的消息顺序 提供针对消息的过滤功能 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力 RabbitMQ Erlang实现&#xff0c;非常重量级&#xff0c;更适…