10分钟带你了解HTML5

你需要知道的

何为HTML5

☞HTML5属于上一代HTML的新迭代语言,设计HTML5主要的目的也是为了让多媒体在移动端上得到更好的支持!
如:video、audio、及canvas等

H5优缺点

☞H5的优点明显,就是跨平台,如开发了一款H5的游戏,我们可以很轻易的移植到其他开放平台,甚至也可以通过封装的技术打包成app,所以跨平台性很强大,这也是H5得到开发者认可的主要原因。
但是缺点也有,就是pc端浏览器支持不太友好,如果项目需要运行在ie8及以下版本或者其他低版本浏览器就要做兼容。

H5新增特性

1.加入了表单元素
2.取消了过时的显示效果标记 <font></font> <center></center>等
3.加入了语义标签
4.增加本地存储
5.加入了一些API
6.canvas标签

下面会对这些新特性做大概的介绍↓↓↓

一、新表单元素及属性

智能表单控件

之前在写text标签的时候,如果要检验用户输入合法性,就需要写相应的正则表达式,但是在H5中为我们新增了智能表单控件,省去很多步骤,使用方式如下:

<input type="email">
 //email: 输入合法的邮箱地址
 //url:  输入合法的url
 //number: 只能输入数字
 //range: 滑块
 //color: 拾色器
 //date: 显示日期
 //month: 显示月份
 //week : 显示第几周
 //time:  显示时间
表单属性
  1. form属性:
autocomplete=on    // 显示表单元素的历史记录,默认开启on,关闭为off
novalidate=off      // 是否关闭检验,默认不关闭false,关闭为true
  1. input属性:
    // autofocus :  自动获取焦点
    // form :  表单外部的标签也可以随着表单提交,只需要在标签是添加属性form="formid"
    // list :  在text标签上加入list属性并指定一个id,即可将下拉框与输入框相结合,如下:
       <input type="text" list="abc"/>
         <datalist id="abc">
            <option value="123">12312</option>
            <option value="123">12312</option>
            <option value="123">12312</option>
            <option value="123">12312</option>
        </datalist>
    // multiple:     实现多选效果
    // placeholder : 占位符  (提示信息)
    // required:    将该项作为必填项

上面写到的一些标签,在表单提交的时候,如果不符合会弹出提示信息,我们如何修改这个提示信息呢?
1. 表单验证是触发oninvalid事件
2. 通过setCustomValidity方式设置修改内容

二、新语义标签

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

首先我们看下H5中常用的语义标签有哪些,如下:

     <header></header>
     <footer></footer>
     <article></article>
     <aside></aside>
     <nav></nav>
     <section></section>
      // ……

那我们在使用这些语义标签的时候需要注意些什么呢?
新的语义标签和我们之前使用的普通标签,在使用上没有任何区别,

<nav></nav>  =  <div class="nav"></div>

可以看到语义标签就像是一个普通标签加上了一个class,这时这个标签就有一定的语义性,增加代码可读性,优化了网站seo。但是我们之前说过H5有一定的兼容问题,语义标签在ie8中就会出问题——不会被识别。这时浏览器会把语义标签当做是【自定义】标签,并且当做是一个行内元素。
那我们如何处理兼容问题呢?

  1. 既然上面说了,浏览器把语义标签当做是自定义标签,那我们就去创建这个【自定义】标签,document.createElement('nav'); 之后别忘了一点,语义标签还会被当成是行内元素,那再根据需要设置下display:block;就行啦。如果标签使用多了这种方式有点麻烦,别急往下看↓↓↓。
  2. 通过js插件,html5shiv.js,在页面内引入,就可以支持语义标签了。那在想下,如果是本身就可以支持的浏览器就会多请求一个脚本,造成资源浪费,所以再往下看↓↓↓↓。
  3. 完美解决方案,将脚本引用放到下面的代码块中
  <!--[if lte IE 8]>
        // 这里的含义是,当当前浏览器版本小于等于8时,就会走到这个if语句中,所以在这里写脚本的请求就将问题解决了。
  <![endif]-->

点我查看权威语义标签说明文档>>>

三、H5中的API

H5中为了方便开发,新增了很多api,包括获取元素属性、文件读取、网络状态、地理位置、本地存储等。

