【前端】【萌狼原创】萌狼播放器--代码

简介: 对部分视频格式/编码格式不支持,这是Video标签的锅,与我萌狼蓝天无关

简介

名称与原理

作品名称:萌狼播放器

原理:H5 Video 自定义化

已实现功能

(1)播放暂停按钮、重置播放按钮

(2)点击屏幕可控制暂停、播放

(3)实现可全屏,全屏后,若鼠标一定时间未移动,则隐藏控制栏;鼠标移动,则显示控制栏

(4)可以通过直接点击进度条跳转进度

未完成功能

(1)音量控制

(2)倍速控制

(3)弹幕

缺点

对部分视频格式/编码格式不支持,这是Video标签的锅,与我萌狼蓝天无关

项目目录

index.html
--| xrilang-video-css
----| controller.css
----| dynamic.css
----| player.css
--| xirlang-video-javascript
----| video.js

代码

index.html

<!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>
    <!-- 字体图标库 -->
    <link rel="stylesheet" href="https://at.alicdn.com/t/font_3159328_il2viqh3j9p.css">
    <script src="./source/js/jquery.min.js"></script>
    <link href="./source/css/normalize.css">
    <!-- 自定义css -->
    <link rel="stylesheet" href="./xrilang-video-css/player.css">
    <link rel="stylesheet" href="./xrilang-video-css/controller.css">
    <link rel="stylesheet" href="./xrilang-video-css/dynamic.css">
</head>
<body>
    <!-- 播放器 -->
    <figure>
        <div class="player">
            <div class="title"><span class="iconfont icon-shipin"></span><span>萌狼播放器</span><a
                    href="https://cnblogs.com/mllt"><small>&nbsp;&nbsp;version:0.1</small></a></div>
            <!-- <video src="http://akc4.top/video/videoBg1.mp4"></video> -->
            <div class="svedio">
                <!-- 下面元素默认隐藏 -->
                <span id="tipStop" class="iconfont icon-icon_video noshow fly-center" style="font-size:2em"></span>
                <video src="./source/video/旋转复制_x264.mp4"></video>
            </div>
            <!-- 控制栏 -->
            <div class="controller">
                <!-- 进度条 -->
                <div class="bar">
                    <div class="line"></div>
                </div>
                <!-- 功能区 -->
                <div class="power">
                    <!-- 播放按钮 -->
                    <div class="basep">
                        <span id="state" class="iconfont icon-bofang1"></span>
                        <span id="restate" class="iconfont icon-zanting1"></span>
                    </div>
                    <!-- 时间 -->
                    <div class="timer">
                        <span class="current">00:00:00</span> —— <span class="total">00:00:00</span>
                    </div>
                    <!-- 功能按钮 -->
                    <div class="morep">
                        <span id="expand" class="iconfont icon-24gf-fullScreenEnter"></span>
                    </div>
                </div>
            </div>
        </div>
    </figure>
</body>
<!-- 自定义javascript -->
<script src="./xrilang-video-javasript/video.js"></script>
</html>

player.css

/* 播放器的css样式 */
/* 注意:请不要随便修改样式名,会影响javascript的执行 */
/* 微信公众号/哔哩哔哩:萌狼蓝天 */
/* 博客:https://cnblogs.com/mllt */
.player {
    /* 边距问题 */
    margin: 0 auto;
    padding: 0;
    box-sizing: border-box;
    /* 大小问题 */
    width: 100%;
    height: auto;
    /* 字体问题 */
    /* 颜色问题 */
    background-color: #FD70A1;
    /* 边框问题 */
    /* border: 1px solid snow; */
    border-radius: 5px;
    /* 其他美化 */
    box-shadow: 1px 1px 1px 1px rgb(19, 141, 255, 0.2);
}
.player .title {
    margin: 0.25em;
    color: snow;
}
.player .title span {
    padding-left: 0.5em;
    font-size: 0.8em;
}
.player a {
    text-decoration: none;
    color: snow;
}
.player video {
    /* 边距问题 */
    margin: 0 auto;
    padding: 0;
    box-sizing: border-box;
    /* 大小问题 */
    width: 100%;
    height: auto;
}
/* 去掉全屏时显示的自带控制条 */
video::-webkit-media-controls {
    display: none !important;
}

