Wie ändere ich den Stil des title-Attributs in einem Ankertag?

243

Beispiel:

<a href="example.com" title="My site"> Link </a>

Wie ändere ich die Darstellung des Attributs "title" im Browser?. Standardmäßig hat es nur einen gelben Hintergrund und eine kleine Schrift. Ich möchte es größer machen und die Hintergrundfarbe ändern.

Gibt es eine CSS-Möglichkeit, das title-Attribut zu formatieren?

Kunpha
quelle

Antworten:

133

Hier ist ein Beispiel dafür:

a.tip {
    border-bottom: 1px dashed;
    text-decoration: none
}
a.tip:hover {
    cursor: help;
    position: relative
}
a.tip span {
    display: none
}
a.tip:hover span {
    border: #c0c0c0 1px dotted;
    padding: 5px 20px 5px 5px;
    display: block;
    z-index: 100;
    background: url(../images/status-info.png) #f0f0f0 no-repeat 100% 5%;
    left: 0px;
    margin: 10px;
    width: 250px;
    position: absolute;
    top: 10px;
    text-decoration: none
}
<a href="#" class="tip">Link<span>This is the CSS tooltip showing up when you mouse over the link</span></a>

valli
quelle
nicht , wenn statt dem Tag richtig in FF arbeiten eine Verwendung der Tag, zum Beispiel, td
dnim
6
Ein Beispiel für die oben beschriebene Technik finden Sie unter sixrevisions.com/css/css-only-tooltips mit einer detaillierten Erläuterung.
George
1
Wenn ich das mache, sehe ich einen doppelten Tooltip. Der gestylte und kurz darauf der nicht gestylte taucht über diesem auf. Das liegt an deiner Geige. Ich benutze Chrom. Ist das eine Anomalie?
8
Eine Antwort ohne das title-Attribut im Code hat hier über 100 positive Stimmen ...?
Ben Racicot
1
Geht nicht einmal auf die eigentliche Frage ein ... Boo!
Matt
126

Es scheint tatsächlich eine reine CSS-Lösung zu geben, die nur den CSS- attrAusdruck, den generierten Inhalt und die Attributselektoren benötigt (was darauf hindeutet, dass sie bereits im IE8 funktioniert):

a[title]:hover:after {
  content: attr(title);
  position: absolute;
}

Quelle: https://jsfiddle.net/z42r2vv0/2/

Update mit Eingabe von @ViROscar: Bitte beachten Sie, dass kein bestimmtes Attribut verwendet werden muss, obwohl ich im obigen Beispiel das Attribut "title" verwendet habe. Eigentlich würde ich empfehlen, das Attribut "alt" zu verwenden, da die Möglichkeit besteht, dass der Inhalt für Benutzer zugänglich ist, die nicht von CSS profitieren können.

Erneut aktualisieren Ich ändere den Code nicht, da das Attribut "title" im Grunde genommen das Attribut "tooltip" bedeutet und es wahrscheinlich keine gute Idee ist, wichtigen Text in einem Feld zu verbergen, auf das nur mit dem Mauszeiger zugegriffen werden kann, aber wenn Sie es sind Wenn Sie daran interessiert sind, diesen Text zugänglich zu machen, scheint das Attribut "aria-label" der beste Ort dafür zu sein: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute

Jon z
quelle
11
Und wenn Sie nicht möchten, dass der native Tooltip irgendwann auch angezeigt wird, können Sie immer das "alt" -Tag verwenden.
Jon z
1
@ Jonz Ich habe es mit einer benutzerdefinierten Eigenschaft "data-alt = 'alt'" versucht und alles geht in Ordnung. ist nicht erforderlich, um die Eigenschaft alt oder title zu verwenden.
ViROscar
7
Reine CSS-QuickInfos haben schwerwiegende Nachteile - sie sind an das Element und damit an dessen Element gebunden stacking context. Alle Elemente mit positionanderen als dem staticErstellen eines neuen Stapelkontexts und reinen CSS-Tooltips sind außerhalb nicht sichtbar und können auch nicht über diesen Stapelkontext hinausgehen. Wenn Sie also ein enges Element mit Position haben relative, ist Ihr CSS-Tooltip nicht sichtbar. Die einzige Lösung besteht darin, einen Tooltip an den Top- Stacking-Kontext anzuhängen (z. B. <body>), der JavaScript benötigt.
Vaclav Novotny
Leider verschwindet es nicht beim Klicken.
user2705463
72