1. 获取元素、类名、自定义属性
  • 获取元素
    传统的方式我们习惯引入jq,然后去写$('')获取一个元素,但是H5提供了比jq还方便的获取方式。如下:
 document.querySelector("选择器");
 // 选择器: 可以是css中的任意一种选择器,通过该选择器只能选中第一个元素。
 document.querySelectorAll("选择器");
 // 与document.querySelector区别: querySelectorAll 可以选中所有符合选择器规则的元素,返回的是一个列表。querySelector返回的只是单独的一个元素。
  • 获取类样式
    方式,如下:
  Dom.classList.add("类名"): // 给当前dom元素添加类样式

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

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

  Dom.classList.toggle("active"); // 切换类样式(有就删除,没有就添加)
  • 自定义属性
    自定义属性其实是对原有自定义属性的升级,我们原来写自定义属性的方式是这样的:
 <input type="text" _name="123" id="text1">
var a = $('#text1').attr('_name');

H5中的自定义属性是这样的:

<input type="text" data-name="123" id="text1">
var a = document.querySelector('#text1').dataset.name;
var b = document.querySelector('#text1').dataset['name'];

是不是方便很多,直观很多。但是要注意的是:
如果数姓名为data-test-name,那么在获取的时候就要使用驼峰命名法获取

document.querySelector('#text1').dataset.testName;
document.querySelector('#text1').dataset['testName'];

当然自定义属性也可以进行添加和赋值
Dom.dataset.自定义属性名=值 或者 Dom.dataset[自定义属性名]=值;

2. 文件读取

直接上栗子:

<input type="file" id="file">
var input = document.querySelector("#file");
input.onchange = function(){
    //获取文件
    var file=this.files[0];
    //开始读取 创建读取器
    var reader=new FileReader();
    //开始读取
    reader.readAsText(file);
    //获取读取结果
        reader.onload = function(){
        //文件读取完成后才可以获取文件内容
        console.log(reader.result);
    }
}

上面的代码很好理解,唯一需要注意的一点就是,获取文件内容一定要等文件读取结束后,就是触发onload事件的时候。

  • FileReader对象属性,接口有3个用来读取文件方法返回结果在result中:
    readAsBinaryString ---将文件读取为二进制编码
    readAsText ---将文件读取为文本
    readAsDataURL ---将文件读取为DataURL
  • FileReader对象提供的事件:
    onabort 中断时触发
    onerror 出错时触发
    onload 文件读取成功完成时触发
    onloadend 读取完成触发,无论成功或失败
    onloadstart 读取开始时触发
    onprogress 读取中
3. 获取网络状态
  • 获取当前网络状态
    window.navigator.onLine 返回一个布尔值,true为联网,false为断网
  • 网络状态事件
    1. window.ononline
    2. window.onoffline
4.获取地理位置
  • 获取一次当前位置
    window.navigator.geolocation.getCurrentPosition(success,error);
    1.coords.latitude 维度
    2.coords.longitude 经度
    注:这个方法时不靠谱的,一些浏览器是获取不到的。

  • 实时获取当前位置

window.navigator.geolocation.watchPosition(success,error);
function success(msg,position) {

}
5. 本地存储

前端技术飞速发展,业务也越来越复杂,经常会在本地存储大量的数据,传统方式的cookie,因为大小只有4k,并且解析复杂,已经不能满足开发需求。HTML5规范提出的新的解决方案,使用sessionStorage和localStorage存储数据。

  • localStorage:
    1.永久生效,可以手动清除
    2.多窗口共享
    3.容量为20M
    api使用方式如下:
  window.localStorage.setItem(key,value); // 设置存储内容
  window.localStorage.getItem(key);          // 获取内容
  window.localStorage.removeItem(key);   // 删除内容
  window.localStorage.clear();          // 清空内容
  • sessionStorage:
    1.生命周期为关闭当前浏览器
    2.只能在当前窗口下访问
    3.数据大小为5M
    api使用方式如下:
  window.sessionStorage.setItem(key,value); // 用法和localStorage一致
  window.sessionStorage.getItem(key);
  window.sessionStorage.removeItem(key);
  window.sessionStorage.clear();

四、多媒体标签

