Вы не можете стилизовать фактический title
атрибут
Способ title
отображения текста в атрибуте определяется браузером и зависит от браузера. Веб-страница не может применить какой-либо стиль к всплывающей подсказке, отображаемой браузером на основе title
атрибута.
Однако вы можете создать нечто очень похожее, используя другие атрибуты.
Вы можете создать псевдо-всплывающую подсказку с помощью CSS и пользовательского атрибута (например data-title
)
Для этого я бы использовал data-title
атрибут. data-*
Атрибуты - это метод хранения пользовательских данных в элементах DOM / HTML. Есть несколько способов доступа к ним . Важно отметить, что они могут быть выбраны с помощью CSS.
Учитывая, что вы можете использовать CSS для выбора элементов с data-title
атрибутами, вы можете затем использовать CSS для создания :after
(или :before
), content
который содержит значение атрибута с помощью attr()
.
Примеры всплывающих подсказок
Больше и с другим цветом фона (по запросу вопроса):
[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
Более сложный стиль (адаптировано из этого поста в блоге ):
[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
Известные проблемы
В отличие от реальной title
всплывающей подсказки, всплывающая подсказка, созданная вышеупомянутым CSS, не обязательно должна быть видимой на странице (т.е. она может находиться за пределами видимой области). С другой стороны, он гарантированно находится в текущем окне, что не относится к реальной всплывающей подсказке.
Кроме того, псевдо-всплывающая подсказка располагается относительно элемента, который имеет псевдо-всплывающую подсказку, а не относительно того, где находится мышь на этом элементе. Вы можете настроить точную настройку псевдо-всплывающей подсказки. Его появление в известном месте относительно элемента может быть преимуществом или недостатком, в зависимости от ситуации.
Вы не можете использовать :before
или :after
на элементы, которые не являются контейнерами
В этом ответе есть хорошее объяснение: «Могу ли я использовать псевдоэлемент: before или: after в поле ввода?»
Фактически, это означает , что вы не можете использовать этот метод непосредственно на элементах , как <input type="text"/>
, <textarea/>
, <img>
и т.д. Простое решение , чтобы обернуть элемент это не контейнер в <span>
или <div>
и есть псевдо-подсказка на контейнере.
Примеры использования псевдо-всплывающей подсказки для <span>
переноса неконтейнерного элемента:
[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/>
Из приведенного выше кода в сообщении блога (который я впервые увидел в ответе, который его занимал плагиатом), для меня стало очевидным использование data-*
атрибута вместо title
атрибута. Это также было предложено в комментарии snostorm к этому (теперь удаленному) ответу.