controller.css

/* 播放器控制区域的css样式 */
/* 注意:请不要随便修改样式名,会影响javascript的执行 */
/* 微信公众号/哔哩哔哩:萌狼蓝天 */
/* 博客:https://cnblogs.com/mllt */
.controller {
    /* 边距问题 */
    margin: 0 auto;
    padding: 0;
    box-sizing: border-box;
    /* 大小问题 */
    width: 100%;
    /* 边框问题 */
    border-radius: 5px;
    /* 其他美化 */
    box-shadow: 1px 1px 1px 1px rgb(19, 141, 255, 0.2);
}
/* bar:进度条底 */
.controller .bar {
    /* 大小 */
    width: 100%;
    height: 0.5em;
    /* 背景 */
    /* background-color: rgb(34, 200, 255, 0.5); */
    background-color: rgba(255, 255, 255, 0.8);
    /* 边框问题 */
    border-radius: 5px;
    /* 其他美化 */
    box-shadow: 0px 1px 1px 0px rgb(19, 141, 255, 0.2);
}
/* line:进度条动态进度 */
.controller .bar .line {
    /* width: 45%; */
    /*测试用*/
    height: 100%;
    background-color: rgb(34, 200, 255, 1);
    border-radius: 5px;
    box-shadow: 1px 0px 1px 0px rgb(19, 141, 255, 0.2);
}
/* power:进度条下面的控制按钮集合 */
.power {
    display: -webkit-inline-flex;
    /* Safari */
    display: inline-flex;
    justify-content: space-between;
    width: 100%;
}
/* 控制按钮 */
/* basep:控制播放、暂停、重置 */
.controller .power .basep,
.controller .power .morep,
.controller .power .timer {
    padding: 0 1em;
    box-sizing: border-box;
    height: 1.5em;
    color: snow;
    line-height: 1.5em;
    /* display: table-cell; */
    /*尽可能的让元素垂直居中*/
    /* display: inline-block; */
}
.controller .basep span,
.controller .morep span,
.controller .timer span {
    display: inline-block;
    font-size: 1.25em;
}

dynamic.css

/* 这里的css样式由JavaScript频繁控制 */
/* 注意:请不要随便修改样式名,会影响javascript的执行 */
/* 微信公众号/哔哩哔哩:萌狼蓝天 */
/* 博客:https://cnblogs.com/mllt */
/*隐藏元素*/
.noshow {
    display: none;
}
/* 控制条浮动(全屏时使用) */
.fly {
    background-color: rgb(34, 200, 255, 0.5);
    position: absolute;
    left: 50%;
    bottom: 0;
    height: 2.5em;
    transform: translateX(-50%);
}
.svedio {
    position: relative;
    font-size: 2em;
    /* color:rgb(19, 141, 255); */
    color: #FD70A1;
}
.fly-center {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    border-radius: 2em;
    box-shadow: 1px 0px 1px 0px rgb(19, 141, 255, 0.5);
}

video.js

/* 播放器控制区域的css样式 */
 /* 注意:因为此JavaScript代码直接引用了css样式,故需要在HTML加载完成后才能加载 */
 /* 微信公众号/哔哩哔哩:萌狼蓝天 */
 /* 博客:https://cnblogs.com/mllt */
 window.οnlοad = function () {}
 // 获取元素
 var video = $("video").get(0); // 把jQuery 对象转换为 dom对象
 var timer = false;
 // 当浏览器可以播放视频的时候,就让video显示出来,同时显示出视频的总时长
 video.oncanplay = function () {
     $("video").show();
     var totalTime = formatTime(video.duration);
     $(".total").html(totalTime); // 把计算出来的总时长放入页面中的元素中
 };
 //监听到暂停
 video.addEventListener('pause', function () {
     console.log('[萌狼工作室]视频被暂停啦~')
     $('#state').addClass("icon-bofang1").removeClass("icon-weibiaoti--"); // 切换图标
    //  $('#tipStop').addClass('fly-center').removeClass('noshow'); //这个是暂停时在视频中央显示的暂停图标,功能未实现,主要是一个定位问题
    $('#tipStop').removeClass('noshow');
    });
