HTML5实用知识点

本文讲解HTML5实用知识点

新增的表单type

Canvas使用

SVG使用

Audio使用

Video使用

网页缓存

文件缓存

后台worker

Server-Sent Events

定位

拖放功能

  1. 新增的表单type

        <input type="color" name="myColor"> 颜色表单
    <input type="date" name="myDate"> 日期表单
    <input type="email" name="myEmail" required> 邮箱,自带验证
    <input type="month" name="myMonth"> 月份表单
    <input type="number" min="1" max="10" step="0.5" > 数字框
    <input type="range" min="1" max="10" step="0.5" > range输入控件
    <input type="search" name="mySearch"> 搜索框
    <input type="tel" name="mytelephone" required> 电话框
    <input type="time" name="mytime"> 时间输入框
    <input type="url" name="mywebsite" required> 网址输入框
    <input type="week" name="myweek"> 周选择框
  2. Canvas使用

    • 创建canvas标签
        canvas标签默认宽 300px 高 150px,canvas标签左上角是原点坐标
    <canvas id="myCanvas" widht="500" height="300"></canvas>
    • 画线
        window.onload = function() {
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext("2d"); // 创建2d上下文
    context.moveTo(50, 100); // 设置线的起点
    context.lineTo(100, 200); // 设置线的终点
    context.stroke(); // 连接两点
    }
    • 画圆弧
        语法格式 context.arc(原点x, 原点y, 半径, 开始角度, 结束角度, 是否逆时针);
    context.arc(200, 100, 50, 0.6 * Math.PI, 1.2 * Math.PI, false); // 描画弧的点
    context.stroke(); // 连接点
    • 画圆
        context.arc(200,100, 50, 0, 2 * Math.PI, false);
    context.stroke();
    • 画矩形
        语法格式 context.rect(起始点坐标x, 起始点坐标y, 矩形宽, 矩形高);
    context.rect(100,100,50,100);
    context.stroke();
    • 改变样式
        stroke方法默认是用宽1pixel的黑色实线画图
    context.strokeStyle = "red"; 设置线的颜色
    context.lineWidth = 5; 设置线的宽度
    context.lineCap = "round"; 设置线端点的形状
    context.fillStyle = "yellow"; 设置填充颜色
    context.fill(); 填充图形,这个方法最好在stroke方法之前使用
    • 使用渐变色
        线性渐变
    context.strokeStyle = "red";
    context.lineWidth = 5;
    context.rect(50,100,100,100);
    var grd = context.createLinearGradient(50,100,150,200); // 创建线性渐变的区域
    grd.addColorStop(0, '#8ED6FF'); // 添加渐变色
    grd.addColorStop(1, '#004CB3');
    context.fillStyle = grd; // 填充
    context.fill();
    context.stroke();
    辐射渐变
    context.strokeStyle = "red";
    context.lineWidth = 5;
    context.arc(150, 100, 70, 0, 2 * Math.PI, false);
    var grd = context.createRadialGradient(150, 100, 10, 150, 100, 100);
    grd.addColorStop(0, '#8ED6FF');
    grd.addColorStop(1, '#004CB3');
    context.fillStyle = grd;
    context.fill();
    context.stroke();
    • 添加文本
        context.font='bold 32px Arial';
    context.textAlign='center';
    context.textBaseline='middle';
    实心文字
    context.fillStyle='red';
    context.fillText("你好吗", 50, 50, 100);
    空心文字
    context.strokeStyle='red';
    context.strokeText("你好吗", 50, 50, 100);
  3. SVG使用

    • 创建svg标签
        svg用来画矢量图形,任意放大缩小都不会丢失图像质量
    <svg width="500" height="500">
    <text x="10" y="20" style="font-size: 14px;">
    你的浏览器支持svg
    </text>
    你的浏览器不支持svg
    </svg>
    • 画线
        <svg width="500" height="500">
    <line x1="50" y1="50" x2="100" y2="150" style="stroke:red;stroke-width:3;"></line>
    </svg>
    • 画矩形
        <svg width="500" height="500">
    <rect x="50" y="50" width="200" height="100" style="fill: red;stroke: black;stroke-width: 3;"></rect>
    </svg>
    • 画圆
        <svg width="500" height="500">
    <circle cx="150" cy="100" r="50" style="fill:limegreen; stroke:black; stroke-width: 3;"></circle>
    </svg>
    • 画文字
        文字块
    <svg width="500" height="500">
    <text x="10" y="20" style="fill:rebeccapurple; font-size: 22px;">你们好吗?</text>
    <text x="10" y="20" dx="0" dy="50" style="fill:chocolate; font-size:20px;">非常好,谢谢!</text>
    </svg>
    x,y表示文本右上角坐标
    dx,dy表示相对于上一个文本的坐标
    文字段
    <svg width="500" height="500">
    <text x="30" y="20" style="fill:palegoldenrod; font-size: 20px;transform:rotate(30deg);">
    <tspan x="30" y="10" style="fill:violet; font-size: 15px;">欢迎来到这里!</tspan>
    <tspan dx="-100" dy="20" style="fill:brown; font-size: 20px;">在这里你可以学到很多东西!</tspan>
    </text>
    </svg>
  4. Audio使用

        基本使用
    <audio controls="controls" src="http://fs.w.kugou.com/201801141449/11d9f59f7bbe44baa117d3ee68d537e8/G004/M01/09/07/pIYBAFT6cwOAKJZAACusE60HmfI058.mp3">
    你的浏览器不支持audio
    </audio>
    兼容处理
    <audio controls="controls">
    <source src="birds.mp3" type="audio/mpeg">
    <source src="birds.ogg" type="audio/ogg">
    你的浏览器不支持audio
    </audio>
    使用a标签也可以播放音乐
    <a href="http://fs.w.kugou.com/201801141449/11d9f59f7bbe44baa117d3ee68d537e8/G004/M01/09/07/pIYBAFT6cwOAKJZAACusE60HmfI058.mp3">播放</a>
    使用object标签播放音乐
    object标签用来将各种媒体类型的文件嵌套展示在html文档中
    <object data="http://fs.w.kugou.com/201801141449/11d9f59f7bbe44baa117d3ee68d537e8/G004/M01/09/07/pIYBAFT6cwOAKJZAACusE60HmfI058.mp3" width="200px" height="50px"></object>
    使用embed也可以实现
    <embed src="http://fs.w.kugou.com/201801141449/11d9f59f7bbe44baa117d3ee68d537e8/G004/M01/09/07/pIYBAFT6cwOAKJZAACusE60HmfI058.mp3" width="200px" height="50px">
  5. Video使用

        基本使用
    <video controls="controls" src="http://114.80.149.155/vlive.qqvideo.tc.qq.com/AWxNgT15MDV-qHJX5cxO9KrgFw-QnllWwnyAPHB6Nunc/w0200ph7kmn.p201.1.mp4?vkey=540F0275B3B1E386A056820358C08C5462CAD4EFEA3AAAE522FB267A7752F019FE18D07FCAA4C0F87AB009EC47D87639C8ED5E39EB201E6D8356180B27B087E5DADE51850EE7EF89C62456A8BC8AC0C3BBE07D5AFFA5CFE70502CB7D9B6B2688FFC14D814469155BB96C6949A2FFA0DF69564134A09DA087&platform=10201&sdtfrom=&fmt=shd&level=0">你的浏览器不支持video</video>
    兼容写法
    <video controls="controls">
    <source src="shuttle.mp4" type="video/mp4">
    <source src="shuttle.ogv" type="video/ogg">
    你的浏览器不支持video
    </video>
    同样也可以使用object和embed播放电影
  6. 网页缓存

    网页缓存可以缓存5M的数据在本地
    localStorage 永久缓存在本地
    if(localStorage) {
    localStorage.setItem("name", "yejiawei"); // 存数据
    console.log(localStorage.getItem("name")); // 取数据
    localStorage.removeItem("name"); // 移除数据
    localStorage.clear(); // 移除所有数据
    }else{
    alert("你的浏览器不支持localStorage");
    }
    sessionStorage 当用户关闭当前页或者关闭浏览器,数据自动清除
    用法和localStorage一样
    if(sessionStorage) {
    sessionStorage.setItem("name", "yejiawei");
    console.log(sessionStorage.getItem("name"));
    sessionStorage.removeItem("name");
    sessionStorage.clear();
    }else{
    alert("你的浏览器不支持sessionStorage");
    }
  7. 文件缓存

        文件缓存可以用来,指导浏览器如何缓存文件和断网的情况下展示什么页面
    先创建一个配置文件,比如test.appcache,写如下内容
    CACHE MANIFEST
    # v1.0: 2018/1/14
    CACHE:
    # 需要缓存的文件
    index.html
    index.css
    NETWORK:
    # 不需要缓存的文件
    124463.js
    FALLBACK:
    # 掉线之后展示的页面
    offline.html
    修改index.html
    <html lang="en" manifest="example.appcache">
    此时浏览器文件缓存已经配置好了,当用户断开与服务器的连接的时候,展示offfline.html文件
  8. 后台worker

    大家应该都知道,js是单线程语言,当计算量很大的时候,会阻塞页面,html5提供了一个web worker的功能可以让你创建类似多线程的功能
    worker需要在一个服务器环境中运行
    将复杂的代码可以单独抽取到一个js文件中,比如index.js
    var i = 0;
    function countNumber() {
    if(i < 10000){
    i = i + 1;
    postMessage(i); // 将信息发送到主线程上
    }
    console.log(i);
    setTimeout(countNumber, 500)
    }
    countNumber();
    在主线程上调用worker接受信息
    if(window.Worker) {
    var worker = new Worker("./index.js");
    worker.onmessage = function(event) {
    document.getElementById("showBox").innerText = event.data;
    if(event.data == 10) {
    worker.terminate(); // 终止worker
    }
    }
    }else{
    alert("你的浏览器不支持worker");
    }
  9. Server-Sent Events

    ajax请求使用XMLHttpRequest对象,此对象只会连接一次,如果要和后端建立长时间的连接,就要使用sse了
    前端的写法
    window.onload = function () {
    var source = new EventSource("api/Test");
    source.onmessage = function (event) {
    document.getElementById("box").innerHTML = event.data;
    }
    source.onopen = function (event) {
    }
    source.onerror = function (event) {
    }
    }
    C#后端的写法
    public HttpResponseMessage Get ()
    {
    HttpResponseMessage response = Request.CreateResponse();
    response.Content = new PushStreamContent((Stream stream, HttpContent content, TransportContext context) => {
    if(stream != null)
    {
    using (var writer = new StreamWriter(stream))
    {
    writer.WriteLine("data:" + JsonConvert.SerializeObject(DateTime.Now.ToString()) + "\n\n"); ;
    writer.Flush();
    }
    }
    }, "text/event-stream");
    return response;
    }
    上面的例子,前端可以在页面上展示后端服务器实时的时间,3s刷新一次
  10. 定位

    经纬度的获取
    function getPosition() {
    if(navigator.geolocation) {
    var box = document.getElementById("showBox");
    box.innerHTML = "正在定位...";
    navigator.geolocation.getCurrentPosition(function(position) {
    // 需要用户同意定位
    var latitude = position.coords.latitude;
    var longitude = position.coords.longitude;
    box.innerHTML = "您当前的坐标是 " + "经度:" + longitude + ",纬度:" + latitude
    },function (err){
    // 错误处理
    if(err.code == 1) {
    box.innerHTML = "你拒绝了定位";
    }else if(err.code == 2) {
    box.innerHTML = "网络问题无法定位";
    }else if(err.code == 3) {
    box.innerHTML = "定位超时";
    }else {
    box.innerHTML = "定位过程中发生了,未知错误";
    }
    })
    }else{
    alert("你的浏览器不支持html5地理定位");
    }
    }
    追踪定位
    作者提醒:这个实时定位,当页面在后台和前台之间切换时才会刷新,具体原因未知
    <div id="showBox"></div>
    <button type="button" id="btn">开始追踪</button>
    <script>
    window.onload = function() {
    var btn = document.getElementById("btn");
    var box = document.getElementById("showBox");
    var watchID;
    btn.onclick = function() {
    if(watchID){
    btn.innerHTML = "开始追踪";
    navigator.geolocation.clearWatch(watchID);
    watchID = false;
    }else{
    btn.innerHTML = "正在获取坐标...";
    getPosition();
    }
    }
    function getPosition() {
    if(navigator.geolocation) {
    watchID = navigator.geolocation.watchPosition(function(position) {
    btn.innerHTML = "停止追踪";
    if(prevLat != position.coords.latitude || prevLong != position.coords.longitude){
    var prevLat = position.coords.latitude;
    var prevLong = position.coords.longitude;
    var positionInfo = "你的当前坐标是 (" + "纬度: " + position.coords.latitude + ", " + "经度: " + position.coords.longitude + ")";
    box.innerHTML = positionInfo;
    }
    })
    }else{
    alert("你的浏览器不支持html5地理定位");
    }
    }
    }
    </script>
  11. 拖放功能

    css
    body{
    background: grey;
    }
    #dropBox{
    width: 300px;
    height: 300px;
    border: 5px dashed gray;
    background: lightyellow;
    text-align: center;
    margin: 20px 0;
    color: orange;
    }
    #dropBox img{
    margin: 25px;
    }
    html
    <h2>拖放功能例子</h2>
    <p>将图片拖拽到div中</p>
    <div id="dropBox" ondragover="dragOver(event);" ondrop="drop(event);"></div>
    <img src="./1.jpg" id="img" draggable="true" ondragstart="dragStart(event);" width="250" height="250">
    设置 draggable="true" 表示元素可拖动,默认情况下,选中的文本,图片,带有href属性的a标签都是可以拖动的
    js
    function dragStart(e) {
    e.dataTransfer.effectAllowed = "move"; // 设置拖动的元素可以执行的动作
    e.dataTransfer.setData("Text", e.target.getAttribute("id")); // 设置拖动的数据
    }
    function dragOver(e) {
    // 清除浏览器的默认行为
    e.preventDefault();
    e.stopPropagation();
    }
    function drop(e) {
    e.stopPropagation();
    e.preventDefault();
    var data = e.dataTransfer.getData("Text"); // 获取拖动的数据
    e.target.appendChild(document.getElementById(data));
    }
    拖放的相关事件
    ondragstart 用户开始拖元素触发一次
    ondragenter 比ondragstart后调用
    ondragover 用户将拖拽的元素放到容器的上方一直触发
    ondreagleave 当拖拽元素的鼠标位置离开了元素的边界触发一次
    ondrag 拖拽元素一直触发
    ondrop 用户将拖拽的元素,在容器上方松开,触发
    ondragend 只要用户松开了,就触发
上一篇:剑指Offer 3. 从尾到头打印链表 (链表)


下一篇:socket 995 错误 boost