惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LINUX DO - 热门话题
Help Net Security
Help Net Security
AWS News Blog
AWS News Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
NISL@THU
NISL@THU
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
C
Cisco Blogs
P
Privacy International News Feed
博客园 - 聂微东
T
Tenable Blog
Recent Announcements
Recent Announcements
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Latest news
Latest news
The GitHub Blog
The GitHub Blog
爱范儿
爱范儿
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Proofpoint News Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Privacy & Cybersecurity Law Blog
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
Know Your Adversary
Know Your Adversary
S
Schneier on Security
云风的 BLOG
云风的 BLOG
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
W
WeLiveSecurity
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
AI
AI
G
GRAHAM CLULEY
小众软件
小众软件
博客园 - 司徒正美
Scott Helme
Scott Helme
罗磊的独立博客
Project Zero
Project Zero
A
About on SuperTechFans
MyScale Blog
MyScale Blog
L
LangChain Blog
TaoSecurity Blog
TaoSecurity Blog
P
Palo Alto Networks Blog
H
Heimdal Security Blog
N
News and Events Feed by Topic
阮一峰的网络日志
阮一峰的网络日志

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活 翻译 – CSS Sprites:实用技术还是生厌之物? « 张鑫旭-鑫空间-鑫生活 纯CSS实现易拉罐3D滚动效果 « 张鑫旭-鑫空间-鑫生活 纯CSS实现侧边栏/分栏高度自动相等 « 张鑫旭-鑫空间-鑫生活 CSS+JavaScript实现页面不同布局的切换 « 张鑫旭-鑫空间-鑫生活 JavaScript实现最简单的拖拽效果 « 张鑫旭-鑫空间-鑫生活 自己写的无图片版jQuery zxxbox弹出框插件 « 张鑫旭-鑫空间-鑫生活 中国古代道家思想与网页重构的思考 « 张鑫旭-鑫空间-鑫生活 让所有浏览器支持HTML5 video视频标签 « 张鑫旭-鑫空间-鑫生活 纯CSS实现各类气球泡泡对话框效果 « 张鑫旭-鑫空间-鑫生活 JS HEX十六进制与RGB, HSL颜色的相互转换 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变、高光等文字效果 « 张鑫旭-鑫空间-鑫生活 去除冗余 – 精简您的CSS样式代码 « 张鑫旭-鑫空间-鑫生活 对overflow与zoom”清除浮动”的一些认识 « 张鑫旭-鑫空间-鑫生活 jQuery Pagination Ajax分页插件中文详解 « 张鑫旭-鑫空间-鑫生活 absolute绝对定位的非绝对定位用法 « 张鑫旭-鑫空间-鑫生活 网页布局思想浅议-淘宝新版首页为实例 « 张鑫旭-鑫空间-鑫生活 回流与重绘:CSS性能让JavaScript变慢? « 张鑫旭-鑫空间-鑫生活 CSS float浮动的深入研究、详解及拓展(二) « 张鑫旭-鑫空间-鑫生活 CSS float浮动的深入研究、详解及拓展(一) « 张鑫旭-鑫空间-鑫生活 60个极富创造性的震撼的电影海报设计 « 张鑫旭-鑫空间-鑫生活 jQuery Lightbox(balupton版)图片展示插件讲解 « 张鑫旭-鑫空间-鑫生活 博客内嵌flash音乐播放器代码、下载与使用 « 张鑫旭-鑫空间-鑫生活 CSS3 animate实现图片墙3D翻转效果 « 张鑫旭-鑫空间-鑫生活 图片旋转效果的一些研究、jQuery插件及实例 « 张鑫旭-鑫空间-鑫生活 CSS3 border-image详解、应用及jQuery插件 « 张鑫旭-鑫空间-鑫生活 jQuery-两款不同原理的圆角插件讲解 « 张鑫旭-鑫空间-鑫生活 页面可用性之outline轮廓外框的一些研究 « 张鑫旭-鑫空间-鑫生活 CSS3 transition实现超酷图片墙动画效果 « 张鑫旭-鑫空间-鑫生活 HTML CSS列表元素ul,ol,dl的研究与应用 « 张鑫旭-鑫空间-鑫生活 jQuery图片文本滚动切换插件jCarousel中文翻译与详解 « 张鑫旭-鑫空间-鑫生活 酷酷的jQuery鼠标悬停图片放大切换显示效果 « 张鑫旭-鑫空间-鑫生活 IE6下z-index犯癫不起作用bug的初步研究 « 张鑫旭-鑫空间-鑫生活 checkbox复选框的一些深入研究与理解 « 张鑫旭-鑫空间-鑫生活 jQuery之使用slideToggle实现垂直下拉菜单 « 张鑫旭-鑫空间-鑫生活 jQuery-innerfade内部列表自动淡入淡出插件 « 张鑫旭-鑫空间-鑫生活 jQuery-火焰灯效果导航菜单 « 张鑫旭-鑫空间-鑫生活 IE下css bug集合-翻译自haslayout.net « 张鑫旭-鑫空间-鑫生活 翻译-IE7/8@font-face嵌入字体与文字平滑 « 张鑫旭-鑫空间-鑫生活 jQuery-马化腾产品设计与用户体验的一些技术实现 « 张鑫旭-鑫空间-鑫生活 像素的世界及其在web开发制作中的应用 « 张鑫旭-鑫空间-鑫生活 css行高line-height的一些深入理解及应用 « 张鑫旭-鑫空间-鑫生活 CSS实现圆角六色渐变自适应按钮详解 « 张鑫旭-鑫空间-鑫生活 我熟知的三种三栏网页宽度自适应布局方法 « 张鑫旭-鑫空间-鑫生活 jQuery照片图像剪裁插件Jcrop中文翻译详解 « 张鑫旭-鑫空间-鑫生活 Ajax Upload多文件上传插件翻译及中文演示 « 张鑫旭-鑫空间-鑫生活 告别图片—使用字符实现兼容性的圆角尖角效果beta版 « 张鑫旭-鑫空间-鑫生活 大小不固定的图片、多行文字的水平垂直居中 « 张鑫旭-鑫空间-鑫生活 jQuery boxy弹出层对话框插件中文演示及讲解 « 张鑫旭-鑫空间-鑫生活 JavaScript实现新浪微博文字放大显示动画效果 « 张鑫旭-鑫空间-鑫生活 翻译:让网络更快一些——最小化浏览器中的回流(reflow) « 张鑫旭-鑫空间-鑫生活 jQuery之addClasas与removeClass使用实例 « 张鑫旭-鑫空间-鑫生活 关于Google圆角高光高宽自适应按钮及其拓展 « 张鑫旭-鑫空间-鑫生活 JavaScript实现图片幻灯片滚动播放动画效果 « 张鑫旭-鑫空间-鑫生活 jQuery-鼠标经过显示大图并跟随鼠标效果插件 « 张鑫旭-鑫空间-鑫生活 关于gif图片(或png8)杂边锯齿的问题 « 张鑫旭-鑫空间-鑫生活 对html与body的一些研究与理解 « 张鑫旭-鑫空间-鑫生活 鲜为人知的一个解决兼容性问题的利器——小数 « 张鑫旭-鑫空间-鑫生活 搜狐白社会似iphone短信对话框效果的优化 « 张鑫旭-鑫空间-鑫生活 关于文字内容溢出用点点点(…)省略号表示 « 张鑫旭-鑫空间-鑫生活 jquery之append与insertBefore使用实例 « 张鑫旭-鑫空间-鑫生活 jQuery之图片关联伸缩效果 « 张鑫旭-鑫空间-鑫生活 jquery之图片左右切换动画效果 « 张鑫旭-鑫空间-鑫生活 jQuery之replace字符串替换实现不同尺寸图片切换 « 张鑫旭-鑫空间-鑫生活 jQuery-实现图片的放大镜显示效果 « 张鑫旭-鑫空间-鑫生活 jQuery-单击文字或图片内容放大显示效果插件 « 张鑫旭-鑫空间-鑫生活 reflection.js-实现图片投影倒影效果js插件 « 张鑫旭-鑫空间-鑫生活 jQuery-很酷的弹出层效果js插件 « 张鑫旭-鑫空间-鑫生活 复选框单选框与文字对齐问题的研究与解决 « 张鑫旭-鑫空间-鑫生活 css margin的相关属性,问题及应用 « 张鑫旭-鑫空间-鑫生活 IE6下png背景不透明问题的综合拓展 « 张鑫旭-鑫空间-鑫生活
基于howler.js写了个音频播放器组件 « 张鑫旭-鑫空间-鑫生活
张鑫旭,zhangxinxu · 2022-03-15 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=10349 鑫空间-鑫生活
本文可全文转载,转载请注明原作者和出处。

