一、拖放事件

1.1 设置拖拽

给标签设置一个draggable设置为true, 标签就可以拖拽了

1.2 拖拽事件

1.2.1拖拽元素事件 (事件对象为被拖拽元素)

  • ondragstart 拖拽前触发
  • ondragend 拖拽结束触发
  • ondrag 拖拽前、拖拽结束之间,连续触发

看实例:

<div draggable="true"><img src="data:images/225.jpg" alt="" style="width:100px;height: 100px;" ></div><script>var  box = document.querySelector("div");box.ondragstart = function(){console.log("我被拖拽了!");}box.ondrag = function(){console.log("我在被拖拽的过程中");}box.ondragend = function(){console.log("拖拽结束了!");}</script>

1.2.2 目标元素事件 (俗解:意思就是拖拽的元素放在哪里)

  • ondragenter 进入目标元素触发,相当于mouserover
  • ondragover 进入目标,离开目标之间,连续触发
  • ondragleave 离开目标元素触发,相当于mouseout
  • ondrop 在目标元素上释放鼠标触发(要想触发drop事件,就必须在ondragover的时间中阻止默认事件)

1.2.3 even下的 dataTransfer 对象

  • setData() : 设置数据 key 和 value (必须是字符串)
  • getData() : 获取数据,根据 key 值,获取对应的value
  • effectAllowed : 拖住到相应区域时显示的光标样式(none、copy、copyLink、copyMove、link、linkMove、move、all、和uninitialized)
  • setDragImage() (当这个传递的节点隐藏的时候只支持Firefox)

他是拖住时显示的图形和样式 , 有三个参数:指定的元素(指点的阴影样式),坐标X 坐标Y(x、y是拖拽时鼠标的位置)

小案例:

     #box{margin-left:150px;}#box1 img{display: block;width:100px;height:100px;float:left;margin-left:20px;}
      <div id="box"><img src="data:images/回收站.png" alt=""></div><div id="box1"><img src="data:images/唯美1.jpg"><img src="data:images/唯美2.jpg"><img src="data:images/唯美3.jpg"><img src="data:images/唯美4.jpg"></div>
<script type="text/javascript">//获取 垃圾箱对象var box = document.querySelector("#box");//获取图片列表对象var imgList = document.querySelectorAll("img");//获取图片列表的父元素var box1 = document.querySelector("#box1");//遍历图片,并且增加拖拽开始事件imgList.forEach(function(item,index){item.ondragstart = function(event){event.dataTransfer.setData("name",index);}});//阻止冒泡box.ondragover = function(event){event.preventDefault();};box.ondrop = function(event){// 获取拖拽元素的编号var index = event.dataTransfer.getData("name");box1.removeChild(imgList[index]);};
</script>

实例效果图:

1.3 外部拖拽文件

files (获取外部拖拽的文件,返回一个filesList列表)

  • length (event.dataTransfer.files.length)
  • Type(event.dataTransfer.files[0].type) 比如:图片的是(image/jpeg)
  • FileReader 对象(读取文件信息)

方法一:readAsDataURL():参数为要读取的文件对象,将文件读取为DataUrl
方法二:Onload()事件函数:当函数文件读取成功完成的时候触发此事件。(this.result用来获取读取到的文件数据,如果是图片,将返回base64格式的图片数据)

