09-HTML5新特性

2017-09-05  本文已影响30人  magic_pill

前言

认识HTML5

语法规范

语义标签

<!-- 头部 -->
<div class="header">
     <ul class="nav"></ul>
</div>
<!-- 主体部分 -->
<div class="main">
    <!-- 文章 -->
    <div class="article"></div>
    <!-- 侧边栏 -->
    <div class="aside"></div>
</div>
<!-- 底部 -->
<div class="footer"></div>
<!-- 头部 -->
<header>
    <ul class="nav"></ul>
</header>
<!-- 主体部分 -->
<div class="main">
    <!-- 文章 -->
    <article></article>
    <!-- 侧边栏 -->
    <aside></aside>
</div>
<!-- 底部 -->
<footer></footer>

常用新语义标签

语义 说明
header 表示页眉
nav 表示导航
section 表示区块
aside 表示侧边栏 如文章的侧栏
article 表示文章 如文章、评论、帖子、博客
footer 表示页脚
figure 表示媒介内容分组 与 ul > li 做个比较
mark 表示标记 (带用“UI”,不怎么用)
progress 表示进度 (带用“UI”,不怎么用)
time 表示日期

兼容处理

<!--条件注释,只有IE才能够识别-->
<!--[if lte ie 8]>
    <script src="html5shiv.min.js"></script>
<![endif]-->

表单

输入类型 (表单类型,表单元素,表单属性,表单事件。)

输入类型 说明
email 输入email格式
tel 手机号码
url 只能输入url格式
number 只能输入数字
search 搜索框
range 范围、滑动条
color 拾色器
time 时间
date 日期(不是绝对的)
datetime 时间日期
month 月份
week 星期

表单元素(标签)

<input type=”text” list=”data”>
<datalist id=”data”>
    <option>男</option>
    <option>女</option>
    <option>不详</option>
</datalist>
<meter value="81" min="0" max="100" low="60" high="80"/>

表单属性

<input type="tel" name="tel" required="required" pattern="^(\+86)?1[3,5,8](\d{9})$">

表单事件

input.oninvalid = function(){
    this.setCustomValidity("你邮箱输错掉了,现在重新输入");
};
案例练习
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        form{
            width: 200px;
            margin: 40px auto;
        }
    </style>
</head>
<body>
    <form>
        <fieldset>
            <legend>注册信息</legend>
            <label>手机号:<input type="tel" name="b" id="userName" pattern="/^((13[0-9])|(15[^4,\D])|(18[0-9]))\d{8}$/"></label><br>
            <label>密&nbsp&nbsp&nbsp码:<input type="password" name="c" id="pwd"></label><br>
            <input type="submit" style="width: 200px;">
        </fieldset>
    </form>
    <script>
        var userName = document.getElementById("userName");
        var pwd = document.getElementById("pwd");
        userName.onblur = function () {
            this.oninvalid = function () {
                this.setCustomValidity("您输入的手机号有误");
            }
        }
    </script>
</body>
</html>

多媒体

音频

<audio scr="xxx.mp3"></audio>
格式 IE9 Firefox3.5 Opera3.5 Chrome3.0 Safari3.0
Ogg Vorbis
MP3
Wav
<audio>
    <source src="music.mp3">
    <source src="music.ogg">
    <source src="music.wav">
    抱歉,您的浏览器不支持音频播放
</audio>

视频

<video scr="xxx.mp4" controls="controls"></video>
格式 IE Firefox Opera Chrome Safari
Ogg No 3.5+ 10.5+ 5.0+ No
MPEG4 9.0+ No No 5.0+ 3.0+
WebM No 4.0+ 10.6+ 6.0+ No

DOM扩展

获取元素

类名操作

自定义属性data-*=""

data-my-name="yijiang";
//获取
Node.dataset['myName']
案例练习 (tab 切换)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>tab栏练习</title>

    <style>
        body{
            background-color: #f0f0f0;
            margin: 0;
            padding: 0;
        }
        .tab{
            margin: 30px auto;
            width: 400px;
            background-color: #fafafa;
        }

        nav{
            height: 40px;
            background-color: #009999;
            display:flex;
            text-align: center;
            line-height:40px;
            overflow: hidden;
        }
        nav a{
            text-decoration: none;
            width: 100px;
            border-right: 1px solid #fff;
        }
        nav a:last-child{
            border-right: none;
        }
        nav a.active{
            background-color: #00dddd;
        }

        .tab ol{
            line-height: 30px;
        }
        .tab .cont{
            overflow: hidden;
            display: none;
        }

    </style>