Sie können kein tatsächliches titleAttribut formatieren

Wie der Text im titleAttribut angezeigt wird, wird vom Browser festgelegt und variiert von Browser zu Browser. Es ist für eine Webseite nicht möglich, einen Stil auf den Tooltip anzuwenden, den der Browser basierend auf dem titleAttribut anzeigt .

Sie können jedoch mit anderen Attributen etwas sehr Ähnliches erstellen.

Sie können einen pseudo-Tooltip mit CSS machen und ein benutzerdefiniertes Attribut (zB data-title)

Dafür würde ich ein data-titleAttribut verwenden. data-*Attribute sind eine Methode zum Speichern von benutzerdefinierten Daten in DOM-Elementen / HTML. Es gibt mehrere Möglichkeiten, auf sie zuzugreifen . Wichtig ist, dass sie per CSS ausgewählt werden können.

Da Sie mit CSS Elemente mit data-titleAttributen auswählen können, können Sie mit CSS erstellen :after(oder :before) content, das den Wert des Attributs enthält attr().

Beispiele für gestaltete QuickInfos

Größer und mit einer anderen Hintergrundfarbe (auf Anfrage der Frage):

[data-title]:hover:after {
    opacity: 1;
    transition: all 0.1s ease 0.5s;
    visibility: visible;
}
[data-title]:after {
    content: attr(data-title);
    background-color: #00FF00;
    color: #111;
    font-size: 150%;
    position: absolute;
    padding: 1px 5px 2px 5px;
    bottom: -1.6em;
    left: 100%;
    white-space: nowrap;
    box-shadow: 1px 1px 3px #222222;
    opacity: 0;
    border: 1px solid #111111;
    z-index: 99999;
    visibility: hidden;
}
[data-title] {
    position: relative;
}
<a href="example.com" data-title="My site"> Link </a> with styled tooltip (bigger and with a different background color, as requested in the question)<br/>
<a href="example.com" title="My site"> Link </a> with normal tooltip

Ausgefeilteres Styling (angepasst aus diesem Blog-Beitrag ):

