HTML5基础

HTML5基础

了解HTML5

HTML5属于上一代HTML的新迭代语言,设计HTML5最主要的目的是为了在移动设备上支持多媒体

  • 新特性:
    • 取消了过时的显示效果标记 <font></font><center></center> ...
    • 新语义标签的引入
    • 新表单元素引入
    • canvas标签(图形设计)
    • 本地数据库(本地存储)
    • 一些API
  • 好处:
    • 跨平台

      例如:比如你开发了一款HTML5的游戏,你可以很轻易地移植到UC的开放平台、Opera的游戏中心、Facebook应用平台,甚至可以通过封装的技术发放到App Store或Google Play上,所以它的跨平台性非常强大,这也是大多数人对HTML5有兴趣的主要原因。

  • 缺点:
    • pc端浏览器支持不是特别友好,造成用户体验不佳

新语义标签

网页布局结构标签及兼容处理

  • 新标签

    	<header></header>
    	<footer></footer>
    	<article></article>
    	<aside></aside>
    	<nav></nav>
    	<section></section>
    
  • 解决方案

    • 第一种解决方案:
    	<script type="text/javascript">
    		document.createElement("nav");
    	</script>
    
    • 第二种解决方案:通过js插件
    	<script type="text/javascript" src="code/html5shiv.min.js"></script>
    
    • 第三种解决方案:终极解决方案
    	<!--[if lte IE 8]>
    		<script type="text/javascript" src="code/html5shiv.min.js"></script>
    	<![endif]-->
    

多媒体标签及属性介绍

  • <video></video> 视频标签
    • 属性:controls -> 显示控制栏
    • 属性:autoplay -> 自动播放
    • 属性:loop -> 设置循环播放
  • <audio></audio> 音频标签
    • 属性:controls -> 显示控制栏
    • 属性:autoplay -> 自动播放
    • 属性:loop -> 设置循环播放
  • video标签支持的格式
  • 多媒体标签在网页中的兼容效果方式
	<video>
      <source src="code/trailer.mp4">
      <source src="code/trailer.ogg">
      <source src="code/trailer.WebM">
	</video>

新表单元素及属性签

智能表单控件

	<input  type="email">	 输入合法的邮箱地址
	<input  type="search">	用户输入内容显示取消图标
	<input  type="url">	   输入合法的网址
	<input  type="tel">	   输入合法的电话号码
	<input  type="number">	只能输入数字
	<input  type="range">	 滑块
	<input  type="color">	 拾色器
	<input  type="date">	  显示日期
	<input  type="month">	 显示月份
	<input  type="week">	  显示第几周
	<input  type="time">	  显示时间
  • 案例:智能表单控件
	<fieldset>  
    <legend>案例:智能表单控件</legend>  
    <form>  
    	<table>
    		<tr><td>Email:</td><td><input type="email"></td></tr>
    		<tr><td>搜索:</td><td><input type="search"></td></tr>
    		<tr><td>URL:</td><td><input type="url"></td></tr>
    		<tr><td>电话号码:</td><td><input type="tel"></td></tr>
    		<tr><td>数字类型:</td><td><input type="number" min="0" max="10" step="2"></td></tr>
    		<tr><td>范围类型:</td><td><input type="range" min="0" max="10" step="2" value="0"></td></tr>
    		<tr><td>颜色类型:</td><td><input type="color"></td></tr>
    		<tr><td>日期类型:</td><td><input type="date"></td></tr>
    		<tr><td>月份类型:</td><td><input type="month"></td></tr>
		    <tr><td>星期类型:</td><td><input type="week"></td></tr>
    		<tr><td>时间类型:</td><td><input type="time"></td></tr>
    		<tr><td></td><td><input type="submit" value="提交按钮"></td></tr>
     </table>
   </form>
 </fieldset>

表单属性

  • form表单

    • 表单元素编组 -> fieldset元素
    • 表单元素标题 -> legend元素
    • 表单关联元素 -> label元素
    • 自定义选项元素 -> datalist元素
  • 表单属性

    • autocomplete=on | off -> 输入提示自动完成
    • novalidate=true | false -> 提交时是否关闭校验
    • autofocus -> 自动获取焦点
    • form -> 表单域外提交
    • list -> 关联datalist元素
    • multiple -> 实现多选效果
    • placeholder -> 占位符 (提示信息)
    • required -> 是否为必填项
  • 案例:禁用整组表单

