Vous ne pouvez pas styliser un title
attribut réel
La façon dont le texte de l' title
attribut est affiché est définie par le navigateur et varie d'un navigateur à l'autre. Il n'est pas possible pour une page Web d'appliquer un style à l'info-bulle que le navigateur affiche en fonction de l' title
attribut.
Cependant, vous pouvez créer quelque chose de très similaire en utilisant d'autres attributs.
Vous pouvez créer une pseudo-info-bulle avec CSS et un attribut personnalisé (par exemple data-title
)
Pour cela, j'utiliserais un data-title
attribut. data-*
Les attributs sont une méthode pour stocker des données personnalisées dans des éléments DOM / HTML. Il existe plusieurs façons d'y accéder . Surtout, ils peuvent être sélectionnés par CSS.
Étant donné que vous pouvez utiliser CSS pour sélectionner des éléments avec des data-title
attributs, vous pouvez ensuite utiliser CSS pour créer :after
(ou :before
) content
qui contient la valeur de l'attribut à l'aide attr()
.
Exemples d'infobulles stylisées
Plus grand et avec une couleur de fond différente (à la demande de la question):
[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
Style plus élaboré (adapté de cet article de 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
Problèmes connus
Contrairement à une véritable title
info-bulle, l'info-bulle produite par le CSS ci-dessus n'est pas nécessairement garantie d'être visible sur la page (c'est-à-dire qu'elle peut être en dehors de la zone visible). En revanche, il est garanti d'être dans la fenêtre courante, ce qui n'est pas le cas pour une info-bulle réelle.
En outre, la pseudo-info-bulle est positionnée par rapport à l'élément qui a la pseudo-info-bulle plutôt que par rapport à l'emplacement de la souris sur cet élément. Vous souhaiterez peut-être affiner l'emplacement d'affichage de la pseudo-info-bulle. Le faire apparaître dans un emplacement connu par rapport à l'élément peut être un avantage ou un inconvénient, selon la situation.
Vous ne pouvez pas utiliser :before
ou :after
sur des éléments qui ne sont pas des conteneurs
Il y a une bonne explication dans cette réponse à "Puis-je utiliser un pseudo-élément: avant ou: après sur un champ de saisie?"
En effet, cela signifie que vous ne pouvez pas utiliser cette méthode directement sur des éléments tels que <input type="text"/>
, <textarea/>
, <img>
, etc. La solution facile est d'envelopper l'élément qui n'est pas un récipient dans un <span>
ou <div>
et ont la pseudo-infobulle sur le récipient.
Exemples d'utilisation d'une pseudo-info-bulle sur un <span>
habillage d'un élément non conteneur:
[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="text""><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/>
D'après le code du blog lié ci-dessus (que j'ai vu pour la première fois ici dans une réponse qui l'a plagié), il m'a semblé évident d'utiliser un data-*
attribut au lieu de l' title
attribut. Cela a également été suggéré dans un commentaire de snostorm sur cette réponse (maintenant supprimée).