示例:
<a href="example.com" title="My site"> Link </a>
如何更改浏览器中"title"属性的呈现方式?默认情况下,它只有黄色背景和小字体。我想让它变大并更改背景颜色。
有没有一种CSS的方法来设置"title"属性的样式?
看起来实际上有一个纯CSS解决方案,只需要使用css中的attr
表达式、生成内容和属性选择器(这表明它可以在IE8之前的浏览器中使用):
https://jsfiddle.net/z42r2vv0/2/
a {
position: relative;
display: inline-block;
margin-top: 20px;
}
a[title]:hover::after {
content: attr(title);
position: absolute;
top: -100%;
left: 0;
}
<a href="http://www.google.com/" title="Hello world!">
Hover over me
</a>
层叠上下文
内。所有具有position
属性且非static
值的元素都会创建新的层叠上下文,而纯CSS工具提示不能在此类层叠上下文之外可见或超出其范围,因此如果您有具有relative
定位的紧密元素,则您的CSS工具提示将无法显示。唯一的解决方案是将工具提示附加到顶部的层叠上下文(例如<body>
),这需要使用JavaScript。 - Rudolf Gröhlingtitle
属性设置样式title
属性中的文本如何显示是由浏览器定义的,并且各个浏览器之间略有差异。网页不能对基于title
属性的工具提示应用任何样式。
但是,您可以使用其他属性创建非常相似的内容。
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
在“Can I use a :before or :after pseudo-element on an input field?”中有一个很好的解释。
实际上,这意味着您无法直接在像 <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的评论建议这样做。
required=true
的特定情况下,您需要不使用该属性并为表单实现自己的验证。或者,您可以使伪工具提示出现在默认工具提示不占用的位置。这可能是特定于浏览器的,但您可以实现覆盖您要支持的浏览器的CSS。 - Makyenwhite-space: nowrap;
并应用其他CSS属性(例如 width
、height
、max-width
、max-height
等)即可。实际使用的CSS并不是为所有情况而设计的,而只是演示完成所请求任务的一种方法。 - Makyen这是一个如何实现的示例:
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>
CSS无法改变工具提示的外观。它取决于浏览器/操作系统。如果您想要不同的外观,您需要使用Javascript,在悬停在元素上时生成标记,而不是使用默认的工具提示。
我在这里找到了答案:http://www.webdesignerdepot.com/2012/11/how-to-create-a-simple-css3-tooltip/
我的代码如下,我改变了属性名称,如果你保留属性的标题名字,你最终会得到相同文本的两个弹出窗口;另一个更改是,在悬停时显示的文本位于暴露文本的下方。
.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(data-gloss);
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" data-gloss="Text shown on hovering">Exposed text</a>
我想在这里张贴我20行JavaScript解决方案。它并不完美,但取决于你需要从工具提示中获得什么,对一些人可能会有用。
何时使用
TITLE
属性的HTML元素样式化工具提示(这包括未来动态添加到文档中的元素)TITLE
属性)何时不使用
代码
// 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); }
}());
将其粘贴到任何地方,即使在DOM准备就绪之前运行此代码(它只是不会显示工具提示,直到DOM准备就绪)也应该可以工作。
自定义
您可以更改第二行中的var
声明以进行一些自定义。
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
样式
现在您可以使用以下CSS样式来设置工具提示的样式:
#tooltip {
background: #fff;
border: 1px solid red;
padding: 3px 10px;
}
这是一个自定义提示模式的jsfiddle,链接在这里
它基于CSS定位和伪类选择器。
查看MDN文档以获取伪类在不同浏览器中的支持情况。
<!-- HTML -->
<p>
<a href="http://www.google.com/" class="tooltip">
I am a
<span> (This website rocks) </span></a> 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;
}
本地工具提示无法进行样式设置。
话虽如此,您可以使用一些库,当元素被悬停时显示样式浮动层(而不是本机工具提示,并抑制它们),需要很少或没有代码修改...
您无法样式化默认的浏览器工具提示。但是,您可以使用JavaScript创建自己的自定义HTML工具提示。