Nie możesz stylizować rzeczywistego title
atrybutu
Sposób wyświetlania tekstu w title
atrybucie jest określany przez przeglądarkę i różni się w zależności od przeglądarki. Strona internetowa nie może zastosować żadnego stylu do podpowiedzi wyświetlanej przez przeglądarkę na podstawie title
atrybutu.
Możesz jednak stworzyć coś bardzo podobnego, używając innych atrybutów.
Możesz stworzyć pseudo-etykietkę z CSS i niestandardowym atrybutem (np. data-title
)
W tym celu użyłbym data-title
atrybutu. data-*
Atrybuty to metoda przechowywania niestandardowych danych w elementach DOM / HTML. Istnieje wiele sposobów dostępu do nich . Co ważne, można je wybrać za pomocą CSS.
Ponieważ możesz używać CSS do wybierania elementów z data-title
atrybutami, możesz następnie użyć CSS do utworzenia :after
(lub :before
) content
zawierającego wartość atrybutu za pomocąattr()
.
Przykłady podpowiedzi w stylu
Większy i z innym kolorem tła (na zapytanie):
[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
Bardziej rozbudowana stylizacja (na podstawie tego postu na blogu ):
[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
Znane problemy
W przeciwieństwie do prawdziwego title
podpowiedzi, podpowiedź wygenerowana przez powyższy CSS niekoniecznie jest gwarantowana, aby była widoczna na stronie (tzn. Może znajdować się poza widocznym obszarem). Z drugiej strony gwarantuje się, że znajduje się w bieżącym oknie, co nie ma miejsca w przypadku rzeczywistej podpowiedzi.
Ponadto pseudo-podpowiedź jest umieszczana względem elementu, który ma pseudo-podpowiedź, a nie w stosunku do położenia myszy na tym elemencie. Możesz dostosować, gdzie wyświetlana jest pseudo-etykieta. Pojawienie się w znanym miejscu względem elementu może być zaletą lub wadą, w zależności od sytuacji.
Nie możesz używać elementów, które nie są kontenerami, :before
ani :after
na nich
Istnieje dobre wyjaśnienie w odpowiedzi na pytanie „Czy mogę użyć: przed lub po po pseudoelemencie w polu wejściowym?”
Skutecznie, to oznacza, że nie można zastosować tej metody bezpośrednio na elementach takich jak <input type="text"/>
, <textarea/>
, <img>
itp łatwe rozwiązaniem jest owinąć element, który nie jest to pojemnik w miejscu <span>
albo <div>
i mają pseudo-podpowiedź na pojemniku.
Przykłady użycia pseudo-etykietki na <span>
opakowaniu elementu innego niż kontener:
[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/>
Z kodu w blogu pod linkiem powyżej (który pierwszy raz zobaczyłem w odpowiedzi, która go plagiatowała), wydawało mi się oczywiste, że użyłem data-*
atrybutu zamiast title
atrybutu. Takie działanie zostało również zasugerowane w komentarzu snostorm do tej (obecnie usuniętej) odpowiedzi.