一、画布(canvas)的使用
1. 绘图:画布(canvas)的使用
2. 画布:页面中用于绘制图形的特殊区域,开发人员可以在这个区域内进行自定义图形的绘制
(1)创建画布的方法:
<canvas id="画布的标识" width="宽度" height="高度"> 您的浏览器不支持画布 </canvas>
复制
(2)获取画布:getElementById(‘canvas的id’)
(3)获取画笔:使用context对象,语法格式是:
let context = canvas.getContext('2d') //context代表的是一支笔
复制
(4)绘制直线:直线的起始点、直线的终点、描边(设置线条的颜色)
<script> let canvas = document.getElementById('canvas') //获取画布 let context = canvas.getContext('2d') //获取画布 context.moveTo(100,100) //确定起始点为(100,100) ,即将画笔移动到该点上。moveTo方法用来确定起始点 context.lineTo(200,200) //确定线条的另一个端点,即终点(200,200)。 context.stroke() //进行描边,让线条可见(默认的画笔颜色为黑色) </script>
复制
(5)设置描边的颜色:context.strokeStyle = ‘red’ //设置描边的颜色。颜色值可以是十六进制、颜色名
(6)设置端点的形状:使用 lineCap=“属性值” 来设置端点的形状,取值有三种
- butt:默认值,无端点,显示的是线条的方形边缘
- round:圆形端点
- square:方形端点
(7)路径的重置:beginPath()
(8)闭合路径:closePath()
(9)设置线宽:lineWidth = ‘数值’
(10)填充路径:fill()
(11)设置填充颜色:fillStyle = ‘颜色’
(12)画弧线或画圆:arc(x,y,r,开始角,结束角,方向)
- x,y:确定圆心的坐标
- r:表示圆形或弧线的半径
- 开始角:表示弧点的起始位置,通常用Math.PI表示(可以理解为180度)
- 结束角:表示弧点的结束位置
- 方向:表示绘图的方向(逆时针、顺时针)。默认值为true,表示逆时针,默认值为false,表示顺时针
<body> <canvas id="huabu" width="1000" height="1000"> 您的浏览器不支持画布 </canvas> <script> //开启画布专属提示 /** @type {HTMLCanvasElement} */ let bu = document.getElementById('huabu')//获取画布 let pen = huabu.getContext('2d')//获取画笔 pen.lineWidth = 10 pen.lineCap = 'round' pen.moveTo(100,100)//确定起始点为(100,100)点,将画笔移动到(100,100)点。moveTo方法用来确定起始点 pen.lineTo(100,200)//确定线条的另一个端点为(200,200)点,即终点。lineTo方法用来确定终点 pen.lineTo(200,200) pen.lineTo(100,100) pen.strokeStyle = 'green' pen.fillStyle= "blue"; pen.stroke() pen.closePath() pen.strokeStyle = 'red'//设置描边的颜色值,可以是16进制,也可以是普通的颜色名字 pen.fillStyle = "blue" pen.fill() pen.stroke()//进行描边,让线条可见(默认的画笔颜色为黑色) pen.arc(150, 150, 100, 0, Math.PI*2, false); pen.fill() pen.arc(400,100,30,0,Math.PI*2,false) pen.lineWidth = '3' pen.stroke() </script> </body>
复制
(13)画矩形:rect(x,y,width,height),x和y表示矩形左上角的坐标
(14)填充矩形:fillRect(x,y,width,height),x和y表示矩形左上角的坐标
(15)绘制文本:context.fillText(text,x,y),text表示要绘制的文本,x和y表示坐标位置
(16)平移当前的坐标系:context.translate(x,y)
(17)设置坐标系的旋转角度:context.rotate(deg)
<body> <canvas id="canvas" width="1000" height="1000"> 您的浏览器不支持画布 </canvas> <script> let ctx = document.getElementById ('canvas').getContext('2d') //矩形的框 ctx.translate(-100, 0)//平移 ctx.rotate(0.02*Math.PI) ctx.rect(120, 120, 180, 100) ctx.strokeStyle = 'red' ctx.stroke() //矩形的块 ctx.fillStyle = 'green' //ctx.rotate(10) ctx.fillRect(230, 230, 180, 100) //绘制文本 //ctx.rotate(10) ctx.fillStyle = 'skyBlue' ctx.fillText('白鹿原', 300, 100) </script> </body>
复制
(18)绘制图像:fillImage(image,x,y)
练习:笑脸
<body> <canvas id="xiaolian" width="1000" height="1000"> 笑脸 </canvas> <script> let huabu = document.getElementById('xiaolian') let pen = xiaolian.getContext('2d') //笑脸 pen.beginPath() pen.arc(100, 100, 80, 0, Math.PI * 2, false) pen.closePath() pen.fillStyle = 'green' pen.fill() //左眼 pen.beginPath() pen.arc(70, 80, 20, 0, Math.PI, true) // pen.closePath() pen.lineWidth = 2 pen.strokeStyle = 'white' pen.stroke() //左眼珠 pen.beginPath() pen.arc(70,80,10,0,Math.PI*2) pen.fillStyle = 'black' pen.fill() //右眼 pen.beginPath() pen.arc(130,80,20,0,Math.PI,true) pen.lineWidth = 2 pen.strokeStyle ='white' pen.stroke() //右眼珠 pen.beginPath() pen.arc(130,80,10,0,Math.PI*2) pen.fillStyle = 'black' pen.fill() //嘴巴 pen.beginPath() pen.arc(100,110,50,Math.PI/6,Math.PI/1.2,false) pen.lineWidth = 2 pen.strokeStyle ='white' pen.stroke() </script> </body>
复制
练习:绘制验证码
(1)随机颜色:随机生成 r、g、b 值
a、定义生成随机数函数:
function rn(min,max){ //随机数函数 return parseInt(Math.random()*(max-min)+min); }
复制
b、随机生成 r、g、b颜色值
function rc(min,max){ //随机颜色的函数 var r=rn(min,max); var g=rn(min,max); var b=rn(min,max); return `rgb(${r},${g},${b})`; }
复制
c、设置绘制验证码的区域:矩形、浅色背景
var w=120; var h=40; var ctx=document.getElementById('canvas').getContext("2d"); ctx.fillStyle=rc(180,230); ctx.fillRect(0,0,w,h); //在0,0的位置填充一个120*40的矩形
复制
(2)随机文本:随机生成下标,通过下标在字符串或数组中拿到对应的字符
var pool="ABCDEFGHIJKLIMNOPQRSTUVWSYZ1234567890"; for(var i=0;i<4;i++){ //生成4个随机的字符 var c=pool[rn(0,pool.length)];//随机的字符 var fs=rn(18,40);//字体的大小 var deg=rn(-30,30);//字体的旋转角度 ctx.font=fs+'px Simhei'; //设置字号、字体 ctx.textBaseline="top"; //绘制文本的基线:以上边线为界 ctx.fillStyle=rc(80,150); //设置填充颜色 ctx.save(); //保存前面对画笔的设置 ctx.translate(30*i+15,15); //平移坐标系 ctx.rotate(deg*Math.PI/180); //设置偏转角度 ctx.fillText(c,-15+5,-15); //绘制文本 ctx.restore(); //清除前面画笔的设置,画笔恢复到初始状态 }
复制
(3)随机画线条(干扰线):端点坐标随机生成、线条的角度随机设置
for(var i=0;i<5;i++){ ctx.beginPath(); //重置路径 ctx.moveTo(rn(0,w),rn(0,h)); //设置线条的起点 ctx.lineTo(rn(0,w),rn(0,h)); //设置线条的终点 ctx.strokeStyle=rc(180,230); //设置线条的随机颜色 ctx.closePath(); //关闭路径 ctx.stroke(); //描边 }
复制
(4)随机画点:圆心坐标随机
for(var i=0;i<40;i++){ ctx.beginPath(); ctx.arc(rn(0,w),rn(0,h),1,0,2*Math.PI); //随机确定圆心坐标 ctx.closePath(); ctx.fillStyle=rc(150,200); //随机的填充色 ctx.fill(); //进行填充 }
复制
练习:在文本框中输入验证码,判断是否正确。设置文本框的样式和验证码在一行中
<head> <script src="../12-3周作业/movie/movie_client/js/jquery-3.4.1.js"></script> </head> <style> input{ height: 40px; margin-top: 40px; } canvas{ vertical-align: middle; margin-bottom: -110px; } button{ margin-left: 200px; } </style> <body> <div> 请输入验证码:<input type="text" id="input"> <canvas id="canvas"> 您的浏览器不支持画布 </canvas> <br><br> <button type="button" id="btn">验证</button> </div> <script> $(function(){ var arr = []; newchar(arr); $('canvas').on('click',function(){ newchar(arr); }) $("#btn").on('click',function(){ var val = $("#input").val().toLowerCase(); var num = arr.join(""); if(val==''){ alert('请输入验证码!'); }else if(val == num){ alert('提交成功!'); $("#input").val(''); }else{ alert('验证码错误!请重新输入!'); $("#input").val(''); } }) }) // 1.随机数 function random(min,max){ return parseInt(Math.random()*(max-min)+min) } // 2.随机颜色 function color(min,max){ var r = random(min,max) var g = random(min,max) var b = random(min,max) return `rgb(${r},${g},${b})` } // 3.绘制验证码区域 // 3.1设置宽高 var width = 120 var height = 40 // 3.2获取画笔 let context = document.getElementById('canvas').getContext('2d') // 3.3设置填充颜色,浅色 context.fillStyle = color(180,230) // 3.4设置区域形状大小 context.fillRect(0,0,width,height) // 4.随机字符串 function newchar(arr){ var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' for (let i = 0; i < 4; i++) { //生成4个随机的字符 var char = str[random(0,str.length)] //随机的字符 var font_size = random(18,40) //字体大小 var deg = random(-30,30) //旋转角度 context.font = font_size + 'px Simhei' //设置字号、字体 context.textBaseline = 'top' //设置文本基线:以上边框为界 context.fillStyle = color(80,150) //设置填充颜色 context.save() //保存前面对画笔的设置 context.translate(30*i+15,15) //平移坐标系 context.rotate(deg*Math.PI/180) //绘制偏转角度 context.fillText(char,-15+5,-15) //绘制文本 context.restore() //清除前面画笔的设置,画笔恢复到初始状态 arr[i] = char.toLowerCase() } } // 5.随机线条 for (let i = 0; i < 5; i++) { context.beginPath() //重置路径 context.moveTo(random(0,width),random(0,height)) //设置线条的起点 context.lineTo(random(0,width),random(0,height)) //设置线条的终点 context.strokeStyle = color(180,230) //设置线条的随机颜色 context.closePath() //关闭路径 context.stroke() //描边 } // 6.随机产生的干扰小点 for (let i = 0; i < 40; i++) { context.beginPath() context.arc(random(0,width),random(0,height),1,0,2*Math.PI) //随机确定圆心坐标 context.closePath() context.fillStyle = color(150,200) //随机填充颜色 context.fill() //进行填充 } </script> </body>
复制
二、元素的拖拽 (Drag和 Drop)
元素的拖拽是H5的一个新的特性,是在页面中通过鼠标将元素从一个位置拖放到另一个位置。在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放。
1. 实现过程:
(1)设置元素为可拖放:为了使元素可拖动,设置元素的draggable属性为true
<img src='' draggable='true'>
复制
(2)拖动什么:给document注册一个ondragstart事件
ondragstart事件调用了一个函数,它规定了被拖动的数据
a.将被拖放的对象保存起来(即让document记忆下来)
b.在拖放的过程中可以设置被拖放对象的透明度
(3)放到何处:给document注册一个ondragover事件
ondragover 事件规定在何处放置被拖动的数据。默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式。这要通过调用 ondragover 事件的 event,preventDefault) 方法(即: 浏览器会默认阻ondrop事件,所以必须在ondragover事件中阻止默认行为)
(4)当将被拖放的对象放到指定位置后,拖放的动作完成(拖放结束):给document注册一个ondrop事件
2. 拖拽元素支持的事件
- ondrag: 应用于拖拽元素,在整个拖拽过程中都会调用
- ondragstart: 应用于拖拽元素,当拖拽开始时调用
- ondragleave: 应用于拖搜元素,当鼠标离开拖拽元素时调用
- ondragend: 应用于拖拽元素,当拖拽结束时调用
3. 目标元素支持的事件
- ondragenter: 应用于目标元素,当拖拽元素进入时调用
- ondragover: 应用于目标元素,当停留在目标元素上方时调用
- ondrop: 应用于目标元素,当在目标元素上方松开鼠标时调用
- ondragleave: 应用于目标元素,当鼠标离开目标元素时调用
4. 基本思想
(1)在拖放开始时在document中保存被拖放元素的id
(2)拖放结束时通过id找到被拖放的元素追加到文档流中
<style> * { padding: 0; margin: 0; } .div1, .div2, .div3 { margin: 0 20px; float: left; width: 200px; height: 200px; border: 1px solid #ccc; } div, p { display: flex; flex-direction: column; align-items: center; } .p1 { width: 50px; background-color: darksalmon; margin: 5px 0; } .p2 { width: 70px; background-color: gold; margin: 5px 0; } .p3 { width: 90px; background-color: yellowgreen; margin: 5px 0; } .p4 { width: 100px; background-color: seagreen; margin: 5px 0; } .p5 { width: 150px; background-color: blueviolet; margin: 5px 0; } .p6 { width: 170px; background-color: firebrick; margin: 5px 0; } </style> <body> <div id="div1" class="div1"> <p id="pe3" class="p3" draggable="true">3</p> <p id="pe2" class="p2" draggable="true">2</p> <p id="pe5" class="p5" draggable="true">5</p> <p id="pe1" class="p1" draggable="true">1</p> <p id="pe4" class="p4" draggable="true">4</p> <p id="pe6" class="p6" draggable="true">6</p> <a href="http://www.baidu.com" id="a1">百度一下</a> </div> <div id="div2" class="div2"></div> <div id="div3" class="div3"></div> <script> document.ondragstart = function (e) { e.dataTransfer.setData('text', e.target.id)//将被拖放的元素保存起来 e.target.style.opacity = 0.2//设置被拖放元素的透明度 } document.ondragend = function (e) { e.target.style.opacity = 1//拖放结束后,恢复拖放对象的透明度 } document.ondragover = function (e) {//关闭浏览器默认的行为:默认情况下,浏览器不允许拖放 e.preventDefault() } document.ondrop = function (e) { let id = e.dataTransfer.getData('text') e.target.appendChild(document.getElementById(id)) } </script> </body>
复制