Come modificare lo stile dell'attributo title all'interno di un tag anchor?


244

Esempio:

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

Come posso modificare la presentazione dell'attributo "titolo" nel browser ?. Per impostazione predefinita, ha solo uno sfondo giallo e un carattere piccolo. Vorrei ingrandirlo e cambiare il colore di sfondo.

Esiste un modo CSS per definire lo stile dell'attributo title?


Risposte:


133

Ecco un esempio di come farlo:

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>


non funziona correttamente in FF se al posto del tag un uso del tag, per esempio, td
dnim

6
Vedi sixrevisions.com/css/css-only-tooltips per un esempio della tecnica sopra, con una spiegazione dettagliata.
George,

1
Quando lo faccio, vedo un doppio suggerimento. Quello in stile, e poi poco dopo, quello inesplorato si apre su questo. Questo è sul tuo violino. Sto usando Chrome. È un'anomalia?

8
Una risposta senza l'attributo title nel codice ha oltre 100 voti qui ...?
Ben Racicot,

1
Non affronta nemmeno la vera domanda ... boo!
Matt,

127

Sembra che esista una soluzione CSS pura, che richiede solo l' attrespressione css , il contenuto generato e i selettori di attributo (il che suggerisce che funzioni fino a IE8):

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

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

aggiornamento con input da @ViROscar: si noti che non è necessario utilizzare alcun attributo specifico, anche se ho usato l'attributo "titolo" nell'esempio sopra; in realtà la mia raccomandazione sarebbe quella di utilizzare l'attributo "alt", in quanto esiste una possibilità che il contenuto sia accessibile agli utenti che non possono beneficiare dei CSS.

aggiorna di nuovo non sto cambiando il codice perché l'attributo "titolo" ha sostanzialmente significato l'attributo "descrizione comando", e probabilmente non è una buona idea nascondere un testo importante all'interno di un campo accessibile solo al passaggio del mouse, ma se stai interessato a rendere accessibile questo testo l'attributo "etichetta-aria" sembra il posto migliore per esso: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute


11
E se non desideri che venga visualizzata anche la descrizione comandi nativa, puoi sempre utilizzare il tag "alt".
Jon z

1
@Jonz ho provato con una proprietà personalizzata "data-alt = 'alt'" e tutto va bene. non è necessario utilizzare la proprietà alt o title.
ViROscar,

7
Pure CSS Tooltips ha un serio wrawback: sono limitati all'elemento, quindi al suo stacking context. Tutti gli elementi positionche non staticcreano un nuovo contesto di stacking e semplici tooltip CSS non sono visibili all'esterno né possono andare oltre tale contesto di stacking , quindi se si dispone di un elemento stretto con posizione relative, il tooltip CSS non sarà visibile. L'unica soluzione è allegare la descrizione comandi al contesto di impilamento superiore (ad es. <body>) Che richiede JavaScript.
Vaclav Novotny,

purtroppo non scompare al clic.
user2705463,

72

Non puoi modellare un titleattributo reale

La modalità di visualizzazione del testo titlenell'attributo è definita dal browser e varia da browser a browser. Non è possibile per una pagina Web applicare uno stile alla descrizione comandi visualizzata dal browser in base titleall'attributo.

Tuttavia, puoi creare qualcosa di molto simile usando altri attributi.

Puoi creare una pseudo-tooltip con CSS e un attributo personalizzato (ad es. data-title)

Per questo, userei un data-titleattributo. data-*gli attributi sono un metodo per archiviare dati personalizzati in elementi DOM / HTML. Esistono diversi modi per accedervi . È importante sottolineare che possono essere selezionati da CSS.

Dato che puoi usare CSS per selezionare elementi con data-titleattributi, puoi quindi usare CSS per creare :after(o :before) contentche contenga il valore dell'attributo usando attr().

Esempi di tooltip con stile

Più grande e con un colore di sfondo diverso (per richiesta):

