video、audio属性及事件的使用

因为videoaudio属性大致相同,直接合并在一起。

另外简单记录一下H5所包含的新特性。

HTML5 中的一些有趣的新特性:

  • 用于绘画的 canvas 元素
  • 用于媒介回放的 video 和 audio 元素(video支持MP4,WebM 和 Ogg三种格式;audio支持MP3,Ogg和Wav; 浏览器兼容上不支持 IE8及以下版本浏览器)
  • 对本地离线存储的更好的支持
  • 新的特殊内容元素,比如 article、footer、header、nav、section
  • 新的表单控件,比如 calendar、date、time、email、url、search

1、属性

  • controls="nodownload" 不支持下载
  • controls="nofullscreen" 不支持全屏
  • autoplay 视频打开后自动播放
  • loop 视频结束后循环播放
  • preload 视频打开后进入预加载模式,不自动播放.若同时设置了autoplay属性,则该属性会被忽略
  • muted 设定默认静音播放,可手动开启
  • poster 贴图, 即打开视频后会在视频显示框内以此图片作为封面

  • currentSrc 获取当前音视频的资源路径
  • currentTime 获取当前音视频播放的时间(即当前播放到的时间位置)
  • duration 获取当前音视频的时间长度
  • volume 获取当前音视频的音量
  • heightwidth 获取当前音视频的宽高尺寸

  • 备用地址切换(如下代码块),写入多个 source后会从第一个source进行加载,若第一个source加载失败则会自动进行切换
<video controls autoplay width="400" height="300" id="_source">
    <source src="test3.mp4" type="video/mp4" />
    <source src="test9.mp4" type="video/mp4" />
    <source src="test-2.mp4" type="video/mp4" />
  </video>
  <script>

分界线表明上方内容属于标签属性,同时适用于进行标签上赋值使用及进行dom操作,中间内容适用于dom操作,下方则是代码编写的方式,具体一些使用在下方的学习所写的Demo源码中写到

2、事件

videoaudio 的事件基本一致,其实根据以往学习的内容,其事件有点类似于一个视频的生命周期,它拥有各个不同时间点的触发事件以及出现各种情况的触发事件,通过addEventListener的方式进行监听,即可在该事件出发时做出相应的处理。详细用法我也放在下面的源码里面了,会有相应注释进行解释。

3、Demo源码

