前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >能用 CSS 能播放声音吗?[每日前端夜话0xF1]

能用 CSS 能播放声音吗?[每日前端夜话0xF1]

作者头像
疯狂的技术宅
发布于 2019-12-11 02:54:58
发布于 2019-12-11 02:54:58
2.4K00
代码可运行
举报
文章被收录于专栏:京程一灯京程一灯
运行总次数:0
代码可运行

正文共:3969 字

预计阅读时间:10 分钟

翻译:疯狂的技术宅 作者:Alvaro Montoro 来源:css-tricks

CSS 是样式、布局和表示的领域。它充斥着颜色、大小和动画。但是你知道吗,它还可以在网页上控制播放声音。

本文介绍了一些技巧。实际上它并不是真正的 hack,而是针对 HTML 和 CSS 的严格实现。不过说实话,这仍然是一种 hack。我不建议在生产中使用它,因为音频可能还会被 <audio> 元素或 JavaScript 进行控制。

窍门

用 CSS 播放声音有好几种方法,但是其基本思想是相同的:将音频文件作为网页中的隐藏对象或文档插入,并在有操作发生时显示它。像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<style>
  embed { display: none; }
  button:active + embed { display: block; }
</style>

<button>Play Sound</button>
<embed src="path-to-audio-file.mp3" />

这段代码使用了 <embed> 标签,也可以使用 <object> 得到类似的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<object data="path-to-audio-file.mp3"></object>

