Ich brauchte einige Tooltips für ein Ding. Als ich nach etwas Inspiration suchte, musste ich nicht weiter als zu meinem Dock gehen

Hier bin ich gelandet

Das HTML: Sauber halten
Links können ohne jegliche Schnörkel-Codierung Tooltips in HTML haben. Geben Sie einem Link einfach ein title-Attribut.
<a href="#" title="Hi, I'm a tooltip thingy.">link</a>
Wenn Sie dann ein bis zwei Sekunden mit der Maus über diesen Link fahren, erhalten Sie die gelbe Box.

Wir werden das nicht verändern. Unser HTML wird genau so aussehen, wie oben gezeigt.
Die Sache ist, dass diese gelbe Box absolut ungestaltbar ist. Vielleicht wird das eines Tages möglich sein, wenn Shadow-DOM-Sachen wie diese spezifiziert sind, aber heute ist es in keinem Browser möglich. Also werden wir etwas JavaScript ausführen, das dieses Attribut extrahiert und <div>-Elemente mit demselben Text erstellt, die wir nach Bedarf positionieren/verstecken/anzeigen werden.
Das JavaScript: jQuery Plugin
Wie üblich an dieser Stelle verwenden wir jQuery. Dies ist die perfekte Art von Funktionalität, um sie in ein Plugin zu verwandeln. Möglicherweise möchten Sie diese Funktionalität auf eine beliebige Sammlung von Elementen Ihrer Wahl anwenden und sie auch verketten, sodass das Plugin-Muster ideal ist.
Der Aufruf wird so einfach sein wie
$("article a[title]").tooltips();
Dadurch werden alle Links mit Titeln, die sich in <article>-Elementen befinden, mit Tooltips versehen. Sie könnten diesen Selektor beliebig wählen.
Unser Plugin wird Folgendes tun
- Durchlaufen Sie jeden Link
- Erstellen Sie ein (verstecktes)
div.tooltipfür jeden von ihnen, dessen Text dem Titelattribut des Links entspricht. - Entfernen Sie das Titelattribut des Links (die einzige Möglichkeit, das standardmäßige gelbe Popup-Fenster loszuwerden)
- Wenn der Link mit der Maus überfahren wird...
- Positionieren Sie den Tooltip entsprechend und blenden Sie ihn ein.
- Wenn der Link nicht mehr mit der Maus überfahren wird...
- Blenden Sie den Link aus.
Massiver Code-Dump, kommentiert zu Ihrem Vergnügen
// IIFE to ensure safe use of $
(function( $ ) {
// Create plugin
$.fn.tooltips = function(el) {
var $tooltip,
$body = $('body'),
$el;
// Ensure chaining works
return this.each(function(i, el) {
$el = $(el).attr("data-tooltip", i);
// Make DIV and append to page
var $tooltip = $('<div class="tooltip" data-tooltip="' + i + '">' + $el.attr('title') + '<div class="arrow"></div></div>').appendTo("body");
// Position right away, so first appearance is smooth
var linkPosition = $el.position();
$tooltip.css({
top: linkPosition.top - $tooltip.outerHeight() - 13,
left: linkPosition.left - ($tooltip.width()/2)
});
$el
// Get rid of yellow box popup
.removeAttr("title")
// Mouseenter
.hover(function() {
$el = $(this);
$tooltip = $('div[data-tooltip=' + $el.data('tooltip') + ']');
// Reposition tooltip, in case of page movement e.g. screen resize
var linkPosition = $el.position();
$tooltip.css({
top: linkPosition.top - $tooltip.outerHeight() - 13,
left: linkPosition.left - ($tooltip.width()/2)
});
// Adding class handles animation through CSS
$tooltip.addClass("active");
// Mouseleave
}, function() {
$el = $(this);
// Temporary class for same-direction fadeout
$tooltip = $('div[data-tooltip=' + $el.data('tooltip') + ']').addClass("out");
// Remove all classes
setTimeout(function() {
$tooltip.removeClass("active").removeClass("out");
}, 300);
});
});
}
})(jQuery);
Ein paar Dinge zu beachten: **1)** Die endgültige Demo wird die Tooltips ein wenig animiert haben. Nichts davon geschieht hier im JavaScript. Animationen sind Design. Design ist CSS. Daher machen wir das alles in CSS. **2)** Eine kleine Design-Besonderheit bei diesen ist, dass die Tooltips in die gleiche Richtung ein- und ausgleiten. In CSS ist dies durch Hinzufügen und Entfernen einer einzigen Klasse und die Verwendung von Übergängen nicht wirklich möglich. Der Übergang läuft beim Entfernen der Klasse rückwärts und gleitet somit in die gleiche Richtung, aus der er kam. Durch die Verwendung eines setTimeout können wir eine temporäre Klasse anwenden und diese ebenfalls animieren. Wenn Sie elegantere Ideen dazu haben, lassen Sie es mich in den Kommentaren unten wissen.
Eine semantische Enttäuschung?
Das Hinzufügen von Divs am Ende des Dokuments fühlt sich wie eine Enttäuschung an; es fühlt sich einfach nicht sehr semantisch an. Sie sind in keiner sinnvollen Weise durch reines HTML mit den Links verbunden, von denen sie stammen.
Auch das Entfernen des Titel-Tags ist für mich nicht ganz richtig. Ich habe gehört, dass sie für die Zugänglichkeit sowieso nicht viel bringen, aber trotzdem. Ich wünschte, preventDefault() würde das Verhindern des Anzeigens bewirken, aber das tut es nicht.
Wenn Sie Ideen dazu haben, lassen Sie es uns in den Kommentaren unten wissen.
Das CSS: Es zählt auf Kleinigkeiten an
Beachten Sie im OS X-Screenshot oben in diesem Artikel, dass der Hintergrund und die Ränder selbst leicht transparent sind. Das konnte ich hier nicht erreichen. Diese Dinge sind im Allgemeinen möglich, aber der spitze Pfeil nach unten ist ein zusätzliches Element und wie die Ränder und Hintergründe miteinander verbunden sind, geschieht nur durch Überlappung, und es sieht mit jeglicher Transparenz schlecht aus. Also, solide Farben, kein Problem.
Oftmals sind spitze Pfeile wie hier mit keinem zusätzlichen Markup oder Bildern machbar, indem Pseudo-Elemente und CSS-Dreiecke verwendet werden. In unserem Fall verwenden wir ein Pseudo-Element, aber wir benötigen auch ein echtes Element. Das echte Element (der <span>, den das JavaScript in jedem Tooltip <div> eingefügt hat) dient als Positionsbox und erledigt das Zuschneiden. Das Pseudo-Element ist der eigentliche Zeiger. Eine Box, die genauso gestaltet ist wie der Tooltip, nur um 45 Grad gedreht und von ihrem Elternteil abgeschnitten. Hier sind die Schaltpläne