</head>
<body>
   <div class="tab">
       <nav>
           <a href="javascript:;" data-content="local" class="active">本地新闻</a>
           <a href="javascript:;" data-content="global">国际新闻</a>
           <a href="javascript:;" data-content="sport">体育新闻</a>
           <a href="javascript:;" data-content="funny">娱乐新闻</a>
       </nav>

       <section class="cont" id="local" style="display: block">
           <ol>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
           </ol>
       </section>
       <section class="cont" id="global">
           <ol>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
           </ol>
       </section>
       <section class="cont" id="sport">
           <ol>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
           </ol>
       </section>
       <section class="cont" id="funny">
           <ol>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
           </ol>
       </section>
   </div>

    <script>
        var aArr = document.querySelectorAll("nav a");

        for(var i=0; i<aArr.length; i++){
            aArr[i].onclick = function () {
                //获取到当前选中的标签
                var current = document.querySelector(".active");
                //获取当前标签的对应section的id
                console.log(current);
                var currentID = current.dataset["content"];
                //取消当前选中状态
                current.classList.remove("active");
                //隐藏对应的内容部分
                document.querySelector("#"+currentID).style.display = "none";

                //改变当前选中标签状态
                this.classList.add("active");
                //获取当前选中状态对应的section的id
                var thisID = this.dataset["content"];
                //显示对应的内容
                document.querySelector("#"+thisID).style.display = "block";
            }
        }
    </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>tab栏练习</title>

    <style>
        body{
            background-color: #f0f0f0;
            margin: 0;
            padding: 0;
        }
        .tab{
            margin: 30px auto;
            width: 400px;
            background-color: #fafafa;
        }

        nav{
            height: 40px;
            background-color: #009999;
            display:flex;
            text-align: center;
            line-height:40px;
            overflow: hidden;
        }
        nav a{
            text-decoration: none;
            width: 100px;
            border-right: 1px solid #fff;
        }
        nav a:last-child{
            border-right: none;
        }
        nav a.active{
            background-color: #00dddd;
        }

        .tab ol{
            line-height: 30px;
        }
        .tab .cont{
            overflow: hidden;
            display: none;
        }

    </style>
</head>
<body>
   <div class="tab">
       <nav>
           <a href="javascript:;" data-content="local">本地新闻</a>
           <a href="javascript:;" data-content="global">国际新闻</a>
           <a href="javascript:;" data-content="sport">体育新闻</a>
           <a href="javascript:;" data-content="funny">娱乐新闻</a>
       </nav>

       <section class="cont" id="local">
           <ol>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
               <li>111南方大旱,农作物减产绝收面积上亩</li>
           </ol>
       </section>
       <section class="cont" id="global">
           <ol>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
               <li>222南方大旱,农作物减产绝收面积上亩</li>
           </ol>
       </section>
       <section class="cont" id="sport">
           <ol>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
               <li>333南方大旱,农作物减产绝收面积上亩</li>
           </ol>
       </section>
       <section class="cont" id="funny">
           <ol>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
               <li>444南方大旱,农作物减产绝收面积上亩</li>
           </ol>
       </section>
   </div>

    <script>
        var aArr = document.querySelectorAll("nav a");

        (function (index) {

            for(var i=0; i<aArr.length; i++){
                //选中一个进行初始化
                if (i == index){
                    //给对应的标签绑定选中状态
                    aArr[i].classList.add("active");
                    //获取对应的section的id
                    var myID = aArr[i].dataset["content"];
                    document.querySelector("#"+myID).style.display = "block";
                }
                console.log(aArr[index]);

                //绑定点击事件
                aArr[i].onclick = function () {
                    //获取到当前选中的标签
                    var current = document.querySelector(".active");
                    //获取当前标签的对应section的id
                    console.log(current);
                    var currentID = current.dataset["content"];
                    //取消当前选中状态
                    current.classList.remove("active");
                    //隐藏对应的内容部分
                    document.querySelector("#"+currentID).style.display = "none";

                    //改变当前选中标签状态
                    this.classList.add("active");
                    //获取当前选中状态对应的section的id
                    var thisID = this.dataset["content"];
                    //显示对应的内容
                    document.querySelector("#"+thisID).style.display = "block";
                }
            }
        })(0);

    </script>
</body>
</html>

H5新增API

