h5音乐播放器,自定义外观。(纯原生)

h5音乐播放器实现 本文为大家分享一个简易音乐播放器的实现,页面设置参考网易播放器设计,主要使用js+jquery实现前端开发与布局,使用Ajax进行异步请求后端数据。文中展示了详细的代码,供大家参考。 阅读详情
AI摘要

博客介绍了h5原生播放器的属性和事件,针对客户变更样式的音乐播放控件需求,提出用h5原生播放器 <audio> 并隐藏原生面板,通过html重构外观的解决方案。使用js、html、scss、vue2、elementui技术实现,开发暂停在1.0初级版本,可拓展性强。

 一,首先介绍一下h5原生播放器的属性和事件。

属性(这里只介绍本文使用到的属性和常用属性):

​​​autoplay​​​​​​​     是否自动播放

controls     是否隐藏控制面板

currentTime    当前播放进度以秒为单位

duration         进度条总长度

loop           是否循环播放

muted       是否静音

preload      资源加载方式 ;   none表示不进行预加载,metadata表示不进行预加载但会获取进度长度,auto表示对资源进行预加载

src           资源加载路径

事件(这里只介绍本文使用到的事件和常用事件):

事件名称触发时机
ended播放到媒体的结束位置,播放停止。
loadeddata媒体的第一帧加载完成。
loadedmetadata元数据加载完成。
pause播放暂停。
play播放开始。
playing因为缺少数据而暂停或延迟的状态结束,播放准备开始。
ratechange播放速度变化。
timeupdate由 currentTime 指定的时间更新。
volumechange音量变化。
waiting因为暂时性缺少数据,播放暂停。

二,实现思路讲解

   场景:客户需要一个可以变更样式的简单音乐播放控件。进度条可拖拽,可暂停播放,可调整音量。(没有一键静音😂,感觉不是很难可以自己加)

   解决方案:使用h5原生播放器<audio>原生功能并隐藏原生控制面板,通过html标签重构外观实现。

   实现效果:如下

三,使用到的技术方案展示

        js/html/scss/vue2/elementui

选型思路,首先三件套是基础,vue2主要是因为公司的项目比较老旧,所以没有选择最新的vue3框架,后期会考虑往vue3迁徙。最后用到elemtui。主要是因为手写一个进度条太浪费时间,而且实现进度条的技术难度很低,自己实现一个进度条可以说是既浪费时间又没有什么提升。所以进度条方案选择了elementui组件。

直接上完整源码

<template>
  <div class="audioPlayer" v-show="visible">
    <div class="audioTitle">
      {{ title }}
    </div>
    <div class="btn">
      <i
        @click="playandstop"
        :class="!isplay ? 'el-icon-video-play' : 'el-icon-video-pause'"
      ></i>
    </div>
    <div class="progressBox">
      <div style="margin-right: 20px">{{ start }}</div>
      <el-slider
        v-model.lazy="sliderValue"
        style="width: 400px"
        @input="clickSilder"
        @change="clickSilder"
        :show-tooltip="false"
        :max="maxTime"
        :step="0.1"
      ></el-slider>
      <div style="margin-left: 15px">{{ end }}</div>
      <div>
        <div class="volumeBox">
          <div class="volumeSlider">
            <span>{{ volumeValue }}</span>
            <el-slider
              v-model="volumeValue"
              vertical
              height="100px"
              @change="volumeSilder"
              :max="maxVolume"
              :min="0"
              :show-tooltip="false"
            >
            </el-slider>
          </div>
          <div class="imgWaper">
            <img src="@/assets/images/workSquare/volumeBlock.png" alt="" />
          </div>
        </div>
      </div>
    </div>
    <div class="close" v-if="showCloseBtn">
      <i class="el-icon-close" @click="$emit('update:visible', false)"></i>
    </div>
    <audio
      @volumechange="volumeChange"
      @ended="playEnded"
      @loadedmetadata="loadedmetadata"
      style="display: none"
      id="audioPlayer"
      :src="audioUrl"
      preload="auto"
      :autoplay="autoplay"
    ></audio>
  </div>
</template>