小案例:拖拽文件上传:

    #box{width:200px;height:200px;line-height:200px;text-align:center;border:5px dashed #eeee;background:pink;}
     <div id="box">请将图片拖到此区域</div><div id="imgs"></div><script>var box = document.querySelector("#box");var imgList = document.querySelector("#imgs");box.ondragover = function(event){event.preventDefault();};box.ondrop = function(event){event.preventDefault();// 获取外部拖拽的文件var fileList = event.dataTransfer.files;for( var i = 0;i < fileList.length; i++){if(fileList[i].type.indexOf("image")>-1){var fd = new  FileReader();//读取文件对象fd.readAsDataURL(fileList[i]);fd.onload = function(){//创建一个图片节点var img = document.createElement("img");img.src = this.result;img.width = "200";img.height = "200";imgs.appendChild(img);}}}};</script>

二、canvas(画布)

2.1 什么是canvas?

  • canvas是HTML5提供的一种新标签
  • canvas是一个矩形区域的画布,可以用JavaScript在上面绘画
  • canvas 标签使用 JavaScript 在网页上绘制图像,本身不具备绘图功能
  • canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法
  • HTML5之前的web页面只能用一些固定样式的标签:比如p、div、h1等,但有了canvas Web页面可以可以丰富多彩

2.2 canvas 的应用领域

  • 游戏。canvas在基于Web的图像显示方面比Flash更加立体、更加精巧,canvas游戏在流畅度和跨平台方面更牛
  • 可视化数据.数据图表,比如:百度的echart
  • banner广告:Flash曾经辉煌的时代,智能手机还未曾出现。现在以及未来的智能机时代,HTML5技术能够在banner广告上发挥巨大作用,用Canvas实现动态的广告效果再合适不过

2.3 canvas 绘图基础

2.3.1 canvas 标签的属性和语法

  • 标签名canvas,需要进行闭合。就是一普通的html标签
  • 可以设置width和height属性,但是属性值单位必须是px,否则忽略
  • width和hegiht:默认300*150像素
  • 注意:1.不要用CSS控制它的宽和高,会走出图片拉伸

2.重新设置canvas标签的宽高属性会让画布擦除所有的内容

3.可以给canvas画布设置背景色

2.4 canvas绘图上下文 (context)

  • 上下文:上知天文,下知地理。是所有的绘制操作api的入口或者集合。
  • Canvas自身无法绘制任何内容。Canvas的绘图是使用JavaScript操作的
  • Context对象就是JavaScript操作Canvas的接口
  • 使用[CanvasElement].getContext(‘2d’)来获取2D绘图上下文
    <canvas></canvas><script>var cas = document.querySelector("canvas");var ctx = cas.getContext("2d");</script>

2.5 基本的绘制路径

2.5.1 canvas 坐标系

canvas 的坐标系从最左上角开始(0,0) .X 向右增大,Y向下增大

2.5.2 设置绘制起点(moveTo)

  • 语法:ctx.moveTo(x,y)
  • 解释:设置上下文绘制路径的起点。相当于移动画笔到某个位置
  • 参数:x,y都是相对于canvas盒子的最左上角
  • 注意:1. 绘制线段钱必须先设置起点,不然绘制无效

2.如果不设置起点,就会使用lineTo 的坐标当做moveTo

2.5.3 绘制直线(lineTo)

  • 语法:ctx.lineTo(x,y)
  • 解释:从x,y的位置绘制一条直线到起点或者上一个线头点
  • x,y 线头点坐标

绘制第一条直线:

        <canvas width="200" height="200"></canvas><script type="text/javascript">//获取canvas 节点var cas = document.querySelector("canvas");cas.style.border = "1px solid red";// 获取canvas 的上下文信息,首先获取一个对象,然后在这个对象里面画画var  cts = cas.getContext("2d");//起点位置cts.moveTo(50, 50);// 终点位置cts.lineTo(100,100);// 开始描边cts.stroke();</script>

2.5.4 路径的开始与闭合

  • 开始路径:ctx.beginPath();
  • 闭合路径:ctx.closePath();
  • 解释:如果复杂路径绘制,必须使用路径开始和结束,闭合路径会自动把最后的线头和开始的线头连在一起
  • beginPath: 核心的作用是将不同绘制的形状进行隔离,每次执行此方法,表示重新绘制一个路径,跟之前绘制的墨迹可以进行分开样式设置和管理

画一个三角形:

       <canvas width="200" height="200"></canvas><script type="text/javascript">//获取canvas 节点var cas = document.querySelector("canvas");cas.style.border = "1px solid red";// 获取canvas 的上下文信息,首先获取一个对象,然后在这个对象里面画画var  cts = cas.getContext("2d");cts.beginPath();//起点位置cts.moveTo(50, 50);// 终点位置cts.lineTo(100,100);cts.lineTo(200,100);cts.lineTo(50,50);// 开始描边cts.stroke();cts.closePath();</script>

2.5.5 描边(stroke)

  • 语法:ctx.stroke();
  • 解释:根据路径绘制线。路径只是草稿,真正绘制线必须执行stroke
  • canvas 绘制的基本步骤
  1. 获得上下文 →canvasElem.getContext('2d');
  2. 开始路径规划 →ctx.beginPath()
  3. 移动起始点 → ctx.moveTo(x, y)
  4. 绘制线(矩形、圆形、图片...) → ctx.lineTo(x, y)
  5. 闭合路径 → ctx.closePath();
  6. 绘制描边 → ctx.stroke();

2.5.6 绘制表格

    <canvas width="600" height="600"></canvas><script>var cas = document.querySelector("canvas");cas.style.border = "1px solid red";// 获取上下文信息var ctx = cas.getContext("2d");var rectH = 10;var rectW = 10;ctx.lineWidth = 0.3;// 绘制水平线for(var i= 0;i < cas.height/rectH; i++){ctx.moveTo(0,i*rectH);ctx.lineTo(cas.width, i*rectH);}// 绘制垂直线for(var i = 0; i < cas.width/rectW; i++){ctx.moveTo(i*rectH,0);ctx.lineTo(i*rectH,cas.width);}ctx.stroke();</script>

2.5.7 填充(fill)

  • 语法:ctx.fill();
  • 解释:填充是将闭合路径的内容填充具体的颜色。默认黑色

eg:

    <canvas width="600" height="600"></canvas><script type="text/javascript">// 获取节点对象var cas = document.querySelector("canvas");// 获取上下文var cat = cas.getContext("2d");// 填充颜色为红色cat.fillStyle = "red";// 开始 绘制cat.beginPath();// 绘制描边的颜色为蓝色cat.strokeStyle = "blue";// 设置起点的位置cat.moveTo(50,50);// 设置第二个点的位置cat.lineTo(200,200);// 设置第三个点的位置cat.lineTo(50,200);// 定义填充,如果不写,会出错cat.fill();cat.closePath();// 结束绘制cat.stroke();</script>

2.5.8 快速创建矩形(rect() 方法)

  • 语法:ctx.rect(x, y, width, height)
  • 解释:x, y是矩形左上角坐标, width和height都是以像素计
  • rect方法只是规划了矩形的路径,并没有填充和描边
     <canvas width="200" height="200"></canvas><script>var cas = document.querySelector("canvas");var cat = cas.getContext("2d");cat.rect(50, 50, 100,100);cat.fillStyle = "pink";cat.fill();cat.strokeStyle = "yellow";cat.stroke();</script>

2.5.9 快速创建描边矩形和填充矩形

  • 语法: ctx.strokeRect(x, y, width, height)

注意此方法绘制完路径后立即进行stroke绘制

  • 语法2:ctx.fillRect(x, y, width, height)

此方法执行完成后。立即对当前矩形进行fill填充
eg:

     <canvas width="200" height="200"></canvas><script>var cas = document.querySelector("canvas");var cat = cas.getContext("2d");cat.strokeRect(50, 50, 100, 100);cat.stroke();</script>

eg:

      <canvas width="200" height="200"></canvas><script>var cas = document.querySelector("canvas");var cat = cas.getContext("2d");cat.fillRect(50, 50, 100, 100);cat.stroke();</script>

2.5.10 清除矩形(clearRect())

  • 语法:ctx.clearRect(x,y,w,h);
  • 解释:清除某个矩形内的绘制的内容,相当于橡皮擦

2.6 绘制圆形

2.6.1 概述:arc() 方法创建弧/曲线(用于创建圆或部分圆)

  • 语法:ctx.arc(x, y, r, sAngle, eAngle, counterclockwise)
  • 解释:x,y 圆心坐标,r 半径大小,sAngle:绘制开始的角度。圆心到最右边点为0度,顺时针方向弧度增大。eAngle:结束的角度,注意是弧度( π)。counterclockwise:是否是逆时针,true是逆时针,false:顺时针
  • 弧度和角度的转换公式: rad = deg*Math.PI/180

eg:

     <canvas width="200" height="200"></canvas><script>var cas = document.querySelector("canvas");cas.style.border = "1px solid red";var cat = cas.getContext("2d");cat.arc(100, 100, 100, 0, 2*Math.PI,false);cat.fillStyle = "skyblue";cat.fill();cat.stroke();</script>

绘制扇形占比

eg:

     <canvas width="200" height="200"></canvas><script>var cas = document.querySelector("canvas");var cat =cas.getContext("2d");cat.beginPath();cat.fillStyle = "pink";cat.moveTo(100,100);cat.arc(100,100,100,0,70*Math.PI/180,true);cat.closePath();cat.fill();cat.stroke();cat.beginPath();cat.moveTo(100,100);cat.arc(100,100,100,0,200*Math.PI/180,false);cat.fillStyle = "red";cat.closePath();cat.fill();cat.stroke();cat.beginPath();cat.moveTo(100,100);cat.arc(100,100,100,0,90*Math.PI/180,false);cat.fillStyle = "blue";cat.closePath();cat.fill();cat.stroke();</script>

2.7 绘制图片

2.7.1 用JS创建 img 对象

  1. var img = document.getElementById("imgId")
  2. var img = new Image();//这个就是 img标签的dom对象

img.src = "imgs/arc.gif";

img.alt = "文本信息";
img.onload = function() {//图片加载完成后,执行此方法

2.7.2 基本绘制图片的方式

  • 语法:context.drawImage(img,x,y);
  • 解释:x,y绘制的是图片左上角的坐标,img 是绘制图片的 dom 对象

eg:

    <canvas width="200" height="200"></canvas><script>// 创建对象var cas = document.querySelector("canvas");// 创建上下文var cat = cas.getContext("2d");// 创建图片对象var img = new Image();img.src = "images/唯美1.jpg";img.onload = function(){cat.drawImage(img, 50,50);}</script>

2.7.3 在画布上绘制图像,并规定图像的宽度和高度

  • 语法:context.drawImage(img,x,y,width,height)
  • 解释:width绘制图片的宽度,height 绘制图片的高度
  • 注意:如果指定宽高,最好成比例,不然图片会被拉伸
  • 等比公式:设置高 = 原高度 * 设置宽/ 原宽度

eg:

    <canvas width="600" height="600"></canvas><script>var cas = document.querySelector("canvas");var cat = cas.getContext("2d");var img = new Image();img.src = "images/唯美1.jpg";img.onload = function(){// 图片的原始的宽高为 500 * 313cat.drawImage(img, 0,0,400,313*400/500);}</script>

### 2.7.4 图片裁剪,并在画布上定位被裁剪的部分

  • 语法:context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);
  • 参数说明:sx,sy裁剪的左上角坐标,swidth:裁剪图片的宽度,sheight:裁剪的高度。

eg:

     <canvas width="600" height="600"></canvas><script>var cas = document.querySelector("canvas");var cat = cas.getContext("2d");var img = new Image();img.src = "images/唯美1.jpg";img.onload = function(){cat.drawImage(img, 20,20,200,200,0,0,100,100);}</script>

三、音视频

3.1 使用标签

  • audio

音频标签 , 使用 controls = "" 将控件展示出来

  • video

视频标签,使用 controls = "" 将控件展示出来

  • source

       <source src=”sr1”></srouce>使用source标签可以设置多个源        

3.2 音视频元素( 用来控制音视频 )

3.2.1 标签属性

  • controls:显示或隐藏用户控制界面
  • autoplay:媒体是否自动播放
  • loop:媒体是否循环播放

eg:

    <audio src="yinping/johann_sebastian_bach_air.mp3" autoloop loop controls></audio><script>var auo = document.querySelector("audio");window.onload = function(){setInterval(function(){auo.play();},1000);}


注意:autoplay 属性在谷歌浏览器中不支持,所以小编在这里用了一个setInterval方法,这个属性在火狐浏览器中是可以实现的。

3.2.2 音视频在js中DOM的属性和方法

  • currentTime : 目前播放的时间点
  • duration:媒体总时间(只读)
  • volume:0.0-1.0的音量相对值
  • muted:是否静音
  • paused:媒体是否暂停(只读)
  • ended:媒体是否播放完毕(只读)
  • error:媒体发生错误的时候,返回错误代码(只读)
  • currentSrc:以字符串的形式返回媒体地址(只读)
  • play:媒体播放
  • pause:媒体暂停
  • load:重新加载媒体

eg:

    <video id="v1" src="res/fun.mp4" ></video><input type="button" value="我要暂停" id="btn1"><input type="button" value="我要播放" id="btn2"><input type="button" value="我要切换视频" id="btn3"><script type="text/javascript">window.onload = function() {var v1 = document.getElementById("v1");var btn1 = document.getElementById("btn1");var btn2 = document.getElementById("btn2");btn2.addEventListener('click', function() {v1.play();})btn1.onclick = function() {v1.pause();}btn3.onclick = function() {v1.src = "res/1.mp4";v1.play();}}</script>

3.2.3 事件绑定

  • 补充知识点:addEventListener(type, fn, false)

false,表示不使用捕获(useCapture)

#### 3.2.3.1 DOM事件的三个阶段

  • 捕获阶段:先由文档的根节点document往事件触发对象,从外向内捕获事件对象
  • 目标阶段:到达目标事件位置(事发地),触发事件
  • 冒泡阶段:再从目标事件位置往文档的根节点方向回溯,从内向外冒泡事件对象
  • 注意: 当事件触发在目标阶段时,会根据事件注册的先后顺序执行,在其他两个阶段注册顺序不影响事件执行顺序。也就是说如果该处既注册了冒泡事件,也注册了捕获事件,则按照注册顺序执行。

3.2.4 音视频绑定事件

    <video controls="" src="res/1.mp4" id="v1"></video><script type="text/javascript">window.onload = function() {// 获取到相应的DOM节点var v1 = document.getElementById("v1");// 给dom节点绑定事件v1.addEventListener("ended", function() {alert("请选择下一个视频");})}</script>

3.2.5 音视频的事件绑定

loadstart 开始加载
progress 运行的进度
suspend
emptied
stalled
play 播放
pause 暂停
loadedmetadata
loadeddata
waiting 等待
playing
canplay
canplaythrough
seeking
seeked
timeupdate
ended 结束
ratechange
durationchange
Volumechange

小编寄语:单词有点多,我这里不一一翻译了,用的时候搜一下。

四、总结

虽然多,但是很好理解,多记记单词而已,相信自己!

画布、拖放事件、音视频相关推荐

  1. Web前端开发笔记——第二章 HTML语言 第十节 画布标签、音视频标签

    目录 一.画布标签 二.音视频标签 (一)音频标签 (二)视频标签 (三)资源标签 结语 一.画布标签 <canvas> </canvas> 画布标签用于图形.字符等的绘制,它 ...

  2. 浏览器中的音视频知识总结(工作中需要和音视频打交道必看!)

    大厂技术  高级前端  Node进阶 点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群 视频是什么 视频,其实就是一系列连续播放的图片,如果1s钟播放24张图片,那么人眼看到的就不 ...

  3. 网易云信消息抄送php,实时音视频事件-消息抄送服务-进阶功能-音视频通话2.0-网易云信开发文档...

    实时音视频相关事件 事件类型 1 房间启动(创建房间) 创建房间.音视频通话正式开始时会触发该抄送. 注意:房间启动事件的消息抄送涉及资源计费,若有需要,请联系云信商务经理查看计费策略并协助开通此抄送 ...

  4. html5音频剪辑,一种基于HTML5Canvas画布音视频分段剪辑方法与流程

    技术特征: 1.一种基于html5canvas画布音视频分段剪辑方法,其特征在于:包括如下步骤: 步骤一:首先使用者预先获取源音视频文件,然后使用者对音视频文件分段剪辑时,进入音视频文件分段剪辑主单元 ...

  5. 音视频入门之如何绘制一张图片

    Android 的音视频入门学习,首先了解一下绘制图片.在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View作绘制图片.下 ...

  6. 音视频行业不可或缺的功能-云端录制

    前言 随着音视频行业的迅速发展,无论是在线直播.线上教育.还是视频会议都已经进入到了大家的日常生活中.因为以上这些场景都是实时直播类型的,没有办法回看之前的直播内容,所以录制回放功能成为了各个厂商不可 ...

  7. JS基于页面实现音视频的录制(一)

    前言 音频与视频信息的捕捉一直是Web开发中的一个难点.许多年来,我们一直依赖浏览器插件来实现这个需求,随着HTML 5推出,这种情况有所改变.因为,HTML5提供了许多可以访问硬件设备的API,例如 ...

  8. android绘制黑色画面,Android音视频技术入门之绘制一张图片

    Android 的音视频入门学习,首先了解一下绘制图片.在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 View作绘制图片.下 ...

  9. 5G时代音视频开发王器:WebRTC

    新书速递 导读:WebRTC是一个支持在网页浏览器中进行实时语音对话或视频对话的解决方案.于2011年开源,并在Google.Mozilla.Opera的支持下被纳入万维网联盟的W3C推荐标准. 在W ...

最新文章

  1. 如何在Android Studio中查看方法信息?
  2. ubuntu在系统启动logo过后无法进入桌面的处理方法
  3. 类似于HttpModule的注入方式的事件机制示例
  4. 设计一个算法找一条从迷宫入口到出口的最短路径。_我花了一夜用数据结构给女朋友写个H5走迷宫游戏...
  5. 2018百度之星度度熊学队列
  6. OpenSql的优化原则
  7. 红帽7 -本地yum配置
  8. 运用vs code常见错误_CBA:浙江广厦控股 VS 广东东莞大益 热门篮球竞猜分析
  9. Linux根据端口号或者关键字查询进程,重启Tomcat服务脚本优缺点说明
  10. Windows 7无线路由器解决
  11. 下周出发去印度:直觉之旅,发现自己
  12. 【解决方案】Collecting package metadata (current_repodata.json): failed
  13. javascript笔记 狂神说
  14. windows10桌面_如何让Windows 10系统桌面变得更好看?
  15. 从今以后我一个人唱悲伤情歌:伤感的QQ空间日志
  16. ABclonal再添一员“蛋白~DNA互作研究”大将—CUTTag
  17. 蚂蚁借呗的利息计算方式?
  18. 外卖骑手困在算法,美团困在了利益中
  19. 双向搜索(bfs,dfs)
  20. 计算机程序无法启动,应用程序无法正常启动,教您电脑应用程序无法正常启动0xc000007b怎么解决...

热门文章

  1. php怎么设置文字环绕图片,使用CSS实现文字环绕图片效果
  2. kotlin ..与 until 区别
  3. 程序员技术练级攻略 2011年7月18日
  4. appium 定位方式总结
  5. vue+echarts实现摩天轮大图效果
  6. 如何打造高精度的写实类游戏角色
  7. Noip2011 dayt3 Mayan游戏
  8. 中国汽车企业核心技术优势明显,将在全球市场击败特斯拉
  9. 勤于奋:白酒喝点提神
  10. php 表格后台排序,element表格的后台排序