Und so
.tooltip, .arrow:after {
background: black;
border: 2px solid white;
}
.tooltip {
pointer-events: none;
opacity: 0;
display: inline-block;
position: absolute;
padding: 10px 20px;
color: white;
border-radius: 20px;
margin-top: 20px;
text-align: center;
font: bold 14px "Helvetica Neue", Sans-Serif;
font-stretch: condensed;
text-decoration: none;
text-transform: uppercase;
box-shadow: 0 0 7px black;
}
.arrow {
width: 70px;
height: 16px;
overflow: hidden;
position: absolute;
left: 50%;
margin-left: -35px;
bottom: -16px;
}
.arrow:after {
content: "";
position: absolute;
left: 20px;
top: -20px;
width: 25px;
height: 25px;
box-shadow: 6px 5px 9px -9px black,
5px 6px 9px -9px black;
transform: rotate(45deg);
}
.tooltip.active {
opacity: 1;
margin-top: 5px;
transition: all 0.2s ease;
}
.tooltip.out {
opacity: 0;
margin-top: -20px;
}
Beachten Sie, dass die Klasse .active für die Einblendanimation zuständig ist und die Klasse .out für das Ausblenden.
Danksagung
Dank an Adrian Adkison für einige Ideen und Code unterwegs.
Fairer Hinweis zu Opera
Opera unterstützt pointer-events in CSS nicht, daher wird die gesamte Demo nicht zu funktionieren scheinen. Das liegt daran, dass die Tooltips tatsächlich direkt über den Links positioniert sind, wobei ihre Opazität auf 0 reduziert ist. Wenn Sie es in Opera reparieren möchten, müssen Sie sie im JavaScript buchstäblich auf display none/block setzen oder CSS verwenden, um sie weit genug von den Links zu verschieben, damit sie die Klickbarkeit nicht beeinträchtigen. Wenn jemand diese Änderung vornehmen möchte, aber ansonsten genau wie diese Demo funktionieren soll, bin ich gerne bereit, sie zu aktualisieren.
Demo
Siehe den Stift
Bubble Point Tooltips von Chris Coyier (@chriscoyier)
auf CodePen.
MMM sieht interessant aus! :)
Interessant.
Auf jeden Fall möchte ich darauf hinweisen, dass es unter IE8 nicht funktioniert: die Tooltips erscheinen alle zusammen. Im ersten Tooltip steht nach dem Herzenssymbol das – ich weiß nicht, ob das so gewollt ist oder nicht ;)
Um mit IE 8 fertig zu werden, könnten Sie
Ich bin mir nicht sicher, ob es besser ist, da es ziemlich ausführlich ist, aber anstelle von
setTimeoutkönnten SieanimationEndbinden und im Callback eine Klasse hinzufügen/entfernen.Ich konnte eine ähnliche Logik anwenden und eine neue
animationNamezuweisen, um eine neue Ausblendanimation auszulösen, habe es aber noch nicht mit einer nicht-Keyframe-Animation ausprobiert.Und dann müssen Sie sich mit den verschiedenen Browserpräfixen für
animationEndbefassen, aber das sind nur ein paar Zeilen.Sieht toll aus und funktioniert super, ich kann sehen, dass das nützlich sein wird, danke!
Außerdem ist Ihr Kommentarformular großartig, ich habe jetzt fünf Minuten lang in das Textfeld geklickt.
Eine Sache, um die ich mir Sorgen mache, ist, wie die Zugänglichkeit der Links beeinträchtigt wird, wenn Sie das Titelattribut entfernen. Da diese Informationen dazu dienen, dem Link zusätzliche Anleitung und Bedeutung zu geben, scheint das Entfernen zu einem anderen Element das Stück für einige Benutzer weniger zugänglich zu machen.
(Obwohl, wenn Benutzer mit Geräten für Barrierefreiheit kein JavaScript haben, verlieren sie nichts.)
Hier ist eine ziemlich alte Recherche. http://www.paciellogroup.com/resources/articles/WE05/forms.html
Zu dieser Zeit schien es, dass für LINKS die Mehrheit der Leser das Titelattribut nicht unterstützte (d.h. nichts damit tat). Und diejenigen, die es taten, taten es nicht standardmäßig.
Es funktioniert nicht unter FF 3.6.24 (= neueste),
unter XP-Pro SP3 (vollständig aktualisiert).
Es erscheinen überhaupt keine Popups,
beim Überfahren oder sogar Klicken
auf die Demo-Links! :-(
Sie sollten Ihren Browser aktualisieren... Ich glaube, das neueste FF ist 8.0
tooltip.jswird in keinem Browser außer IE > 8 geladen?Ja, das ist nicht gut. Siehe Kommentare oben für den korrekten Code.
Es sieht so aus, als hätten Sie einige Kompatibilitätsprobleme. Nun, wenn Sie sich damit befassen, habe ich einen Vorschlag für das Entfernen des Titelattributs.
Anstatt es zu entfernen, wenn Sie Ihre Divs einrichten, warum nicht entfernen, wenn die Maus über den Link fährt, und es dann beim Verlassen der Maus wieder hinzufügen. Auf diese Weise könnten Sie immer noch den Tastaturfokus erhalten und den Titel sehen (für Barrierefreiheit), aber wenn Sie die Maus verwenden, erhalten Sie das visuelle Upgrade.
Eine Sache, die mir definitiv nicht gefällt, ist, dass ich den Tooltip selbst nicht überfahren kann, sobald er erscheint. Ich habe Pech, wenn ich den Tooltip-Text kopieren möchte.
Mit hoverIntent kann das behoben werden.
Okay, es funktioniert jetzt unter Firefox. Leute, macht einen Hard Refresh auf der Seite, da sie möglicherweise gecached ist. COMMAND+SHIFT+R unter Firefox.
Eine sehr einfache Möglichkeit, das zu tun, ist die Verwendung der Twitter Bootstrap CSS-Bibliothek. http://twitter.github.com/bootstrap/
Ich bin überrascht, dass Sie dies mit JavaScript anstelle von Pseudo-Elementen, Pseudo-Klassen und Inhalt gemacht haben
Pseudo-Elemente sind beteiligt. Aber ja, es gibt Möglichkeiten, gestylte Tooltips nur mit CSS und ohne JavaScript zu erstellen. Aber das ist weitaus begrenzter. Zum Beispiel wollte ich das Titelattribut als Tooltips verwenden, wie sie naturgemäß sind. Das geht nicht ohne etwas JavaScript, da es keine Möglichkeit gibt, das Standard-Gelbfenster zu verhindern. Sie können auch nicht die exakte Form mit Pfeil und Rändern nur mit Pseudo-Elementen erhalten. Sie können auch nicht die Bewegung in die gleiche Richtung erzielen. Also ja, ich habe mich für JS entschieden, um all das zu bekommen.
Ein Wort: "WOW"
Problem, das ich hatte, ist, dass es auf Mobilgeräten ziemlich erheblich kaputt geht. Es erfordert einen Klick zum Öffnen, was verständlich ist, aber es gibt keine Möglichkeit, es zu schließen. Das ist ein großes Problem, da es alles darunter abdeckt und man nicht darauf zugreifen kann.
Gibt es eine Möglichkeit, einen Hover-Zustand beim zweiten Klick zu entfernen? Ich habe bisher noch keine Möglichkeit gefunden.
Toller Code, aber es ist jQuery und Probleme mit meinem Browser Opera ;/. Egal, hoffe, das wird bald auf HTML 5 möglich sein :)
Toller Leitfaden. Eine Alternative für den Tipp-Zeiger, um ihn mit Browsern kompatibel zu machen, die keine Drehung unterstützen: Verwenden Sie ein CSS "Randdreieck" mit etwas wie diesem (nicht getestet)
.arrow {
width: 0;
height: 0;
border-left: 20px solid transparent;
border-right: 20px solid transparent;
border-top: 20px solid #fff;
}
.arrow:after {
width: 0;
height: 0;
border-left: 20px solid transparent;
border-right: 20px solid transparent;
border-top: 20px solid #000;
content: '';
position:absolute;
top: -2px;
}
Obwohl wahrscheinlich nicht so scharf wie ein gedrehtes Div, würde es in IE7+ funktionieren.
Wie bei http://tutorialzine.com/2010/07/colortips-jquery-tooltip-plugin/
Außerdem können Sie
.tooltip:beforeund.tooltip:afteranstelle von.arrowund.arrow:afterverwenden, sodass kein zusätzliches Element benötigt wird.CSS-Dreiecke sind toll. Die Randidee dort ist auch eine gute Idee. Sie müssten wahrscheinlich die Größe des Dreiecks insgesamt erhöhen, um den saubersten Rand zu erhalten. Aber ja, Schärfe ist oft ein Problem. Es ist am besten zu verwenden, wenn der Kontrast zwischen dem Dreieck und seinem Hintergrund nicht sehr hoch ist. Im schlimmsten Fall (Schwarz auf Weiß) gibt es viel "Treppenstufenbildung"
@GreLI außer nicht, denn in meinem Design muss eines das Kind des anderen sein. (Siehe Schaltpläne oben).
Ich denke, es wäre semantisch freundlicher, wenn Tooltips nur bei Bedarf hinzugefügt würden (beim Hovern)
Schnelles Beispiel
http://jsfiddle.net/stryju/Ygn42/
Auf diese Weise verschmutzen Sie das Dokument nicht mit zufälligen Tooltip-Elementen UND können den Titel NUR entfernen, wenn er benötigt wird (wenn der Tooltip erscheint)
@stryju: Ihr Code ist sehr, sehr schön und sauber – das ist definitiv eine Gelegenheit, die .data()-Funktion in jQuery zu verwenden. Gut gemacht.
Danke!
Habe es etwas aktualisiert, so dass es eine richtige Position und einen "knackigen Pfeil" hat ;-)
Ich mag diese Idee. Ich denke, es könnte Vorteile haben, es so oder so zu tun. Mit meiner Methode findet die gesamte DOM-Manipulation im Voraus statt, daher möglicherweise eine langsamere Ausführungszeit gleich zu Beginn, während bei Ihrer Methode bei jedem Hover eine DOM-Manipulation stattfindet, also langsamer während der gesamten Nutzung der Seite.
minimale DOM-Manipulation – nur die Handler werden angehängt, keine DOM-Manipulation durchgeführt = bessere Performance, meiner Meinung nach
Ich denke, der große Vorteil dieses Ansatzes ist: kein schmutziges DOM (warum sollten Tooltips im DOM aufbewahrt werden, wenn sie nie benutzt werden können?)
Wenn Sie das DOM verschmutzen wollen, warum dann X Tooltips erstellen und nicht einen und dann den Text hineingeben (Repainting wird sowieso passieren)?
1 Tooltip, Textänderung beim Hover = saubereres DOM
Korrigieren Sie mich, wenn ich falsch liege ;-)
"Animationen sind Design. Design ist CSS."
Ich stimme nicht zu. Es gibt einen gewissen Appetit bei den Webentwicklern, Dinge durcheinanderzubringen und die normale Bedeutung von Wörtern zu verwässern, das geht schon seit Jahren so.
Dieser hier ist nicht anders. Design ist Design. Animation ist Aktion, eine Aktion, die man *auch* gestalten muss.
Und ich bin mir ziemlich sicher, dass jeder, der Cartoons oder Animationen kennt oder auch nur vage davon gehört hat, dasselbe sagen wird: Animation ist kein Design, sondern etwas, auf das Design angewendet wird. Webentwicklung ist nicht anders.
Ich denke, das "<" am Anfang des Selektors muss nicht dort sein
$tooltip = $(‘<div[data-tooltip=’ + $el.data(‘tooltip’) + ‘]’).addClass(“out”);
Cool, behoben. Erstaunlich, dass es mit diesem Tippfehler überhaupt funktioniert hat.
Wirklich schön, aber wenn es in alten Browsern nicht funktioniert, beschränken Sie die Nutzung. Immer dasselbe Problem ;(
Zitat
Um unbeabsichtigte Brüche und/oder unsichere Sicherheitslöcher zu vermeiden, verwenden Sie .text() anstelle von .html()-ähnlichem Verhalten (was derzeit aufgrund des direkten Einfügens zwischen den öffnenden/schließenden Tags geschieht). Stattdessen
Schlüssel ist die Verwendung von .text(), der Rest ist allgemeine gute Praxis oder Präferenz.
würde das nicht den späteren
$tooltip = $('div[data-tooltip=' + $el.data('tooltip') + ']').addClass("out");kaputt machen?Ich denke, es macht es kaputt – jQuery holt data-* Attribute zu beliebigen .data() des Objekts, nicht umgekehrt
Kurzer Test: http://jsfiddle.net/stryju/QjMYC/
Ich meinte die Zeile
.data('tooltip', i);-)Gute Sache. Ich habe kürzlich einen jQuery-basierten Tooltip auf ähnliche Weise erstellt. Der, den ich erstellt habe, musste HTML-Inhalt anzeigen. Außerdem gibt es zu jedem Zeitpunkt nur einen im DOM. Ich habe den Inhalt dieses Divs durch den neuen Inhalt ersetzt.
Es wäre schön, wenn der Benutzer ein Menüelement oder einen Link im Popover anklicken könnte
Sie könnten dies so ändern, dass es auf Klick anstatt auf Hover reagiert. Es war hier einfach nicht das Ziel.
Ein weiterer Punkt, der erwähnt werden sollte, ist, dass das Tooltip-Div kein Nachkomme des Ankerlinks ist. Wenn das der Fall wäre, würden wir standardmäßig ein besseres Verhalten erzielen. Der Tooltip würde nicht verschwinden, wenn Sie mit der Maus darüber fahren, was Ihnen erlaubt, Dinge wie das Kopieren des Textes zu tun. Aber leider funktioniert das Verhalten, obwohl Sie Divs in a's in HTML5 einfügen können, in diesem Fall nicht ganz richtig.
Tolles Tutorial, es hat mir sehr geholfen, ich habe diesen Tooltip auf vielen Websites verwendet.
Funktioniert jetzt gut.
Beim Blick auf den Code sieht es so aus, als gäbe es Konflikte, wenn Sie tooltips() zweimal mit unterschiedlichen Selektoren aufrufen. D.h. mehrere Tooltips erscheinen beim Hovern, da mehrere Divs mit demselben data-tooltip-Wert vorhanden sind.
Ziemlich cool, aber wie einige andere bereits erwähnt haben, könnten Sie das alles mit CSS machen. Ich hatte tatsächlich eine solche Herausforderung in einem meiner letzten Projekte. Schauen Sie sich diesen Fiddle an: http://jsfiddle.net/r7Q9m/
Funktioniert in IE8+, verlässt sich nicht auf
-webkit-transformfür das Dreieck (obwohl Sie keinen Rand um den Tooltip haben), aber trotzdem – es funktioniert, und das gut.Ich verstehe, dass wir mit jQuery Animationen haben und das Standardverhalten des
title-Attributs fallen lassen können, aber ist das wirklich eine gute Sache? Sicher, der gelbe Text mag nervig sein, aber mit der reinen CSS-Technik ist es nur ein Hauch vonpreventDefaultund zack – einfache, reine CSS-Tooltips, die in IE8+ funktionieren, und das Standard-Titelverhalten für ältere Browser.Wunderbar!!!
Sehr sauber und einfach, gefällt mir.
Nur um das klarzustellen, Sie sagten "man könnte das alles mit CSS machen" in Bezug auf mein Beispiel, was nicht stimmt.
- Sie können kein Gleiten in die gleiche Richtung erzielen
- Sie können das gelbe Popup nicht entfernen (selbst Ihr Beispiel hat das, preventDefault funktioniert nicht)
- Sie können keine schattierten/gerahmten Dreiecke erhalten
Also ja, tolle Demo, liebe sie, möchte nur klarstellen, dass ich kein JavaScript unnötig verwendet habe, ich hatte einige Dinge, die ich tun wollte, und das ist der einzige Weg.
Schönes Plugin.
Sollten Sie
offsetanstelle vonpositionfür relativ positionierte Elemente verwenden?Ich glaube, Sie könnten Recht haben. Aus den Dokumenten
Obwohl es in meinem einfachen Demo-Fall gut zu funktionieren scheint. Für die Verteilung als Plugin muss ich es jedoch testen und wahrscheinlich ersetzen.
Chris, diese Zeile fällt mir auf.
"Animationen sind Design. Design ist CSS."
Ich weiß, das ist leicht irrelevant, aber ich habe immer diese Meinung vertreten, sehr zum üblichen Widerspruch anderer. Es ist also schön zu wissen, dass jemand mit dem Ansehen und Ruf, den Sie haben, die gleiche Ansicht teilt.
schön, sieht aus wie der Tooltip von iPhone
kann es jedoch durch ein einzelnes PNG-Bild mit rechteckiger und nach unten gerichteter Pfeilform platziert werden, anstatt den Tooltip-CSS zu erstellen
(unter Berücksichtigung, dass der Browser ein interlaced Bild von PNG anzeigen kann)
Wenn Sie stattdessen ein PNG verwenden möchten, wäre der beste Weg wahrscheinlich die Verwendung von
border-image, damit es sowohl vertikal als auch horizontal erweiterbar ist, anstatt eine feste Größe zu haben.Siehe das Suchschaltflächenbeispiel hier: http://ejohn.org/blog/border-image-in-firefox/
Ich musste einen z-index zum Tooltip hinzufügen, um sicherzustellen, dass er immer oben ist.
Oh, toll!!! :(o)
Danke. Großartige Arbeit :)
Interessant, dass mein Kommentar nicht angezeigt wird. Es scheint, dass zu viele gültige Kommentare in Ihrem Spam-Ordner landen. Trotzdem
Mir ist aufgefallen, dass der Tooltip in IE8 nicht funktionierte (ich habe Ihre Korrektur in den Kommentaren gesehen).
Auch in IE9 ist mir aufgefallen, dass der Tooltip nicht konsistent ist, d.h. der Tooltip wird bei einem Link angezeigt, bei anderen aber nicht. Haben Sie dieses Verhalten bemerkt?
Für Safari, Google Chrome und Mozilla (alle neuesten Versionen) funktioniert der Tooltip hervorragend.
Danke.
Großartig, das möchte ich für meine Website verwenden.
Das funktioniert in IE nicht.
Schauen Sie sich das folgende Fiddle an
http://jsfiddle.net/r7Q9m/
Sie können den Tooltip mit reinem CSS3 erstellen. Es kommt hauptsächlich darauf an, ob Sie auf CSS3 oder JavaScript setzen wollen. Wahrscheinlich würde die Mehrheit, die auf JavaScript setzt, eine höhere Kompatibilität erzielen.
Die Pseudo-Elemente ":before" und ":after" für den Inhalt und den "Pin" sind auch ausreichend.
Fantastischer Beitrag! Ich implementiere ihn gerade auf meiner eigenen Seite!
Funktioniert nicht in Internet Explorer.
Es funktioniert überhaupt nicht in IE 8 und älter, also verwenden Sie bedingte Kommentare, um zu verhindern, dass die Skripte dort geladen werden (siehe früherer Kommentar).
Lesen Sie auch den Abschnitt über Opera im Artikel. Das Problem sind pointer-events. Sie können dies selbst ändern, um den "versteckten" Tooltip von oben auf dem Link zu bewegen, um dieses Problem zu lösen. Machen Sie ihn zum Beispiel über dem Link und lassen Sie ihn nach unten und weg schweben, anstatt nach oben und weg.
Genial und sehr nützlich!
Eine Frage: Ist es möglich zu verhindern, dass der Tooltip außerhalb des Browserfensters schwebt?
THX!
Ich hatte Probleme mit der Positionierung der Tooltips relativ zum Wrap-Container. Ich habe mir die Haare ausgerauft, um das herauszufinden, und überall mit 'relative' und 'absolute' herumgespielt. Schließlich habe ich
var linkPosition = $el.position();zuvar linkPosition = $el.offset();geändert, obwohl ich nicht glaube, dass dies empfohlen wird.Kann mir außerdem jemand sagen, *warum* das in IE8 nicht funktioniert? Ich habe alle IE-spezifischen 'opacity'-Regeln hinzugefügt, aber es funktioniert trotzdem nicht. Es sieht nicht so ungewöhnlich aus, was mit dem JS oder CSS passiert, daher kann es nicht so schwierig sein, zumindest eine eingeschränkte Version in IE8 zum Laufen zu bringen.
Wäre es semantisch richtig, einen Span innerhalb des a-Elements zu verwenden und ihn als absolut zu positionieren und beim Hovern anzuzeigen?
Sieht gut aus, ist aber etwas problematisch. Der Inhalt des title-Attributs ist normalerweise einfacher Text, aber diese Lösung wandelt ihn in HTML um – aber nicht für alle, da der einfache Text-Titel als Fallback verwendet wird. Wenn Sie also ein kaufmännisches Und im Titeltext oder vielleicht sogar ein <tag> haben möchten, was würden Sie in das title-Attribut schreiben?
Somit ist diese Tooltip-Implementierung auch ein möglicher Angriffsvektor für XSS-Exploits. Stellen Sie sich eine Anwendung vor, die es Benutzern ermöglicht, Text für Tooltips einzugeben, z. B. Bildunterschriften. Dann möchte der Administrator die Benutzeroberfläche mit diesen Tooltips verschönern. Hoppla! Jetzt können die Benutzer beliebigen HTML-Code eingeben.
Mein Vorschlag: Das title-Attribut soll einfacher Text sein. Fügen Sie ein weiteres Attribut hinzu, z. B. data-fancy-html-title, wenn HTML benötigt wird.
Oder stellen Sie eine Callback-Funktion für den Inhalt des Tooltips bereit. Lassen Sie den Benutzer entscheiden, was in den Tooltip kommt – ob Rich-Text oder einfacher Text… Das habe ich mit meinem Elixon Tooltip gemacht und er ist so universell wie möglich… Ich kann ihn jetzt für so viele Dinge verwenden…
Das ist viel CSS für einen kleinen Tooltip. Ich habe in der Vergangenheit schon Tooltips erstellt, aber ich schreibe meinen Inhalt immer wieder neu, um ihn zu erklären, was traurig ist, weil ich Tooltips wirklich mag. :P
Daniel Piechnick
Dieses repositioniert sich nicht, wenn kein Platz auf dem Bildschirm ist… Ich versuche, eines zu erstellen, aber ich denke, dieses ist das effizienteste und einfachste
https://code.google.com/p/littletip/
Danke für den Beitrag!
Das wäre eine nette Funktion. Eigentlich nicht allzu schwer, wenn man jQuery UI für .postion() anstelle von nativem jQuery verwendet. .postion() hat eine Kollisionserkennung und verschiebt das, was man positioniert, um es auf dem Bildschirm anzuzeigen.
Wie mache ich diesen Tooltip unten? Kann mir bitte jemand helfen?
Wie kann ich den Popup halten, bevor ich mit der Maus darüber fahre?
TypeError: $(…).tooltips ist keine Funktion