[data-title]:hover:after {
    opacity: 1;
    transition: all 0.1s ease 0.5s;
    visibility: visible;
}
[data-title]:after {
    content: attr(data-title);
    position: absolute;
    bottom: -1.6em;
    left: 100%;
    padding: 4px 4px 4px 8px;
    color: #222;
    white-space: nowrap; 
    -moz-border-radius: 5px; 
    -webkit-border-radius: 5px;  
    border-radius: 5px;  
    -moz-box-shadow: 0px 0px 4px #222;  
    -webkit-box-shadow: 0px 0px 4px #222;  
    box-shadow: 0px 0px 4px #222;  
    background-image: -moz-linear-gradient(top, #f8f8f8, #cccccc);  
    background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #f8f8f8),color-stop(1, #cccccc));
    background-image: -webkit-linear-gradient(top, #f8f8f8, #cccccc);  
    background-image: -moz-linear-gradient(top, #f8f8f8, #cccccc);  
    background-image: -ms-linear-gradient(top, #f8f8f8, #cccccc);  
    background-image: -o-linear-gradient(top, #f8f8f8, #cccccc);
    opacity: 0;
    z-index: 99999;
    visibility: hidden;
}
[data-title] {
    position: relative;
}
<a href="example.com" data-title="My site"> Link </a> with styled tooltip<br/>
<a href="example.com" title="My site"> Link </a> with normal tooltip

Bekannte Probleme

Im Gegensatz zu einem echten titleTooltip ist nicht unbedingt garantiert, dass der vom obigen CSS erstellte Tooltip auf der Seite sichtbar ist (dh außerhalb des sichtbaren Bereichs). Auf der anderen Seite wird garantiert, dass es sich innerhalb des aktuellen Fensters befindet, was bei einem tatsächlichen Tooltip nicht der Fall ist.

Außerdem wird der Pseudo-Tooltip relativ zu dem Element positioniert, das den Pseudo-Tooltip enthält, und nicht relativ zu der Position, an der sich die Maus auf diesem Element befindet. Möglicherweise möchten Sie genau festlegen, wo der Pseudo-Tooltip angezeigt wird. Das Erscheinen an einer bekannten Stelle relativ zum Element kann je nach Situation ein Vorteil oder ein Nachteil sein.

Sie können mit nicht :beforeoder :afterauf Elemente , die keine Container sind

Diese Antwort enthält eine gute Erklärung für "Kann ich ein: vor oder: nach dem Pseudoelement in einem Eingabefeld verwenden?"

Effektiv bedeutet dies , dass Sie diese Methode nicht direkt auf Elemente wie verwenden können <input type="text"/>, <textarea/>, <img>etc. Die einfache Lösung ist es, das Element zu wickeln , die in einem kein Container ist <span>oder <div>und hat den pseudo-Tooltip auf den Behälter.

Beispiele für die Verwendung eines Pseudo-Tooltips zum <span>Umschließen eines Nicht-Container-Elements:

[data-title]:hover:after {
    opacity: 1;
    transition: all 0.1s ease 0.5s;
    visibility: visible;
}
[data-title]:after {
    content: attr(data-title);
    background-color: #00FF00;
    color: #111;
    font-size: 150%;
    position: absolute;
    padding: 1px 5px 2px 5px;
    bottom: -1.6em;
    left: 100%;
    white-space: nowrap;
    box-shadow: 1px 1px 3px #222222;
    opacity: 0;
    border: 1px solid #111111;
    z-index: 99999;
    visibility: hidden;
}
[data-title] {
    position: relative;
}

.pseudo-tooltip-wrapper {
    /*This causes the wrapping element to be the same size as what it contains.*/
    display: inline-block;
}
Text input with a pseudo-tooltip:<br/>
<span class="pseudo-tooltip-wrapper" data-title="input type=&quot;text&quot;"><input type='text'></span><br/><br/><br/>
Textarea with a pseudo-tooltip:<br/>
<span class="pseudo-tooltip-wrapper" data-title="this is a textarea"><textarea data-title="this is a textarea"></textarea></span><br/>


Aus dem Code in dem oben verlinkten Blog-Beitrag (den ich hier zum ersten Mal in einer Antwort gesehen habe, die ihn plagiiert hat) erschien es mir offensichtlich, ein data-*Attribut anstelle des titleAttributs zu verwenden. Dies wurde auch in einem Kommentar von snostorm zu dieser (jetzt gelöschten) Antwort vorgeschlagen.

Makyen
quelle
1
Dies ist möglicherweise nicht die Antwort auf die Frage, aber dies ist die bisher beste Lösung. Vielen Dank.
JJ Labajo
@JJLabajo Vielen Dank für die Ergänzung, dass dies die bisher beste Lösung ist. Ich bin mir jedoch nicht sicher, wie dies die Frage nicht beantwortet. Die Frage ist nach etwas, was einfach nicht möglich ist. Diese Antwort besagt, dass dies nicht möglich ist, bietet jedoch eine Alternative, die etwas Ähnliches erreicht, wie es das OP wünscht.
Makyen
Ich denke, diese Lösung gilt nicht für Elemente wie input[type='text']oder textarea, aber ich weiß nicht warum. Kann jemand erklären?
Cheeso
@Cheeso Sie haben Recht, die :beforeund :afterPseudo-Elemente funktionieren nicht bei Elementen, die keine Container sind. Die Antwort enthält eine gute Erklärung: Kann ich ein: vor oder: nach dem Pseudoelement in einem Eingabefeld verwenden? Um diese Methode zu verwenden, ist es wahrscheinlich am einfachsten, die Elemente, die keine Container sind, in ein <span>oder zu verpacken, <div>auf das Sie das data-titleAttribut setzen. Sie werden sie wahrscheinlich auch geben wollen display: inline-block;, da sie dadurch die gleiche Größe wie das <input>oder haben <textarea>. Ich habe diese Antwort mit einem Beispiel aktualisiert.
Makyen
Diese Antwort lehrt uns tatsächlich, was los ist und liefert alle Arten von gut strukturierten Hintergrundinformationen.
Ideogramm
26

CSS kann das Erscheinungsbild der QuickInfos nicht ändern. Es ist browser- / betriebssystemabhängig. Wenn Sie etwas anderes möchten, müssen Sie Javascript verwenden, um Markups zu generieren, wenn Sie den Mauszeiger über das Element anstelle des Standard-Tooltips bewegen.

Cletus
quelle
22
Man muss nicht haben zu JS verwenden , es zu tun.
Aneves
9
Das Risiko bei "Sie können nicht" -Antworten besteht darin, dass sie veraltet sein können. (Das andere Risiko ist, dass Sie einfach nicht wissen konnten, wie.)
Michael Scheper
12

Ich dachte, ich würde meine 20-Zeilen-JavaScript-Lösung hier veröffentlichen. Es ist nicht perfekt, kann aber für einige nützlich sein, je nachdem, was Sie in Ihren Tooltips benötigen.

Wann man es benutzt

  • Formatiert den Tooltip für alle HTML-Elemente automatisch mit einem TITLEdefinierten Attribut (dies schließt Elemente ein, die dem Dokument in Zukunft dynamisch hinzugefügt werden).
  • Für jeden Tooltip sind keine Javascript / HTML-Änderungen oder Hacks erforderlich (nur das TITLEAttribut, semantisch klar).
  • Sehr leicht (fügt ungefähr 300 Bytes hinzu, die gezippt und minimiert sind)
  • Sie möchten nur einen sehr einfachen, stilbaren Tooltip

Wann NICHT verwenden

  • Benötigt jQuery, verwenden Sie es also nicht, wenn Sie jQuery nicht verwenden
  • Schlechte Unterstützung für verschachtelte Elemente, die beide QuickInfos haben
  • Sie benötigen mehr als einen Tooltip gleichzeitig auf dem Bildschirm
  • Sie benötigen den Tooltip, um nach einiger Zeit zu verschwinden

Der Code

// Use a closure to keep vars out of global scope
(function () {
    var ID = "tooltip", CLS_ON = "tooltip_ON", FOLLOW = true,
    DATA = "_tooltip", OFFSET_X = 20, OFFSET_Y = 10,
    showAt = function (e) {
        var ntop = e.pageY + OFFSET_Y, nleft = e.pageX + OFFSET_X;
        $("#" + ID).html($(e.target).data(DATA)).css({
            position: "absolute", top: ntop, left: nleft
        }).show();
    };
    $(document).on("mouseenter", "*[title]", function (e) {
        $(this).data(DATA, $(this).attr("title"));
        $(this).removeAttr("title").addClass(CLS_ON);
        $("<div id='" + ID + "' />").appendTo("body");
        showAt(e);
    });
    $(document).on("mouseleave", "." + CLS_ON, function (e) {
        $(this).attr("title", $(this).data(DATA)).removeClass(CLS_ON);
        $("#" + ID).remove();
    });
    if (FOLLOW) { $(document).on("mousemove", "." + CLS_ON, showAt); }
}());

Fügen Sie es an einer beliebigen Stelle ein. Es sollte auch dann funktionieren, wenn Sie diesen Code ausführen, bevor das DOM fertig ist (Ihre Tooltips werden erst angezeigt, wenn das DOM fertig ist).

Anpassen

Sie können die varDeklarationen in der zweiten Zeile ändern , um sie ein wenig anzupassen.

var ID = "tooltip"; // The ID of the styleable tooltip
var CLS_ON = "tooltip_ON"; // Does not matter, make it somewhat unique
var FOLLOW = true; // TRUE to enable mouse following, FALSE to have static tooltips
var DATA = "_tooltip"; // Does not matter, make it somewhat unique
var OFFSET_X = 20, OFFSET_Y = 10; // Tooltip's distance to the cursor

Stil

Sie können Ihre QuickInfos jetzt mit dem folgenden CSS formatieren:

#tooltip {
    background: #fff;
    border: 1px solid red;
    padding: 3px 10px;
}
ChrisF
quelle
2
Funktioniert super! Korrektur für einen kleinen Fehler (wenn der Titel leer ist) finden Sie hier: stackoverflow.com/questions/26702472/…
Malasorte
Wenn Sie sich schnell über ein Element bewegen, wird ein leerer Tooltip angezeigt, auch mit der oben genannten Fehlerbehebung. Dies ist unberechenbar und hört auf, wenn ich $ (this) .removeAttr ("title") entferne. Aber natürlich bekomme ich dann nach einer Weile die Standardhilfe.
Allen Eroberung
10

Ich habe die Antwort hier gefunden: http://www.webdesignerdepot.com/2012/11/how-to-create-a-simple-css3-tooltip/

Mein eigener Code sieht so aus. Ich habe den Attributnamen geändert. Wenn Sie den Titelnamen für das Attribut beibehalten, haben Sie am Ende zwei Popups für denselben Text. Eine weitere Änderung besteht darin, dass mein Text beim Schweben unter dem exponierten Text angezeigt wird.

.tags {
  display: inline;
  position: relative;
}

.tags:hover:after {
  background: #333;
  background: rgba(0, 0, 0, .8);
  border-radius: 5px;
  bottom: -34px;
  color: #fff;
  content: attr(glose);
  left: 20%;
  padding: 5px 15px;
  position: absolute;
  z-index: 98;
  width: 350px;
}

.tags:hover:before {
  border: solid;
  border-color: #333 transparent;
  border-width: 0 6px 6px 6px;
  bottom: -4px;
  content: "";
  left: 50%;
  position: absolute;
  z-index: 99;
}
<a class="tags" glose="Text shown on hovering">Exposed text</a>

Andrés Chandía
quelle
7

Eine jsfiddle für ein benutzerdefiniertes Tooltip-Muster finden Sie hier

Es basiert auf CSS-Positionierungs- und Pseduo-Klassenselektoren

Überprüfen Sie die MDN-Dokumente auf browserübergreifende Unterstützung von Pseudoklassen

    <!-- HTML -->
<p>
    <a href="http://www.google.com/" class="tooltip">
    I am a 
        <span> (This website rocks) </span></a>&nbsp; a developer.
</p>

    /*CSS*/
a.tooltip {
    position: relative;
}

a.tooltip span {
    display: none;    
}

a.tooltip:hover span, a.tooltip:focus span {
    display:block;
    position:absolute;
    top:1em;
    left:1.5em;
    padding: 0.2em 0.6em;
    border:1px solid #996633;
    background-color:#FFFF66;
    color:#000;
}
Prasun
quelle
5

Native Tooltips können nicht gestaltet werden.

Abgesehen davon können Sie eine Bibliothek verwenden, in der schwebende Stilebenen angezeigt werden, wenn das Element bewegt wird (anstelle der nativen QuickInfos, und diese unterdrücken), ohne dass Codeänderungen erforderlich sind.

Poncha
quelle
Ich glaube nicht, dass Sie die nativen QuickInfos unterdrücken können, wenn ein Element ein titleAttribut hat. Wenn Sie also Ihre eigene Tooltip-Implementierung einrichten, ist es besser, ein anderes Attribut (z. B. data-tip) anstelle von zu verwenden title.
Jukka K. Korpela
1
Sie können, wenn Sie nach dem Anhängen an das Ereignis das
Titelattribut
1
Ich verstehe Ihren Standpunkt, aber es geht nicht darum, native Tooltips zu gestalten. Es geht darum, sie zu vermeiden (indem Sie das DOM ändern).
Jukka K. Korpela
@ JukkaK.Korpela yep, und ich sagte in meinem ersten Satz, dass es unmöglich war;)
poncha
Der Vorteil der Verwendung des title-Attributs und dessen späteres Löschen besteht darin, dass der Tooltip weiterhin verfügbar ist, wenn der Benutzer JavaScript deaktiviert hat.
JJJ
2

Sie können den Standard-Browser-Tooltip nicht formatieren. Sie können jedoch Javascript verwenden, um Ihre eigenen benutzerdefinierten HTML-Tooltips zu erstellen.

bfavaretto
quelle
-1
a[title="My site"] {
    color: red;
}

Dies funktioniert auch mit allen Attributen, die Sie hinzufügen möchten, zum Beispiel:

HTML

<div class="my_class" anything="whatever">My Stuff</div>

CSS

.my_class[anything="whatever"] {
    color: red;
}

Sehen Sie, wie es funktioniert unter: http://jsfiddle.net/vpYWE/1/

Shana.
quelle
14
Dadurch wird ein Element mit dem angegebenen Titel formatiert. nicht der Tooltip-Titel, den der Browser anzeigt
Rowland Shaw
1
Auch anythingist kein gültiges HTML-Attribut. Verwenden Sie für benutzerdefinierte Attribute data-Attribute.
user4642212