封面图

一、简述

抽时间写了个音频播放器组件,支持序列播放,支持倍速控制,桌面端和移动端通用,兼容现代浏览器,不支持 IE 浏览器。

演示地址:https://zhangxinxu.gitee.io/howlerjs-player/

音频播放组件示意图

项目地址

地址:https://gitee.com/zhangxinxu/howlerjs-player

现在我的开源小玩意全部都放在 Gitee 上了,因为开源实际上也是有国界的,放在里面安全点,访问速度也更快。

也欢迎关注我的 Gitee 账号

关注我的gitee

快速使用

本组件采用 Web Components 组件开发,使用的时候引入一个 JS,然后就可以使用了,如下所示:

  1. 引入 ui-audio.js
    <script type="module" src="./src/ui-audio.js"></script>
  2. 此时就可以使用 <ui-audio> 元素进行音频播放处理了,相关的属性和 API 基本上和原生的 <audio> 元素一致。
    <ui-audio src="your.mp3" controls></ui-audio>

    移动端显示

接下来详细介绍下 API 和一些细节知识。

二、API 详细介绍

支持几乎所有 HTML <audio> 元素支持的 API。

HTML 属性

所谓 HTML 属性,指的是可以在 HTML 元素上设置并生效的属性。

loop
支持值 0, 1, 2,分别表示顺序播放,随机播放和循环播放。

