Wenn Sie im Internet nach Möglichkeiten suchen, wie man mit CSS einen Sound abspielt, werden Sie
- Einiges über Counter Strike: Source finden
- Einiges über
play-duringundcue-beforeund Dinge, die vielversprechend aussehen, aber eigentlich für akustische Stylesheets (Barrierefreiheit / Screenreader-Zeug) gedacht sind, und nicht nur dafür, wie man Eselschreie erzeugt, wenn man in irgendeinem beliebigen Browser über einen Menüpunkt fährt.
Ich würde behaupten, dass Töne Teil des Designs sind und daher die Möglichkeit, sie abzuspielen/auszulösen, in CSS gehört, aber leider sind wir noch nicht so weit. Um Töne abzuspielen, wenn die Maus über einen bestimmten Bereich fährt, müssen wir auf HTML5 oder Flash zurückgreifen. Aber niemand hier möchte sich mit Flash beschäftigen, oder? Also machen wir es mit HTML5, das Töne über sein <audio>-Element abspielen kann (Firefox 3.5+, Chrome 3+, Opera 10.5+, Safari 4+, IE 9+). Um eine möglichst breite Browserunterstützung zu erhalten, machen wir es wie folgt mit einer MP3-Quelle (WebKit und IE) und einer OGG-Quelle (Firefox und 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>
Wenn Sie den obigen Code exakt in eine Seite einfügen, werden Sie nichts sehen oder hören. Wenn Sie ein kleines Player-Element wünschen, verwenden Sie unbedingt das Attribut `controls` (<audio controls>). Wenn es abgespielt werden soll, aber nicht sichtbar sein soll, verwenden Sie unbedingt das Element `autoplay` (<audio autoplay>). Oder beides...
Unser Ziel ist es, dass der Ton abgespielt wird, wenn die Maus über ein bestimmtes Element fährt, z. B. einen Menüpunkt. Leider können wir einem <audio>-Element über CSS keine Anweisungen geben, so dass wir JavaScript benötigen werden. Um den Ton mit JavaScript abzuspielen
var audio = document.getElementsByTagName("audio")[0];
audio.play();
// or with an ID
var audio = document.getElementById("mySoundClip");
audio.play();
Nehmen wir jQuery, einfach weil die Auswahl und der Umgang mit Ereignissen damit einfacher werden.
var audio = $("#mySoundClip")[0];
audio.play();
Um diesen Ton abzuspielen, wenn die Maus über ein bestimmtes Element fährt
var audio = $("#mySoundClip")[0];
$("nav a").mouseenter(function() {
audio.play();
});
Ein anderer Weg...
Die Teaser-Seite für die Goodfoot Mobile App verwendet eine ähnliche Technik, um seltsame Grunzer (von Dave Rupert) abzuspielen, wenn man über den Yeti-Kerl fährt. Sie machen das, indem sie jedes Mal, wenn dieser Yeti-Kerl angefahren wird, ein neues Audio-Element in den DOM einfügen.
$("#speak").mouseenter(function(){
$("<audio></audio>").attr({
'src':'audio/'+Math.ceil(Math.random() * 5)+'.mp3',
'volume':0.4,
'autoplay':'autoplay'
}).appendTo("body");
});
Das könnte man wahrscheinlich noch etwas verbessern, um auch OGG zu unterstützen. Ich bin mir nicht sicher, was es mit dem `volume`-Attribut auf sich hat, das ist weder Standard noch wird es irgendwo unterstützt, wo ich es gesehen habe. Dies ist eine Modifikation von 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');
});
Ich bin mit diesem Ansatz vollkommen einverstanden, da er gut zu funktionieren scheint und das ist letztendlich das Wichtigste. Nachdem der Ton einmal abgespielt wurde, scheint er gecached zu werden und spielt schnell ab, was gut ist.
Eine andere Möglichkeit wäre, alle drei Audio-Elemente sofort auf die Seite zu legen.
<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>
Dann zufällig eines auswählen und abspielen
$("#speak").mouseenter(function() {
$("#sound-" + Math.ceil(Math.random() * 3))[0].play();
});
Versuche und Probleme: Überlappende Töne
Meine ursprüngliche Idee, damit herumzuspielen, war ein Navigationsmenü, das beim Überfahren mit der Maus einen kleinen Klickton abspielte. Sofort trat ein Problem auf: Man kann mit der Maus über Menüpunkte fahren und einen .play()-Befehl viel schneller auslösen, als der Ton abgespielt werden kann. Ein einzelnes Audio-Element kann nicht überlappend abspielen. Es ignoriert weitere Aufforderungen zu .play(), bis es abgeschlossen ist.
Mein erster Versuch war, .pause() zu verwenden, um den Ton zu stoppen, und dann wieder .play() aufzurufen, aber bei meinen Tests hilft das nicht viel. Es scheint die Pause zu respektieren, aber dann in vielen Fällen das Play nicht.
Der geschmeidigste Weg, den ich gefunden habe, war, das Audio-Element für jeden Menüpunkt zu duplizieren. Auf diese Weise hat jeder Menüpunkt seinen eigenen Audioclip zum Abspielen, und die Töne können sich überlappen.
$("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
Demo ansehen Dateien herunterladen
Ich liebe Alternativen zur Verwendung von Flash und werde diese in Zukunft nutzen müssen. Danke Chris!
Wie kann ich den Menüpunkt loopen?
Ich bin frustriert, alles, was ich sehe, ist nur `mouseenter`, ich versuche, den verdammten Klick-Effekt anstelle des Hover-Effekts herauszufinden, ich habe `mouseclick` auf `mousedown` auf `onmouseclick` auf `onclick` versucht, wo verdammt ist der Klick-Effekt? Zweitens, wie zum Teufel soll ich einige dieser Beispiele verwenden, besonders das letzte „Versuche und Probleme: Überlappende Töne“... Es gibt eine Menge IDs, Namen und Wörter, von denen ich keine Ahnung habe, was sie sind oder repräsentieren. `#nav a..` nun, ich nehme an, das ist Ihre Navigationsleiste und alle „a“-Links, aber was ist `#beep`? Ist das Ihre Audio-Datei, Ihre Audio-ID aus dem `src`? Oder eine ID, die Sie sich für die Audio-Datei ausgedacht haben, oder was auch immer? Ist das „id“ nur das, was wir setzen müssen? Oder sagen Sie uns, dass eine zufällige ID das ersetzt und wenn ja, welche? „beep-“, „beeper“ und „#beep“ und „beep-0“, was ist das? Sie können von Ihnen erfundene IDs sein, sie können die Sounddatei sein, Sie sollten das HTML einfügen, damit wir wissen, welche exakte ID oder welches Wort Sie in den JavaScript einfügen. Alles ist durcheinander. Fügen Sie das HTML ein, damit wir einfach die Punkte mit unserem eigenen HTML mit Ihrem JavaScript verbinden können.
Ok, ich hab’s! Tolles Tutorial, aber sind Töne nicht das Nervigste im Internet? Ich meine, wenn Leute im Büro surfen und plötzlich Musik anfängt zu spielen, oder jedes Mal, wenn man über eine Navigation fährt, hört man dieses nervige „Klick“ „Klick“ „Klick“.
Ich sag’s nur. Aber ein gutes Tutorial ;)
Ja, ich stimme zu. Ich würde es akzeptieren, wenn es ein sehr, sehr leiser „Klick“ wäre, so als würde man zum letzten Teil der Demo gehen und die Lautstärke so weit herunterdrehen, dass noch etwa zwei Millimeter Platz bis zum Boden sind.
Chris, wenn ich auf den Demo-Button klicke, sagt mein Antivirus, dass es sich um eine „HTML-Skript-Infektion“ handelt und bricht die Verbindung ab.
Trotzdem ein schöner Artikel.
Danke für das Tutorial, aber das lässt mich erschaudern, wenn ich daran denke, dass Leute das tatsächlich zu den Navigationsbuttons ihrer Website hinzufügen. 2advanced-Ära-Blepp-Bopp-Websites aller Art...
Haha! „seltsame Grunzergeräusche“
Leute, willkommen zu nervigen (Nicht-)Flash-Websites 2.0
Wenn Sie es wirklich *müssen*, denke ich, der beste Weg ist, ein Audio-Element zu erstellen und es zu entfernen, wenn der Ton endet. Auf diese Weise
• müssen Sie nicht warten, bis das vorherige Ende erreicht ist
• das vorherige wird nicht unterbrochen
Ziehen Sie auch das Vorladen des Tons in Betracht.
Ihr Kommentar beweist, dass Sie nicht verstehen, was vor sich geht.
Sie schlugen vor, das Audio-Element zu entfernen, wenn der Ton zu Ende ist? Der ganze Sinn ist, dass die vorherigen Töne für die neuen Töne stoppen, nicht dass die alten Töne zu Ende laufen. Lernen Sie zu lesen, bevor Sie Negativität verbreiten.
Willkommen zu Federico Fail 2.0
Schauen Sie sich Scott Schillers Sound Manager 2 an. Es ist eine ausgezeichnete, ausgezeichnete Bibliothek. Sie wird von Last.FM verwendet, wenn der Benutzer auf den Play-Button neben einem Song in einer ungeordneten Liste klickt (im Gegensatz zum Hauptplayer). Schiller verwendet sie auf seiner eigenen Website, um genau das zu tun, was Sie hier beschreiben (mit dem Hover-Effekt) unter http://www.schillmania.com/
Ich glaube, die neueste Version wird bei Bedarf auch HTML5 nutzen.
Wenn das Ziel ist, Benutzer von einer Website wegzutreiben, sollten nervige kleine Töne bei Navigationen sehr effektiv sein.
Es ist ein interessantes Machbarkeitskonzept, aber ich erschaudere bei dem Gedanken, wohin es führen wird.
Leute –
Ich verstehe vollkommen, woher Sie mit dem „Igitt, eklig“-Winkel kommen.
Töne können missbraucht werden.
Aber.
Farben können missbraucht werden. Bilder können missbraucht werden. Schriftarten können missbraucht werden. Wörter können missbraucht werden. Farbe kann missbraucht werden. Hämmer und Nägel können missbraucht werden.
Dies ist nur eine Tech-Demo, die uns die Macht gibt, kreativ zu sein. Nutzen Sie sie weise.
Sie haben vollkommen Recht – in der richtigen Umgebung wäre das völlig akzeptabel. Denken Sie an Seiten, die sich an Kinder richten, oder an Buttons auf etwas wie Pandora oder Last.FM, das sich auf Ton konzentriert.
Ich habe zweimal „vollkommen“ im ersten Satz gesagt und würde es wirklich gerne bearbeiten... :)
Ich bin daran interessiert, ein animiertes Profilbild auf meiner Künstlerseite zu erstellen. Was ich erreichen möchte, ist, dass wenn Leute an mir interessiert sind und auf mein animiertes Profilbild klicken, eines meiner Lieder abgespielt wird. Ich möchte, dass das Bild animiert ist, um Aufmerksamkeit zu erregen, aber nicht nervig zu sein.
Genau... Die meisten Leute sind Keksstempel-Figuren, die aus dem gemacht sind, was sie denken, was sie sein sollen, und sie könnten sich nicht aus einem nassen Papiersack herausarbeiten, weil ihr kleiner Lehrer ihnen einmal gesagt hat, sie sollen nie lernen, wie man UX interaktiver gestaltet.
Die gleichen Leute, die sagen, dass Ton nervig ist, nutzen wahrscheinlich auch ihre anderen Sinne nicht viel.
Danke für das Tutorial und dafür, dass Sie versuchen, Leuten beim Lernen zu helfen.
Das letzte Beispiel für JavaScript-Code ist die beste Lösung, ich kann jetzt viele aktive Hover pro Sekunde hören. Danke Chris!
Ich dachte sofort an meinen alten College-Professor, der Flash und alle seltsamen Klicks und Geräusche auf Webseiten verabscheute, es sei denn, es war eine Seite für Musik oder Video. Ich frage mich, was er dazu sagen würde. Es ist zumindest sehr innovativ.
Oh Gott, ich dachte, diese nervigen Flash-Hover-Sounds wären eine Sache der Vergangenheit. Ich stimme zu, Wissen ist gut, aber ich hoffe wirklich, dass dies nicht anfängt, sich bei HTML-Seiten durchzusetzen...
Das ist ein erstaunliches Tutorial!! Ich sehe hier viele Diskussionen, aber egal was es ist, es ist gut, dass wir Sounds auf Hover haben können, ohne Flash zu verwenden!!
Oh! Wie ich es liebe!! :D
Ich habe deinen Artikel schon vor ein paar Stunden gelesen, jetzt bin ich zurückgekommen, um die Kommentare zu prüfen. Und ich muss sagen, ich bin sehr glücklich über die Reaktionen, die du bekommst ;)
Das ist ein toller Beitrag. Sehr schön. Danke, dass Sie Ihre Ideen geteilt haben.
Gute Idee! Ich frage mich nur, ob es eine Möglichkeit gibt, das ohne JS zu machen. Ein Gedanke, der mir in den Sinn kommt, ist die Verwendung von CSS :before oder :after Selektoren. Vielleicht etwas wie
.navSelect:hover:after {
content: "
Dein Browser ist nicht zu super spaßiger Audiowiedergabe eingeladen.
"
}
Ich bin mir nicht sicher, ob man Pseudoklassen stapeln kann, also könnte es etwas wie `.navSelect:hover span:after` oder `a:after` sein.
Würde das das gewünschte Ergebnis erzielen und *technisch* von CSS gesteuert werden?
Entschuldigung, der Beitrag wurde verschluckt... Hier ist, was er hätte sein sollen
.navSelect:hover:after {
content: "
<audio autoplay>
<source src="audio/beep.mp3"></source>
<source src="audio/beep.ogg"></source>
Dein Browser ist nicht zu super spaßiger Audiowiedergabe eingeladen.
</audio>
Dein Browser ist nicht zu super spaßiger Audiowiedergabe eingeladen.
"
}
Ich befürchte, das funktioniert nicht. Was Sie in die `content`-Eigenschaft einfügen, wird als String behandelt. Beim letzten Mal, als ich es versuchte, wurden HTML-Elemente nicht auf diese Weise erstellt.
Meine zwei Cents dazu – seien Sie nur sehr, sehr vorsichtig, wo Sie das verwenden. Bisher kann ich mir keine Umstände vorstellen, unter denen es angemessen wäre, aber es mag einige geben.
Könnte man die Sound-Events durch Hinzufügen zur `fxqueue` in eine Warteschlange stellen?
Außerdem möchten Sie vielleicht die ID zum ersten HTML-Block hinzufügen, da sie für den Rest des Beispiels verwendet wird.
Tolle Lektüre, ich arbeitete gerade an einer Website, bei der Barrierefreiheit oberste Priorität hat. Leider sind akustische Stylesheets veraltet und CSS 3 Speech-Module sind noch im Entwurfsstadium. Ich fand jedoch das akustische Boxmodell interessant. Sie finden es hier.
Selbst ich bevorzuge Flash, dieses Tutorial könnte mir helfen.
danke
Ich habe gerade Ihre Demo ausprobiert, so COOL!
Ähnlich wie Flash, aber mit schnellerer Ladezeit der Seite, man muss nicht von 20% auf 100% warten.
Ich denke, es ist besser geeignet für Blogs oder persönliche Websites, nicht so gut für Online-Shops.
Ich werde es ausprobieren, danke.
„Sound auf :hover abspielen“?
Wäre „Sound mit JavaScript abspielen“ nicht ein besserer Titel für diesen Artikel, da Sie das wirklich tun? Es ist nicht so erstaunlich wie das Abspielen mit `:hover`, aber der Titel ist eher irreführend...
Außerdem sind Sounds auf Webseiten die reine Hölle^^ (nicht gerechnet Musik- & Videoplayer).
Es ist besser, zuerst `stop()` aufzurufen, bevor `play()` neu aufgerufen wird, um stumme Buttons zu vermeiden. Außerdem gibt es eine Möglichkeit mit jQuery, Sound dynamisch hinzuzufügen und sie dynamisch aus dem DOM zu löschen, wenn sie abgespielt werden. So können mehr Töne gleichzeitig abgespielt werden.
Das ist ein großartiges Tutorial, gut verteilt und erklärt. Sounds im Hover-Zustand können nervig sein, aber dieses Tutorial erklärt nur, dass Sound ohne Flash angewendet werden kann.
HTML 5 hat viel Potenzial für großartige Dinge und ist definitiv eines, das man für die Zukunft im Auge behalten sollte.
Was ist mit langem Audio?
Können wir es stoppen, wenn die Maus den Hoverbereich verlässt?
Danke dafür, es war genau das, was ich brauchte :D
Weiß jemand, ob es eine Möglichkeit gibt, die Steuerelement-Buttons mit CSS zu ändern?
Jetzt gibt es keine Ausrede mehr für die Verwendung von Flash, Animation und Ton mit CSS :-)
Das ist wirklich cool. Wenn es jedoch missbraucht wird, kann es schnell sehr nervig werden! HTML5 sieht wirklich gut aus, obwohl ich nicht sicher bin, ob Flash noch lange fallen gelassen wird!
Ich denke, Flash wird sehr bald fallen gelassen. Ich glaube nicht, dass es jemals als Medium für Videos (unter anderem) eliminiert wird, aber da HTML5 als Kraft für Videos aufsteigt, wird Flash seinen zaghaften Fußtritt verlieren.
Ich kenne keine Designer, denen Webstandards und Semantik wichtig sind und die Flash noch in ihrem (kritischen) Arsenal einsetzen. Ich denke, es wird immer einen Platz haben, aber es wird Websites ergänzen und verbessern, anstatt entscheidend für ihre Integrität zu sein.
/rant
Interessante Sachen! Danke!
Übrigens macht dieser [0] keinen Sinn
var audio = $(“#mySoundClip”)[0];
Die Alternative wäre
var audio = document.getElementById(“mySoundClip”);
Nur so am Rande, Sie würden wahrscheinlich das Ergebnis des `Math.random`-Aufrufs cachen, sonst besteht die Gefahr, dass die Sounddateien völlig unterschiedlich sind.
Nicht dass es bei dieser Demo anyway wichtig wäre :)
Wie würde das funktionieren, wenn man den Sound auf der Elementklasse statt auf der ID basiert? So alle `div`s/`span`s/etc. mit `class1` beim Hovern `class1.mp3` abspielen; `class2` -> `class2.mp3`, usw.?
Wie kann das über das Joomla Menüsystem gemacht werden? Ist es möglich, eine Integration zwischen dem Joomla Modulmenü und dieser Methode vorzunehmen?
Joomla-Menücode wird dynamisch generiert.
Danke Kumpel. Das funktioniert. =)
Es ruft ein riesiges Skript auf, ohne das es nicht funktioniert
http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js
Kann jemand ein echtes Tutorial machen, wie man den einfachsten „audio/click.mp3“-Sound beim Hovern aufruft?
Hier ist, was ich bekommen habe, ich habe einen mp3-Sound namens „beep-29.mp3“ heruntergeladen, also habe ich in den HTML-Code meiner Startseite das hier eingefügt
dann im JavaScript, im „$(document).ready( function() {}“-Teil,
habe ich das eingefügt: `var audio = $(“#audio”)[0];`
$(“#topmenu a”).mouseenter(function() {
audio.play();
});
„#audio“ verweist offensichtlich auf die ID „audio“, die ich dem Audio-Tag gegeben habe, und „#topmenu a“ ist die ID, die ich meiner oberen Navigationsleiste gegeben habe, und es zielt auf die Links, die Buttons auf der oberen Leiste.
Das ist alles. Was mir an diesen Beispielen nicht gefällt, besonders an den „Versuche und Probleme mit überlappenden Tönen“, ist, dass derjenige, der das gepostet hat, KEIN HTML gepostet hat. Das bedeutet, dass ich keine Ahnung habe, was ich ersetzen oder in meinen Code einfügen soll, weil ich nicht weiß, welche IDs welche sind und wo sie hingehören. Sie müssen das HTML einfügen, damit wir genau wissen, welche IDs aufgerufen werden und welche Wörter wohin gehören.
Anstatt das Audio zu klonen, setzen Sie den Wiedergabekopf zurück, indem Sie `currentTime` setzen.
.mouseenter(function() {
beepThree.pause();
beepThree.currentTime = 0;
beepThree.play();
})