<section style='width: 260px;'>  
	<form method="post" id="outField" novalidate>
		<fieldset disabled>
			<legend>案例:禁用整组表单</legend>
			<input type="search" autocomplete="on" placeholder="请输入内容" autofocus required>
			<button type="button">搜索</button>
      <br>
      <label for="male">Male</label>
      <input type="radio" name="sex" id="male">
      <label for="female">Female</label>
      <input type="radio" name="sex" id="female">
      <br>
      <input type="text" list="data" placeholder="请选择区域" multiple>
      <datalist id="data">
      	<option value="江苏省">南京市</option>
        <option value="浙江省">杭州市</option>
        <option value="安徽省">合肥市</option>
        <option value="河南省">郑州市</option>
        <option value="四川省">成都市</option>
      </datalist>
      <br>
    </fieldset>
  </form>
  <div style="margin: 0 auto;width: 100px;">
  	<br>
    <input type='reset' form="outField" value="重置">
    <input type='submit'  form="outField" value="提交">
  </div>
</section>

HTMl5中的API

获取页面元素及类名操作

	document.querySelector("选择器");
		备注:
			选择器: 可以是css中的任意一种选择器
					通过该选择器只能选中第一个元素。

	document.querySelectorAll("选择器");
	备注:
		与document.querySelector区别:
			querySelectorAll 可以选中所有符合选择器规则的元素,返回的是一个列表;
			querySelector返回的只是单独的一个元素

	Dom.classList.add("类名"): 给当前dom元素添加类样式

	Dom.classList.remove("类名"); 给当前dom元素移除类样式

	Dom.classList.contains("类名"); 检测是否包含类样式

	Dom.classList.toggle("active");  切换类样式(有就删除,没有就添加)

data-自定义属性

	data-自定义属性名 -> 在标签中,以data-自定义名称

	1. 获取自定义属性   Dom.dataset   返回的是一个对象
		Dom.dataset.属性名  或者  Dom.dataset[属性名]
		注意:
				属性名是不包含data-
				驼峰命名法

	2. 设置自定义属性
		Dom.dataset.自定义属性名=值;
		  或者  
		Dom.dataset[自定义属性名]=值;

文件读取

  • FileReader阅读器
	FileReader -> 接口有3个用来读取文件方法返回结果在result中
	readAsBinaryString -> 将文件读取为二进制编码
	readAsText -> 将文件读取为文本
	readAsDataURL -> 将文件读取为DataURL
  • FileReader 提供的事件模型
	onabort	  	中断时触发
	onerror	  	出错时触发
	onload	   	文件读取成功完成时触发
	onloadend		读取完成触发,无论成功或失败
	onloadstart	  读取开始时触发
	onprogress	   读取中
  • 案例:读取图片
<input type="file">
<script>
	let fileBtn = document.querySelector('input');
	fileBtn.onchange = function(){
			let file = this.files[0];
			// 判断后缀是否合法
			let extension = file.name.substring(file.name.lastIndexOf('.'));
			let images = [".jpg",".jpeg",".png",".gif",".ico"];
			let flag = false;
			for(let i=0;i<images.length;i++){
					if(images[i] === extension){
							flag = true;
							break;
					}
			}
			if(flag){
					let reader = new FileReader();
					reader.readAsDataURL(file);

					reader.onload = function(){
							let img = document.createElement("img");
							img.src = reader.result;
							document.body.appendChild(img);
					}
			}else{
					alert("文件类型不正确,请重新选择");
			}
	}
</script>

获取网络状态

  • 获取当前网络状态
	window.navigator.onLine 返回一个布尔值
  • 网络状态事件
	window.ononline
	window.onoffline

获取地理定位

  • 获取一次当前位置
    • coords.latitude 维度
    • coords.longitude 经度
	window.navigator.geolocation.getCurrentPosition(success,error);
  • 实时获取当前位置
	window.navigator.geolocation.getCurrentPosition(success,error);

