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

简介: 对部分视频格式/编码格式不支持,这是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>


相关文章
|
3天前
|
前端开发 小程序 JavaScript
信前端里的循环显示如何编写代码?
信前端里的循环显示如何编写代码?
12 5
|
2月前
|
缓存 前端开发 数据格式
构建前端防腐策略问题之保证组件层的代码不受到接口版本变化的问题如何解决
构建前端防腐策略问题之保证组件层的代码不受到接口版本变化的问题如何解决
|
2月前
|
JavaScript 前端开发 小程序
【技巧】JS代码这么写,前端小姐姐都会爱上你
本文介绍了JavaScript编程中的实用技巧,包括解构赋值的多种妙用、数组操作技巧及常用JS功能片段。解构赋值部分涵盖短路语法防错、深度解构及默认值赋值;数组技巧包括按条件添加数据、获取最后一个元素及使用`includes`优化`if`语句;常用功能片段则涉及URL参数解析、页面滚动回顶部及获取滚动距离等。通过这些技巧,提升代码质量和效率。
22 0
【技巧】JS代码这么写,前端小姐姐都会爱上你
|
2月前
|
前端开发 API 开发者
构建前端防腐策略问题之防腐层的核心代码实现以RxJS Observable为中心的的问题如何解决
构建前端防腐策略问题之防腐层的核心代码实现以RxJS Observable为中心的的问题如何解决
|
2月前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
58 0
|
2月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
78 0
|
2月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
76 0
|
2月前
|
前端开发 程序员 API
从后端到前端的无缝切换:一名C#程序员如何借助Blazor技术实现全栈开发的梦想——深入解析Blazor框架下的Web应用构建之旅,附带实战代码示例与项目配置技巧揭露
【8月更文挑战第31天】本文通过详细步骤和代码示例,介绍了如何利用 Blazor 构建全栈 Web 应用。从创建新的 Blazor WebAssembly 项目开始,逐步演示了前后端分离的服务架构设计,包括 REST API 的设置及 Blazor 组件的数据展示。通过整合前后端逻辑,C# 开发者能够在统一环境中实现高效且一致的全栈开发。Blazor 的引入不仅简化了 Web 应用开发流程,还为习惯于后端开发的程序员提供了进入前端世界的桥梁。
56 0
|
2月前
|
JavaScript 前端开发
揭秘Vue.js组件魔法:如何轻松驾驭前端代码,让维护变得轻而易举?
【8月更文挑战第30天】本文探讨了如何利用Vue.js的组件化开发提升前端代码的可维护性。组件化开发将复杂页面拆分为独立、可复用的组件,提高开发效率和代码可维护性。Vue.js支持全局及局部组件注册,并提供了多种组件间通信方式如props、事件等。通过示例展示了组件定义、数据传递及复用组合的方法,强调了组件化开发在实际项目中的重要性。
21 0
|
2月前
|
机器学习/深度学习 分布式计算 前端开发
构建前端防腐策略问题之前端代码会随着技术引擎的迭代而腐烂的问题如何解决
构建前端防腐策略问题之前端代码会随着技术引擎的迭代而腐烂的问题如何解决
下一篇
无影云桌面