当您在谷歌上搜索如何使用 CSS 播放声音时,您会发现
- 一些关于反恐精英:起源的内容
- 一些关于
play-during
和cue-before
的内容,以及看起来很有希望但实际上是用于 听觉样式表(辅助功能/屏幕阅读器内容),而不是如何在任何浏览器中将驴叫声与菜单项悬停关联起来
我认为声音是设计的一部分,因此播放/触发声音的能力应该属于 CSS,但可惜我们还没有达到这一步。 要在鼠标悬停在某个区域时播放声音,我们需要依赖 HTML5 或 Flash。 但是这里没有人想处理 Flash,对吧? 所以让我们用 HTML5 来做,它可以通过其<audio>
元素播放声音(Firefox 3.5+、Chrome 3+、Opera 10.5+、Safari 4+、IE 9+)。 为了获得尽可能广泛的浏览器支持,我们将使用 MP3 源(WebKit 和 IE)和 OGG 源(Firefox 和 Opera)这样来实现。
<audio>
<source src="audio/beep.mp3"></source>
<source src="audio/beep.ogg"></source>
Your browser isn't invited for super fun audio time.
</audio>
如果您将代码完全按照上述方式插入页面,您将看不到或听不到任何内容。 如果您想要一个小播放器元素,请确保使用 controls 属性(<audio controls>
)。 如果您希望它播放但不可见,请确保使用 autoplay 元素(<audio autoplay>
)。 或者两者兼而有之……
我们的目标是在鼠标悬停在某个元素(例如菜单项)上时播放声音。 遗憾的是,我们无法通过 CSS 告诉<audio>
元素该怎么做,因此我们需要 JavaScript。 要使用 JavaScript 播放声音
var audio = document.getElementsByTagName("audio")[0];
audio.play();
// or with an ID
var audio = document.getElementById("mySoundClip");
audio.play();
让我们使用 jQuery,因为它可以使选择和处理事件变得更容易。
var audio = $("#mySoundClip")[0];
audio.play();
因此,要使此声音在鼠标悬停在某个元素上时开始播放
var audio = $("#mySoundClip")[0];
$("nav a").mouseenter(function() {
audio.play();
});
另一种方法……
针对 Goodfoot 移动应用程序 的预告页面使用了类似的技术,在您将鼠标悬停在雪人身上时播放奇怪的呻吟声(通过 Dave Rupert)。 他们通过在每次将鼠标悬停在雪人身上时将新的音频元素注入 DOM 来实现这一点
$("#speak").mouseenter(function(){
$("<audio></audio>").attr({
'src':'audio/'+Math.ceil(Math.random() * 5)+'.mp3',
'volume':0.4,
'autoplay':'autoplay'
}).appendTo("body");
});
这可能需要稍微改进一下,以便也支持 OGG。 不确定 volume 属性是做什么用的,这不在 规范 中,而且我在任何地方都没有看到它得到支持。 这是根据 Jeffrey Way 修改的
function addSource(elem, path) {
$('<source>').attr('src', path).appendTo(elem);
}
$("#speak").mouseenter(function(){
var audio = $('<audio />', {
autoPlay : 'autoplay'
});
addSource(audio, 'audio/'+Math.ceil(Math.random() * 5)+'.mp3');
addSource(audio, 'audio/'+Math.ceil(Math.random() * 5)+'.ogg');
audio.appendTo('body');
});
我完全赞同这种方法,因为它看起来运行良好,这就是底线。 声音播放一次后似乎会被缓存并快速播放,这很好。
另一种处理方法是立即将所有三个音频元素放到页面上。
<audio preload="auto" id="sound-1" > ... src & fallback ... </audio>
<audio preload="auto" id="sound-2" > ... src & fallback ... </audio>
<audio preload="auto" id="sound-3" > ... src & fallback ... </audio>
然后随机选择一个播放
$("#speak").mouseenter(function() {
$("#sound-" + Math.ceil(Math.random() * 3))[0].play();
});
试验与麻烦:重叠的声音
我最初的想法是使用一个导航菜单,在将鼠标悬停在菜单项上时播放轻微的点击声。 立即发现了这个问题:您可以比声音完成播放的速度快得多地将鼠标悬停在菜单项上并触发.play()
。 单个音频元素无法以重叠的方式播放自身声音。 它只是忽略进一步的.play()
请求,直到它完成播放。
我的第一次尝试是使用.pause()
停止播放,然后再次使用.play()
,但在我的测试中,这并没有多大帮助。 它似乎会遵守暂停,但在许多情况下不会遵守播放。
我发现最流畅的方法是为每个菜单项复制音频元素。 这样,每个菜单项都有自己的音频片段可以播放,并且声音可以重叠
$("nav a") // loop each menu item
.each(function(i) {
if (i != 0) { // only clone if more than one needed
$("#beep")
.clone()
.attr("id", "beep-" + i)
.appendTo($(this).parent());
}
$(this).data("beeper", i); // save reference
})
.mouseenter(function() {
$("#beep-" + $(this).data("beeper"))[0].play();
});
$("#beep").attr("id", "beep-0"); // get first one into naming convention
我喜欢使用 Flash 的替代方案,将来我必须使用这个。 谢谢 Chris!
如何循环菜单项?
我对此感到沮丧,我看到的只是 mouseenter,我试图弄清楚,而不是悬停效果,点击效果我尝试了 mouseclick、mousedown、onmouseclick、onclick,点击效果在哪里?其次,我应该如何使用其中的一些示例,特别是最后一个“试验与麻烦:重叠的声音”……有一堆我根本不知道是什么或代表什么的 id 名称和单词。#nav a..好吧,我假设那是你的导航栏和所有“a”链接,但是“#beep”?那是什么,那是你的音频文件吗?你从 src 获取的音频 id?或者你为音频文件或其他内容创建的 id?“id”是否只是我们必须放入的内容?或者你是告诉我们随机的 id 会替换它,如果是这样,哪个?“beep-”、“beeper”和“#beep”以及“beep-0”是什么?它们可以由您创建的随机 id,也可以是声音文件,您应该放入 html,以便我们知道您在 javascript 中放置的确切 id 或单词,一切都乱七八糟。放入 html,以便我们可以简单地将自己的 html 与我们的 javascript “连接起来”。
好的,我喜欢! 很棒的教程,但是声音不是网站上最烦人的东西吗? 我的意思是,当人们在工作时浏览网页,然后突然开始播放音乐,或者每次将鼠标悬停在导航上时都会听到烦人的“点击” “点击” “点击”。
我只是说说而已。 不过教程很好;)
是的,我同意。 如果它是一个非常非常安静的“点击”,就像您转到演示的最后一部分并将音量调低到距离底部大约两毫米的空间一样,我会接受它
Chris,当我点击演示按钮时,我的杀毒软件说它是“HTML 脚本感染”并中止连接。
不过,文章写得很好。
感谢您的教程,但这让我不寒而栗,因为人们实际上会将其添加到他们网站的导航按钮中。 2advanced-era bleepity-boopity 网站遍地都是……
哈哈!“奇怪的呻吟声”
各位,欢迎来到恼人的(非)Flash 网站 2.0
如果您真的必须这样做,我认为最好的方法是创建一个音频元素并在声音结束时将其删除,这样
• 您不必等待前一个声音结束
• 前一个声音不会被打断
也考虑预加载声音
你的评论证明你根本不明白发生了什么事。
你建议在声音播放完毕后删除音频元素? 关键是要让之前的音频停止以播放新的音频,而不是让旧音频完成播放。 在你胡乱发表负面言论之前,先学会阅读。
欢迎来到 Federico 失败 2.0
查看 Scott Schiller 的 Sound Manager 2。 这是一个非常棒的库。 当用户点击无序列表(而不是主播放器)中歌曲旁边的播放按钮时,Last.FM 会使用它。 Schiller 在他自己的网站上使用它来做你在这里描述的(使用悬停效果)的事情,网址是 http://www.schillmania.com/
我相信最新版本甚至会根据需要使用 HTML5。
如果目标是让用户远离网站,那么在导航上使用恼人的小声音应该非常有效。
这是一个有趣的概念证明,但我不敢想象它会导致什么。
各位 —
完全理解你们在“啊,太恶心了”方面的想法。
声音可能会被滥用。
但是。
颜色可以被误用。图像可以被误用。字体可以被误用。文字可以被误用。油漆可以被误用。锤子和钉子可以被误用。
这只是一个技术演示,它赋予我们创造力的力量。请明智地使用。
你完全正确——在合适的环境下,这完全可以接受。想想针对儿童的网站,或者像Pandora或Last.FM这样的以声音为导向的网站上的按钮。
我在第一句话中两次说了“完全”,真的很想编辑一下…… :)
我对在我的艺术家页面上创建一个动画头像感兴趣。我想实现的是,当人们对我有兴趣并点击我的动画头像时,我的其中一首歌曲开始播放。我希望图片是动画的,以便吸引人们的注意力,但不要让人感到厌烦。
没错……大多数人都是千篇一律的人物,被他们认为应该成为的样子所塑造,无法摆脱困境,因为他们的老师曾经告诉他们永远不要学习如何使UX更具互动性。
那些说声音很烦人的人可能也不太善于使用他们的其他感官。
感谢你的教程,并尝试帮助人们学习。
JavaScript代码的最后一个示例是最佳解决方案,我现在可以听到每秒钟许多活动的悬停。感谢Chris!
我立刻想到了我以前大学的老师,他讨厌Flash以及网页上所有奇怪的点击和声音,除非是音乐或视频网站。我想知道他会怎么看待这个。至少可以说,这非常有创意。
哦,天哪,我以为这些烦人的Flash悬停声音已经成为过去。我同意,知识是好的,但我真的希望这不会成为html网站的趋势。
这是一个很棒的教程!!我看到这里有很多争论,但无论如何,能够在不使用Flash的情况下在悬停时播放声音是一件好事!!
哦!我真的很喜欢它!!:D
我在几个小时前已经阅读了你的文章,现在我回来查看评论。我不得不说,我对你的反应感到非常高兴;)
这是一篇很棒的文章。非常好。感谢分享你的想法。
好主意!我想知道是否有办法在没有JS的情况下做到这一点。想到的一个想法是使用CSS :before或:after选择器。也许像这样
.navSelect:hover:after {
content: "
您的浏览器没有被邀请参加超级有趣的音频时间。
"
}
我不确定是否可以堆叠伪类,所以它可能必须像.navSelect:hover span:after或a:after。
这不会达到预期效果并在技术上由CSS控制吗?
抱歉,帖子被吃掉了……以下是它应该是什么样子
.navSelect:hover:after {
content: "
<audio autoplay>
<source src="audio/beep.mp3"></source>
<source src="audio/beep.ogg"></source>
您的浏览器没有被邀请参加超级有趣的音频时间。
</audio>
您的浏览器没有被邀请参加超级有趣的音频时间。
"
}
恐怕这不起作用。上次我尝试时,你放在content属性中的内容被视为字符串,html元素不是这样创建的。
补充我的两分钱——在使用它时要非常非常小心。到目前为止,我无法想象有任何情况下它是合适的,但可能有一些。
你可以通过将声音事件添加到fxqueue中来排队吗?
此外,您可能希望将id添加到第一个html块中,因为它用于其余示例。
很棒的文章,我正在处理一个网站,它需要可访问性作为其首要任务。不幸的是,声音样式表已弃用,CSS 3语音模块仍处于工作草案阶段。但是我确实发现声音框模型很有趣。你可以在这里找到它
即使我更喜欢使用Flash,本教程也可能对我有帮助,
谢谢
我刚刚尝试了你的演示,太酷了!
有点像Flash,但页面加载速度更快,无需等待从20%到100%。
我认为它更适合博客或个人网站,不太适合网店。
我会尝试的,谢谢。
“在:hover上播放声音”?
既然你实际上是在使用JavaScript播放声音,那么“使用JavaScript播放声音”会不会是这篇文章的更好标题?它不像使用:hover那样神奇,但标题有点误导性……
此外,网页上的声音纯粹是邪恶的^^(不包括音乐和视频播放器)。
在新的play()之前先调用stop()会更好,以防止静音按钮。此外,还有一种方法可以使用jQuery动态添加声音并动态地从dom中删除它们,因为它们正在播放。因此,它可以同时播放更多声音。
这是一个很棒的教程,分布和解释得很好,在悬停状态下播放声音可能会很烦人,但本教程只是为了解释可以在不使用Flash的情况下应用声音。
HTML 5具有实现伟大功能的巨大潜力,绝对是未来值得关注的技术。
长音频怎么样?
当鼠标移出悬停区域时,我们能否停止它?
谢谢你的分享,这正是我需要的:D
有谁知道是否有任何方法可以使用CSS更改控制按钮?
现在,使用Flash、动画和CSS声音没有任何理由了:-)
这真的很酷。但是,如果滥用它,它很快就会变得非常烦人!HTML5看起来确实不错,尽管我不确定Flash是否会在相当长的一段时间内被淘汰!
我认为Flash很快就会被淘汰。我认为它永远不会作为视频媒介(以及其他功能)被淘汰,但随着HTML5作为视频力量的崛起,Flash将失去其暂时的立足点。
我不认识任何关心网络标准和语义并且仍然在其(关键)武器库中使用Flash的设计师。我认为它将永远存在,但将补充和增强网站,而不是对其完整性至关重要。
/rant
有趣的东西!谢谢!
顺便说一句,这[0]没有任何意义
var audio = $(“#mySoundClip”)[0];
另一种方法是
var audio = document.getElementById(“mySoundClip”);
无论如何,您可能希望缓存Math.random调用的结果,否则声音文件可能会完全不同。
不过对于这个演示来说并不重要:)
如果根据元素类而不是id来设置声音,这将如何工作?因此,所有具有class1的div/span/等在悬停时播放class1.mp3;class2 -> class2.mp3,等等……?
如何通过Joomla菜单系统实现?是否可以在这两种方法之间进行Joomla模块菜单集成?
Joomla菜单代码将动态完成
谢谢老兄。这有效。=)
它调用了一个巨大的脚本,没有它将无法工作
https://ajax.googleapis.ac.cn/ajax/libs/jquery/1.5.2/jquery.min.js
谁能做一个真正的教程,讲解如何在悬停时调用最简单的“audio/click.mp3”音频?
这里,这是我得到的,我下载了一个名为“beep-29.mp3”的mp3音频,所以在我的主页的html中我放了这个
然后在javascript中,“$(document).ready( function() {}”部分内,
我放了这个 var audio = $(“#audio”)[0];
$(“#topmenu a”).mouseenter(function() {
audio.play();
});
“#audio”显然链接到我赋予音频标签的id“audio”,而“#topmenu a”是我赋予顶部导航栏的ID,它正在定位链接,即顶部栏上的按钮。
就是这样,我不喜欢这些例子,特别是试用和故障重叠声音,是因为发布这些例子的人没有发布任何HTML,这意味着我不知道要替换或放入我的代码中的内容,因为我不知道哪些ID是哪个,什么放在哪里。他们需要提供html,以便我们确切地知道正在调用哪些id以及哪些词放在哪里。
与其克隆音频,不如通过设置currentTime重置播放头。
.mouseenter(function() {
beepThree.pause();
beepThree.currentTime = 0;
beepThree.play();
})