百度地图

  • 百度地图的使用
    * 地址 - http://developer.baidu.com/map/
    * 注册百度开发者
    * 如何创建应用
    * 应用类型 - 服务器
    * 启用服务 - 默认全部启用
    * 请求校验方式 - IP白名单校验
    * IP白名单 - 0.0.0.0/0
    * 得到应用的秘钥 - HbUVYMUg6PwbOnXkztdgSQlQ
  • 使用百度地图的步骤
    • HTML页面
      * 引入百度地图的JS文件
      http://api.map.baidu.com/api?v=2.0&ak=您的密钥
      * 定义容器元素 - 用于显示百度地图
    • JavaScript
      * 创建百度地图的Map对象
      new BMap.Map(容器的ID);
      * 设置百度地图的中心和显示级别
      centerAndZoom(center,zoom)
    • center - 设置地图的中心位置(String)
    • zoom - 设置地图的显示级别(3 - 19)
  • 百度地图API
    • 核心类
      • Map
        • 构造器 - new BMap.Map(容器的ID)
        • 返回一个Map核心对象
    • 方法
      • 修改状态方法
        • centerAndZoom(center,zoom)方法
          • 作用 - 初始化方法(必要)
        • setCenter(center)方法
          • 作用 - 设置中心点
        • 控件方法
          • addControl(control)方法 - 添加控件
          • removeControl(control)方法 - 删除控件
        • 遮盖物方法
          • addOverlay()方法 - 添加遮盖物
          • removeOverlay()方法 - 删除遮盖物
          • openInfoWindow()方法 - 打开信息窗口
          • closeInfoWindow()方法 - 关闭信息窗口
        • 右键菜单方法
          • addContextmenu()方法 - 添加右键菜单
          • removeContextMenu()方法 - 删除右键菜单
        • 基础类
          • Point
            • 构造器 - new BMap.Point(lng,lat)
    • 属性
      • lng - 表示经度
      • lat - 表示纬度
      • 控件类
        • ScaleControl - 比例尺
        • NavigationControl - 缩放和平移
        • MapTypeControl - 地图类型
      • 遮盖物类
        • Marker - 标注
        • InfoWindow - 信息窗口
      • 右键菜单类
        • ContextMenu - 自定义菜单
        • MenuItem - 菜单选项
  • 案例
	<!DOCTYPE html>
	<html>
	<head>
		<title>地图的控件展示</title>
		<meta charset="utf-8" />
		<script src="http://api.map.baidu.com/api?v=2.0&ak=HbUVYMUg6PwbOnXkztdgSQlQ"></script>
	</head>
	<body>
		<div id="allmap" style="width:500px;height:500px;"></div>
		<script>
			let map = new BMap.Map("allmap");
			map.centerAndZoom("北京",12);
			/*
				 向地图添加比例尺
				 * 创建一个比例尺对象
					 new BMap.ScaleControl(options)
				 * anchor - 设置控件在地图中显示的位置
					 * BMAP_ANCHOR_TOP_LEFT - 左上角
					 * BMAP_ANCHOR_BOTTOM_LEFT - 左下角
					 * BMAP_ANCHOR_TOP_RIGHT - 右上角
					 * BMAP_ANCHOR_BOTTOM_RIGHT - 右下角
				 * 通过Map对象添加控件
					 addControl(比例尺对象);
			 */
			let scale = new BMap.ScaleControl({
				anchor : BMAP_ANCHOR_BOTTOM_RIGHT
			});
			map.addControl(scale);
			/*
				 向地图添加缩放平移控件
				 * 创建缩放平移对象
					 new BMap.NavigationControl(options)
				 * anchor - 设置控件在地图中显示的位置
					 * BMAP_ANCHOR_TOP_LEFT - 左上角
					 * BMAP_ANCHOR_BOTTOM_LEFT - 左下角
					 * BMAP_ANCHOR_TOP_RIGHT - 右上角
					 * BMAP_ANCHOR_BOTTOM_RIGHT - 右下角
					 * type - 平移和缩放控件样式
					 * BMAP_NAVIGATION_CONTROL_SMALL:仅包含平移和缩放按钮
					 * BMAP_NAVIGATION_CONTROL_PAN:仅包含平移按钮
					 * BMAP_NAVIGATION_CONTROL_ZOOM:仅包含缩放按钮
				 * 通过Map对象添加控件
					 addControl(比例尺对象);
			 */
			let nav = new BMap.NavigationControl({
				anchor : BMAP_ANCHOR_TOP_RIGHT,
				type : BMAP_NAVIGATION_CONTROL_SMALL
			});
			map.addControl(nav);
			/*
				 向百度地图添加地图类型
				 * 创建地图类型对象
					 new BMap.MapTypeControl()
				 * 通过Map对象添加控件
					 addControl(比例尺对象);
			 */
			let type = new BMap.MapTypeControl({
				anchor : BMAP_ANCHOR_TOP_LEFT
			});
			map.addControl(type);
		</script>
		</body>
		</html>