播放按钮

如果不设置,音频播放完毕即停止,也不会显示播放顺序设置按钮,如下 GIF 示意。

loop false 隐藏循环按钮

muted
布尔属性值,表示是否静音,此时声音图标会变成禁止标志,音量也会变成 0。
静音设置示意
controls
是否显示音频控制器。如果没有设置此属性,则播放器界面不可见,适合播放背景音乐。
src
当前播放的音频地址。
prevsrc
上一个播放的音频地址。如果不设置,不显示上一个播放按钮,如果是空字符串或者是 ‘none’,上一个播放按钮则禁用。
nextvsrc
下一个播放的音频地址。如果不设置,不显示下一个播放按钮,如果是空字符串或者是 ‘none’,下一个播放按钮则禁用。
type
音频播放的类型。和原生的 type 属性不同,这里只需要后缀名称即可,无需指定mime type,一般用在 src 地址没有暴露音频文件后缀的场景下。
label
标签提示信息,一般用来显示当前播放音频的名称或者描述。如果不设置,则不显示对应元素。

label描述信息

mode
当前播放的音频模式,支持 ‘webapi’ 和 ‘html5’ 两种方式,默认是 webapi,如果希望使用 html5 播放,可以设置 mode=”html5″,一般音频文件比较大,或者希望音频边下载边播放的时候使用 html5 模式。html5 模式在移动端,尤其 Safari 下可能会有体验问题。

以上 HTML 属性均可以直接从 DOM 对象上设置或获取,例如:

const audio = document.querySelector('ui-audio');
// 获取
console.log(audio.loop);
// 设置
audio.muted = false;

JS 属性

而下面这些属性或方法只能通过 DOM 对象在 JavaScript 中进行设置。

属性
currentTime
当前播放的时间,单位是秒。
volume
当前的音量,范围0-1。
playbackRate
用来设置或获取当前媒体文件的播放速率,值为数值。
paused
当前音频是否暂停中。
方法
play()
音频播放。
pause()
音频暂停。
stop()
音频停止,播放点会回到 0。
prev()
播放前一个音频。
next()
播放下一个音频。
state()
返回当前音频的状态,值包括:’unready’, ‘unloaded’, ‘loading’, ‘loaded’
load()
触发音频文件的加载。
unload()
音频文件的卸载,会停止播放音频,并释放内存。
事件
play
播放时触发。
pause
暂停时触发。
load
加载完毕触发。
end
播放完毕触发,如果是单曲循环,则每次播放结束都会执行一次。
stop
播放停止触发。
seek
改变播放的位置时候触发,例如点击或拖动进度条。
playing
当前正在播放的时候触发,每秒执行约 60 次。
error
加载或播放错误的时候触发,错误类型通过 event.detail 获取。
audio.addEventListener('pause', function () {
    // 暂停啦...
});

三、实际使用说明

如果只是基础的单音频播放,只需要使用上面的属性或方法进行设置就能满足需求。

但是,如果是具有播放列表的复杂音频播放器,则需要自己根据业务代码和上面提供的API接口进行处理。

正如项目演示页面所示。

需要自己根据播放状态(随机播放,还是顺序播放)改变 prevsrcnextsrc 的属性值,此时播放器会根据在播放结束之后自定义播放 nextsrc 对应的音频地址。