//监听到播放
 video.addEventListener('playing', function () {
     console.log('[萌狼工作室]视频开始啦~')
     console.log('监听到了播放' + $('#state').hasClass('icon-weibiaoti--'))
     $('#state').addClass("icon-weibiaoti--").removeClass("icon-bofang1"); // 切换图标
     $('#tipStop').addClass('noshow');
 });
 //播放按钮
 $("#state").on("click", function () {
     if (video.paused) {
         video.play(); // 播放
     } else {
         video.pause(); // 暂停
     }
 });
 //手动重置
 $("#restate").on("click", function () {
     video.pause(); //暂停视频
     $(".line").css("width", 0); //播放进度条归零
     video.currentTime = 0; //将视频播放时间归零
     $(".current").html(formatTime(video.currentTime)); //动态显示的播放时间归零
     $('#state').addClass("icon-bofang1").removeClass("icon-weibiaoti--"); // 切换图标
 });
 // 计算时分秒函数formatTime
 function formatTime(time) {
     var h = Math.floor(time / 3600);
     var m = Math.floor(time % 3600 / 60);
     var s = Math.floor(time % 60);
     // 00:00:00
     return (h < 10 ? "0" + h : h) + ":" + (m < 10 ? "0" + m : m) + ":" + (s < 10 ? "0" + s : s);
 };
 //显示进度条
 video.ontimeupdate = function () {
     var w = video.currentTime / video.duration * 100 + "%";
     $(".line").css("width", w);
     $(".current").html(formatTime(video.currentTime));
 };
 //全屏和取消全屏
 $("#expand").on("click", function () {
     //确定参与全屏的内容
     var div = document.querySelector('.player');
     // 判断是要全屏还是要退出全屏
     if (!document.webkitIsFullScreen) {
         if (div.requestFullscreen) {
             div.requestFullscreen(); // 正常浏览器 
         } else if (div.webkitRequestFullScreen) {
             div.webkitRequestFullScreen(); // webkit 
         } else if (div.mozRequestFullScreen) {
             div.mozRequestFullScreen(); //早期火狐浏览器
         } else if (div.oRequestFullScreen) {
             div.oRequestFullScreen(); //早期Opera浏览器
         } else if (div.msRequestFullscreen) {
             div.msRequestFullscreen(); //早期IE浏览器
         } else {
             alert('暂不支持在您的浏览器中全屏');
         }
         //H5 API END
     } else {
         if (document.exitFullscreen) {
             document.exitFullscreen(); // 正常浏览器 
         } else if (document.webkitCancelFullScreen) {
             document.webkitCancelFullScreen(); // webkit 
         } else if (document.mozCancelFullScreen) {
             document.mozCancelFullScreen(); //早期火狐浏览器
         } else if (document.oCancelFullScreen) {
             document.oCancelFullScreen(); //早期Opera浏览器
         } else if (document.msCancelFullscreen) {
             document.msCancelFullscreen(); //早期IE浏览器
         } else {
             alert('暂不支持在您的浏览器中全屏');
         }
         //H5 API END
     }
 });
 //监听全屏状态避免Bug
 //当遇没有通过到特殊操作自动退出全屏时,控制栏因为没有触发,会导致样式异常
 document.addEventListener('fullscreenchange', function () {
     if (document.webkitIsFullScreen) {
         console.log('[萌狼工作室]进入全屏,沉浸体验');
         //进入全屏后的样式
         $('.title').addClass("noshow");
         $(".controller").addClass("fly");
         $("#expand").addClass("icon-24gl-fullScreenEnter").removeClass("icon-24gf-fullScreenEnter");
         //创建定时器
         //定时器,检测是否长时间未操作页面
         timer = setInterval(function () {
             currentTime = new Date().getTime(); //更新当前时间
             if (currentTime - lastTime > 3000) { //判断是否超时
                 if (!$('.controller').hasClass('noshow')) {
                     $('.controller').addClass("noshow");
                     console.log('切换型监听触发控制栏隐藏');
                 }
                 console.log(timer)
             }
         }, 1000);
     } else {
         console.log('[萌狼工作室]退出全屏,偷偷看~')
         //清除定时器
         if (timer != 0) {
             clearInterval(timer)
             console.log('理论上清除了时钟。' + timer)
         }
         //退出全屏后的样式
         if ($('.title').hasClass("noshow")) {
             // console.log("[萌狼播放器]FE1:退出全屏,恢复样式");
             $('.title').removeClass("noshow");
         }
         if ($('.controller').hasClass("fly")) {
             // console.log("[萌狼播放器]FE2:退出全屏,恢复样式");
             $(".controller").removeClass("fly");
         }
         if ($('.controller').hasClass("noshow")) {
             // console.log("[萌狼播放器]FE2:退出全屏,恢复样式");
             $(".controller").removeClass("noshow");
         }
         if ($("#expand").hasClass("icon-24gl-fullScreenEnter")) {
             // console.log("[萌狼播放器]FE3:退出全屏,清除样式");
             $("#expand").addClass("icon-24gf-fullScreenEnter").removeClass("icon-24gl-fullScreenEnter");
         }
     }
 })
 //监听鼠标状态
 var lastTime = new Date().getTime(); //鼠标最后一次移动时间
 var currentTime = new Date().getTime(); //当前时间
 document.addEventListener('mousemove', function () {
     // console.log('[萌狼播放器]鼠标移动,全屏状态为:'+document.webkitIsFullScreen)
     //要处于全屏状态才会触发事件
     if (document.webkitIsFullScreen) {
         //此时鼠标移动,显示控件
         // console.log('[萌狼播放器]鼠标移动且处于全屏状态,显示控件')
         $('.controller').removeClass("noshow");
         //更新操作时间
         lastTime = new Date().getTime(); //更新操作时间  
     }
 });
 //重置播放状态
 video.onended = function () {
     // 当前的视频时长清零 
     video.currentTime = 0;
     $("#state").addClass("icon-bofang1").removeClass("icon-weibiaoti--");
 };
 //单击进度条视频跳转
 $(".bar").on("click", function (event) {
     if (!video.paused) {
         video.pause();
     }
     // 1. 获取单击的位置
     var offset = event.offsetX;
     // 2. 根据单击视频的播放位置计算要切换的时间
     var current = offset / $('.bar').width() * video.duration; //duration 持续时间
     // 3. 把计算后的时间赋值给currentTime
     video.currentTime = current;
     console.log('[萌狼播放器]跳转到:' + Math.round(video.currentTime) + "秒")
     //更新进度条
     var w = video.currentTime / video.duration * 100 + "%";
     $(".line").css("width", w);
     $(".current").html(formatTime(video.currentTime));
     console.log('[萌狼播放器]进度条更新完毕,准备播放');
     let playPromise = video.play()
     if (playPromise !== undefined) {
         playPromise.then(() => {
             video.play()
             $('#state').addClass("icon-weibiaoti--").removeClass("icon-bofang1"); // 切换图标
             console.log('[萌狼播放器]已启动播放,开始观看吧!');
         }).catch((e) => {
             console.log("[萌狼播放器]#出现错误#:" + e);
             console.log("[萌狼播放器]#错误分析#也许视频格式不太支持噢,请尝试转码(可以使用小丸工具箱)");
             //重置
             video.currentTime = 0;
             $("#state").addClass("icon-bofang1").removeClass("icon-weibiaoti--");
         })
     }
 });
 //视频被点击
 $("video").on("click", function () {
     // console.log("视频被点击")
     if (video.paused) {
         //播放视频
         video.play()
         $('#tipStop').addClass('noshow');
     } else {
         //暂停视频
         video.pause()
     }
 });
 $("#tipStop").on("click", function () {
     // console.log("视频被点击")
     if (video.paused) {
         //播放视频
         video.play()
         $('#tipStop').addClass('noshow');
     } else {
         //暂停视频
         video.pause()
     }
 })