本地存储

  • 发展:

随着互联网的快速发展,基于网页的应用越来越普遍,同时也变的越来越复杂,为了满足各种各样的需求,会经常性在本地存储大量的数据,传统方式我们以document.cookie来进行存储的,但是由于其存储大小只有4k左右,并且解析也相当的复杂,给开发带来诸多不便,HTML5规范则提出解决方案,使用sessionStorage和localStorage存储数据。

  • localStorage:
    • 永久生效
    • 多窗口共享
    • 容量大约为20M
	window.localStorage.setItem(key,value)		 设置存储内容
	window.localStorage.getItem(key)			   获取内容
	window.localStorage.removeItem(key)			删除内容
	window.localStorage.clear()					清空内容
  • sessionStorage:
    • 生命周期为关闭当前浏览器窗口
    • 可以在同一个窗口下访问
    • 数据大小为5M左右
	window.sessionStorage.setItem(key,value)		 设置存储内容
	window.sessionStorage.getItem(key)			   获取内容
	window.sessionStorage.removeItem(key)			删除内容
	window.sessionStorage.clear()					清空内容

Web Workers

  • 基本内容
    • 什么是Worker?
      • 是一个运行在后台的JavaScript
      • 独立于HTML页面运行的一段JavaScript代码
    • Worker的特点
      • 同时运行几个逻辑,并不需要顺序执行
      • 独立于HTML页面的循序执行
      • Worker之间相对是独立的
    • Worker的问题
      • 不能操作页面 - 单纯的JS逻辑
      • 导致也不能使用BOM
      • 不能使用DOM
  • Worker API
    • 检测浏览器对Worker支持情况
    • 创建Worker文件
    • 创建Worker对象
    • 与Worker进行通信
      • onmessage事件
      • postMessage()方法
    • 终止Worker
  • Web存储API
  • Web Socket
  • 扩展内容
    • 主流浏览器不允许读取本地文件
    • Chrome浏览器 - 直接报错
    • Firefox浏览器 - 不报错,不能用
    • IE浏览器 - 不报错,不能用
    • 网络文件还是可以读取的
  • 案例:聊天机器人
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>worker双向通信</title>
    <style>
        #showme > p{ line-height: 12px; color: orangered; }
    </style>
</head>
<body>
<input type="text" id="data">
<input type="button" id="btn" value="发送">
<div id="showme"></div>
<script>
    let btn = document.querySelector("#btn");
    let data = document.querySelector("#data");
    let showme = document.querySelector("#showme");
    let worker;
    // 1. 检测浏览器是否支持Worker
    if(typeof(Worker)!=="undefined"){
        /*
           2. 创建Worker对象
              * 注意 - 指定对应Worker文件
              var worker = new Worker(url);
              * url - Worker文件的路径
        */
        worker = new Worker("worker_d.js");
        /*
           3. 绑定onmessage事件
              * 注意
                * 将onmessage事件绑定在Worker对象
              * 触发
                * Worker文件调用postMessage()方法时
              * 处理函数
                * 具有形参允许接收postMessage()方法传递的数据内容
         */
        worker.postMessage("success");
        worker.onmessage = myMessage;
    }else{
        showme.innerHTML = "此浏览器不支持worker,请更换浏览器运行!"
    }
    function myMessage(event){
        showme.innerHTML += event.data + "<br>";
        console.log(event.data);
    }
    btn.onclick = function(){
        let value = data.value;
        showme.innerHTML += "<p>我:"+value+"</p>";
        worker.postMessage(value);
        data.value = "";
    }
