(第三天)HTML5之Range对象(下)、Audio、Video、拖放、Canvas标签

Range对象的方法


Range对象之cloneRange、cloneContents、extractContents方法
  • cloneRange():克隆并返回一个Range对象,非Node类型,无法添加到其他节点中;
  • cloneContents():克隆Range对象下的所有子节点,并返回一个DocumentFragment对象;
  • extractContents():提取所有子节点,并返回一个DocumentFragment对象;

<small>注:
① cloneContents & extractContents操作的对象是Node(整个节点)或是Contents(节点中的所有子节点)由selectNode & selectNodeContents两个方法决定;
②DocumentFragment是一个Node类型,故可以作为Node被添加到其他Node中,添加方法:node.appendChild(fragment)

<!-- cloneRange Demo -->
<body>
  <script>
  function cloneP(argument) {
      var p = document.getElementById("clone");
      var rangeObj = document.createRange();
      rangeObj.selectNodeContents(p);
      // 返回一个新的Range对象
      var cloneObj = rangeObj.cloneRange();
      // Range对象无法作为Node添加到节点中,故下面的appendChild方法会报错
      // p.appendChild(cloneObj);
      console.log(cloneObj.toString());

  }
  </script>
  <p id="clone">这是一个将被克隆的元素</p>
  <button onclick="cloneP()">克隆</button>
</body>
<!-- cloneContents Demo -->
<body>
  <script>
  function cloneAppend() {
      var rangeObj = document.createRange();
      var p = document.getElementById("p");
      // rangeObj.selectNode(p); /*选取整个p节点*/
      rangeObj.selectNodeContents(p); /*选取p节点中的所有子节点*/
      var fragMent = rangeObj.cloneContents(); /*clone选取的内容(或节点),并返回DocumentFragMent对象*/
      p.appendChild(fragMent); /*往p节点中添加一个fragment*/
  }
  </script>
  <p id="p">克隆里面的内容并追加到该p元素中</p>
  <button onclick="cloneAppend()">克隆并追加</button>
</body>
<!-- extractContents Demo -->
<body>
  <script>
  function extractAppend(argument) {
      var src = document.getElementById("srcDiv");
      var distDiv = document.getElementById("distDiv");
      var rangeObj = document.createRange();
      rangeObj.selectNodeContents(src);
      /*若上方使用的是selectNode方法,则会将src的整个节点提取(剪切);若为selectNodeContents,则只提取(剪切)src节点中的内容部分*/
      var fragment = rangeObj.extractContents();
      /*若上方使用的是selectNode方法,则会将src的整个节点提取(剪切)至distDiv中;若为selectNodeContents,则只提取(剪切)src节点中的内容部分至distDiv中*/
      distDiv.appendChild(fragment);
  }
  </script>
  <!-- 内容源 -->
  <div id="srcDiv" style="background-color: #0fc; width: 300px; height: 50px;">将被提取的内容</div>
  <!-- 内容提取后的放置目标 -->
  <div id="distDiv" style="background-color: #0cf; width: 300px; height: 50px; font-weight: bold;"></div>
  <button onclick="extractAppend()">提取并追加</button>
</body>
Range对象之insertNode方法
  • insertNode(newNode):将newNode插入到Range(范围)起始点。
<!-- inserNode Demo -->
<body>
    <script>
    function insertB() {
        var p = document.getElementById("p");
        // 获得一个选择器
        var selection = document.getSelection();
        if (selection.rangeCount > 0) {
            // 获取选择器中的第一个range(选取范围)
            var rangeObj = selection.getRangeAt(0);
            // 在range范围起始位置插入整个p节点(<p id="p">这是一个<b>粗体</b></p>)
            rangeObj.insertNode(p);
        }
    }
    </script>
    <!-- 鼠标按下弹起后触发insertB函数 -->
    <p onmouseup="insertB()">这段文字中将被插入一个b元素,根据鼠标点击或选取范围(Range)的起始位置决定插入位置。</p>
    <p id="p">这是一个<b>粗体</b></p>