一页汇总(css,js,都在这个html文件里面)

<!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>
    <!-- 字体图标库 -->
    <link rel="stylesheet" href="https://at.alicdn.com/t/font_3159328_il2viqh3j9p.css">
    <link rel="stylesheet" href="./source/css/font-awesome-4.7.0/css/font-awesome.min.css" />
    <script src="./source/js/jquery.min.js"></script>
    <link href="./source/css/normalize.css">
    <style>
        .player {
            /* 边距问题 */
            margin: 0 auto;
            padding: 0;
            box-sizing: border-box;
            /* 大小问题 */
            width: 100%;
            height: auto;
            /* 字体问题 */
            /* 颜色问题 */
            background-color: #FD70A1;
            /* 边框问题 */
            /* border: 1px solid snow; */
            border-radius: 5px;
            /* 其他美化 */
            box-shadow: 1px 1px 1px 1px rgb(19, 141, 255, 0.2);
        }
        .player .title {
            margin: 0.25em;
            color: snow;
        }
        .player .title span {
            padding-left: 0.5em;
            font-size: 0.8em;
        }
        .player a {
            text-decoration: none;
            color: snow;
        }
        .player video {
            /* 边距问题 */
            margin: 0 auto;
            padding: 0;
            box-sizing: border-box;
            /* 大小问题 */
            width: 100%;
            height: auto;
        }
        /* 控制条样式 */
        .controller {
            /* 边距问题 */
            margin: 0 auto;
            padding: 0;
            box-sizing: border-box;
            /* 大小问题 */
            width: 100%;
            /* 边框问题 */
            border-radius: 5px;
            /* 其他美化 */
            box-shadow: 1px 1px 1px 1px rgb(19, 141, 255, 0.2);
        }
        .controller .bar {
            /* 大小 */
            width: 100%;
            height: 0.5em;
            /* 背景 */
            /* background-color: rgb(34, 200, 255, 0.5); */
            background-color: rgba(255, 255, 255, 0.8);
            /* 边框问题 */
            border-radius: 5px;
            /* 其他美化 */
            box-shadow: 0px 1px 1px 0px rgb(19, 141, 255, 0.2);
        }
        .controller .bar .line {
            /* width: 45%; */
            /*测试用*/
            height: 100%;
            background-color: rgb(34, 200, 255, 1);
            border-radius: 5px;
            box-shadow: 1px 0px 1px 0px rgb(19, 141, 255, 0.2);
        }
        .power {
            display: -webkit-inline-flex;
            /* Safari */
            display: inline-flex;
            justify-content: space-between;
            width: 100%;
        }
        /* 控制栏 */
        .controller .basep,
        .controller .morep,
        .controller .timer {
            padding: 0 1em;
            box-sizing: border-box;
            height: 1.5em;
            color: snow;
            line-height: 1.5em;
            /* display: table-cell; */
            /*尽可能的让元素垂直居中*/
            /* display: inline-block; */
        }
        .controller .basep span,
        .controller .morep span,
        .controller .timer span {
            display: inline-block;
            font-size: 1.25em;
        }
    </style>
