[html] How to change the style of the title attribute inside an anchor tag?

Example:

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

How do I change the presentation of the "title" attribute in the browser?. By default, it just has yellow background and small font. I would like to make it bigger and change the background color.

Is there a CSS way to style the title attribute?

This question is related to html css

The answer is


CSS can't change the tooltip appearance. It is browser/OS-dependent. If you want something different you'll have to use Javascript to generate markup when you hover over the element instead of the default tooltip.


I have found the answer here: http://www.webdesignerdepot.com/2012/11/how-to-create-a-simple-css3-tooltip/

my own code goes like this, I have changed the attribute name, if you maintain the title name for the attribute you end up having two popups for the same text, another change is that my text on hovering displays underneath the exposed text.

_x000D_
_x000D_
.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(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;
}
_x000D_
<a class="tags" gloss="Text shown on hovering">Exposed text</a>
_x000D_
_x000D_
_x000D_


It seems that there is in fact a pure CSS solution, requiring only the css attr expression, generated content and attribute selectors (which suggests that it works as far back as IE8):

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

_x000D_
_x000D_
a {
  position: relative;
  display: inline-block;
  margin-top: 20px;
}

a[title]:hover::after {
  content: attr(title);
  position: absolute;
  top: -100%;
  left: 0;
}
_x000D_
<a href="http://www.google.com/" title="Hello world!">
  Hover over me
</a>
_x000D_
_x000D_
_x000D_

update w/ input from @ViROscar: please note that it's not necessary to use any specific attribute, although I've used the "title" attribute in the example above; actually my recommendation would be to use the "alt" attribute, as there is some chance that the content will be accessible to users unable to benefit from CSS.

update again I'm not changing the code because the "title" attribute has basically come to mean the "tooltip" attribute, and it's probably not a good idea to hide important text inside a field only accessible on hover, but if you're interested in making this text accessible the "aria-label" attribute seems like the best place for it: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute


You cannot style the default browser tooltip. But you can use javascript to create your own custom HTML tooltips.


You can't style an actual title attribute

How the text in the title attribute is displayed is defined by the browser and varies from browser to browser. It's not possible for a webpage to apply any style to the tooltip that the browser displays based on the title attribute.

However, you can create something very similar using other attributes.

You can make a pseudo-tooltip with CSS and a custom attribute (e.g. data-title)

For this, I'd use a data-title attribute. data-* attributes are a method to store custom data in DOM elements/HTML. There are multiple ways of accessing them. Importantly, they can be selected by CSS.

Given that you can use CSS to select elements with data-title attributes, you can then use CSS to create :after (or :before) content that contains the value of the attribute using attr().

Styled tooltip Examples