</body>
Range对象之compareBoundaryPoints方法
  • compareBoundaryPoints(how,sourceRange):比较sourceRange边界点与当前Range边界点的位置。
    • 返回值:如果当前范围的指定边界点位于 sourceRange 指定的边界点之前,则返回 -1。如果指定的两个边界点相同,则返回 0。如果当前范围的边界点位于 sourceRange 指定的边界点之后,则返回 1。
    • how参数:声明如何执行比较操作(即比较哪些边界点)。它的合法值是 Range 接口定义的常量。
      • Range.START_TO_START - 比较两个 Range 节点的开始点
      • Range.END_TO_END - 比较两个 Range 节点的结束点
      • Range.START_TO_END - 用 sourceRange 的开始点与当前范围的结束点比较
      • Range.END_TO_START - 用 sourceRange 的结束点与当前范围的开始点比较
<!-- compareBoundaryPoints Demo -->
<body>
    <script>
    function compare(argument) {
        var b = document.getElementById("b");
        var bRange = document.createRange();
        //这里也可以为selectNodeContents,因为浏览器表现的都是"粗体"这个文本对象,但代码不同,故可根据实际情况使用。
        bRange.selectNode(b);
        // 鼠标点击也是一种selection,即鼠标在左边点一下相当于在左边选择了,选择范围即点击位置
        var selection = document.getSelection();
        if (selection.rangeCount > 0) { /*选择的range数大于0*/
            var selRange = selection.getRangeAt(0); /*获取选取的第一个Range对象*/
            /*将bRange与selRange对象进行位置比较*/
            if (selRange.compareBoundaryPoints(Range.START_TO_END, bRange) <= 0) { /*bRange的开始位置与selRange的结束位置相比;若小于0,则表示selRange的结束位置在bRange的开始位置左边*/
                alert("选取的文字在指定节点(粗体节点)左边");
            } else if (selRange.compareBoundaryPoints(Range.END_TO_START, bRange) >= 0) { /*bRange的结束位置与selRange的开始位置相比;若大于0,表示selRange的开始位置大于bRange的结束位置,即表示selRange在bRange的右边*/
                alert("选取的文字在指定节点(粗体节点)右边");
            } else { /*这里省略了另外三种情况的判断*/
                alert("另外3中情况之一");
            }
        }
    }
    </script>
    <p>这段文字中有一个加粗的<b id="b">粗体</b>,为了比较选取范围(Range)在粗体这个节点的位置</p>
    <button onclick="compare()">比较</button>
</body>
Range对象之collapse、detach方法
  • collapse(toStart):将Range的边界点设置为重合(折叠);
    • true:toStart的值,表示Range的结束边界点设置为开始边界点的值;
    • false:toStart的值,表示Range的开始边界点设置为结束边界点的值;
  • detach():释放Range对象,无法针对释放后的Range对象操作,否则抛出INVALID_STATE_ERR错误;常用于释放已无作用的Range对象,提高脚本运行性能。

<small>detach():浏览器内核为Gecko的版本,从v15.0开始,该方法已失效。

