使用原生js,写个性网页视频播放器

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        html,
        body,
        div,
        span,
        applet,
        object,
        iframe,
        h1,
        h2,
        h3,
        h4,
        h5,
        h6,
        p,
        blockquote,
        pre,
        a,
        abbr,
        and,
        address,
        cite,
        code,
        del,
        dfn,
        em,
        img,
        ins,
        kbd,
        q,
        s,
        samp,
        small,
        strike,
        strong,
        sub,
        sup,
        tt,
        var,
        b,
        u,
        i,
        dl,
        dt,
        dd,
        ol,
        ul,
        li,
        fieldset,
        form,
        label,
        legend,
        table,
        caption,
        tbody,
        tfoot,
        thead,
        tr,
        th,
        td,
        article,
        aside,
        canvas,
        details,
        embed,
        figure,
        figcaption,
        footer,
        header,
        hgroup,
        menu,
        nav,
        output,
        ruby,
        section,
        summary,
        time,
        mark,
        audio,
        video,
        input,
        textarea,
        select {
            background: transparent;
            border: 0;
            font-size: 100%;
            margin: 0;
            outline: 0;
            padding: 0;
            vertical-align: baseline
        }

        article,
        aside,
        details,
        figcaption,
        figure,
        footer,
        header,
        hgroup,
        menu,
        nav,
        section {
            display: block
        }

        body {
            line-height: 1
        }

        abbr[title],
        dfn[title] {
            border-bottom: 1px dotted;
            cursor: help
        }

        blockquote,
        q {
            quotes: none
        }

        blockquote:before,
        blockquote:after,
        q:before,
        q:after {
            content: none
        }

        del {
            text-decoration: line-through
        }

        hr {
            background: transparent;
            border: 0;
            clear: both;
            color: transparent;
            height: 1px;
            margin: 0;
            padding: 0
        }

        mark {
            background-color: #ffffb3;
            font-style: italic
        }

        input,
        select {
            vertical-align: middle
        }

        ins {
            background-color: red;
            color: white;
            text-decoration: none
        }

        ol,
        ul {
            list-style: none
        }

        table {
            border-collapse: collapse;
            border-spacing: 0
        }

        a {
            text-decoration: none;
        }

        body {
            margin: 0;
            padding: 0;
            background: url(images/bg.jpg) repeat;
        }

        .jp-video {
            font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
            position: relative;

            -webkit-box-shadow: 0px 0px 20px rgba(0, 0, 0, .3);
            -moz-box-shadow: 0px 0px 20px rgba(0, 0, 0, .3);
            box-shadow: 0px 0px 20px rgba(0, 0, 0, .3);
            background: #000;
        }

        .jp-video-360p {
            width: 570px;
            margin: 100px auto;
        }

        .jp-video-full {
            width: 480px;
            height: 270px;
            position: static !important;
            position: relative;
        }

        .jp-video-full .jp-jplayer {
            top: 0;
            left: 0;
            position: fixed !important;
            position: relative;
            /* Rules for IE6 (full-screen) */
            overflow: hidden;
            z-index: 1000;
        }

        .jp-video-full .jp-gui {
            position: fixed !important;
            position: static;
            /* Rules for IE6 (full-screen) */
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            z-index: 1000;
        }

        .jp-video-full .jp-interface {
            position: absolute !important;
            position: relative;
            /* Rules for IE6 (full-screen) */
            bottom: 0;
            left: 0;
            z-index: 1000;
        }

        .jp-interface {
            position: relative;
            width: 100%;
            height: 35px;

            background-image: -webkit-linear-gradient(top, rgb(242, 242, 242), rgb(209, 209, 209));
            background-image: -moz-linear-gradient(top, rgb(242, 242, 242), rgb(209, 209, 209));
            background-image: -o-linear-gradient(top, rgb(242, 242, 242), rgb(209, 209, 209));
            background-image: -ms-linear-gradient(top, rgb(242, 242, 242), rgb(209, 209, 209));
            background-image: linear-gradient(top, rgb(242, 242, 242), rgb(209, 209, 209));
            filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, StartColorStr='#f2f2f2', EndColorStr='#d1d1d1');

            -webkit-box-shadow: inset 0px 1px 0px #f7f7f7,
                inset 0px -1px 0px #e2e2e2;
            -moz-box-shadow: inset 0px 1px 0px #f7f7f7,
                inset 0px -1px 0px #e2e2e2;
            box-shadow: inset 0px 1px 0px #f7f7f7,
                inset 0px -1px 0px #e2e2e2;
        }

        div.jp-controls-holder {
            clear: both;
            width: 570px;
            margin: 0 auto;

            position: relative;
            overflow: hidden;
        }

        a.jp-play,
        a.jp-pause {
            width: 40px;
            height: 35px;
            float: left;
            text-indent: -9999px;
            outline: none;
        }

        a.jp-play {
            background: url(images/sprite.png) 0 0 no-repeat;
        }

        a.jp-pause {
            background: url(images/sprite.png) -40px 0 no-repeat;
            display: none;
        }

        #separator {
            background-image: url(images/separator.png);
            background-repeat: no-repeat;
            width: 2px;
            height: 35px;
            float: left;
            margin-top: 7px;
            margin-right: 10px;
        }

        .jp-progress {
            background: #706d6d;

            -webkit-border-radius: 5px;
            -moz-border-radius: 5px;
            border-radius: 5px;

            -webkit-box-shadow: inset 0px 1px 4px rgba(0, 0, 0, .4),
                0px 1px 0px rgba(255, 255, 255, .4);
            -moz-box-shadow: inset 0px 1px 4px rgba(0, 0, 0, .4),
                0px 1px 0px rgba(255, 255, 255, .4);
            box-shadow: inset 0px 1px 4px rgba(0, 0, 0, .4),
                0px 1px 0px rgba(255, 255, 255, .4);

            width: 280px;
            height: 10px;
            float: left;
            margin-top: 13px;
        }

        .jp-seek-bar {
            width: 0px;
            height: 100%;
            cursor: pointer;
        }

        .jp-seeking-bg {
            background: #575555;
            -webkit-border-radius: 5px;
            -moz-border-radius: 5px;
            border-radius: 5px;
        }

        .jp-play-bar {
            background: url(images/play-bar.png) left repeat-x;
            width: 0px;
            height: 10px;
            position: relative;
            z-index: 9999;

            -webkit-border-radius: 5px;
            -moz-border-radius: 5px;
            border-radius: 5px;
        }

        .jp-play-bar span {
            position: absolute;
            top: -3px;
            right: -12px;

            background: url(images/handle.png) no-repeat center;
            width: 16px;
            height: 17px;
        }

        .jp-current-time,
        .jp-duration {
            font-size: 11px;
            font-family: Arial;
            color: #444444;
            margin-top: 13px;
            float: left;
        }

        .jp-current-time {
            float: left;
            display: inline;
        }

        .jp-duration {
            float: left;
            display: inline;
            text-align: right;
        }

        .jp-video .jp-current-time {
            margin-left: 10px;
        }

        .jp-video .jp-duration {
            margin-right: 10px;
        }

        .time-sep {
            float: left;
            margin: 13px 3px 0 3px;

            font-size: 11px;
            font-family: Arial;
            color: #444444;
        }

        .jp-video a.jp-mute,
        .jp-video a.jp-unmute {
            text-indent: -9999px;
            float: left;

            height: 35px;
            outline: none;
        }

        .jp-mute {
            float: left;
            background: url(images/sprite.png) -80px 0 no-repeat;
            margin-top: 1px;
            margin-left: -10px;
            width: 35px;
        }

        a.jp-unmute {
            background: url(images/sprite.png) -115px 0 no-repeat;
            margin-top: 1px;
            margin-left: -13px;
            display: none;
            width: 38px;
        }

        .jp-volume-bar {
            float: left;
            margin-top: 13px;
            margin-right: 10px;
            overflow: hidden;
            width: 70px;
            height: 10px;
            cursor: pointer;

            background: #706d6d;

            -webkit-border-radius: 5px;
            -moz-border-radius: 5px;
            border-radius: 5px;

            -webkit-box-shadow: inset 0px 1px 4px rgba(0, 0, 0, .4),
                0px 1px 0px rgba(255, 255, 255, .4);
            -moz-box-shadow: inset 0px 1px 4px rgba(0, 0, 0, .4),
                0px 1px 0px rgba(255, 255, 255, .4);
            box-shadow: inset 0px 1px 4px rgba(0, 0, 0, .4),
                0px 1px 0px rgba(255, 255, 255, .4);
        }

        .jp-volume-bar-value {
            background: rgba(112, 109, 109, 1);
            width: 0px;
            height: 10px;
            position: relative;
            min-width: 11px;
        }

        .jp-volume-bar-value span {
            position: absolute;
            top: 0px;
            right: 0px;

            background: url(images/volume.png) no-repeat center;
            width: 11px;
            height: 10px;
        }

        .jp-full-screen {
            background: url(images/sprite.png) -150px 0 no-repeat;
            float: left;
            width: 40px;
            height: 35px;
            text-indent: -9999px;
            margin-left: -10px;
            outline: none;
        }

        .jp-restore-screen {
            background: url(images/sprite.png) -150px 0 no-repeat;
            float: left;
            width: 40px;
            height: 35px;
            text-indent: -9999px;
            margin-left: -15px;
            outline: none;

        }

        .box {
            width: 500px;
            margin: 0 auto;
            position: relative;
        }

        #video {
            width: 100%;
        }
    </style>