<script>
export default {
  props: {
    visible: {
      type: Boolean,
      default: true
    },
    audioUrl: {
      type: String,
      default: ''
    },
    title: {
      type: String,
      default: ''
    },
    showCloseBtn: {
      type: Boolean,
      default: false
    },
    autoplay: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      isplay: false,
      start: '0:00', //初始值
      end: '0:00', //初始值
      audio: null, //audio元素
      sliderValue: 0,
      maxTime: 100,
      inThrottle: undefined,
      volumeValue: 100,
      maxVolume: 100
    }
  },
  mounted() {
    this.audio = document.querySelector('#audioPlayer')
    this.audio.addEventListener('timeupdate', this.domDone)
  },
  methods: {
    formate(time) {
      const minutes = Math.floor(time / 60)
      const remainingSeconds = Math.floor(time % 60)
      // 确保秒数是两位数
      const displaySeconds =
        remainingSeconds < 10 ? '0' + remainingSeconds : remainingSeconds
      return minutes + ':' + displaySeconds
    },
    domDone(event) {
      this.$nextTick(() => {
        this.start = this.formate(event.target.currentTime)
        this.end = event.target.duration
          ? this.formate(event.target.duration)
          : ''
        this.sliderValue = Math.floor(event.target.currentTime * 10) / 10
        this.maxTime = Math.floor(event.target.duration * 10) / 10
      })
    },
    playandstop() {
      if (this.audio.paused) {
        this.audio.play()
        this.isplay = true
      } else {
        this.audio.pause()
        this.isplay = false
      }
    },
    volumeChange() {
      this.volumeValue = Math.round(this.audio.volume * 100)
    },
    clickSilder(val) {
      // 优化拖动silder卡顿
      if (!this.inThrottle) {
        this.inThrottle = true
        setTimeout(() => {
          this.inThrottle = false
        }, 50)
      } else {
        this.audio.currentTime = val
        return
      }
    },
    playEnded() {
      this.$emit('playEnded')
    },
    play() {
      this.$nextTick(() => {
        this.audio.play()
      })
    },
    pause() {
      this.$nextTick(() => {
        this.audio.pause()
      })
    },
    reset() {
      // 重置播放器的状态
      this.audio.currentTime = 0
      this.audio.volume = 1
      this.volumeValue = 100
      this.isplay = false
      this.audio.pause()
    },
    loadedmetadata(event) {
      this.start = this.formate(event.target.currentTime)
      this.end = this.formate(event.target.duration)
    },
    volumeSilder(val) {
      this.audio.volume = val / 100
    }
  }
}
</script>

<style scoped lang="scss">
.audioPlayer {
  // 定位
  // position: fixed;
  display: flex;
  justify-content: center;
  align-items: center;
  // bottom: 0px;
  // left: 0px;
  width: 100%;
  height: 50px;
  z-index: 999;
  background: rgba(255, 255, 255, 0.425);
  backdrop-filter: blur(10px);
  border-radius: 5px;
}
.audioTitle {
  margin-right: 10px;
}
.progressBox {
  display: flex;
  align-items: center;
}
.btn {
  display: flex;
  align-items: center;
  cursor: pointer;
  i {
    scale: 1.5;
    margin-right: 10px;
    display: flex;
    align-items: center;
    color: rgb(29, 29, 29);
  }
}
.close {
  position: absolute;
  top: 5px;
  right: 5px;
  cursor: pointer;
}
.volumeBox {
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
  height: 50px;
  .volumeSlider {
    position: absolute;
    left: 0px;
    top: -118px;
    padding-bottom: 10px;
    display: none;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    background: rgba(255, 255, 255, 0.911);
    backdrop-filter: blur(10px);
    border-radius: 5px;
    > span {
      display: flex;
      width: 100%;
      justify-content: center;
      margin-bottom: 10px;
      color: #000000;
    }
    ::v-deep .el-slider__button {
      width: 7px;
      height: 7px;
    }
    ::v-deep .el-slider.is-vertical .el-slider__runway {
      width: 5px;
    }
    .imgWaper {
      height: 100%;
    }
  }
  img {
    height: 20px;
    width: 20px;
    margin-left: 8px;
    margin-top: 5px;
  }
}
.volumeBox:hover {
  .volumeSlider {
    display: flex !important;
  }
}
::v-deep .el-slider__button {
  width: 10px;
  height: 10px;
}
</style>

这个音乐播放器是基于简单需求进行开发的,后期应该不会再升级更复杂的功能,此播放器的开发被我暂停在了1.0初级版本。

如果各位需要更复杂的功能和需求可以再此基础上进行升级开发,可拓展的空间很大。

如果点击量不错,后续还会更新

    h5原生视频播放器自定义播放器外观

敬请期待