<!-- collapse & detach Demo-->
<body>
    <script>
    var rangeObj = document.createRange();

    // 选取节点
    function selectObj() {
        rangeObj.selectNodeContents(document.getElementById("p")); /*选取p节点*/
    }
    // 取消选取,将collapse作为选择器使用
    function unSelectObj() {
        // 将range的结束边界点设置为开始边界点相同的值,即折叠。
        // 这里即使为false,也是取消选择range范围,因为false表示将开始边界点设置为结束边界点的值
        rangeObj.collapse(true);
    }
    // 显示选取的内容,selectObj的情况下,会显示p节点的所有子节点,即"待选取的对象";unSelectObj状态下,rangeObj无选取内容,alert结果为空。
    function showObj() {
        alert(rangeObj.toString());
    }

    // 释放Range对象,释放后无法对Range对象进行操作,否则抛出INVALID_STATE_ERR错误
    // detach方法在Gecko 15.0内核开始,操作没有任何效果。
    function detachRange() {
        rangeObj.detach();
    }

    function getRangeStartOffset(toStart) {
        var sel = document.getSelection();
        if (sel.rangeCount > 0) {
            var tmpRange = sel.getRangeAt(0);
            // 通过传入不同的toStart,观察startOffset的值;
            // toStart为true时,startOffset为range开始边界点的值;为false时,startOffset为range结束边界点的值。
            tmpRange.collapse(toStart);
            // 打印tmpRange在当前节点的起点开始位置;p节点中有三个子节点,startOffset的位置按当前节点计算,从0开始
            // startOffset的位置:0所1有2子3节4点5被6选7取8,9包10括11<b>0粗1体2</b>0这1个2节3点4
            console.log(tmpRange.startOffset);
        }
    }
    </script>
    <p id="p">所有子节点被选取,包括<b>粗体</b>这个节点</p>
    <button onclick="selectObj()">选取对象</button>
    <button onclick="unSelectObj()">取消选取</button>
    <button onclick="showObj()">显示对象</button>
    <button onclick="detachRange()">释放Range对象</button>
    <button onclick="getRangeStartOffset(false)">获取Range范围的开始点并打印在console中</button>
</body>

HTML5新增元素audio(音频)与video(视频)


audio元素
  • audio的属性:
    • autoplay:如果出现该属性,则音频在就绪后马上播放;
    • controls:如果出现该属性,则向用户显示控件,比如播放按钮;
    • src:要播放的音频的 URL;
    • loop:如果出现该属性,则每当音频结束时重新开始播放;
    • preload:如果出现该属性,则音频在页面加载时进行加载,并预备播放。如果使用 "autoplay",则忽略该属性。
vedio元素
  • vedio的属性:
    • autoplay:如果出现该属性,则视频在就绪后马上播放;
    • controls:如果出现该属性,则向用户显示控件,比如播放按钮;
    • src:要播放的视频的 URL;
    • loop:如果出现该属性,则每当视频结束时重新开始播放;
    • preload:如果出现该属性,则视频在页面加载时进行加载,并预备播放。如果使用 "autoplay",则忽略该属性;
    • height、width:定义视频的高度与宽度;
    • muted:规定视频的音频输出应该被静音;
    • poster:规定视频下载时显示的图像URL,或者在用户点击播放按钮前显示的图像URL。
source元素

为媒介元素(比如 <video> 和 <audio>)定义媒介资源。主要用途为允许您规定可替换的视频/音频文件供浏览器根据它对媒体类型或者编解码器的支持进行选择。该元素为媒介元素的子标签(即元素应放在媒介元素之内)。

  • 常用属性src,定义资源URL;
<!-- audio Demo-->
<body>
    <!-- 当autoplay存在时,preload(预加载)忽略 -->
    <!-- <audio src="../raw/1.mp3" controls="controls" preload="preload" autoplay="autoplay" loop="loop"></audio> -->
    <audio id="audio" src="../raw/1.mp3">您的浏览器不支持</audio>
    <button onclick="playPause()">播放/暂停</button>
    <script>
    // 若再全局变量中声明,须注意该节点是否已加载(浏览器从上往下逐步加载),否则会出现获取不到的情况。
    var audio = document.getElementById("audio");

    function playPause(argument) {
        if (audio.paused) { /*如果音乐为暂停状态*/
            // 播放音乐
            audio.play();
        } else {
            audio.pause();
        }
    }
    </script>
</body>

<!--video & source Demo-->
<body>
    <button onclick="playPause()">播放/暂停</button>
    <button onclick="bigger()">放大</button>
    <button onclick="smaller()">缩小</button>
    <!-- 一种文件格式的video,弊端:某些浏览器可能出现不支持对应的视频格式 -->
    <video src="../raw/movie.ogg" id="myControls">您的浏览器不支持</video>
    <script>
    var video = document.getElementById("myControls");

    // 播放暂停功能
    function playPause(argument) {
        if (video.paused) {
            video.play();
        } else {
            video.pause();
        }
    }
    // 放大视频窗口功能
    function bigger(argument) {
        video.width = 800; /*将video节点的宽度设置为800px*/
        video.height = 800; /*将video节点的高度设置为800px*/
    }
    // 缩小视频窗口功能
    function smaller(argument) {
        video.width = 100;
        video.height = 100;
    }
    </script>
    <!-- 根据浏览器支持的格式获取对应的资源文件 -->
    <video controls="controls">
        <!-- ogg格式 -->
        <source src="../raw/movie.ogg">
        <!-- mp4格式 -->
        <source src="../raw/movie.mp4">
    </video>