</head>
<body>
    <!-- 播放器 -->
    <figure>
        <div class="player">
            <div class="title"><span class="iconfont icon-shipin"></span><span>萌狼播放器</span><a
                    href="https://cnblogs.com/mllt"><small>&nbsp;&nbsp;version:0.1</small></a></div>
            <!-- <video src="http://akc4.top/video/videoBg1.mp4"></video> -->
            <div class="svedio">
                <!-- 下面元素默认隐藏 -->
                <span id="tipStop" class="iconfont icon-icon_video noshow" style="font-size:2em"></span>
                <video src="./source/video/旋转复制_x264.mp4"></video>
            </div>
            <!-- 控制栏 -->
            <div class="controller">
                <!-- 进度条 -->
                <div class="bar">
                    <div class="line"></div>
                </div>
                <!-- 功能区 -->
                <div class="power">
                    <!-- 播放按钮 -->
                    <div class="basep">
                        <span id="state" class="iconfont icon-bofang1"></span>
                        <span id="restate" class="iconfont icon-zanting1"></span>
                    </div>
                    <!-- 时间 -->
                    <div class="timer">
                        <span class="current">00:00:00</span> —— <span class="total">00:00:00</span>
                    </div>
                    <!-- 功能按钮 -->
                    <div class="morep">
                        <span id="expand" class="iconfont icon-24gf-fullScreenEnter"></span>
                    </div>
                </div>
            </div>
        </div>
    </figure>
    <script>
        // 获取元素
        var video = $("video").get(0); // 把jQuery 对象转换为 dom对象
        var timer = false;
        // 当浏览器可以播放视频的时候,就让video显示出来,同时显示出视频的总时长
        video.oncanplay = function () {
            $("video").show();
            var totalTime = formatTime(video.duration);
            $(".total").html(totalTime); // 把计算出来的总时长放入页面中的元素中
        };
        //监听到暂停
        video.addEventListener('pause', function () {
            console.log('[萌狼工作室]视频被暂停啦~')
            $('#state').addClass("icon-bofang1").removeClass("icon-weibiaoti--"); // 切换图标
            $('#tipStop').addClass('fly-center').removeClass('noshow'); //这个是暂停时在视频中央显示的暂停图标,功能未实现,主要是一个定位问题
        });
        video.addEventListener('playing', function () {
            console.log('[萌狼工作室]视频开始啦~')
            console.log('监听到了播放' + $('#state').hasClass('icon-weibiaoti--'))
            $('#state').addClass("icon-weibiaoti--").removeClass("icon-bofang1"); // 切换图标
            $('#tipStop').addClass('noshow');
        });
        //播放按钮
        $("#state").on("click", function () {
            if (video.paused) {
                video.play(); // 播放
            } else {
                video.pause(); // 暂停
            }
        });
        //手动重置
        $("#restate").on("click", function () {
            video.pause(); //暂停视频
            $(".line").css("width", 0); //播放进度条归零
            video.currentTime = 0; //将视频播放时间归零
            $(".current").html(formatTime(video.currentTime)); //动态显示的播放时间归零
            $('#state').addClass("icon-bofang1").removeClass("icon-weibiaoti--"); // 切换图标
        });
        // 计算时分秒函数formatTime
        function formatTime(time) {
            var h = Math.floor(time / 3600);
            var m = Math.floor(time % 3600 / 60);
            var s = Math.floor(time % 60);
            // 00:00:00
            return (h < 10 ? "0" + h : h) + ":" + (m < 10 ? "0" + m : m) + ":" + (s < 10 ? "0" + s : s);
        };
        //显示进度条
        video.ontimeupdate = function () {
            var w = video.currentTime / video.duration * 100 + "%";
            $(".line").css("width", w);
            $(".current").html(formatTime(video.currentTime));
        };
        //全屏和取消全屏
        $("#expand").on("click", function () {
            //确定参与全屏的内容
            var div = document.querySelector('.player');
            // 判断是要全屏还是要退出全屏
            if (!document.webkitIsFullScreen) {
                if (div.requestFullscreen) {
                    div.requestFullscreen(); // 正常浏览器 
                } else if (div.webkitRequestFullScreen) {
                    div.webkitRequestFullScreen(); // webkit 
                } else if (div.mozRequestFullScreen) {
                    div.mozRequestFullScreen(); //早期火狐浏览器
                } else if (div.oRequestFullScreen) {
                    div.oRequestFullScreen(); //早期Opera浏览器
                } else if (div.msRequestFullscreen) {
                    div.msRequestFullscreen(); //早期IE浏览器
                } else {
                    alert('暂不支持在您的浏览器中全屏');
                }
                //H5 API END
            } else {
                if (document.exitFullscreen) {
                    document.exitFullscreen(); // 正常浏览器 
                } else if (document.webkitCancelFullScreen) {
                    document.webkitCancelFullScreen(); // webkit 
                } else if (document.mozCancelFullScreen) {
                    document.mozCancelFullScreen(); //早期火狐浏览器
                } else if (document.oCancelFullScreen) {
                    document.oCancelFullScreen(); //早期Opera浏览器
                } else if (document.msCancelFullscreen) {
                    document.msCancelFullscreen(); //早期IE浏览器
                } else {
                    alert('暂不支持在您的浏览器中全屏');
                }
                //H5 API END
            }
        });
        //监听全屏状态避免Bug
        //当遇没有通过到特殊操作自动退出全屏时,控制栏因为没有触发,会导致样式异常
        document.addEventListener('fullscreenchange', function () {
            if (document.webkitIsFullScreen) {
                console.log('[萌狼工作室]进入全屏,沉浸体验');
                //进入全屏后的样式
                $('.title').addClass("noshow");
                $(".controller").addClass("fly");
                $("#expand").addClass("icon-24gl-fullScreenEnter").removeClass("icon-24gf-fullScreenEnter");
                //创建定时器
                //定时器,检测是否长时间未操作页面
                timer = setInterval(function () {
                    currentTime = new Date().getTime(); //更新当前时间
                    if (currentTime - lastTime > 3000) { //判断是否超时
                        if (!$('.controller').hasClass('noshow')) {
                            $('.controller').addClass("noshow");
                            console.log('切换型监听触发控制栏隐藏');
                        }
                        console.log(timer)
                    }
                }, 1000);
            } else {
                console.log('[萌狼工作室]退出全屏,偷偷看~')
                //清除定时器
                if (timer != 0) {
                    clearInterval(timer)
                    console.log('理论上清除了时钟。' + timer)
                }
                //退出全屏后的样式
                if ($('.title').hasClass("noshow")) {
                    // console.log("[萌狼播放器]FE1:退出全屏,恢复样式");
                    $('.title').removeClass("noshow");
                }
                if ($('.controller').hasClass("fly")) {
                    // console.log("[萌狼播放器]FE2:退出全屏,恢复样式");
                    $(".controller").removeClass("fly");
                }
                if ($('.controller').hasClass("noshow")) {
                    // console.log("[萌狼播放器]FE2:退出全屏,恢复样式");
                    $(".controller").removeClass("noshow");
                }
                if ($("#expand").hasClass("icon-24gl-fullScreenEnter")) {
                    // console.log("[萌狼播放器]FE3:退出全屏,清除样式");
                    $("#expand").addClass("icon-24gf-fullScreenEnter").removeClass("icon-24gl-fullScreenEnter");
                }
            }
        })
        //监听鼠标状态
        var lastTime = new Date().getTime(); //鼠标最后一次移动时间
        var currentTime = new Date().getTime(); //当前时间
        document.addEventListener('mousemove', function () {
            // console.log('[萌狼播放器]鼠标移动,全屏状态为:'+document.webkitIsFullScreen)
            //要处于全屏状态才会触发事件
            if (document.webkitIsFullScreen) {
                //此时鼠标移动,显示控件
                // console.log('[萌狼播放器]鼠标移动且处于全屏状态,显示控件')
                $('.controller').removeClass("noshow");
                //更新操作时间
                lastTime = new Date().getTime(); //更新操作时间  
            }
        });
        //重置播放状态
        video.onended = function () {
            // 当前的视频时长清零 
            video.currentTime = 0;
            $("#state").addClass("icon-bofang1").removeClass("icon-weibiaoti--");
        };
        //单击进度条视频跳转
        $(".bar").on("click", function (event) {
            if (!video.paused) {
                video.pause();
            }
            // 1. 获取单击的位置
            var offset = event.offsetX;
            // 2. 根据单击视频的播放位置计算要切换的时间
            var current = offset / $('.bar').width() * video.duration; //duration 持续时间
            // 3. 把计算后的时间赋值给currentTime
            video.currentTime = current;
            console.log('[萌狼播放器]跳转到:' + Math.round(video.currentTime) + "秒")
            //更新进度条
            var w = video.currentTime / video.duration * 100 + "%";
            $(".line").css("width", w);
            $(".current").html(formatTime(video.currentTime));
            console.log('[萌狼播放器]进度条更新完毕,准备播放');
            let playPromise = video.play()
            if (playPromise !== undefined) {
                playPromise.then(() => {
                    video.play()
                    $('#state').addClass("icon-weibiaoti--").removeClass("icon-bofang1"); // 切换图标
                    console.log('[萌狼播放器]已启动播放,开始观看吧!');
                }).catch((e) => {
                    console.log("[萌狼播放器]#出现错误#:" + e);
                    console.log("[萌狼播放器]#错误分析#也许视频格式不太支持噢,请尝试转码(可以使用小丸工具箱)");
                    //重置
                    video.currentTime = 0;
                    $("#state").addClass("icon-bofang1").removeClass("icon-weibiaoti--");
                })
            }
        });
        //视频被点击
        $("video").on("click", function () {
            // console.log("视频被点击")
            if (video.paused) {
                //播放视频
                video.play()
                $('#tipStop').addClass('noshow');
            } else {
                //暂停视频
                video.pause()
            }
        });
        $("#tipStop").on("click", function () {
            // console.log("视频被点击")
            if (video.paused) {
                //播放视频
                video.play()
                $('#tipStop').addClass('noshow');
            } else {
                //暂停视频
                video.pause()
            }
        })
    </script>
    <style>
        /*隐藏元素*/
        .noshow {
            display: none;
        }
        /* 去掉全屏时显示的自带控制条 */
        video::-webkit-media-controls {
            display: none !important;
        }
        /* 控制条浮动(全屏时使用) */
        .fly {
            background-color: rgb(34, 200, 255, 0.5);
            position: absolute;
            left: 50%;
            bottom: 0;
            height: 2.5em;
            transform: translateX(-50%);
        }
        .svedio {
            position: relative;
            font-size: 2em;
            /* color:rgb(19, 141, 255); */
            color: #FD70A1;
        }
        .fly-center {
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            border-radius: 2em;
            box-shadow: 1px 0px 1px 0px rgb(19, 141, 255, 0.5);
        }
    </style>