H5视频播放器(livePlayer.js) 国网B接口服务 电网B接口;支持本地、内网、私有云部署;为企业视频能力建设,提供了视频点播转码、手机直播推流、云端录像存储计划、RTMP拉流推流服务、RTSP拉流推流服务、设备GB28181接入、Onvif云台控制等等能力,同时提供性能强大稳定的WebRTC/RTMP/HLS/RTSP/HTTP-FLV分发,支持H5页面无插件直播,强大的后台管理,详细的二次开发接口文档,服务搭建简单解压后一键启动,支持Windows和Linux环境部署。二、编辑webpack.xxx.config.js。 阅读详情

相关推荐

H5playerV2.1.2开发指南

说明:traceId是查询调用链的唯一标识,H5player不做调用链埋点,只拼接traceId,traceId建议在传入url的时候自行拼接,更方便应用层管理,h5player内部会检测无traceId时会默认拼接上。示例:wss://10.19.147.57:6014/proxy/10.19.147.57:559/EUrl/SiSnW6z?说明:traceId是查询调用链的唯一标识,H5player不做调用链埋点,只拼接traceId,traceId建议在传入url的时候自行拼接。

FL06052146的博客 4829

13款用于Web的流行HTML5视频播放器

播放器是最佳MPEG-DASH播放器之一,其声明的目标是:“dash.js是DASH行业论坛发起的,目的是使用W3C所定义的媒体源扩展API来实现产品级品质的框架,该框架用于创建播放MPEG-DASH内容的视频和音频播放器。这款播放器还拥有用于下载视频切片的自定义ABR算法,并且可以通过供应商(如NPAW、Conviva、MediaMelon、Mux Data、Agama等)出色地支持Multi-DRM、广告插入(CSAI和SSAI)、字幕、分析等功能。它免费、开源且由技术社区的开发者维护。

顺其自然~专栏 1万+

HTML5音乐播放器电台源码及实战指南

本文还有配套的精品资源,点击获取 简介:HTML5听猫播放器是一个基于HTML5技术的在线音乐电台应用源码,它通过使用HTML5的 标签和相关API实现音乐播放功能。该源码项目不仅提供了音乐播放的基本功能,还包括了播放器的外观设计、用户交互、数据管理、响应式布局、事件监听、动态播放列表、内容缓存与预加载以及电台功能的实现。这些功能的实现涉及了HTML、CSS、Jav...

weixin_30653091的博客 1708

H5直播/点播播放器

1、liveplayer 一款集rtmp、m3u8/HLS、flv于一身的H5视频流媒体播放器。使用简单,功能强大,免费使用。 文档链接 2、dplayer 一款开源的高质量H5视频播放器,支持发布弹幕、Bilibili视频及实时视频(HLS/M3U8 FLV)等格式。 文档链接 ...

weixin_43422861的博客 2712

HTML5音乐播放器源码实战:从音频API到Nginx部署

浏览器音频处理是前端开发中兼具实用性与趣味性的领域,而音乐播放器则是这一技术的经典载体。HTML5 与 Web Audio API 为开发者提供了从基础音频播放到频谱分析、音效控制的完整能力。理解音频数据流的传递原理——从音频元素到分析器再到输出设备——是构建健壮播放器的前提,而播放列表管理、状态机设计和异步竞态处理则决定了其工程化水平。此类技术常用于网页设计课程、个人站点媒体体验以及轻量级 Web 应用场景。围绕播放器源码的获取与落地,从 Linux 解压 .7z 资源包、本地静态服务器调试,再到 Ngi

weixin_27945229的博客 166

CloudCompare里那个CSF地面滤波插件,到底怎么用?手把手教你分离点云里的地面

本文详细介绍了如何在CloudCompare中使用CSF地面滤波插件分离点云中的地面数据。通过解析布料模拟滤波算法的核心参数,如布料刚度和网格分辨率,并提供不同地形(城市、丘陵、山地)的适配策略,帮助用户高效处理复杂点云数据。文章还包含实战案例和优化技巧,确保滤波结果的精度和可靠性。

weixin_42548708的博客 221

如何将粘性HTML5 WordPress音乐播放器添加到您的网站

有很多免费和付费的插件可用于将音频播放器添加到WordPress网站。 我们已经创建了一个教程,讨论如何向您的WordPress网站添加免费的音乐播放器 。 在本教程中,我们将重点转移到CodeCanyon上的Sticky HTML5 Music Player WordPress插件 。 如您所见,付费插件提供了免费插件中缺少的许多重要和有用的功能。 您还将获得六个月的免费支持以及终身免费更新...

代码教主 851

手把手教你用Simulink搭建交流异步电机矢量控制模型(附完整仿真文件)