</body>

HTML5的拖放功能


<small>先了解这些知识(原理部分)
1.开始拖动某元素,会触发该元素的ondragstart事件;在这个事件里设置拖动的元素。
2.拖动的元素A经过元素B时,会触发B元素的ondragover事件;在这个事件里设置B元素允许被其他元素放入。
3.拖动的元素A在元素B上放手后,会出发B元素的ondrop事件;在这个事件里设置A元素放入到B元素的添加行为。
4.拖放中的数据传输,依赖于event中的dataTransfer对象。

网页元素之间的拖放
  • 拖放流程
    1. 开始拖动,在被拖动的元素上调用ondragstart监听事件;
    2. 设置拖动数据,在ondragstart事件中,通过事件的dataTransfer设置拖放数据(setData方法);
    3. 设置拖放位置,在拖放目标位置,设置元素允许被其他元素放入,通过ondragover事件避免浏览器默认方式(不允许元素被其他元素放入)处理;
    4. 获取拖动的元素并将该元素放入目的位置元素,通过ondrop事件,完成拖放元素添加到目标元素的动作。
  • 实现方法(两种)
    • 通过JS实现
      获取拖动元素及目标位置元素,通过拖动元素A监听ondragstart事件,设置拖动数据;通过目标位置元素B监听ondragover和ondrop事件,设置允许拖入,并将A添加到B元素。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTML5网页中元素的拖放-通过JS实现</title>
    <style>
    div {
        float: left;
        height: 300px;
        width: 300px;
    }
    #box {
        background-color: #ECAD12;
    }
    #secBox {
        background-color: #34CA7E;
    }
    </style>
    <script>
    // 页面加载完成之后立即执行如下函数
    window.onload = function() {
            var box = document.getElementById("box");
            var secBox = document.getElementById("secBox");
            var dragImg = document.getElementById("dragImg");
            // 第一步:在被拖动的节点上使用ondragstart方法,表示开始拖动;同时设置拖动的数据
            dragImg.ondragstart = function(ev) {
                // 设置拖动的数据,"myData"表示一个types元素(可以理解为id),将被拖动数据放入目标位置时获取数据使用
                // "myData"会写入到dataTransfer对象的types键(该键下包含很多类型,myData表示一种类型)中
                // 数据的传输是通过event的dataTransfer来实现的
                // ev.target.id:事件目标的id,这里指的是dragImg对象的元素id属性值
                ev.dataTransfer.setData("myData", ev.target.id);
            }
            // 第二步:ondragover规定在何处放置被拖动数据,默认情况下,无法将元素/数据放到其他数据中
            // 此处自定义ondragover事件,阻止浏览器使用默认处理方式,即允许其他元素放到该元素中
            box.ondragover = unDefault;
            secBox.ondragover = unDefault;
            // 第三步:放置数据时会出发ondrop事件,故通过重写该事件的处理方式达到放置目的。
            box.ondrop = imgDrag;
            secBox.ondrop = imgDrag;
            // ondragover调用的方法:避免浏览器对数据的默认处理方式
            function unDefault(event) {
                // 避免浏览器对数据的默认处理方式的方法
                event.preventDefault();
            }
            // ondrop调用的方法:获取拖动数据,放入到目的地节点
            function imgDrag(ev) {
                showObj(ev.dataTransfer, "dataTransfer");
                showObj(ev.dataTransfer.types, "types"); //types中会显示setData设置的数据
                showObj(ev.dataTransfer.files, "files"); //files的length若大于0,表示有有文件拖放行为;这里是img元素,所以该属性的length=0;
                // 网页元素拖放实际测试发现,drop事件不改变默认处理方式,也能拖放至目的地;前提是dragover事件中需避免默认处理。ondrop的默认处理方式是以链接形式打开。
                // 本地资源拖放则必须使用该方法避免默认处理方式执行
                ev.preventDefault();
                // 获取设置的数据标记(id)
                var myData = ev.dataTransfer.getData("myData");
                // 通过数据标记获得一个节点
                var myImg = document.getElementById(myData);
                //将节点加入追加到拖放目的地节点中 ev.target表示事件目标,即拖放目的地节点
                ev.target.appendChild(myImg);
            }
        }
        // 显示对象key和value信息
    function showObj(obj, flag) {
        for (var key in obj) { /*obj为键值对*/
            str += key + ":" + obj[key] + " -- " + flag + "<br/>";
        }
        var objDiv = document.getElementById("objDiv");
        objDiv.innerHTML = str + "<br/>";
    }
    </script>