</head>

<body>
    <div class="box">
        <video id="video">
            <!-- <source src="video/video.webm" /> -->
            <source src="video/downloadVideo(1).MP4">
        </video>
        <div class="jp-gui">
            <div class="jp-interface">
                <div class="jp-controls-holder">
                    <!--play and pause buttons-->
                    <a href="javascript:;" class="jp-play" tabindex="1" style="display: block;">play</a>
                    <a href="javascript:;" class="jp-pause" tabindex="1" style="display: none;">pause</a>
                    <span class="separator sep-1"></span>
                    <!--progress bar-->
                    <div class="jp-progress">
                        <div class="jp-seek-bar" style="width: 100%;">
                            <div class="jp-play-bar" style="width: 0%;"><span></span></div>
                        </div>
                    </div>
                    <!--time notifications-->
                    <div class="jp-current-time" style="padding: 0 2px 0 5px;">00:00</div>
                    <span class="time-sep">/</span>

                    <div class="jp-duration" style="padding: 0 5px 0 2px;">00:00</div>
                    <!--<span class="separator sep-2"></span>-->


                    <!--mute / unmute toggle-->
                    <!--<a href="javascript:;" class="jp-mute" tabindex="1" title="mute">mute</a>-->
                    <!--<a href="javascript:;" class="jp-unmute" tabindex="1" title="unmute" style="display: none;">unmute</a>-->

                    <!--volume bar-->
                    <div class="jp-volume-bar">
                        <div class="jp-volume-bar-value" style="width: 90%;"><span class="handle"></span></div>
                    </div>
                    <!--<span class="separator sep-2"></span>-->

                    <!--full screen toggle-->
                    <a href="javascript:;" class="jp-full-screen" tabindex="1" title="full screen">full screen</a>
                    <!--<a href="javascript:;" class="jp-restore-screen" tabindex="1" title="restore screen"-->
                    <!--style="display: none;">restore screen</a>-->

                </div>
                <!--end jp-controls-holder-->
            </div>
            <!--end jp-interface-->
        </div>
    </div>
