javascript - 如何使用HTML设计定制的音频播放器

标签 javascript css html html5-audio

我有一个音频播放器的布局,希望与HTML音频播放器元素一起使用。

enter image description here

我正在尝试<audio></audio>,它为我提供了默认播放器:

enter image description here

有什么方法可以更改播放器的样式以使用我要使用的布局?

最佳答案

您可以很快为HTML5音频播放器创建一组外观非常漂亮的自定义音频控件。只需使用(大部分)基本的HTML和CSS,以及一些简单的Javascript事件处理即可。该解决方案基于所提供的设计,是一种功能齐全的自定义音频播放器。

完整的代码和示例可以在jsFiddle:https://jsfiddle.net/mgaskill/zo3ede1c/中找到。单击并按需使用它,因为它确实是可以正常工作的音频播放器。

玩家

播放器包括原始设计中描述的所有元素。您可以在第一张图片中看到它(并与原始图像进行比较):

enter image description here

另外,我通过提供可折叠的“信息托盘”略微扩展了设计,可以通过按下右侧的“更多信息”按钮来隐藏和显示该托盘。您可以在第二个图像中看到部署的托盘:

enter image description here

当然,颜色并不相同,并且与原始设计可能存在特定于像素的差异,但是非常接近。我的核心技能不是CSS,因此还有改进的空间。但是,它非常接近原始设计,并保留了该设计的所有精神,布局和功能。

工具