这里只做简单的介绍,因为详细的说内容很多,后续会更新专门介绍多媒体标签的文章。
<video></video> 视频
属性:controls 显示控制栏 属性:autoplay 自动播放 属性:loop 设置循环播放
<audio></audio> 音频
属性:同video标签

video,支持3种格式,ogg mp4 WebM,将三种格式文件放入source中,浏览器从上至下读取,支持哪个就播放哪个。

        <video>
        <source src="test/多媒体/111.mp4">
        <source src="111.ogg">
        <source src="111.WebM">
    </video>

点我查看权威video标签说明文档>>>

五、canvas标签

在这里只写一些基础的api使用,后续会专门更新canvas详细使用的文章

1. 开始绘图

canvas其实就是H5提供的一个标签,使用方式也很简单。
首先设置画布

<canvas width="600" height="500"></canvas>

这里需要注意的一点就是,设置画布大小一定要通过设置标签属性的方式,不能通过css方式改变,因为属性改变的才是画布实际大小,而css改变的只是标签大小,实际画布大小不会改变。

var canvas = document.querySelector("canvas");//获取canvas对象
var ctx = canvas.getContext("2d");//获取绘图上下文
2. 绘图方法

设置好了画布就开始绘图了,绘图分为3个步骤,落笔、连线、描边

  • 落笔(找到起始点坐标)
ctx.moveTo(x,y);
  • 连线
ctx.lineTo(x,y);
  • 描边
ctx.stroke();//只有描边后才能看到图形

当画完一个图形后,需要开启新的图层,不然每次调用ctx.stroke()的时候都会将之前所有的图形再画一次,就会造成图形重叠、颜色变深。开启新图层方式如下:

ctx.benginPath();
  • 其他属性设置
    颜色: ctx.strokeStyle="red"
    线宽: ctx.linewidth="30" 备注:不需要带单位
    线连接方式: ctx.lineJoin: round | bevel | miter (默认)
    线帽(线两端的结束方式): ctx.lineCap: butt(默认值) | round | square
    在画一个闭合图形是,最后一条线可以通过闭合路径的方式画出
ctx.closePath(); // 自动画出图形最后闭合的线
3. 渐变方案
  • 线性渐变
 var 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();

中渐变的开始位置和结束位置介于0-1之间,0代表开始,1代表结束。中间可以设置任何小数。

  • 径向渐变
ctx.createradialGradient(x0,y0,r0,x1,y1,r1);
            // (x0,y0):渐变的开始圆的 x,y 坐标
            // r0:开始圆的半径
            // (x1,y1):渐变的结束圆的 x,y 坐标
            // r1:结束圆的半径
4. 填充效果
  ctx.fill();         // 设置填充效果
  ctx.fillstyle="值"; // 设置填充颜色
5. 非零环绕原则

当我们绘制一个“回”形图案时,进行颜色填充,就用到非零环绕原则。

  • 非零环绕原则前提:
    1.绘制的图形是闭合图形
    2.绘制的时候,绘制不同图形的顺序有顺时针和逆时针
  • 非零环绕原则:
    1.任意找一点,越简单越好
    2.以这个点位圆心,绘制一条射线(相交点越少越好)
    3.以点为轴将射线顺时针旋转,相交的边绘制的方向如果和旋转方向相同则+1,相反则-1,最后将一个区域内各边的值相加,等于0则不填充。非0则填充。
6. 绘制虚线

原理: 设置虚线其实就是设置实线与空白部分直接的距离,利用数组描述其中的关系

     var arr = [10,10];
     ctx.moveTo(100, 100);
     ctx.lineTo(300, 100);
     ctx.setLineDash(arr);
     ctx.stroke();
  • 数组表示:
    [10,5] 实线部分10px 空白部分5px
    [10,5,20] 实线部分10px 空白5px 实线20px 空白部分10px 实线5px 空白20px....

注意:如果要将虚线改为实线,只要将数组改为空数组即可。

7. 绘制动画效果
  • 原理:
    1.绘制一个描边矩形: ctx.strokeRect(x,y,width,height)
    2.绘制一个填充矩形: ctx.fillRect(x,y,width,height)
    3.清除: ctx.clearRect(x,y,width,height)

  • 实现动画效果步骤:
    1.先清屏
    2.绘制图形
    3.处理变量