</body>

</html>
<script src="js/index.js"></script>
var video = document.getElementById('video') //mp4
var jp_play = document.getElementsByClassName('jp-play')[0]; //播放按钮
var jp_pause = document.getElementsByClassName('jp-pause')[0]; //暂停按钮
var jp_seek_bar = document.getElementsByClassName('jp-seek-bar')[0]; //视频进度条
var jp_play_bar = document.getElementsByClassName('jp-play-bar')[0]; //视频进度条按钮
var jp_duration = document.getElementsByClassName('jp-duration')[0]; //视频总时长
var jp_current_time = document.getElementsByClassName('jp-current-time')[0]; //视频已加载时长
var jp_volume_bar = document.getElementsByClassName('jp-volume-bar')[0]; //音量进度条
var jp_volume_bar_value = document.getElementsByClassName('jp-volume-bar-value')[0]; //音量进度条按钮
var jp_full_screen = document.getElementsByClassName('jp-full-screen')[0]; //全屏
video.addEventListener('canplay', function () {
    // 1、视频播放
    jp_play.addEventListener('click', function () {
        video.play(); //视频播放方法
        jp_play.style.display = 'none';
        jp_pause.style.display = 'block';
    });
    // 2、视频暂停
    jp_pause.addEventListener('click', function () {
        video.pause(); //视频暂停方法
        this.style.display = 'none';
        jp_play.style.display = 'block';
    });
    //3、获取视频的总播放时长
    jp_duration.innerHTML = formatT(video.duration);
    //4、执行timeupdate (时间更新这个方法)
    video.addEventListener('timeupdate', function () {
        // 4.1 获取当前时间
        jp_current_time.innerHTML = formatT(video.currentTime)
        // 4.2 已经播放了多少时间
        var timer = video.currentTime / video.duration;
        // 4.3 设置视频进度条
        jp_play_bar.style.width = timer * 100 + '%';
    })
    // 5、点击 播放进度条改变播放速度
    jp_seek_bar.addEventListener('click', function (e) {
        e = e || window.event; //获取当前的实时事件
        // offset 距离父元素的点
        var scale = e.offsetX / this.offsetWidth;
        // 5.1正在播放的进度条
        jp_play_bar.style.width = scale * 100 + '%';
        // 5.1正在播放的进度条的实时时间
        jp_current_time.innerHTML = formatT(scale * video.duration);
        // 当前视频的播放进度
        video.currentTime = scale * video.duration;
    })

    // 6、音量进度条
    jp_volume_bar.addEventListener('click', function (e) {
        e = e || window.event;
        var scale = e.offsetX / this.offsetWidth;
        jp_volume_bar_value.style.width = scale * 100 + 'px';
        video.volume = scale;
        console.log(scale)
    })
    // 7.全屏幕
    jp_full_screen.addEventListener('click', function () {
        video.webkitRequestFullScreen();
    })
});
//封装时间函数
function formatT(time) {
    var m = Math.floor(time / 60); //分 
    m = m > 9 ? m : '0' + m;
    var s = Math.floor(time % 60); //秒
    s = s > 9 ? s : '0' + s;
    // return m + ':' + s;
    return `${m}:${s}`;
}

