• 用H5和js写一个移动端自定义播放器


    前言

    由于html5自带的播放器样式不怎么好看,大多数人都是自己写一个来满足业务需求。这一次的需求如下:

    1.不要上一曲下一曲

    2.有进度条和播放暂停按钮

    3.有时间显示

    demo实现功能

    1.进度条滚动

    2.时间显示

    3.播放控制

    4.多平台播放

    关键代码展示

    <body>
        <div class="top"></div>
        <div id="containner">
            
            <div style=" 78px; height: 30px; border-radius: 11px; text-align: center; margin:0px auto; ">
                <div><img id="icon" src="played.jpg" onclick="play()" width="30" height="30" /></div>
        
             </div>
            <div style="100%; height:22px; padding-right:50px;"><span id="showtime" >00:00</span><span>/</span><span id="currenttime">00:00</span></div>
           
            <div id="barbox" class="graph" style="98%">
                <strong id="bar" class="bar" style=" 0%;"></strong>
            </div>
          
            <div id="divplayer">
                <audio id="player" src="" loop="0" autostart="true" hidden="true"></audio>
            </div>
           
        </div>
       
    </body>
    </html>
    <script language="javascript">
        //成员变量
        var url = 'mp3/myeye.mp3';//(设定文件路径)
        var pausedimg = "paused.png";
        var playedimg = "played.jpg";
        var div = document.getElementById('divplayer');  
        var player = document.getElementsByTagName('audio')[0];
        player.src = url;
        //文件长度(秒)
        var fileseconds = 0;
        //定时器对象
        var progressStateTimer;
        //进度条父容器宽度
        var barboxwidth = 0;
        //进度条当前宽度
        var currentbarwidth = 0;
        //每秒追加宽度
        var appendwidth = 0;
        //进度条对象
        var bar;
        //当前运行秒数
        var currentseconds = 0;
    
        function play() {
            if (player && player.paused) {
    
                //获取文件时长
                fileseconds = parseInt(player.duration);
                //显示文件时长
                document.getElementById("showtime").innerHTML = (formatTime(fileseconds));
                //获取进度条的容器宽度
                barboxwidth = document.getElementById("barbox").style.width;
    
                //获取容器变量备用
                bar = document.getElementById("bar");
                //开始播放
                player.play();
                //显示暂停按钮
                document.getElementById("icon").src = pausedimg;
                //执行进度条方法
                progressStateTimer = setInterval(prossbar, 1000);
            } else if (player && player.played) {
                //暂停并停止进度条
                player.pause();
                //显示播放按钮
                document.getElementById("icon").src = playedimg;
                //停止进度条
                clearInterval(progressStateTimer);
            }
            else {
                //进到此处说明player未实例化 或者状态不是播放和暂停
                //dosomething
            }
        }
    
    
    
    
        var prossbar = function () {
    
            if (fileseconds > 0) {
                //重新计算新的宽度
                
                if (currentseconds == 0) {
                    appendwidth = 0;
                } else
                {
                    appendwidth = (currentseconds / fileseconds) * 100;
                }
                
                bar.style.width = appendwidth + "%";
                //显示当前播放的时间
                document.getElementById("currenttime").innerHTML = formatTime(currentseconds);
                currentseconds++;
                if (currentseconds > fileseconds || currentbarwidth >= barboxwidth) {
                    //停止播放并清除进度条计时器
                    player.pause();
                    clearInterval(progressStateTimer);
                }
            }
        }
    
        function formatTime(second) {
            return [parseInt(second / 60 % 60), parseInt(second % 60)].join(":")
            .replace(/(d)/g, "0$1");
        }
    </script>

    效果图预览

    PC端运行

     移动端运行

    进度条实现原理

    1.利用一个DIV作为容器,一个子DIV作为进度条,初始时设定子DIV宽度为0%

    2.获取音频文件总时长(有属性可以直接获取(单位为秒))

    3.(核心)利用timer计时器来计算当前播放了多少秒,一秒运行一次(可自由设置)

    4.利用播放的秒数/文件总秒数/100  =当前的进度条的百分比

    5.直接给进度条设定当前宽度

    6.判断播放时长和文件时长一致就停止计时器

    进度条的广泛运用

      多div组成的进度条之前也曾经用该进度条来实现大文件上传,可以多任务执行

    demo下载

    点我下载

    如果我的分享能帮到你,麻烦给点个赞吧!如果发现错误,也请及时拍砖!请关注我的个人主页http://www.cnblogs.com/jingch

  • 相关阅读:
    springboot: 使web项目支持jsp
    springboot: 集成freemark模板引擎
    Springboot的优点和实现
    Spring的两种动态代理:Jdk和Cglib 的区别和实现
    JAVA单例模式:懒汉式,饿汉式
    java的内存管理 对象的分配与释放
    JAVA反射调用方法
    JAVA内置注解 基本注解
    图——图的定义与操作
    树——二叉树的线索化
  • 原文地址:https://www.cnblogs.com/jingch/p/4990681.html
Copyright © 2020-2023  润新知