[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

Stile più elaborato (adattato da questo post del blog ):

[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

Problemi noti

A differenza di una vera titledescrizione comandi, la descrizione prodotta dal CSS sopra non è necessariamente garantita per essere visibile sulla pagina (cioè potrebbe essere al di fuori dell'area visibile). D'altra parte, è garantito che si trovi all'interno della finestra corrente, il che non è il caso di una descrizione comando reale.

Inoltre, la pseudo-tooltip è posizionata rispetto all'elemento che ha la pseudo-tooltip piuttosto che rispetto a dove si trova il mouse su quell'elemento. Potresti voler mettere a punto dove viene visualizzato lo pseudo tooltip. Farlo apparire in una posizione nota rispetto all'elemento può essere un vantaggio o uno svantaggio, a seconda della situazione.

Non è possibile utilizzare :beforeo :aftersu elementi che non sono contenitori

C'è una buona spiegazione in questa risposta a "Posso usare uno pseudo-elemento: before o: after su un campo di input?"

In effetti, questo significa che non è possibile utilizzare questo metodo direttamente su elementi come <input type="text"/>, <textarea/>, <img>, ecc La soluzione più semplice è quello di avvolgere l'elemento che non è un contenitore in un <span>o <div>e hanno la pseudo-tooltip sul contenitore.

Esempi di utilizzo di una pseudo-tooltip su un <span>wrapping di un elemento non contenitore:

[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/>


Dal codice sul post del blog collegato sopra (che ho visto per la prima volta in una risposta che lo ha plagiato), mi è sembrato ovvio usare un data-*attributo anziché l' titleattributo. Ciò è stato anche suggerito in un commento di snostorm su quella risposta (ora eliminata).


1
Questa potrebbe non essere la risposta alla domanda, ma questa è la soluzione migliore finora. Grazie.
JJ Labajo,

@JJLabajo Grazie per il complemento di questa soluzione finora. Tuttavia, non sono sicuro di come questo non risponda alla domanda. La domanda è chiedere qualcosa che non è possibile. Questa risposta afferma che non è possibile, ma offre un'alternativa che realizza qualcosa di simile a ciò che l'OP desidera.
Makyen,

Penso che questa soluzione non si applichi a elementi come input[type='text']o textarea, ma non so perché. Qualcuno può spiegare?
Cheeso,

@Cheeso Hai ragione, l' :beforee :afterpseudo-elementi non funzionano su elementi che non sono contenitori. C'è una buona spiegazione nella risposta: posso usare uno pseudo-elemento: before o: after su un campo di input? Per utilizzare questo metodo, è probabilmente più semplice avvolgere gli elementi che non sono contenitori in uno <span>o <div>su cui si inserisce l' data-titleattributo. Probabilmente vorrai anche darglieli display: inline-block;, poiché ciò li renderà della stessa dimensione del <input>o <textarea>. Ho aggiornato questa risposta con un esempio.
Makyen,

Questa risposta in realtà ci insegna cosa sta succedendo e fornisce tutti i tipi di informazioni di base ben strutturate.
Ideogram,

26

I CSS non possono modificare l'aspetto della descrizione comandi. Dipende dal browser / dal sistema operativo. Se vuoi qualcosa di diverso dovrai usare Javascript per generare markup quando passi con il mouse sopra l'elemento anziché la descrizione comandi predefinita.


22
Non è necessario utilizzare JS per farlo.
ANeves,

9
Il rischio con le risposte "non puoi" è che possono diventare obsolete. (L'altro rischio è che non si può proprio sapere come.)
Michael Scheper,

12

Ho pensato di pubblicare qui la mia soluzione JavaScript a 20 righe. Non è perfetto, ma può essere utile per alcuni a seconda di ciò di cui hai bisogno dalla descrizione dei comandi.

Quando usarlo

  • Stili automaticamente la descrizione comandi per tutti gli elementi HTML con un TITLEattributo definito (questo include elementi aggiunti dinamicamente al documento in futuro)
  • Non sono necessarie modifiche o hack JavaScript / HTML per ogni descrizione comandi (solo l' TITLEattributo, semanticamente chiaro)
  • Molto leggero (aggiunge circa 300 byte compressi con gzip e minimizzato)
  • Volete solo un suggerimento stilistico molto semplice

Quando NON usare

  • Richiede jQuery, quindi non utilizzarlo se non si utilizza jQuery
  • Cattivo supporto per gli elementi nidificati che hanno entrambi suggerimenti
  • È necessario più di una descrizione comandi sullo schermo contemporaneamente
  • È necessario che la descrizione comandi scompaia dopo qualche tempo

Il codice

// 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); }
}());

Incollalo ovunque, dovrebbe funzionare anche quando esegui questo codice prima che il DOM sia pronto (non mostrerà i tuoi suggerimenti finché DOM non sarà pronto).

personalizzare

È possibile modificare le vardichiarazioni sulla seconda riga per personalizzarlo un po '.

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

Stile

Ora puoi modellare i suggerimenti usando il seguente CSS:

#tooltip {
    background: #fff;
    border: 1px solid red;
    padding: 3px 10px;
}

2
Funziona alla grande! La correzione di un bug minore (se il titolo è vuoto) è disponibile qui: stackoverflow.com/questions/26702472/…
Malasorte,

Se si sposta rapidamente su un elemento, sto ottenendo una descrizione comandi vuota, anche con la correzione degli errori di cui sopra. Questo è irregolare e si interrompe se tolgo $ (questo) .removeAttr ("titolo"). Ma ovviamente dopo un po 'ottengo l'aiuto standard.
Allen Conquest,

10

Ho trovato la risposta qui: http://www.webdesignerdepot.com/2012/11/how-to-create-a-simple-css3-tooltip/

il mio codice va in questo modo, ho cambiato il nome dell'attributo, se mantieni il nome del titolo per l'attributo finisci per avere due popup per lo stesso testo, un'altra modifica è che il mio testo al passaggio del mouse viene visualizzato sotto il testo esposto.

.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>


7

Un jsfiddle per il modello di tooltip personalizzato è qui

Si basa sul posizionamento CSS e sui selettori di classe pseduo

Controlla i documenti MDN per il supporto cross-browser delle pseudo-classi

    <!-- 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;
}

5

La descrizione comandi nativa non può essere definita.

Detto questo, è possibile utilizzare alcune librerie che mostrano gli stili livelli fluttuanti quando l'elemento viene spostato (anziché i suggerimenti nativi e li sopprime) che richiede piccole o nessuna modifica del codice ...


Non penso che tu possa sopprimere i suggerimenti nativi se un elemento ha un titleattributo. Quindi, se imposti la tua implementazione di tooltip, è meglio usare qualche altro attributo (diciamo, data-tip) invece di title.
Jukka K. Korpela,

1
puoi, se dopo esserti associato all'evento
cancelli l'

1
Vedo il tuo punto, ma non si tratta di dare uno stile ai tooltip nativi; si tratta di evitarli (modificando il DOM).
Jukka K. Korpela,

@ JukkaK.Korpela sì, e nella mia prima frase ho detto che era impossibile;)
poncha

Il vantaggio di utilizzare l'attributo title e di cancellarlo in seguito è che la descrizione comandi è ancora disponibile se l'utente ha JavaScript disabilitato.
JJJ

2

Non è possibile definire lo stile della descrizione comandi del browser predefinita. Ma puoi usare JavaScript per creare i tuoi suggerimenti HTML personalizzati.


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

Funziona anche con qualsiasi attributo che desideri aggiungere ad esempio:

HTML

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

CSS

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

Guardalo funzionare su: http://jsfiddle.net/vpYWE/1/


14
Quello modella un elemento con il titolo specificato; non il titolo della descrizione comandi visualizzata dal browser
Rowland Shaw,

1
Inoltre, anythingnon è un attributo HTML valido. Per gli attributi personalizzati utilizzare gli data-attributi.
user4642212
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.