效果图:

 

autoscroll(true,false):当播放列表过长的时候,默认会自动显示滚动条。当该值设置为’true’的时候,会自动根据鼠标滚动播放列表。 displaywidth(number of pixes):设置显示区域的宽度,当设置的比较小的时候,播放列表会显示在显示区域的右侧而不是底部。 kenburns* (true,false): 用以实现在运动的时候实现kb效果(Ken Burns effect),注意,当图比较大,而且网速比较快的时候,建议打开,否则关闭。建议设置transition为"slowfade"来配合。 largecontrols (true,false): 设置该值为true用来放大控制区域的按钮。建议为视力不好的用户打开 logo* (url): 设置一个图片用来作为右上角的水印,支持所有图片格式,支持通明图层的png效果最佳。 overstretch* (true,false,fit,none): 设置图片/影片在显示区域的缩放。"true"等比例拉伸用来符合显示区域。"false"仅拉伸合显示区域。"fit"全屏显示。"none"显示原始大小。JW Media Player等默认为"fit",JW Image Rotator默认为"false" showdigits (true,false,total): 设置为"false"隐藏播放时间等信息用来节省控制区域的空间。设置为"total"用来显示全部时间。 showdownload (true,false):设置该值用来在控制区域显示下载按钮。链接到link所设置的地址。 showeq (true,false): 用来显示一个假的音频波动效果。当播放mp3的时候打设置该值可以得到很好的效果 showicons* (true,false): 用来显示或者隐藏显示区域中间的图片,JW Media Player等默认为true。JW Image Rotator默认为false; showvolume (true,false): 用来设置是否显示音量控制按钮 thumbsinplaylist (true,false): 设置列表中是否显示预览图 播放参数 autostart (true,false,muted): 设置为ture,页面加载完后会自动播放。设置为muted,会在静音模式下自动播放,并且显示区域中间有静音图标。bufferlength (number): 设置flv的缓存时间。默认为3秒 repeat* (true,false,list): 默认为flase,从当前播放位置播放到列表尾部后停止。设置为list会播放列表中所有的项目,设置为true会循环播放。 rotatetime* (number): 设置图片的显示时间。JW Media Player等默认为10秒,JW Image Rotator默认为5秒 shuffle* (true,false): 设置为false顺序播放,设置为true无序播 smoothing (true,false): 设置为false关闭视频平滑处理,推荐设置true用以得到更好效果。但对于大屏幕或者配置低的机器设置false是有好处的 start* (second): 在使用RTMP 或 HTTP 流媒体的时候(非常规的flv/mp3),使用该变量准确的定位开始位置。该参数设置在XSPE格式的列表中以便准且的设置文件的章节。 volume* (number): 设置音量,默认为80. 互动参数 audio* (url):用这个参数来添加一个mp3文件作为单独的音频,可以作为图片的背景音乐解说等。 bwfile (url):用以带宽检测的文件的地址,可以放一个图片,或者rtmp流媒体。可以在右键菜单中查看到贷款数值。 bwstreams (comma-separated list of bitrates): 和bwfile配合使用,根据带宽值来选择不同的文件。如:你要播放video.flv并且设置该项的值为100,250,500,1000,当播放器发现带宽为349kbps的时候,将会播放video_250.flv。所以他有一套有效的命名设置,他将会自动切换,哪怕是在采用播放列表的情况下。 callback (url):设置这个参数为服务端程序(php/asp)地址用来回传数据。在每个项播放和停止的时候会发送数据到服务器,以便在服务器端保存播放统计。 captions (url): 设置该值用以载入一个文本格式的文本作为字幕。播放器至支持SMIL格式和DVD的SRT格式的字幕。如果你的flv文件内置字体你可以设置该值为"captionate".如果你有多频道字幕,可以设置这个值为"captionate0", "captionate3"等。可以在列表中设置每一个项的值。 enablejs* (true,false): 设置为true打开对javascript的支持。仅支持在线使用javascript可以控制播放,加载媒体,获得当前播放项的详尽信息。 fsbuttonlink (url):如果用户的flashplayer版本高于(9.0.28)播放器会自动的显示一个全屏按钮。通过设置该值,你可以链接到另外的页面用以全屏显示。服务端程可以设定将要播放的文件。 id (string): 播放器的唯一标识。将会被回传到服务器端。 javascriptid* (string):如果你的页面上有多个播放器,你可以设置这个参数给每个播放器不同的id,这样就可以方便的用javascript来控制。他将回传到getUpdate()事件中。 link (url): 通过这个参数用来设置一个可现在的版本,或者强制用户通过该地址下载当前项。可以在播放列表中为每一项设置该值。 linkfromdisplay* (true,false):设置显示区域被点击时要访问的页面。默认点击显示区域时会进行播放/暂停操作。 linktarget* (frame): 设置链接目标,"_self"在当前页打开。"_blank"在新页面中打开。 streamscript (url):设置这个参数为了兼容‘伪流媒体’FLV文件。 type (mp3,flv,rtmp,jpg,png,gif,swf,rbs,3gp,mp4,m4v): 播放器会根据文件名的最后三个字符来判断类型。在你使用服务器端语言进行重定向时,这种方法将不会再有效。所以你可以设置这个参数来告诉播放器文件类型。你也可以在播放列表中对每一项进行设置。如果播放器找不到文件类型将会被识别为播放列表。 useaudio (true,false): 设置为false用来改变为静音状态。 usecaptions (true,false):设置为false隐藏字幕. usefullscreen (true,false):如果你不希望用flashplayer9的全屏模式。可以设置"fsbuttonlink"参数用来替换全屏按钮的事件。 usekeys (true,false): 设置为"false"用来取消键盘操作(SPACE,UP,DOWN,LEFT,RIGHT) 注意:你必须对?=&进行字符转移。? → %3F, = → %3D, & → %26. 你的"file" 变量为getplaylist.php?id=123的时候必须设置为 getplaylist.php%3Fid%3D123.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值