控件的自定义

首先讲下基础控件的显隐自定义。

  1. 默认“倍速”按钮是显示的,如果希望隐藏,可以在 <ui-audio> 元素上设置 rate="none"

    rate=

  2. 如果希望显示循环播放设置按钮,设置 loop 属性值为 ‘0’, ‘1’, ‘2’ 中的一个即可,如果仅仅是 loop 属性,不会显示此按钮,仅仅表示单曲循环播放。
    <!-- 单曲循环,不显示设置循环模式按钮 -->
    <ui-audio loop>
  3. 如果没有设置 prevsrcnextsrc 属性,则前后播放按钮是不会显示的。
    前后播放按钮示意

    上图之所以“上一个”播放按钮禁用态,是因为设置了 prevsrc="none"

移动端下,音量控制,以及倍速和循环按钮会自动收起,以节约布局空间,此时可以通过点击对应的按钮呼起相应的控件。

移动端布局效果示意

样式的自定义

整个组件基于 CSS 变量构建,同时使用 part 暴露了 Shadow DOM 内部主要的元素。

因此,想要对组件进行样式自定义,既可以使用 CSS 变量,也可以使用 ::part 伪元素。

例如,本组件的基本单位是 1rem,如果希望进行设置,则可以这么处理:

ui-audio {
    --1rem: 16px;
}

希望重置使用的图标,可以使用下面这些 CSS 变量:

--ui-audio-icon-prev: url();
--ui-audio-icon-next: url();
--ui-audio-icon-play: url();
--ui-audio-icon-pause: url();
--ui-audio-icon-muted: url();
--ui-audio-icon-unmuted: url();
// 更多图标,移动端出现
--ui-audio-icon-more: url();
// 随机播放图标
--ui-audio-icon-shuffle: url();
// 顺序播放图标
--ui-audio-icon-swap: url();
// 单曲循环图标
--ui-audio-icon-repeat: url();

以及支持全局的背景色和颜色变量:

--ui-audio-background
--ui-audio-color

如果希望更进一步的样式设置,则 ::part 伪元素是非常好的选择,例如:

part 属性示意

因此,我们可以使用下面这些伪元素对整个组件进行精确的样式设置:

ui-audio::part(container) {}
ui-audio::part(label) {}
ui-audio::part(operate) {}

例如,希望播放器换个皮肤颜色,可以这样处理:

<ui-audio class="your-audio" src="your.mp3" controls></ui-audio>
.your-audio::part(container) {
    background: darkred;
    color: #fff;
}

效果如下图所示:

改变颜色后的效果

如果对 ::part 伪元素还不是很了解,可以参考这篇文章:“使用::part伪元素改变Shadow DOM的CSS样式

Slot占位

组件在下图所示的位置提供了一个占位符,可以使用下面的语法插入你希望插入的 DOM 元素结构。

占位符内容

语法是设置 slot="custom",例如:

<ui-audio controls>
    <span slot="custom">by zhangxinxu</span>
</ui-audio>

自定义元素示意

由于播放器采用的是 flex 布局,因此,大家可以使用 order 属性调整自定义占位元素的位置,不一定在最后显示。

如果对 <slot> 插槽元素不是很了解,可以参见这篇文章:“HTML slot 插槽元素深入

在 Web Components 组件开发中,<slot> 插槽元素是非常实用的,必学必会。

四、关于howler.js

本组件依赖 howler.js,这是我用过体验非常好(从未出bug)的音频播放控制组件,优先使用 Web Audio API 实现。

项目地址:https://github.com/goldfire/howler.js

目前 Star 数目快 2 万了。

Star 数目

其他不多说,使用还是比较简单的,方法和API也比较丰富。

五、好,就说这么多

业余时间整的个玩意,突然来了兴趣,就弄了下,以后需要用的时候直接拿过来用就好了,同时对一些新技术练练手。

不过自己未在实际项目中应用,不保证百分百无 bug,如果使用过程中有什么问题,欢迎反馈,或者 pull 下,共同建设。

好,以上就是本文的全部内容,感谢阅读。

希望里面的内容能够对你的工作与学习有所帮助。

对了,本文可以任意转载,无版权限制。

点亮灯泡

本文为原创文章,欢迎分享,转载请注明住处,方便溯源,因为会及时更新知识点及修正错误,阅读体验也更好。
本文地址:https://www.zhangxinxu.com/wordpress/?p=10349

(本篇完)