本文提供了一份详细的Simulink仿真指南,手把手教你从零开始搭建交流异步电机矢量控制模型。内容涵盖主电路搭建、坐标变换实现、双闭环PI调节器设计、转子磁链观测器调试等核心步骤,并附有完整的仿真文件,帮助读者跨越理论到实践的鸿沟,掌握高性能电机控制系统的建模与仿真技能。

pz890123的博客 665

自己动手,打造一款适合 Python 程序员的 Html5 音乐播放器

近期断断续续读了一些 Web Audio API 和 WebRTC API 的文档,发现了很多好玩的东西,有一种“忽入桃花源”的感觉。这一款 Html5 音乐播放器,就是基于 Web Audio 技术实现的,原型来自于 Web Audio API 的例子。为什么说适合 Python 程序员呢?因为使用者需要理解下面这一行命令:python -m http.server

Python作业辅导员 - 天元浪子 9276

NR TA

这篇是NR TA的笔记,之前有对R17 NTN TA进行了简单总结,但是也仅仅局限在NTN部分,其他TA基本过程没有涉及,这篇是针对R16版本协议对NR TA相关内容做的总结。和PUSCH power control过程类似,NR TA也可以分为开环 和闭环调整,相关内容分散在38.300,38.211,38.213,38.321,38.133和38.331。后面就按照38.300 TA相关概念,38.211中有关TA定义,38.213 TA 相关内容,38.321 TA控制过程,38.133 Timi

ModemProtocol的博客 768

使用abagen工具箱获取基于脑区的基因表达矩阵

脑区模板定义了您感兴趣的脑区的空间位置。abagen提供了一些预定义的脑区模板,您可以选择使用,也可以使用自定义的脑区模板。它提供了一种简便的方式来获取基于脑区的基因表达矩阵。abagen需要使用Allen脑图谱数据来获取基因表达矩阵。您可以使用abagen内置的下载功能来获取这些数据。这就是使用abagen工具箱获取基于脑区的基因表达矩阵的详细步骤。通过按照上述步骤操作,您可以轻松获取并使用Allen脑图谱数据中的基因表达信息。一旦您加载了脑区模板,您可以使用abagen来获取基于脑区的基因表达矩阵。

web_bug407的博客 1326

android 获取本地所有音频文件_Stellio Player - 安卓本地音乐播放器

Stellio Player 是一款 Android 平台上 高品质 的 本地音乐 播放器应用,通过引入强大的 音频引擎 实现 最高质量的声音 目标。用户可以 完全自由 地通过手动进行操作,使用该引擎可控制 12 频段均衡器 和 各种音频 效果。另配有 简洁美观 的主题等特点,堪称 史上最佳 的本地音乐播放器。安装并打开应用,按照 喜好 选择 主题模式。进入应用首页后即可看到 全部歌曲 列表,默认...

weixin_30304773的博客 2623

最新Python爬虫实战(入门爬虫篇)——案例1:某瓣网站Top250图片数据采集(附上完整爬虫代码)

本次案例通过Python爬虫技术实现了某瓣Top250电影封面的批量下载。代码采用模块化设计,函数实现cookies的自动解析,简化了配置流程,涵盖请求、解析、存储的完整流程。学习重点包括:抓包工具定位数据源、正则表达式匹配图片链接、模拟请求头绕过反爬机制、以及自动化文件管理。需要注意控制请求频率并遵守网站使用规范,适用于入门爬虫实践。

努力让自己发光,对的人才能迎着光而来 16万+

H5 移动端拖拽进度条