</head>
<body>
    <!-- 被拖放数据放置的区域1 -->
    <div id="box"></div>
    <!-- 被拖放数据放置的区域2 -->
    <div id="secBox"></div>
    <img id="dragImg" src="../raw/submit.gif">
    <p id="objDiv"></p>
</body>
</html>
* *通过属性实现*

在拖动元素中设置ondragstart属性,设置事件调用的方法drag(event);在目标位置元素中设置ondragover与ondrop属性,并以此设置allowDrag(event)与allDrop(event)方法。

<small>方法名可自定义,参数必须是event</small>

  ```html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>HTML5网页中元素的拖放-通过属性实现</title>
<style>
div {
width: 500px;
height: 300px;
float: left;
}
#box {
background-color: #EABD14;
}
#secBox {
background-color: #CE30C6;
}
</style>
<script>
var str = "";
// 第一步:被拖放数据设置数据,开始拖放
function drag(ev) {
// "test"会写入到dataTransfer对象的types键中
ev.dataTransfer.setData("test", ev.target.id);
}
// 第二步:拖放目的地避免默认处理方式(不允许其他元素放到自身元素中,避免后允许),决定被拖放数据的位置
function dragOver(ev) {
ev.preventDefault();
}
// 第三步:放置数据触发的事件,将设置的数据获取,并将得到的数据获取节点后追加到目的地节点
function boxDrop(ev) {
showObj(ev.dataTransfer, "dataTransfer");
showObj(ev.dataTransfer.types, "types"); //types中会显示setData设置的数据
showObj(ev.dataTransfer.files, "files"); //files的length若大于0,表示有有文件拖放行为
// showObj(ev.dataTransfer.files);
// 实际测试发现,drop事件不改变默认处理方式,也能拖放至目的地;前提是dragover事件中需避免默认处理
// 本地资源拖放则必须使用该方法避免默认处理方式执行
ev.preventDefault();
var img = document.getElementById(ev.dataTransfer.getData("test"));
ev.target.appendChild(img);
}
// 显示对象key和value信息
function showObj(obj, flag) {
for (var key in obj) { /obj为键值对/
str += key + ":" + obj[key] + " -- " + flag + "
";
}
var objDiv = document.getElementById("objDiv");
objDiv.innerHTML = str + "
";
}
</script>
</head>
<body>

<div ondragover="dragOver(event)" ondrop="boxDrop(event)" id="box"></div>
<div ondragover="dragOver(event)" ondrop="boxDrop(event)" id="secBox"></div>

<img draggable="true" id="gif" ondragstart="drag(event)" src="../raw/submit.gif">
<div id="objDiv"></div>
</body>
</html>


#####本地资源拖放至网页(以图片为例)
  * **拖放流程**
    1. 设置拖放位置,在拖放目标位置,设置元素允许被其他元素放入,通过ondragover事件避免浏览器默认方式(不允许元素被其他元素放入)处理;
    2. 获取拖动的元素并将该元素放入目的位置元素,通过ondrop事件,完成拖放元素添加到目标元素的动作。

  > <small>注:
1.因为是本地资源的拖放,所以没有元素需要ondragstart事件;
2.获取拖动数据的方法:var file = event.dataTransfer.files[0];files是一个数组,访问拖动的第一个文件,所以索引值为0;
3.创建一个FileReader容器读取文件:var fileReader = new FileReader();
4.设置文件读取进度的监听事件:fileReader.onload = allDrop(readerEvent);读取完成后执行allDrop函数;
5.在allDrop文件中使用readerEvent.target.result属性获取读取结果数据并将输入添加到目标容器(拖放目的地)中;target为当前event的filereader对象。
6.开始读取文件:fileReader.readAsDataURL(file),将文件读取为一串Data URL字符串。`读取文件的方法请根据文件类型决定`。

  * **实现方法(两种)**
    * *通过JS实现*
通过目标位置元素监听ondragover和ondrop事件,设置允许拖入,读取拖动的本地资源数据并将其添加到B元素中。
```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HTML5之本地资源拖放到网页-通过JS实现</title>
    <style>
    #imgContainer {
        background-color: #ccc;
        height: 300px;
        width: 300px;
    }
    </style>
    <script>
    // 监听页面加载完成后执行如下函数
    window.onload = function() {
        // 获取装载图片的容器
        var imgContainer = document.getElementById("imgContainer");
        // 设置图片加载的位置,取消默认浏览器行为;即允许元素放入其他元素
        imgContainer.ondragover = function(ev) {
            ev.preventDefault();
        }
        // 放置图片
        imgContainer.ondrop = function(ev) {
            // 本地资源拖放,必须禁止浏览器默认行为(默认行为:以链接形式打开)
            ev.preventDefault();
            // 获取第一个文件
            var uploadFile = ev.dataTransfer.files[0];
            var fileReader = new FileReader();
            // 文件成功读取完成后执行如下函数
            fileReader.onload = function(subEv) {
                    // target为一个FileReader对象,图片链接就是该对象下result键对应的值
                    imgContainer.innerHTML = "<img src=\"" + subEv.target.result + "\">"
                }
                // 读取图片为DataUrl格式,若为其他类型资源,请根据实际情况选择fileReader的读取文件方法
            fileReader.readAsDataURL(uploadFile);
        }
    }
    </script>