</script>
</body>
</html>
onmessage = function(event){
    let message = event.data;
    if(message === "success"){
        postMessage("小麦:你好,我是小麦!");
    }else if(message.indexOf("我是") >= 0){
        postMessage("小麦:很高兴认识你!");
    }else if(message.indexOf("你是") >= 0){
        postMessage("小麦:我是智障!");
    }else if(message.indexOf("对象") >= 0){
        postMessage("小麦:我没对象,不要跟我说话!");
    }else if(message.indexOf("智障") >= 0){
        postMessage("小麦:智障青年欢乐多!");
    }else if(message.indexOf("游戏") >= 0){
        postMessage("小麦:我是不跟智障玩游戏的!");
    }else if(message.indexOf("吗") >= 0){
        postMessage("小麦:你问我,我可是会脸红的!");
    }else if(message.indexOf("?") >= 0){
        postMessage("小麦:我不跟你说话,我想静静!");
    }else if(message.indexOf("滚") >= 0){
        postMessage("小麦:只有球才会滚,我不会!");
    }else if(message.indexOf("会") >= 0){
        postMessage("小麦:你会的我都不会,你不会的我就更不会了!");
    }else if(message.indexOf("啥") >= 0){
        postMessage("小麦:没啥,我就是偷着乐呵了!");
    }
};

操作多媒体

Canvas画布

绘图工具

  • 介绍canvas画布
	<canvas width="400" height="400">
		<p>此浏览器不支持canvas元素!</p>
	</canvas>
  • 设置画布大小: 使用属性方式设置
    • <canvas width="400" height="400"></canvas>
  • 解决画布重绘问题
    • 设置一次描边 -> ctx.stroke(); -> 只执行一次
    • 开启新的图层 -> ctx.beginPath(); -> ctx.closePath();

绘图方法

	ctx.moveTo(x,y);    落笔
	ctx.lineTo(x,y);    连线
	ctx.stroke();	   描边
	ctx.beginPath();   开启新的图层

	☞ 颜色: strokeStyle="值"
	☞ 线宽: linewidth="值"   备注:不需要带单位
	☞ 线连接方式:   lineJoin: round | bevel | miter (默认)
	☞ 线帽(线两端的结束方式):  lineCap: butt(默认值) | round | square

	ctx.closePath();   闭合路径
  • 案例:绘制一条直线
	<!DOCTYPE html>
	<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>canvas画布</title>
	</head>
	<body>
		<canvas width="600px" height="400px"></canvas>
		<script>
			// 获取canvas画布对象
			let canvas = document.querySelector("canvas");
			// 获取canvas画笔对象
		let ctx = canvas.getContext("2d");
		// 落笔
		ctx.moveTo(100, 200);
		// 走线
		ctx.lineTo(300, 200);
		// 描边渲染
		ctx.stroke();
		// 开始绘制
		ctx.beginPath();
		// 落笔
		ctx.moveTo(100, 150);
		// 走线
		ctx.lineTo(300, 150);
		ctx.lineTo(300, 50);
		ctx.lineTo(100, 150);
		// 设置线的颜色为red
		ctx.strokeStyle = "red";
		// 设置线的宽度为20
		ctx.lineWidth = "8";
		// 设置线帽
		ctx.lineCap = "round";
		ctx.stroke();
		ctx.closePath();
	</script>
	</body>
	</html>