Bigger and with a different background color (per question's request):

_x000D_
_x000D_
[data-title]:hover:after {_x000D_
    opacity: 1;_x000D_
    transition: all 0.1s ease 0.5s;_x000D_
    visibility: visible;_x000D_
}_x000D_
[data-title]:after {_x000D_
    content: attr(data-title);_x000D_
    background-color: #00FF00;_x000D_
    color: #111;_x000D_
    font-size: 150%;_x000D_
    position: absolute;_x000D_
    padding: 1px 5px 2px 5px;_x000D_
    bottom: -1.6em;_x000D_
    left: 100%;_x000D_
    white-space: nowrap;_x000D_
    box-shadow: 1px 1px 3px #222222;_x000D_
    opacity: 0;_x000D_
    border: 1px solid #111111;_x000D_
    z-index: 99999;_x000D_
    visibility: hidden;_x000D_
}_x000D_
[data-title] {_x000D_
    position: relative;_x000D_
}
_x000D_
<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/>_x000D_
<a href="example.com" title="My site"> Link </a> with normal tooltip
_x000D_
_x000D_
_x000D_

More elaborate styling (adapted from this blog post):

_x000D_
_x000D_
[data-title]:hover:after {_x000D_
    opacity: 1;_x000D_
    transition: all 0.1s ease 0.5s;_x000D_
    visibility: visible;_x000D_
}_x000D_
[data-title]:after {_x000D_
    content: attr(data-title);_x000D_
    position: absolute;_x000D_
    bottom: -1.6em;_x000D_
    left: 100%;_x000D_
    padding: 4px 4px 4px 8px;_x000D_
    color: #222;_x000D_
    white-space: nowrap; _x000D_
    -moz-border-radius: 5px; _x000D_
    -webkit-border-radius: 5px;  _x000D_
    border-radius: 5px;  _x000D_
    -moz-box-shadow: 0px 0px 4px #222;  _x000D_
    -webkit-box-shadow: 0px 0px 4px #222;  _x000D_
    box-shadow: 0px 0px 4px #222;  _x000D_
    background-image: -moz-linear-gradient(top, #f8f8f8, #cccccc);  _x000D_
    background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #f8f8f8),color-stop(1, #cccccc));_x000D_
    background-image: -webkit-linear-gradient(top, #f8f8f8, #cccccc);  _x000D_
    background-image: -moz-linear-gradient(top, #f8f8f8, #cccccc);  _x000D_
    background-image: -ms-linear-gradient(top, #f8f8f8, #cccccc);  _x000D_
    background-image: -o-linear-gradient(top, #f8f8f8, #cccccc);_x000D_
    opacity: 0;_x000D_
    z-index: 99999;_x000D_
    visibility: hidden;_x000D_
}_x000D_
[data-title] {_x000D_
    position: relative;_x000D_
}
_x000D_
<a href="example.com" data-title="My site"> Link </a> with styled tooltip<br/>_x000D_
<a href="example.com" title="My site"> Link </a> with normal tooltip
_x000D_
_x000D_
_x000D_

Known issues

Unlike a real title tooltip, the tooltip produced by the above CSS is not, necessarily, guaranteed to be visible on the page (i.e. it might be outside the visible area). On the other hand, it is guaranteed to be within the current window, which is not the case for an actual tooltip.

In addition, the pseudo-tooltip is positioned relative to the element that has the pseudo-tooltip rather than relative to where the mouse is on that element. You may want to fine-tune where the pseudo-tooltip is displayed. Having it appear in a known location relative to the element can be a benefit or a drawback, depending on the situation.

You can't use :before or :after on elements which are not containers

There's a good explanation in this answer to "Can I use a :before or :after pseudo-element on an input field?"

Effectively, this means that you can't use this method directly on elements like <input type="text"/>, <textarea/>, <img>, etc. The easy solution is to wrap the element that's not a container in a <span> or <div> and have the pseudo-tooltip on the container.

Examples of using a pseudo-tooltip on a <span> wrapping a non-container element:

_x000D_
_x000D_
[data-title]:hover:after {_x000D_
    opacity: 1;_x000D_
    transition: all 0.1s ease 0.5s;_x000D_
    visibility: visible;_x000D_
}_x000D_
[data-title]:after {_x000D_
    content: attr(data-title);_x000D_
    background-color: #00FF00;_x000D_
    color: #111;_x000D_
    font-size: 150%;_x000D_
    position: absolute;_x000D_
    padding: 1px 5px 2px 5px;_x000D_
    bottom: -1.6em;_x000D_
    left: 100%;_x000D_
    white-space: nowrap;_x000D_
    box-shadow: 1px 1px 3px #222222;_x000D_
    opacity: 0;_x000D_
    border: 1px solid #111111;_x000D_
    z-index: 99999;_x000D_
    visibility: hidden;_x000D_
}_x000D_
[data-title] {_x000D_
    position: relative;_x000D_
}_x000D_
_x000D_
.pseudo-tooltip-wrapper {_x000D_
    /*This causes the wrapping element to be the same size as what it contains.*/_x000D_
    display: inline-block;_x000D_
}
_x000D_
Text input with a pseudo-tooltip:<br/>_x000D_
<span class="pseudo-tooltip-wrapper" data-title="input type=&quot;text&quot;"><input type='text'></span><br/><br/><br/>_x000D_
Textarea with a pseudo-tooltip:<br/>_x000D_
<span class="pseudo-tooltip-wrapper" data-title="this is a textarea"><textarea data-title="this is a textarea"></textarea></span><br/>
_x000D_
_x000D_
_x000D_


From the code on the blog post linked above (which I first saw in an answer here that plagiarized it), it appeared obvious to me to use a data-* attribute instead of the title attribute. Doing so was also suggested in a comment by snostorm on that (now deleted) answer.


Native tooltip cannot be styled.

That being said, you can use some library that would show styles floating layers when element is being hovered (instead of the native tooltips, and suppress them) requiring little or no code modifications...


I thought i'd post my 20 lines JavaScript solution here. It is not perfect, but may be useful for some depending on what you need from your tooltips.

When to use it

  • Automatically styles the tooltip for all HTML elements with a TITLE attribute defined (this includes elements dynamically added to the document in the future)
  • No Javascript/HTML changes or hacks required for every tooltip (just the TITLE attribute, semantically clear)
  • Very light (adds about 300 bytes gzipped and minified)
  • You want only a very basic styleable tooltip

When NOT to use

  • Requires jQuery, so do not use if you don't use jQuery
  • Bad support for nested elements that both have tooltips
  • You need more than one tooltip on the screen at the same time
  • You need the tooltip to disappear after some time

The code

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

Paste it anywhere, it should work even when you run this code before the DOM is ready (it just won't show your tooltips until DOM is ready).

Customize

You can change the var declarations on the second line to customize it a bit.

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

Style

You can now style your tooltips using the following CSS:

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

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

This also works with any attribute you want to add for instance:

HTML

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

CSS

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

See it work at: http://jsfiddle.net/vpYWE/1/


A jsfiddle for custom tooltip pattern is Here

It is based on CSS Positioning and pseduo class selectors

Check MDN docs for cross-browser support of pseudo classes

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

Here is an example of how to do it:

_x000D_
_x000D_
a.tip {_x000D_
    border-bottom: 1px dashed;_x000D_
    text-decoration: none_x000D_
}_x000D_
a.tip:hover {_x000D_
    cursor: help;_x000D_
    position: relative_x000D_
}_x000D_
a.tip span {_x000D_
    display: none_x000D_
}_x000D_
a.tip:hover span {_x000D_
    border: #c0c0c0 1px dotted;_x000D_
    padding: 5px 20px 5px 5px;_x000D_
    display: block;_x000D_
    z-index: 100;_x000D_
    background: url(../images/status-info.png) #f0f0f0 no-repeat 100% 5%;_x000D_
    left: 0px;_x000D_
    margin: 10px;_x000D_
    width: 250px;_x000D_
    position: absolute;_x000D_
    top: 10px;_x000D_
    text-decoration: none_x000D_
}
_x000D_
<a href="#" class="tip">Link<span>This is the CSS tooltip showing up when you mouse over the link</span></a>
_x000D_
_x000D_
_x000D_