</head>
<body>
    <div id="imgContainer"></div>
</body>
</html>
* *通过属性实现*

在目标位置元素中设置ondragover与ondrop属性,并以此设置allowDrag(event)与allDrop(event)方法。

<small>方法名可自定义,参数必须是event</small>

  ```html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>HTML5之本地资源拖放到网页-通过属性实现</title>
<style>
#imgContainer {
background-color: #ccc;
height: 300px;
width: 300px;
}
</style>
</head>
<body>
<script>
var str = "";
function allowDrag(ev) {
ev.preventDefault();
}
function allDrop(ev) {
// 本地资源拖放则必须使用该方法避免默认处理方式执行
ev.preventDefault();
showObj(ev.dataTransfer, "dataTransfer");
showObj(ev.dataTransfer.types, "types");
showObj(ev.dataTransfer.files, "files");
// 可以获取到files文件列表第一个文件的文件名、最后修改时间、大小、类型等
showObj(ev.dataTransfer.files[0], "file");

    // 从File数组中获取第一个File文件
    var uploadFile = ev.dataTransfer.files[0];
    // 创建一个文件读取器
    var fileReader = new FileReader();
    // 数据读取成功完成时触发
    fileReader.onload = function(subEv) {
        showObj(subEv.target); /*target 是一个FileReader对象*/
        // subEv.target.result是一个base64加密的被拖放图片的地址
        ev.target.innerHTML = "<img src=\"" + subEv.target.result + "\">"
    }

    // 将文件读取为一串Data URL字符串,将小文件以一种特殊格式的URL地址直接读入页面。小文件指图像与html等格式的文件。
    fileReader.readAsDataURL(uploadFile);
}
// 显示对象key和value信息
function showObj(obj, flag) {
    for (var key in obj) { /*obj为键值对*/
        str += key + ":" + obj[key] + " -- " + flag + "<br/>";
    }

    var objDiv = document.getElementById("objDiv");
    objDiv.innerHTML = str + "<br/>";
}
</script>
<div ondragover="allowDrag(event)" ondrop="allDrop(event)" id="imgContainer"></div>
<div id="objDiv"></div>

</body>
</html>


##canvas元素的基本使用
***
#####canvas元素
只是一个图形容器,必须通过JS来绘制图形;可以绘制各种路径、图形、图像、文字等。
> <small>注:所有绘制均须在画布只能,超出画布范围将无法绘制。

  * ***canvas的创建方式(两种)***
    * 通过JS创建:`document.body.innerHTML = "<canvas id=\"canvas\">您的浏览器不支持</canvas>"`
    * 直接创建:`<canvas id="canvas">您的浏览器不支持</canvas>`
  * ***canvas的2d渲染模式下的应用***
    * *绘制矩形*
      1. 获取画布:`var canvas = document.getElementById("canvas");`
      2. 获取2d模式上下文:`var ctx = canvas.getContext("2d");`
      3. 设置填充样式:`ctx.fillStyle = "rgba(255,255,0,0.5)"`,值也可以为`#ff0、yellow`格式;
      4. 绘制矩形:`ctx.fillRect(x,y,width,height);`
    * *绘制图片*
      1. 获取画布:`var canvas = document.getElementById("canvas");`
      2. 获取2d模式上下文:`var ctx = canvas.getContext("2d");`
      3. 创建图片对象:`var img = new Image()`,设置图片路径:`img.src="xxx.jpg"`;图片对象也可从网页元素中获取;
      4. 监听图片加载完成事件:`img.onload = function(event){...}`
      5. 在onload的函数体内执行`ctx.drawImage(img,0,0)`方法,该方法有多种参数类型,可参考API

> 更多Canvas的使用可查阅Mozilla提供的API:[点击查看](https://developer.mozilla.org/en-US/docs/Web/API)

```html
<!-- canvas demo-->
<body>
    <script>
    var canvas, ctx;
    window.onload = function() {
        getCanvas();
        // fillRect();
        drawImg();
    }

    function getCanvas() {
        // 通过js创建canvas
        // document.body.innerHTML = "<canvas id=\"canvas\"></canvas>";
        // 获取canvas
        canvas = document.getElementById("canvas");
        if (canvas == null) { /*canvas获取失败的情况下,返回false*/
            return false;
        }
        // 通过2d渲染画图,获得一个上下文
        ctx = canvas.getContext("2d");
    }

    function fillRect() {
        ctx.fillStyle = "#ff0000"; /*绘图颜色*/
        ctx.rotate(45 * Math.PI / 180); /*顺时针45度*/
        // ctx.scale(2, 0.5); /* x*2,y*0.5 坐标与长宽都会根据这个因子变化*/
        ctx.fillRect(450, 0, 50, 50); /*绘制一个矩形,参数分别是x,y,width,height*/

    }

    function drawImg() {
        var img = new Image();
        // 当img成功读取完成时,执行下方函数
        img.onload = function(ev) {
            // 若图片大于画布大小,则只会绘画画布大小部分的图片
            ctx.drawImage(img, 0, 0);
        }
        img.src = "../raw/1.jpg";

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

推荐阅读更多精彩内容

  • 接上 关于HTML/HTML5(一)//www.greatytc.com/p/33fc7840c079 学...
    Amyyy_阅读 778评论 0 4
  • H5 meta详解 viewport width:控制 viewport 的大小,可以指定的一个值,如果 600,...
    FConfidence阅读 800评论 0 3
  • +概述:HTML5是W3C 与 WHATWG 合作的结果。 新特性:1)canvas:用于绘画;2)video/a...
    南山伐木阅读 222评论 0 0
  • HTML5拖放(Drag 和 Drop) 拖放(Drag 和 drop)是 HTML5 标准的组成部分。 拖放 拖...
    GreenHand1阅读 345评论 0 0
  • 1.htm5新特性 1.语义化标签 1.1.htm5新特性 1.2.新选着器### 1.3 获取class列表属性...
    believedream阅读 527评论 0 0