为了方便起见,该解决方案利用了一些外部元素。这些都是:

  • jQuery:因为与裸露的Java脚本相比,我通常更喜欢
  • jQueryUI:用于跟踪进度和音量控制,因为HTML5进度栏在某些浏览器中不可用,特别是IE的较旧版本和某些移动浏览器
  • FontAwesome:用于播放/暂停和音量/静音按钮图形
  • Noise Addicts Free MP3 Samples:用于出色的Semper Fidelis March

  • 的HTML

    HTML采用将音频控制面板上的每个组件作为单独的元素进行处理的方法。 HTML的布局很漂亮,唯一有趣的地方是使用FontAwesome类来实现播放/暂停和音量/静音按钮的初始状态图标。

    <link href="http://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet"/>
    <link href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet"/>
    <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
    <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
    <audio id="player">
        <source src="http://www.noiseaddicts.com/samples_1w72b820/2543.mp3" type="audio/mpeg" />
    </audio>
    
    <div id="audio-player">
        <div id="controls">
            <i id="play" class="fa fa-pause"></i>
            <span id="start-time" class="time">00:00</span>
            <div id="progressbar"></div>
            <span id="time" class="time">00:00</span>
            <i id="mute" class="fa fa-volume-up"></i>
            <div id="volume"></div>    
        </div>
        <div id="more-info-box">
            <span id="more-info">MORE INFO</span>
        </div>
        <div id="info-tray">
            Track: <span id="track">Semper Fidelis March</span>
        </div>
    </div>
    

    请注意,整个音频控件都包含在#audio-player元素内。

    CSS

    CSS使HTML栩栩如生,在这种情况下,用于提供颜色,位置和 Action 。

    #audio-player {
        height: 50px;
        width: 500px;
        overflow: hidden;
        background-color: #2B2B2B;
        color: white;
        -webkit-user-select: none; /* webkit (safari, chrome) browsers */
        -moz-user-select: none;    /* mozilla browsers */
        -khtml-user-select: none;  /* webkit (konqueror) browsers */
        -ms-user-select: none;     /* IE10+ */
    }
    
    #controls {
        height: 50px;
        background-color: #808080;
        width: 350px;
    }
    
    .time {
        font-size: 10px;
        color: white;
        position: relative;
        top: 14px;
        margin: 5px;
    }
    
    .ui-progressbar {
        background: #2B2B2B;
    }
    
    .ui-progressbar-value {
        background: white;
    }
    
    #progressbar, #volume {
        height: 10px;
        display: inline-block;
        border-radius: 0px;
        border: none;
        position: relative;
        top: 16px;
    }
    
    #progressbar {
        width: 150px;
    }
    
    #play, #mute {
        font-size: 16px;
        width: 20px;
        position: relative;
        top: 17px;
    }
    
    #play {
        margin-left: 15px;
    }
    
    #volume {
        width: 50px;
    }
    
    #more-info-box {
        display: inline-block;
        width: 150px;
        height: 50px;
        position: relative;
        left: 350px;
        top: -50px;
        padding-top: 18px;
        text-align: center;
        font-family: sans-serif;
        font-size: 12px;
        color: white;
    }
    
    #more-info-box, #more-info-box > span {
        cursor: context-menu;
    }
    
    #info-tray {
        display: inline-block;
        color: white;
        position: relative;
        width: 100%;
        top: -65px;
        height: 50px;
        padding: 5px;
    }
    

    尽管大多数操作非常简单,但仍有一些有趣的事情在进行。

    首先,#audio-player样式调用特定于浏览器的(但不是全部)样式来禁用控件的文本选择:

    -webkit-user-select: none; /* webkit (safari, chrome) browsers */
    -moz-user-select: none;    /* mozilla browsers */
    -khtml-user-select: none;  /* webkit (konqueror) browsers */
    -ms-user-select: none;     /* IE10+ */
    

    jQueryUI进度条控件使用预定义的类以条形设置样式:

    .ui-progressbar {
        background: #2B2B2B;
    }
    
    .ui-progressbar-value {
        background: white;
    }
    

    通过更改显示布局,可以使基于div的控件正确布局:

    display: inline-block;
    

    使用相对位置将控件显式放置在适当的位置:

    position: relative;
    

    Javascript

    Javascript主要面向处理各种控件和状态的事件。

    var audio_player = $("#audio-player");
    var play_button = $('#play');
    var progress_bar = $("#progressbar");
    var time = $("#time");
    var mute_button = $('#mute');
    var volume_bar = $('#volume');
    var more_info = $('#more-info-box');
    var info_tray = $("#info-tray");
    var player = document.getElementById('player');
    var duration = 0;
    var volume = 0.75;
    
    player.onloadedmetadata = function() {
        duration = player.duration;
        progress_bar.progressbar("option", { 'max' : duration });
    };
    
    player.load();
    player.volume = 0.75;
    player.addEventListener("timeupdate", function() {
        progress_bar.progressbar('value', player.currentTime);
        time.text(getTime(player.currentTime));
    }, false);
    
    function getTime(t) {
        var m=~~(t/60), s=~~(t % 60);
        return (m<10?"0"+m:m)+':'+(s<10?"0"+s:s);
    }
    
    function getProgressBarClickInfo(progress_bar, e) {
        var offset = progress_bar.position();
        var x = e.pageX - offset.left; // or e.offsetX (less support, though)
        var y = e.pageY - offset.top;  // or e.offsetY
        var max = progress_bar.progressbar("option", "max");
        var value = x * max / progress_bar.width();
    
        return { x: x, y: y, max: max, value: value };
    }
    
    volume_bar.progressbar({
        value : player.volume*100,
    });
    
    volume_bar.click(function(e) {
        var info = getProgressBarClickInfo($(this), e);
        volume_bar.progressbar('value', info.value);
        player.volume = info.value / info.max;
    });
    
    progress_bar.progressbar({
        value : player.currentTime,
    });
    
    progress_bar.click(function(e) {
        var info = getProgressBarClickInfo($(this), e);
        player.currentTime = player.duration / info.max * info.value;
    });
    
    play_button.click(function() {
        player[player.paused ? 'play' : 'pause']();
        $(this).toggleClass("fa-play", !player.paused);
        $(this).toggleClass("fa-pause", player.paused);
    });
    
    mute_button.click(function() {
        if (player.volume == 0) {
            player.volume = volume;
        } else {
            volume = player.volume;
            player.volume = 0;
        }
    
        volume_bar.progressbar('value', player.volume * 100);
    
        $(this).toggleClass("fa-volume-up", player.volume != 0);
        $(this).toggleClass("fa-volume-off", player.volume == 0);
    });
    
    more_info.click(function() {
        audio_player.animate({
            height: (audio_player.height() == 50) ? 100 : 50
        }, 1000);
    });
    
    onloadedmetadata事件处理程序用于标识何时加载音频,以便可以将轨道进度初始化为音频轨道的长度(持续时间)。
    timeupdate事件处理程序用于在音频轨道播放时更新轨道进度。这使进度条向右增长,以反射(reflect)音轨中的当前位置。
    volumeprogress_bar元素使用jQueryUI progressbar控件进行了初始化,并且设置了click处理程序以允许用户在其中单击以动态更改位置。

    单击play_buttonmute_button handle 可更改播放状态(播放/暂停)或音频状态(音量开/关)。这些处理程序动态交换适当的FontAwesome类,以正确反射(reflect)按钮上的当前状态。

    最后,more_info单击处理程序将显示/隐藏信息托盘元素。隐藏/显示使用jQuery animate进行动画处理,以提供类似于立体声组件的感觉,让人联想到CD托盘弹出。另外,它给控件带来了类似伺服的感觉。因为那是我想要它做的,没有其他原因。

    关于javascript - 如何使用HTML设计定制的音频播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37452293/

    相关文章:

    javascript - js中访问包含冒号的对象元素

    javascript - 如何允许弹出窗口继续弹出,即使您移至另一个页面并且仅在单击按钮时停止?

    html - 在流畅的布局中居中文本

    javascript - renderer.setSize 按屏幕百分比计算? (三.js)

    javascript - 如何在使用 express 在 nodejs 中进行身份验证后授予对文件夹的访问权限?

    javascript - 当您有很多选项时,GUI 替代 <select>

    html - DataTables 正在使用 Bootstrap 3.3.7 应用程序中的 ajax 源数据更改列的宽度

    javascript - 在 JavaScript 中获取 HTML 节点的形状/轮廓

    javascript - 无法向元素添加类或属性

    javascript - Bootstrap 和 Chosen 插件之间的冲突