多媒体

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>视频播放器</title>

    <link rel="stylesheet" href="../fontawesome/css/font-awesome.min.css">
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        figure{
            width: 720px;
            height: 410px;
            border: 1px solid #000;
            margin: 40px auto;
        }
        figcaption{
            text-align: center;
            line-height: 40px;
            font-family: "Microsoft Yahei";
            font-size: 24px;
        }

        .player{
            width: 720px;
            height: 360px;
            border: 1px solid #000;
            margin: 10px auto;
            background: #000 url(h5-source/loading.gif) center no-repeat;
            background-size: auto 100%;
            position: relative;
            border-radius: 20px;
        }
        .player video{
            display: block;
            height: 100%;
            margin: 0 auto;
        }

        .controls{
            width: 700px;
            height: 40px;
            position: absolute;
            left: 10px;
            bottom: 10px;
            background: rgba(200,120,140,0.8);
        }
        .switch{
            width: 20px;
            height: 20px;
            position: absolute;
            left: 10px;
            top: 10px;
            background-color: #bbb;
            text-align: center;
            line-height: 20px;
            color: white;
        }

        progress{
            width: 450px;
            height: 10px;
            background-color: white;
            /*color: red;*/
            position: absolute;
            left: 40px;
            top: 15px;
        }
        .time{
            position: absolute;
            left: 500px;
            line-height: 40px;
        }
        .extend{
            width: 20px;
            height: 20px;
            position: absolute;
            top: 10px;
            right: 10px;
            color: white;
            text-align: center;
            line-height: 20px;
        }

    </style>
</head>
<body>
    <figure>
        <figcaption>视频播放器</figcaption>

        <div class="player">
            <video src="h5-source/fun.mp4"></video>
            <div class="controls">
                <a href="#" class="switch icon-play"></a>
                <progress value="20" max="100"></progress>
                <div class="time">
                    <span class="currentTime">--:--:--</span>
                    /
                    <span class="totalTime">--:--:--</span>
                </div>
                <a href="#" class="extend icon-resize-full"></a>
            </div>
        </div>
    </figure>

    <script>
        //获取视频
        var video = document.querySelector("video");
        //播放暂停按钮
        var switchBtn = document.querySelector(".switch");
        //进度条
        var progressBar = document.querySelector("progress");
        //当前时间
        var currentTime = document.querySelector(".currentTime");
        //总时间
        var totalTime = document.querySelector(".totalTime");
        //全半屏
        var extendBtn = document.querySelector(".extend");

        //2.播放暂停按钮点击
        switchBtn.onclick = function () {
            //判断按钮状态,如果当前暂停,点击之后开始播放,并更改按钮状态,反之同理
            if (video.paused){
                this.classList.remove("icon-play");
                this.classList.add("icon-pause");
                video.play();
            }else {
                this.classList.remove("icon-pause");
                this.classList.add("icon-play");
                video.pause();
            }
        };

        var totalT = 0;
        //1.视频加载完成之后,进入可播放状态
        video.oncanplay = function () {
            alert(111);
            //获取总时间
            console.log(video.duration);
            totalT = video.duration;
            //时
            var h = Math.floor(totalT/3600);
            //分
            var m = Math.floor(totalT%3600/60);
            //秒
            var s = Math.floor(totalT%60);

            //把格式化成 00:00:00
            h = h>=10 ? h:"0"+h;
            m = m>=10 ? m:"0"+m;
            s = s>=10 ? s:"0"+m;
            totalTime.innerHTML = h + ":" + m + ":" + s;
            //设置当前播放时间为 00:00:00
            currentTime.innerHTML = "00:00:00";

        };


        var currentT = 0;
        //3.视频播放过程中,要不断更新当前时间和当前进度条
        video.ontimeupdate = function () {
            currentT = video.currentTime;
            //更新视频播放进度
            progressBar.value = currentT / totalT * 100;

            //时
            var h = Math.floor(currentT/3600);
            //分
            var m = Math.floor(currentT%3600/60);
            //秒
            var s = Math.floor(currentT%60);
            //化成格式 00:00:00
            h = h>=10 ? h:"0"+h;
            m = m>=10 ? h:"0"+m;
            s = s>=10 ? s:"0"+s;
            currentTime.innerHTML = h + ":" + m + ":" + s;
        };

        //4.全半屏播放
        extendBtn.onclick = function () {
            video.webkitRequestFullScreen();
        }
    </script>
</body>
</html>

拖拽