关于这个演示和相关技术的快速说明。大约一年前,我用这种技术开发了一种仅使用 HTML 和 CSS 的 CodePen 小型钢琴(https://codepen.io/alvaromontoro/pen/ejwXJm)。效果很好,但是从那以后,情况发生了变化,该演示在 CodePen 上不再起作用。

最大的变化与安全性有关。由于它用的是 embedobject 而不是 audio,所以导入的文件将会受到更严格的安全检查。跨域访问控制策略(CORS)强制音频文件与导入文件的页面位于相同的协议和域上。即使将声音放到 base64 中也将不再起作用。此外,你(和用户)可能需要在其浏览器设置上激活自动播放功能,此技巧才能起作用

另一个变化是,浏览器现在只播放一次声音。我会发誓过去的浏览器每次都会播放声音。但现在似乎不再行得通了,这大大限制了技巧的范围(并且使这个钢琴演示几乎毫无用处)。

如果你可以控制服务器和文件,则可以解决 CORS 问题,但是禁用的自动播放是每个用户都无法控制的事情。

查看演示:https://codepen.io/alvaromontoro/full/bGGjNom

这为什么有效

可以在 embed 标签的定义(https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-embed-element)中发现这种行为背后的理论:

每当非潜在活动(https://html.spec.whatwg.org/multipage/iframe-embed-object.html#concept-embed-active)的 embed 元素变为潜在活动状态,并且每一个仍处于处于潜在活动状态,且其 src 属性或 type 属性被设置、更改或删的设置,用户代理必须使用 embed 任务源将任务排队(https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task)来运行 embed 元素设置步骤(https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-embed-element-setup-steps)。

object 标记的定义(https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-object-element)也是如此:

每当出现以下情况之一: […]

  • 元素从正在渲染(https://html.spec.whatwg.org/multipage/rendering.html#being-rendered)变为未渲染,反之亦然,

[…] user agent 必须将任务排队才能运行以下步骤,来(重新)确定 object t元素代表什么。[并且最终处理并运行它]

尽管我们对 object(文件已处理并在渲染上运行)的处理机制更清楚,但对于 embed,具有“潜在活动”的概念,这似乎有些复杂。尽管还有一些其他的条件,但它会在初始渲染上运行,这与处理 object 的方式类似。

如你所见,从技术上讲,这根本不是一个把戏,但是并非所有浏览器的行为方式都是如此。

浏览器支持

与许多类似的 hack 技巧一样,这个功能的支持也不是很好,并且随浏览器的不同而有很大差异。

在 Opera 和 Chrome 浏览器上,它能够工作。但是,对于其他基于 Chromium 的浏览器,该支持很少。例如,Mac 上的 Edge 可以正确播放音频,而 Brave 浏览器则不会正确播放音频,除非你有最新版本。

在 Safari 中无法使用,对于 Windows 上的 Internet Explorer 或 Edge 来说也是如此。在这些浏览器中都无法使用。

Firefox 会在页面加载时立即播放所有声音,但是在隐藏并再次显示后,将不再播放。当声音试图“无用户交互”地播放时,它会在控制台中触发安全警告,除非用户首先批准该站点,否则它们将被阻止。

?总的来说,这是有趣的 CSS 技巧,不过却是一种“不要用在发布的产品中”的事情…… ?

原文:https://css-tricks.com/playing-sounds-with-css/

在公众号内回复“体系”查看高清大图

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端先锋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在 Python 中播放声音
我们首先检查playsound库,它为在Python中播放声音文件提供了一个简单直接的解决方案。凭借其最低的设置要求,开发人员可以使用单个函数调用将音频播放快速集成到他们的应用程序中。但是,对于更高级的音频功能,我们深入研究了两个流行的库:pygame和pyglet。Pygame是一个强大的多媒体库,以其处理音频,图形和用户输入的能力而闻名。
很酷的站长
2023/08/11
8460
在 Python 中播放声音
解决苹果Safari 浏览器下html不能自动播放声音和视频的问题-实时语音通话功能【唯一客服】
在实现我的客服系统中,实时语音通话功能的时候,如果想自动播放音视频流,在苹果设备上遇到了问题。
唯一Chat
2023/03/10
3.9K0
现代浏览器探秘(part3):渲染 [每日前端夜话(0x12)]
这是关于浏览器内部工作原理系列的第3部分。 之前,我们介绍了多进程架构和导航流程。 在这篇文章中,我们将看看渲染器进程内部发生了什么。
疯狂的技术宅
2019/03/27
1.4K0
现代浏览器探秘(part3):渲染 [每日前端夜话(0x12)]
chrome 66自动播放策略调整
Web浏览器正在朝着更严格的自动播放策略发展,以便改善用户体验,最大限度地降低安装广告拦截器的积极性并减少昂贵和/或受限网络上的数据消耗。这些更改旨在为用户提供更大的播放控制权,并使开发商获得合法用例。
gnip
2020/10/29
5.2K0
用CSS Grid Shepherd技术对数据进行排序[每日前端夜话0x7B]
牧羊人很擅长照顾他们的羊群,为牧群带来秩序和结构。即使有几百只毛茸茸的动物,牧羊人仍然会在一天结束时将它们悉数带回农场。
疯狂的技术宅
2019/06/03
5820
HTML技术入门
本文并没有详细介绍每个知识点,因为官方的文档介绍的更好,建议前往学习(https://www.w3cschool.cn/html/),本文主要记录一些重点内容和细节。
码之有理
2023/02/13
2.4K0
为了防止狗上沙发,写了一个浏览器实时识别目标功能
网友的家里有一条狗🐶,很喜欢乘人不备睡沙发🛋️,恰好最近刚搬家 + 狗迎来了掉毛期 不想让沙发上很多毛。所以希望能识别到狗,然后播放“gun 下去”的音频📣。
@派大星
2024/03/20
1150
为了防止狗上沙发,写了一个浏览器实时识别目标功能
HTML音频操作
    如视频播放一样,在HTML5出现之前我们要想在浏览器中播放音频,没有一个官方浏览器遵循的播放标准(也就是没有提供一个可以专门来处理音频的HTML标签),我们依然需要使用适用于各种浏览器的音频播放插件才可以(比如:Flash,JavaApplet、ActiveX等)。
十分钟空间
2022/08/17
2.1K0
requestAnimationFrame 执行机制探索
上面的代码 1s 大约执行 60 次,因为一般的屏幕硬件设备的刷新频率都是 60Hz,然后每执行一次大约是 16.6ms。使用 requestAnimationFrame 的时候,只需要反复调用它就可以实现动画效果。
winty
2021/11/24
1.2K0
requestAnimationFrame 执行机制探索
HTML5音频audio详解
直到现在,仍然不存在一项旨在网页上播放音频的标准。 目前,大多数音频是通过插件(比如 Flash)来播放的。然而,并非所有浏览器都拥有同样的插件。 HTML5 规定了一种通过 audio 元素来包含音频的标准方法。 audio 元素能够播放声音文件或者音频流。
业余草
2019/01/21
3.1K0
超动感音乐可视化:WebAudio与Shader的震撼结合!
Web Audio API 提供了在 Web 上控制音频的一个非常有效通用的系统,允许开发者来自选音频源,对音频添加特效,使音频可视化,添加空间效果 (如平移),等等。
张晓衡
2019/12/16
1.4K0
超动感音乐可视化:WebAudio与Shader的震撼结合!
Hexo博客 | 博客中能用到的代码(一)
这篇文章介绍了如何使用font awesome图标字体库,使用动态图标,添加网页运行时间,全站变黑白,鼠标点击特效,网页标题的动态效果,网页樱花特效,鼠标触动音乐特效,之前还介绍过打字机效果,可以看看这篇文章
Justlovesmile
2021/12/13
8840
Hexo博客 | 博客中能用到的代码(一)
在 HTML 中包含资源的新思路[每日前端夜话0xC3]
注意:这篇文章描述了一种我们仍需要测其试性能影响的实验技术。它可能最终会成为一种有用的工具,也有可能成为不被推荐的做法。无论哪种方式,它对我们来说很有吸引力!
疯狂的技术宅
2019/09/25
3.2K0
在 HTML 中包含资源的新思路[每日前端夜话0xC3]
HTML5 学习总结(一)——HTML5概要与新增标签
张果
2018/01/04
2.8K0
HTML5 学习总结(一)——HTML5概要与新增标签
文档解析和DOMContentLoaded触发时机
| 导语 大家都知道 HTML 文档完全加载和解析完成之后,会触发 DOMContentLoaded 事件,那么 HTML 里面的内容会如何影响文档解析呢?在解析过程中遇到 script 标签或者 link 标签时,解析会受影响吗?我们通过不同情况举例和 HTML5 规范一起分析一下。 DOMContentLoaded 触发定义 HTML 文档被完全加载和解析完成之后,会触发 DOMContentLoaded 事件,通常外部样式表和文档内的图片加载都不会影响该事件触发,不过也有特殊情况,我们后面会提到。 如
用户1097444
2022/06/29
7830
文档解析和DOMContentLoaded触发时机
每日两题 T36
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
合一大师
2020/07/20
2470
每日两题 T36
CSS粘性定位是怎样工作的 [每日前端夜话0x1F]
第一,受到浏览器的良好支持需要漫长的等待:浏览器的支持往往需要很长的时间才能完成,到时候它的功能已经被人们遗忘了。
疯狂的技术宅
2019/03/27
1.8K0
CSS粘性定位是怎样工作的 [每日前端夜话0x1F]
W3C TPAC 大会上的 Service workers 内容总结[每日前端夜话0xCD]
上个月,我们在福冈举行的 W3C TPAC 会议上召开了 service worker 会议。这是几年来我们第一次专注于潜在的新功能和行为。现总结如下:
疯狂的技术宅
2019/10/13
8590
iNotify.js 2 实现浏览器的title闪烁滚动声音提示,弹出通知
JS 实现浏览器的 title 闪烁、滚动、声音提示、chrome、Firefox、Safari等系统弹出通知。它没有依赖,压缩只有只有4.66kb(gzipped: 1.70kb),demo 实例预览。
小弟调调
2018/08/10
6.8K2
iNotify.js 2 实现浏览器的title闪烁滚动声音提示,弹出通知
Vue3开发:视频播放器video.js使用详解
Video.js是一个通用的在网页上嵌入视频播放器的JS库,比原生video标签有更强大的功能、更好的兼容性、更美观等优点。是一个比较流行的视频播放器,它的官网是https://videojs.com/
BennuCTech
2023/08/28
10.9K0
Vue3开发:视频播放器video.js使用详解
推荐阅读
相关推荐
在 Python 中播放声音
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验