首先源码没有引用jquery,另外呢静态资源是根据自己需要可进行替换的。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>

        <header>
            <h1>这是HEADER</h1>
        </header>
        <section>这是SECTION</section>
        <nav>这是NAV</nav>

        <article>这是ARTICLE,下面是视频组件学习</article>
        <div id="videoOper">
            <button type="button" onclick="selectSRC(1)">视频一</button>
            <button type="button" onclick="selectSRC(2)">视频二</button>
        </div>
        <div id="video_demo">
            <video id="video1" width="800" height="500" controls="controls" preload="auto" controlslist="nodownload nofullscreen"
             style="background-color: darkblue;">
                <source src="./Material/videoDemo.mp4" type="video/mp4">
                Your browser does not support the video tag.
                </source>
            </video>
            <img id="adver" src="Material/adv.png">
        </div>
        <div id="videoOper">
            <button type="button" onclick="makeBig()">放大</button>
            <button type="button" onclick="makeSmall()">缩小</button>
            <button type="button" onclick="getTime()">记录时间</button>
            <button type="button" onclick="getSrc()">资源路径</button>
            <button type="button" onclick="makeFront()">快进5s</button>
            <button type="button" onclick="makeBack()">快退5s</button>
        </div>

        <div id="data">
            <table border="0" cellspacing="10" style="border-collapse: collapse; margin: 1rem auto;">

                <tr>
                    <td>时间显示</td>
                    <td>
                        <input type="text" id="TIMERECORDS" value="" />
                    </td>
                </tr>
                <tr>
                    <td>路径显示</td>
                    <td>
                        <input type="text" id="SRCRECORDS" value="" />
                    </td>
                </tr>
            </table>
        </div>

        <footer>
            <h1>这是FOOTER</h1>
        </footer>

        <script type="text/javascript">
            var _self = this;
            var videoDOM = document.getElementById("video1")
            var imgDOM = document.getElementById("adver")
            var timeDOM = document.getElementById("TIMERECORDS");
            var srcDOM = document.getElementById("SRCRECORDS");

            // 放大
            function makeBig() {
                console.log("makeBig");
                let initwidth = videoDOM.width;
                let initheith = videoDOM.height;
                if (initwidth == 1000) {
                    alert("尺寸过大")
                } else {
                    videoDOM.width = initwidth + 200;
                    videoDOM.height = initheith + 100;
                    _self.caculate();
                }
            }

            // 缩小
            function makeSmall() {
                console.log("makeSmall");
                let initwidth = videoDOM.width;
                let initheith = videoDOM.height;
                console.log(initwidth)
                console.log(initheith)
                if (initwidth == 400) {
                    alert("尺寸过小")
                } else {
                    videoDOM.width = initwidth - 200;
                    videoDOM.height = initheith - 100;
                    _self.caculate();
                }
            }

            // 获取当前播放时间
            function getTime() {
                let timeValue = videoDOM.currentTime;
                timeDOM.value = timeValue + "s";
            }

            // 获取当前视频SRC
            function getSrc() {
                let srcValue = videoDOM.currentSrc;
                srcDOM.value = srcValue;
            }

            // 快进
            function makeFront() {
                let timeValue = videoDOM.currentTime;
                if (videoDOM.duration - timeValue < 5) {
                    alert("视频剩余时长不足5s")
                } else {
                    videoDOM.currentTime = timeValue + 5;
                }
            }

            // 快退
            function makeBack() {
                let timeValue = videoDOM.currentTime;
                if (timeValue - 5 < 0) {
                    videoDOM.currentTime = 0;
                } else {
                    videoDOM.currentTime = timeValue - 5;
                }
            }

            // 切换视频
            function selectSRC(params) {
                if (params == 1) {
                    videoDOM.src = "http://127.0.0.1:8848/H5_CSS3_JS/Material/videoDemo.mp4";
                } else {
                    videoDOM.src = "http://127.0.0.1:8848/H5_CSS3_JS/Material/videoDemo2.mp4";
                }
            }

            // 计算广告图大小及位置,以保持居中
            function caculate() {
                let imgWidth = videoDOM.width / 2;
                let imgHeight = videoDOM.height / 2;
                console.log(imgWidth)
                console.log(imgHeight)
                imgDOM.style.width = imgWidth + "px";
                imgDOM.style.height = imgHeight + "px";
                imgDOM.style.top = imgHeight - imgHeight / 2 + "px";
            }


            // 以下是video的事件,有点类似于生命周期

            // 1、loadstart: 视频查找。浏览器开始寻找指定音/视频时,即加载过程开始时
            videoDOM.addEventListener('loadstart', function(e) {
                console.log("视频元数据开始加载!");
                console.log(e);
                _self.caculate();
                console.log("此时还没有视频时长--->", videoDOM.duration)
            })

            // 2、durationchange: 时长变化。即指定音/视频的时长数据改变,变化为音/视频的实际时长
            videoDOM.addEventListener('durationchange', function(e) {
                console.log("视频时长已刷新");
                console.log(e);
                console.log("刷新后的视频时长--->", videoDOM.duration);

                // 3、loadedmetadata: 元数据已加载,
                videoDOM.addEventListener('loadedmetadata')
                console.log('视频的元数据已加载');
                console.log(e);
            })

            // 4、loadeddata: 视频下载监听。当前帧的数据已加载,但是没有足够数据播放下一帧时触发
            videoDOM.addEventListener('loadeddata', function(e) {
                console.log("当前帧数据可用");
                console.log(e);
            })

            // 5、progress: 浏览器下载监听。浏览器正在下载音/视频时触发
            videoDOM.addEventListener('progress', function(e) {
                console.log("视频正在下载中");
                console.log(e);
            })

            // 6、canplay: 可播放监听。浏览器预计能够播放指定的音/视频时触发
            videoDOM.addEventListener('canplay', function(e) {
                console.log("当前视频可进行播放");
                console.log(e);
            })

            // 7、canplaythrough: 可流畅播放。浏览器预计能够在不停下来进行缓冲的情况下持续播放指定的音频/视频时触发
            videoDOM.addEventListener('canplaythrough', function(e) {
                console.log("当前视频可流畅播放");
                console.log(e);
            })

            // 8、play: 播放监听。
            videoDOM.addEventListener('play', function(e) {
                console.log("当前视频正在播放中");
                console.log(e);
                imgDOM.style.display = "none";
            })

            // 9、pause: 暂停监听。
            videoDOM.addEventListener('pause', function(e) {
                console.log("当前视频已暂停");
                console.log(e);
                _self.caculate();
            })

            // 10、seeking: 查找开始。当用户开始移动/跳跃到音/视频中新的位置时触发
            videoDOM, addEventListener('seeking', function(e) {
                alert("移动了进度条");
                console.log(e);
            })

            // 11、seeked: 查找结束。当用户已经移动到新位置时触发
            videoDOM.addBehavior('seeked', function(e) {
                console.log("进度条移动到新位置了");
                console.log(e);
            })

            // 12、waiting: 视频加载等待。当视频由于需要缓冲下一帧而停止、等待时触发
            videoDOM.addEventListener('waiting', function(e) {
                console.log("视频正在加载、等待");
                console.log(e);
            })

            // 13、playing: 当视频因缓冲而暂停或停止后已就绪时触发
            videoDOM.addEventListener('playing', function(e) {
                console.log("正在进行视频缓冲");
                console.log(e);
            })

            // 14、timeupdate: 目前播放位置已更改时,播放时间更新
            videoDOM.addEventListener('timeupdate', function(e) {
                console.log('播放位置变更,时间已更改');
                console.log(e);
                console.log("当前时间节点为", videoDOM.currentTime);
            })

            // 15、ended: 播放结束
            videoDOM.addEventListener('ended', function(e) {
                console.log("视频播放已结束");
                console.log(e);
            })

            // 16、error: 播放错误
            videoDOM.addEventListener('error', function(e) {
                console.log("视频出错了");
                console.log(e);
            })

            // 17、volumechange: 当音量变更时
            videoDOM.addEventListener('volumechange', function(e) {
                console.log("音量变更了");
                console.log(e);
            })

            // 18、stalled: 当浏览器尝试获取媒体数据,但数据不可用时吃法
            videoDOM.addEventListener('stalled', function(e) {
                console.log("媒体数据不可用");
                console.log(e);
            })

            // 19、ratechange: 当视频播放速度收到更改时
            videoDOM.addEventListener('ratechange', function(e) {
                console.log("视频播放速度已更改");
                console.log(e);
            })
        </script>
    </body>
</html>



<style type="text/css">
    header,
    section,
    nav,
    article,
    footer {
        text-align: center;
    }

    article {
        margin: 30px 0 10px 0;
        font-size: 1.25rem;
        font-weight: bold;
        color: mediumblue;
    }

    #video_demo {
        position: relative;
    }

    #video_demo,
    #videoOper {
        display: flex;
        flex-direction: row;
        justify-content: center;
    }

    #videoOper {
        margin: 0.625rem 0;
    }

    #adver {
        position: absolute;
    }
</style>

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