拖拽元素
目标元素
事件监听
拖拽元素 说明
ondrag 应用于拖拽元素,整个拖拽过程都会调用
ondragstart 应用于拖拽元素,当拖拽开始时调用
ondragleave 应用于拖拽元素,当鼠标离开拖拽元素原位置时调用
ondragend 应用于拖拽元素,当拖拽结束时调用
目标元素 说明
ondragenter 应用于目标元素,当拖拽元素进入时调用
ondragover 应用于目标元素,当拖拽元素在目标元素上时连续触发
ondrop 应用于目标元素,当在目标元素上松开鼠标时调用
ondragleave 应用于目标元素,当鼠标离开目标元素时调用
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>拖拽</title>

    <style>
        .box1,.box2{
            width: 300px;
            height: 300px;
            border: 1px solid #000;
            float: left;
            margin: 40px;
        }
        .sBox{
            width: 75px;
            height: 75px;
            background-color: #f00;
            float: left;
            border-radius: 50%;
            text-align: center;
            line-height: 75px;
        }
    </style>
</head>
<body>
<div class="box1">
    <div class="sBox" draggable="true">1</div>
    <div class="sBox" draggable="true">2</div>
    <div class="sBox" draggable="true">3</div>
    <div class="sBox" draggable="true">4</div>
    <div class="sBox" draggable="true">5</div>
    <div class="sBox" draggable="true">6</div>
    <div class="sBox" draggable="true">7</div>
    <div class="sBox" draggable="true">8</div>
</div>
    <div class="box2"></div>

    <script>
        //获取事件源
        var sBoxs = document.querySelectorAll(".sBox");
        var box1 = document.querySelector(".box1");
        var box2 = document.querySelector(".box2");

        var temp = null;
        //给各个小盒子绑定事件
        for(var i=0; i<sBoxs.length; i++){
            sBoxs[i].ondragstart = function () {
                temp = this;
            };
        }

        //给目标元素绑定事件
        box2.ondragover = function (event) {
            event.preventDefault();
        };
        box2.ondrop = function () {
            this.appendChild(temp);
        };

        box1.ondragover = function (event) {
            event.preventDefault();
        };
        box1.ondrop = function () {
            this.appendChild(temp);
        }
    </script>
</body>
</html>

全屏

var docElm = document.documentElement;
    if (docElm.requestFullscreen) {
       docElm.requestFullscreen();
    }
    else if (docElm.mozRequestFullScreen) {
       docElm.mozRequestFullScreen();
    }
    else if (docElm.webkitRequestFullScreen) {
       docElm.webkitRequestFullScreen();
    }

Web存储

一、特性
二、window.sessionStorage
三、window.localStorage
四、方法详解
五、其它(了解)

网络状态

<script>
    window.online = function () {
        alert("联网");
    };
    window.addEventListener("offline",function () {
        alert("已断网");
    });
</script>

应用缓存

一、优势
  1. 可配置需要缓存的资源;
二、缓存清单
CACHE MANIFEST
#下面是要缓存的文件
CACHE:
        http://xxx.jpg
三、manifest文件格式
  1. 顶行写CACHE MANIFEST;
  2. 注释使用#开头;
  3. CACHE:换行,指定我们需要缓存的静态资源,如.css、image、js等;
FALLBACK:
        4O4.html
四、其它
  1. CACHE:可以省略,这种情况下将需要缓存的资源写在CACHE MANIFEST;
  2. 可以指定多个CACHE: NETWORK: FALLBACK:,无顺序限制;
CACHE MANIFEST
CACHE:(以下部分是需要缓存的资源)
    1.jpg
    js/jquery.min.js
NETWORK:
    js/demo.js
    # 可以使用 * 号替代
FALLBACK:
    one.css two.css
    //会缓存two.css 当找不到one.css 会去找two.css 文件.

地理定位

一、获取地理信息方式
  1. IP地址;
数据源 优点 缺点
IP地址 任何地方都可用;在服务器端处理 不精确(经常出错,一般精确到市级);运算代价大
GPS 很精确 定位时间长,耗电量大;室内效果差;需要额外硬件设备支持
WiFi 精确;可在室内使用;简单、快捷 在乡村这些WiFi接入点少的地区无法使用
手机信号 相当精确;可在室内使用;简单、快捷 需要能够访问手机或其modem设备
用户自定义 可获得比程序定位服务更准确的位置数据;用户自行输入可能比自动检测更快 可能很不准确,特别是当用户位置变更后
二、隐私
三、API详解
<script>
    if (navigator.geolocation){
        navigator.geolocation.getCurrentPosition(successCallBack,errorCallBack);
    }else {
        alert("对不起,您的浏览器不能获取到位置...");
    }
    //成功获取位置时回调
    function successCallBack(position) {
        console.log(position.coords.latitude);
        console.log(position.coords.longitude);
    }
    //获取位置失败时回调
    function errorCallBack(error) {
        console.log(error);
    }
</script>

历史

上一篇下一篇

猜你喜欢

热点阅读