</body>
</html>


相关文章
|
1月前
|
缓存 前端开发 JavaScript
利用代码分割优化前端性能:策略与实践
在现代Web开发中,代码分割是提升页面加载性能的有效手段。本文介绍代码分割的概念、重要性及其实现策略,包括动态导入、路由分割等方法,并探讨在React、Vue、Angular等前端框架中的具体应用。
|
21天前
|
缓存 监控 前端开发
探索前端性能优化:关键策略与代码实例
本文深入探讨前端性能优化的关键策略,结合实际代码示例,帮助开发者提升网页加载速度和用户体验,涵盖资源压缩、懒加载、缓存机制等技术。
|
1月前
|
Web App开发 缓存 监控
前端性能优化实战:从代码到部署的全面策略
前端性能优化实战:从代码到部署的全面策略
29 1
|
1月前
|
Web App开发 前端开发 JavaScript
前端性能优化实战:从代码到部署的全面指南
前端性能优化实战:从代码到部署的全面指南
32 1
|
1月前
|
前端开发 JavaScript
前端界的革命:掌握这些新技术,让你的代码简洁到让人惊叹!
前端技术的快速发展带来了许多令人惊叹的新特性。ES6及其后续版本引入了箭头函数、模板字符串等简洁语法,极大减少了代码冗余。React通过虚拟DOM和组件化思想,提高了代码的可维护性和效率。Webpack等构建工具通过模块化和代码分割,优化了应用性能和加载速度。这些新技术正引领前端开发的革命,使代码更加简洁、高效、可维护。
27 2
|
1月前
|
前端开发 JavaScript 测试技术
前端工程师的必修课:如何写出优雅、可维护的代码?
前端工程作为数字世界的门面,编写优雅、可维护的代码至关重要。本文从命名规范、模块化设计、注释与文档、遵循最佳实践四个方面,提供了提升代码质量的方法。通过清晰的命名、合理的模块划分、详细的注释和持续的学习,前端工程师可以写出高效且易于维护的代码,为项目的成功打下坚实基础。
34 2
|
1月前
|
监控 前端开发 JavaScript
前端开发的终极奥义:如何让你的代码既快又美,还不易出错?
【10月更文挑战第31天】前端开发是一个充满挑战与机遇的领域,本文从性能优化、代码美化和错误处理三个方面,探讨了如何提升代码的效率、可读性和健壮性。通过减少DOM操作、懒加载、使用Web Workers等方法提升性能;遵循命名规范、保持一致的缩进与空行、添加注释与文档,让代码更易读;通过输入验证、try-catch捕获异常、日志与监控,增强代码的健壮性。追求代码的“快、美、稳”,是每个前端开发者的目标。
39 3
|
1月前
|
前端开发 JavaScript 开发者
前端开发的终极技巧:如何让你的代码既简洁又高效,还能减少bug?
【10月更文挑战第30天】前端开发充满挑战与创新,如何编写简洁高效且少bug的代码是开发者关注的重点。本文介绍五大技巧:1. 模块化,提高代码复用性;2. 组件化,降低代码耦合度;3. 使用现代框架,提高开发效率;4. 统一代码规范,降低沟通成本;5. 利用工具,优化代码质量。掌握这些技巧,让前端开发更高效。
80 1
|
1月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
37 1
|
1月前
|
缓存 监控 前端开发
前端性能优化:从代码到部署的全面策略
前端性能优化:从代码到部署的全面策略