8. 绘制文本
  • 绘制填充文本
content.fillText(文本的内容,x,y);
  • 绘制镂空文本
content.strokeText(文本的内容,x,y);
  • 设置文字大小
 content.font="20px 微软雅黑";

注: 该属性设置文字大小,必须按照cssfont属性的方式设置

  • 文字水平对齐方式
content.textalign="left | right | center"
  • 文字垂直对齐方式
content.textBaseline="top | middle | bottom | alphabetic(默认)"
  • 文字阴影效果
ctx.shadowColor="red";  // 设置文字阴影的颜色
ctx.ShadowOffsetX=值;   // 设置文字阴影的水平偏移量
ctx.shadowOffsetY=值;   // 设置文字阴影的垂直偏移量
ctx.shadowBlur=值;      // 设置文字阴影的模糊度,值越大越模糊
9. 绘制图片
  • 第一种
var img = document.createElement("img");
img.src="1.png";//或者获取页面内的img标签
// 注:画的方法一定要放到img.onload方法内
//将图片绘制到画布的指定位置
content.drawImage(图片对象,x,y);
  • 第二种
//将图片绘制到指定区域大小的位置  x,y指的是矩形区域的位置,width和height指的是矩形区域的大小
content.drawImage(img,x,y,width,height);
  • 第三种
//将图片的指定区域绘制到指定矩形区域内
content.drawImage(img,sx,sy,swidth,sheight,dx,dy,dwidth,dheight);
// sx,sy 指的是要从图片哪块区域开始绘制,swidth,sheight 是指截取图片区域的大小
// dx,dy 是指矩形区域的位置,dwidth,dheight是值矩形区域的大小
  • 解决图片绘制到某一个区域的按原比例缩放绘制:
    绘制宽:绘制高 = 原始宽:原始高
10. 绘制圆弧
content.arc(x,y,radius,startradian,endradian[,direct]);
  • 参数含义:
    x,y 圆心的坐标
    radius 半径
    startradian 开始弧度,弧度制,一般从0开始
    endradian 结束弧度,一般到2*Math.PI
    direct 方向(默认顺时针 false) true 代表逆时针

  • 0度角在哪?
    1.以圆心为中心向右为0角 顺时针为正,逆时针为负。
    2.0度在3点钟放向。

  • 备注:
    180角度 = Math.PI
    角度 和 弧度的关系: 角度:弧度= 180:pi

  • 特殊值
    0度 = 0弧度
    30度 = π/6 (180度的六分之一)
    45度 = π/4
    60度 = π/3
    90度 = π/2
    180度 = π
    360度 = 2π

  • 绘制圆上任意点公式:
    x=ox+rcos( 弧度 );
    y=oy+r
    sin( 弧度 );
    // ox: 圆心的横坐标
    // oy: 圆心的纵坐标
    // r: 圆的半径
    栗子:

var x = 300 + 100 * Math.cos(Math.PI/3);
var y = 200 + 100 * Math.sin(Math.PI/3);
//获取到圆上一点x,y
ctx.arc(x,y,10,0,Math.PI*2);
11. 平移(坐标系原点平移)

这里的平移指的是将坐标系原点平移。

ctx.translate(x,y);
  • 特点:
    通过该方法可以将原点的位置进行重新设置。
  • 注意:
    1.translate(x,y) 中不能设置一个值
    2.与moveTo(x,y) 的区别:
    2-1.moveTo(x,y) 指的是将画笔的落笔点的位置改变,而坐标系中的原点位置并没有发生改变
    2-2.translate(x,y) 是将坐标系中的原点位置发生改变
12. 旋转(坐标系原点旋转)
ctx.rotate(弧度);
// 弧度计算方式见圆弧绘制
13. 缩放
 ctx.scale(x,y);

可以设置一个值,即x轴y轴同时缩放相同比例
也可以设置两个值,即x轴y轴按照相应的比例缩放

六、完结

就写到这吧,HTML5真是好处多多,可以大大的提升开发效率、增加代码可读性,当然前提是处理好兼容问题。文章只是做一个初步介绍,帮助没用过的朋友快速了解H5,后续会针对其中几个点做更详细的解释。
如文章有错误或者不严谨的地方,还请指出,共同进步。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容