最近业务需要移动移动端可拖拽的进度条,用来做音乐播放器,简单研究了一下 <div class="bar_wrap" id="wrap"> </div> css .bar_wrap{ // width: 100%; background-color: aliceblue; // height: 20px; margin-top: 20px; } /** * name 元素选择器 string * w.

u013611033的博客 966

Aurix TC3xx系列MCU ResourceM模块配置(多核资源分配)

为减轻主核的负载率或者平衡各个核的资源分配,通常需要把一些MCU内部资源分配到从核上,在EB tresos工具中,通过ResourceM模块实现多核资源分配。

m0_38045338的博客 1388

【100%通过率】华为OD机试真题 JavaScript 实现【对称美学】【2023 Q1 | 100分】

对称就是最大的美学,现有一道关于对称字符串的美学。 已知: 第1个字符串:R 第2个字符串:BR 第3个字符串:RBBR 第4个字符串:BRRBRBBR 第5个字符串:RBBRBRRBBRRBRBBR相信你已经发现规律了,没错! 就是第i个字符串=第i-1号字符串的取反+第i-1号字符串。取反即(R->B,B->R); 现在告诉你n和k,让你求得第n个字符串的第k个字符是多少。(k的编号从0开始)

MISAYAONE的博客 9850

React H5 Audio Player:打造一致且高度可定制的音频播放体验

React H5 Audio Player:打造一致且高度可定制的音频播放体验 在当今的Web开发中,音频播放器是许多应用不可或缺的一部分。无论是播客、音乐播放器还是教育应用,一个稳定、易用且美观的音频播放器都能显著提升用户体验。今天,我们要介绍的是一个开源项目——React H5 Audio Player,它不仅提供了跨浏览器的UI/UX一致性,还具备极高的定制能力,满足各种复杂需求。 项目介绍...

gitblog_00252的博客 899

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

10 个基于 Web 的 HTML5 音乐播放器

HTML5 是一种用于创建和呈现的网页内容的语言。这是一个革命性的语言,它拥有一些真正棒的功能和一个新的HTML5规范允许本地音频流的播放。本文向你推荐 10 个最棒的 HTML5 音频播放器,看看你喜欢哪个! Speakker Speakker 是一个基于 Web 浏览器的音乐播放器,只提供很多高级播放功能包括播放列表管理和分享。 audio.js

∧︵∧全世界的屋顶 ∧︵∧ 1747

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

开源html5在线音乐,10 个基于 Web 的 HTML5 音乐播放器

HTML5 是一种用于创建和呈现的网页内容的语言。这是一个革命性的语言,它拥有一些真正棒的功能和一个新的HTML5规范允许本地音频流的播放。本文向你推荐 10 个最棒的 HTML5 音频播放器,看看你喜欢哪个! Speakker 是一个基于 Web 浏览器的音乐播放器,只提供很多高级播放功能包括播放列表管理和分享。 audio.js 是一个 js 库用来让 HTML5 的 标签可以在各种浏览器上...

weixin_33524408的博客 2506

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

7款超具个性的HTML5播放器

这篇文章我们要分享一些很有个性的HTML5音乐播放器和视频播放器,它们都具有播放器的大部分功能,并以HTML5和JavaScript实现。这些HTML5播放器有着非常漂亮的外观,很多你都无需自己重新定义样式,引用相关JS即可,源代码大家都可以下载。 我们相信随着HTML5技术和浏览器技术的不断发展,我们的网页一定会越来越酷而且实用,基于HTML5的播放器也会越来越多,我们会继续关注HTML5播放

爱前端网 655

一款简约好看的html5音乐播放器,HTML5 之美:推荐9款优秀的 HTML5 音乐播放器

过去,在网页上播放音频都是通过第三方插件来播放的,如 Flash、QuickTime 和Silverlight 等,没有统一的音频播放标准。HTML5 通过 audio 元素来提供在网页中嵌入音频的标准方法,下面这9款 HTML5 音频播放器都是基于 audio 元素开发的,能够帮助你在网页中轻松的嵌入音频。另外推荐:7款很棒的 HTML5 视频播放器。jPlayerjPlayer 一款基于 j...

weixin_33729662的博客 1730

16款最佳HTML5超酷动画演示及源码

1、HTML5/CSS3图片选择动画 可选择多张图片 之前我们已经分享过几款很酷的HTML5图片特效,像HTML5 3D图片折叠特效、HTML5 3D旋转图片相册等应用。今天我们来分享一款既炫酷又实用的HTML5图片选择特效,当图片被选中时,图片上就会覆盖一个半透明的层,上面有一个勾,并且在选中的时候图片出现弹跳的动画效果。 在线演示 源码下载 2、HTML5/CSS3折叠动画登录表单...

weixin_34174105的博客 4324

通过html+css制作滚动照片墙教程

通过html+css制作滚动照片墙教程 去发现同类优质开源项目:https://gitcode.com/ 本教程向您展示如何使用基础的html代码和css动画属性,打造一个滚动的照片墙。这个照片墙不仅能让您的照片动态展示,还内置了音乐播放器,并且背景图片会随着滚动到最前面的图片进行变化,增加了视觉效果和互动性。 简介 在本教程中,您将学习到: 如何使用html构建照片墙的结构。 如何应用css动...

gitblog_06786的博客 526
上一篇: elemtui,日期时间选择器,禁选时间只能选到58秒的解决方案
a coolcat
博客等级 码龄5年 96粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值