A Way To Get a Fancy Link Hover Effect
Jarrod, of (the great blog) HeyDingus.net, wanted to do something about the way his links appear on his website. He asked:
Since the first design of my site, I’ve stuck with blue text for my hyperlinks because that always seemed canonical with the web. Links = blue text, blue underline. But I’ve grown less certain with its readability with all that blue text interspersed. I’m considering a change. What do y’all think?
One thing he didn’t mention there, is that he also has a nice hover effect, that changes the underline to a gradient (that matches his logo and more) on hover.
My first idea for how to solve it sacrificed the gradient — but that just wouldn’t do. But I think I found a pretty good solution in the end!
The solution and how to implement it
Here’s the logic behind it:
- We set the gradient as the background image always.
- But then we use
-webkit-background-clip: text;
to make it so that the shape of the background is exactly like the text. - However, as we don’t want the gradient to be visible at all times, we add
-webkit-text-fill-color: var(-—offWhite);
. This fills normal text colour above our gradient — so now the entire background-image covered and appears invisible. - But then, on :hover, we change the text-fill to
-webkit-text-fill-color: transparent;
, as that will make it so the gradient shines through! - …and we do something similar with the underline — from colour to transparent.
So then we get the following CSS:
a {
background-image: linear-gradient(
to right,
var(--green),
var(--yellow),
var(--orange),
var(--red),
var(--purple),
var(--blue)
);
text-decoration: underline;
text-decoration-thickness: 1.5px;
text-decoration-color: var(--blue);
transition: all ease-in-out 0.3s;
}
a:hover {
-webkit-text-fill-color: transparent;
text-decoration-color: transparent;
}
Alternative to text-decoration: underline;
An alternative way to create underlines, is by using box-shadow: inset. 1 Then you can make it shrink down to nothing on hover:
And here’s the CSS:
a {
background-image: linear-gradient(
to right,
var(--green),
var(--yellow),
var(--orange),
var(--red),
var(--purple),
var(--blue)
);
text-decoration: none;
box-shadow: inset 0 -1.5px 0 var(--blue);
transition: all ease-in-out 0.3s;
}
a:hover {
-webkit-text-fill-color: transparent;
box-shadow: inset 0 0 0 var(--blue);
}
Without moving it down, it clips the emoji a bit — so that’s a negative here. Also, the shrinking effect would be cooler if the line were thicker (but I think 1.5px looks nice here!). By the way, I’m using box-shadow on my links here, but on :hover I make the inset shadow cover the entire link and change colour, Instead of disappearing.
-
And you could move them further down by making some pseudo-elements, but I won’t go Into that here. ↩︎