渐变方案

  • 线性渐变
		let grd = ctx.createLinearGradient(x0,y0,x1,y1);
					x0 --> 渐变开始的x坐标
					y0 --> 渐变开始的y坐标
					x1 --> 渐变结束的x坐标
					y1 --> 渐变结束的y坐标

		grd.addColorStop(0,"black");      设置渐变的开始颜色
		grd.addColorStop(0.5,"yellow");   设置渐变的中间颜色
		grd.addColorStop(1,"red");        设置渐变的结束颜色

		ctx.strokeStyle=grd;
		ctx.stroke();

		备注:
			 addColorStop(offse,color);
			 中渐变的开始位置和结束位置介于0-1之间,0代表开始,1代表结束。
			 中间可以设置任何小数
  • 径向渐变
	let grd = ctx.createradialGradient(x0,y0,r0,x1,y1,r1);
					(x0,y0) --> 渐变的开始圆的 x,y 坐标
					r0 --> 开始圆的半径
					(x1,y1) --> 渐变的开始圆的 x,y 坐标
					r1 --> 开始圆的半径

填充效果

	ctx.fill();	      	设置填充渲染
	ctx.fillstyle="值"; 	 设置填充颜色

非零环绕原则

  • 非零环绕原则:
    • 任意找一点,越简单越好
    • 以点为圆心,绘制一条射线,越简单越好(相交的边越少越好)
    • 以射线为半径顺时针旋转,相交的边同向记为+1,反方向记为-1,如果相加的区域等于0,则不填充。
    • 非零区域填充
  • 案例
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>非零环绕原则</title>
	<style type="text/css">
			canvas { border: 1px solid red; }
	</style>
</head>
<body>
<canvas width="600" height="400"></canvas>
<script type="text/javascript">
	//获取canvas画布对象
	let canvas =document.querySelector("canvas");
	//获取绘图上下文
	let ctx=canvas.getContext("2d");
	//绘制一个300*300矩形
	ctx.moveTo(150, 50);
	ctx.lineTo(450, 50);
	ctx.lineTo(450, 350);
	ctx.lineTo(150, 350);
	ctx.lineTo(150, 50);
	//开始绘制图形
	ctx.moveTo(300, 100);
	ctx.lineTo(200, 200);
	ctx.lineTo(250, 200);
	ctx.lineTo(250, 300);
	ctx.lineTo(350, 300);
	ctx.lineTo(350, 200);
	ctx.lineTo(400, 200);
	ctx.lineTo(300, 100);
	ctx.fill();
</script>
</body>
</html>

绘制虚线

  • 原理:设置虚线其实就是设置实线与空白部分直接的距离,利用数组描述其中的关系
    • 例如: [10,10] 实线部分10px 空白部分10px
    • 例如: [10,5] 实线部分10px 空白部分5px
    • 例如: [10,5,20] 实线部分10px 空白5px 实线20px 空白部分10px 实线5px 空白20px....
  • 注意:如果要将虚线改为实线,只要将数组改为空数组即可。
绘制:
 	ctx.setLineDash(数组);
 	ctx.stroke();

 例如:
 	ctx.moveTo(100, 100);
 	ctx.lineTo(300, 100);
 	ctx.setLineDash([2,4]);
 	ctx.stroke();

绘制动画效果

	☞ 绘制一个描边矩形:
		content.strokeRect(x,y,width,height);

	☞ 绘制一个填充矩形:
		content.fillRect(x,y,width,height);

	☞ 清除:		   
		content.clearRect(x,y,width,height);
  • 实现动画效果:
    • 先清屏
    • 绘制图形
    • 处理变量
	<!DOCTYPE html>
	<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>动画矩形</title>
		<style>
				section { margin: 0 auto; width: 600px; }
				canvas { border: 1px solid red; }
		</style>
	</head>
	<body>
		<section>
			<canvas width="600" height="400"></canvas>
		</section>
		<script>
		let canvas = document.querySelector("canvas");
		let ctx = canvas.getContext("2d");
		let x = 0;
		let step = 5;
		let i = 1;
		setInterval(function(){
				ctx.clearRect(0,0,canvas.width,canvas.height);
				ctx.fillRect(x,100,100,200);
				x += step * i;
				if(x > canvas.width-100){
						i = -1;
				}else if(x < 0){
						i = 1;
				}
		},20)
	</script>
	</body>
	</html>

绘制文本

	☞ 绘制填充文本:
		content.fillText(文本的内容,x,y);

	☞ 绘制镂空文本
		content.strokeText();

	☞ 设置文字大小:
		content.font="20px 微软雅黑";
		备注: 该属性设置文字大小,必须按照cssfont属性的方式设置

	☞ 文字水平对齐方式【文字在圆心点位置的对齐方式】
		content.textalign="left | right | center";

	☞ 文字垂直对齐方式:
		content.textBaseline="top | middle | bottom | alphabetic(默认)";

	☞ 文字阴影效果:
		ctx.shadowColor="red";  设置文字阴影的颜色
		ctx.ShadowOffsetX=值;   设置文字阴影的水平偏移量
		ctx.shadowOffsetY=值;   设置文字阴影的垂直偏移量
		ctx.shadowBlur=值;      设置文字阴影的模糊度

绘制图片

	☞ 将图片绘制到画布的指定位置:
		content.drawImage(图片对象,x,y);

	☞ 将图片绘制到指定区域大小的位置:
		content.drawImage(图片对象,x,y,width,height);
		备注:x与y指的是矩形区域的位置,width和height指的是矩形区域的大小

	☞ 将图片的指定区域绘制到指定矩形区域内:
	  context.drawImage(图片对象,sx,sy,swidth,sheight,dx,dy,dwidth,dheight);
		备注:sx与sy 指的是要从图片哪块区域开始绘制
				 swidth与sheight 指的是截取图片区域的大小
				 dx与dy 是指矩形区域的位置
				 dwidth与dheight 是指矩形区域的大小

	☞ 解决图片绘制到某一个区域的按原比例缩放绘制:
		绘制宽:绘制高==原始宽:原始高

绘制圆弧

	☞ content.arc(x,y,radius,startradian,endradian[,direct]);
		x,y    圆心的坐标
		radius 半径
		startradian   开始弧度
		endradian     结束弧度
		direct        方向(顺时针 false 默认)(逆时针 true)

	☞ 0度角在哪?
		以圆心为中心向右为0角 顺时针为正,逆时针为负

	☞ 角度和弧度的关系:角度:弧度= 180:pi
		特殊值: 0度 = 0弧度
				30度 = π/6   (180度的六分之一)
				45度 = π/4
				60度 = π/3
				90度 = π/2
				180度 = π
				360度 = 2π

	☞ 绘制圆上任意点:
		公式:	x=ox+r*cos( 弧度 )
			     y=oy+r*sin( 弧度 )
					 		ox: 圆心的横坐标
					 		oy: 圆心的纵坐标
					 		r: 圆的半径

平移【坐标系圆点的平移】

	ctx.translate(x,y);
  • 特点:通过该方法可以将原点的位置进行重新设置。
  • 注意:
    • translate(x,y) 中不能设置一个值
    • 与moveTo(x,y) 的区别:
      • 1moveTo(x,y) 指的是将画笔的落笔点的位置改变,而坐标系中的原点位置并没有发生改变;
      • translate(x,y) 是将坐标系中的原点位置发生改变

旋转【坐标系旋转】

	ctx.rotate(弧度)
  • 案例:画布中心旋转
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>画布中心旋转</title>
    <style>
        canvas{ background-color: #e2fdfa; }
    </style>
</head>
<body>
<canvas id="canvas" width="600px" height="600px"></canvas>
<script>
    let canvas = document.getElementById("canvas");
    let context = canvas.getContext("2d");
    context.translate(canvas.width/2,canvas.height/2);
    context.rotate(30*Math.PI/180);
    context.fillRect(-50,-50,100,100);
    setInterval(function(){
        context.clearRect(-canvas.width/2,-canvas.height/2,canvas.width,canvas.height);
        context.rotate(10*Math.PI/180);
        context.fillRect(-50,-50,100,100);
    },100);
</script>
</body>
</html>

伸缩

	ctx.scale(x,y)
  • 沿着x轴和y轴缩放,x,y 为倍数 例如: 0.5 1
posted @ 2020-07-24 11:40  wing1377  阅读(127)  评论(0编辑  收藏  举报