Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't this a:visited css style work?

Is there any reason why this does not work on Internet Explorer or Chrome:

<html>
    <head>
        <style>
            A {font-weight: bold; color:black;}
            A:visited {font-weight: normal; color: black; }
            .Empty {font-weight: bold; color: black; }
        </style>
    </head>

    <body>
        <a href="http://mysite">click me</a>
    </body>
</html>

The link I click never goes to normal and just stays bold. On some other browsers it works.

Changing case did not affect it. Changing a to a:link did not affect it. Changing color works, just not font-weight.

One workaround was to change accessibility to ignore web colors. I do not have access to the source, so I had to do it this way.

like image 236
johnny Avatar asked Nov 30 '11 19:11

johnny


3 Answers

Actually, this has nothing to do with case sensitivity. This is a security feature. The functionality of :visited pseudoclass has been restricted in many modern browsers (Fx4, IE9, Chrome) to prevent CSS exploit: read about it here.

Nowadays, getComputedStyle() in these browsers usually returns values for visited links as if they weren't visited. However, I can simply imagine circumventing of that: using font-weight for visited links, the element's width changes so browsers that would allow changing font-weight for :visited links wouldn't actually fix the security hole.

You can see there are some specific things browsers do to protect against this:

  • The window.getComputedStyle method, and similar functions such as element.querySelector, will always return values indicating that a user has never visited any of the links on a page.
  • If you use a sibling selector such as :visited + span, the adjacent element (span in this example) will be styled as if the link were unvisited.
  • In rare scenarios, if you're using nested link elements and the element being matched is different from the link whose presence in history is being tested, the element will be rendered as if the link were unvisited, as well.

Thus, there's no workaround for this issue.

like image 101
duri Avatar answered Oct 06 '22 05:10

duri


One useful attribute that does work with :visited is background-color. So try:

:visited {background-color:red;}

:visited also works on non-a elements.

like image 30
music Avatar answered Oct 06 '22 04:10

music


The problem has to do with history sniffing, changing css properties is disabled for visited links due to privacy issues.

I came up with the following workaround to reach the desired effect. It is possible to change the background-color of the visited link.

The solution is very simple:

  1. set a background-image on the link with the same height as your link and 1px width and repeat the image horizontally
  2. the image has the same color as the background of the link
  3. make one pixel of that image transparent, in the vertical middle
  4. on :visited state just change the backgroundcolor of that link to the text-color of the link
  5. Only one line of the background-color wil be visible, because the background-image is masking it

Here's an example:

a:link {
    color:#000;
    background:#FFF url('../img/linethrough.png') repeat-x top left;
}

a:visited {
    background-color:#000;
    color:#000;
}
like image 26
Ernie Avatar answered Oct 06 '22 06:10

Ernie