Growing link underline, in Tailwind CSS

Katie - Jun 16 '21 - - Dev Community

Today I learned that Learn 11ty From Scratch opened up for free. Searching for the news, I found Ben Myers’ article “I Finally Understand Eleventy’s Data Cascade,” which reminded me how much I like some of his styling, including links whose underlines are chunky and grow to be full backgrounds when you hover or focus on them.

I’ve been doing a lot of Tailwind lately on landing-page-type sites so I can rip off other peoples’ components, but I hadn’t found a link style I was satisfied with, so I ported Ben’s work to Tailwind. See it on Tailwind Play or keep reading to just see the source code here.

You need to use a gradient from a color to itself so that your background is a “background image,” not a “background color.”

<p>I am some text, and <a class="bg-gradient-to-r from-yellow-200 to-yellow-200 bg-growing-underline" href="https://example.com">I am a link</a>, and that's that.</p>
Enter fullscreen mode Exit fullscreen mode

The rest of the party tricks, you can wrap up by making yourself a new Tailwind class in your tailwind.css file (or whatever you call it):

@tailwind base;
@tailwind components;
@tailwind utilities;

@layer utilities {
  .bg-size-2em {
    background-size: 100% 0.2em;
  }
  .bg-hundred {
    background-size: 100% 100%;
  }
  .bg-near-bottom {
    background-position: 0 88%;
  }
  .bg-growing-underline {
    @apply bg-no-repeat bg-near-bottom bg-size-2em transition-all duration-200 hover:bg-hundred focus:bg-hundred;
  }
}
Enter fullscreen mode Exit fullscreen mode

Alternatively, if you feel cleaner not exposing intermediate concepts like bg-size-2em, bg-hundred, and bg-near-bottom to yourself for reuse elsewhere in your HTML (see on Tailwind Play):

@tailwind base;
@tailwind components;
@tailwind utilities;

@layer utilities {
  .bg-growing-underline {
    background-size: 100% 0.2em;
    background-position: 0 88%;
    @apply bg-no-repeat transition-all duration-200;
  }
  .bg-growing-underline:hover {
    background-size: 100% 100%;
  }
  .bg-growing-underline:focus {
    background-size: 100% 100%;
  }
}
Enter fullscreen mode Exit fullscreen mode

Note that you can’t use bg-cover for the hover/focus, even though it looks the same as background-size: 100% 100%, because the smooth background size transition only works with an explicit size.


Update: Ben says he grabbed the code from Morgan Wesemann.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .