Skip to content

hover link effect

Solved Customisation
18 3 6.6k 1
  • wrote on last edited by DownPW
    #1

    Hello @phenomlab

    I see this effect on link here.

    64ce4a20-4dbf-468f-9180-38e657810970-image.png

    I research how to do this or other effect and i found this code for example on css tricks

    a {
      position: relative;
    }
    
    a::before {
        content: '';
        position: absolute;
        width: 100%;
        height: 2px;
        border-radius: 2px;
        background-color: red;
        bottom: 0;
        left: 0;
        transform-origin: right;
        transform: scaleX(0);
        transition: transform .3s ease-in-out;
      }
    
    a:hover::before {
        color: red;
      transform-origin: left;
      transform: scaleX(1);
    }
    
    a:focus, a:hover {
        color: red;
    }
    

    The effect is good but he is active on reply button, quote, reply to, username and I don’t want that… Just on post (url, @mention)

    And you, what is your code ?

  • Hello @phenomlab

    I see this effect on link here.

    64ce4a20-4dbf-468f-9180-38e657810970-image.png

    I research how to do this or other effect and i found this code for example on css tricks

    a {
      position: relative;
    }
    
    a::before {
        content: '';
        position: absolute;
        width: 100%;
        height: 2px;
        border-radius: 2px;
        background-color: red;
        bottom: 0;
        left: 0;
        transform-origin: right;
        transform: scaleX(0);
        transition: transform .3s ease-in-out;
      }
    
    a:hover::before {
        color: red;
      transform-origin: left;
      transform: scaleX(1);
    }
    
    a:focus, a:hover {
        color: red;
    }
    

    The effect is good but he is active on reply button, quote, reply to, username and I don’t want that… Just on post (url, @mention)

    And you, what is your code ?

    wrote on last edited by
    #2

    @DownPW

    reply to me, maybe .posts .content a:focus

    I will test 😉

  • @DownPW

    reply to me, maybe .posts .content a:focus

    I will test 😉

    wrote on last edited by
    #3

    @DownPW I also had some issues with this effect showing on unwanted elements, and off the top of my head I can’t recall the CSS I used, but will check.

  • @DownPW I also had some issues with this effect showing on unwanted elements, and off the top of my head I can’t recall the CSS I used, but will check.

    wrote on last edited by
    #4

    @phenomlab

    .posts .content seems to be pretty good for me 😉

  • @phenomlab

    .posts .content seems to be pretty good for me 😉

    wrote on last edited by
    #5

    @DownPW said in hover link effect:

    @phenomlab

    .posts .content seems to be pretty good for me 😉

    it not worked on my web site.

  • Hello @phenomlab

    I see this effect on link here.

    64ce4a20-4dbf-468f-9180-38e657810970-image.png

    I research how to do this or other effect and i found this code for example on css tricks

    a {
      position: relative;
    }
    
    a::before {
        content: '';
        position: absolute;
        width: 100%;
        height: 2px;
        border-radius: 2px;
        background-color: red;
        bottom: 0;
        left: 0;
        transform-origin: right;
        transform: scaleX(0);
        transition: transform .3s ease-in-out;
      }
    
    a:hover::before {
        color: red;
      transform-origin: left;
      transform: scaleX(1);
    }
    
    a:focus, a:hover {
        color: red;
    }
    

    The effect is good but he is active on reply button, quote, reply to, username and I don’t want that… Just on post (url, @mention)

    And you, what is your code ?

    wrote on last edited by
    #6

    @DownPW My CSS is as below

    .content p a:not(.noanimate):after {    
      background: none repeat scroll 0 0 transparent;
      bottom: 0;
      content: "";
      display: block;
      height: 1px;
      left: 0%;
      position: absolute;
      background: var(--link);
      transition: width 0.3s ease 0s, left 0.3s ease 0s;
      width: 0;
    }
    .content p a:hover:after { 
      width: 100%; 
      left: 0; 
    }
    
  • @DownPW My CSS is as below

    .content p a:not(.noanimate):after {    
      background: none repeat scroll 0 0 transparent;
      bottom: 0;
      content: "";
      display: block;
      height: 1px;
      left: 0%;
      position: absolute;
      background: var(--link);
      transition: width 0.3s ease 0s, left 0.3s ease 0s;
      width: 0;
    }
    .content p a:hover:after { 
      width: 100%; 
      left: 0; 
    }
    
    wrote on last edited by DownPW
    #7

    @phenomlab

    And here is mine with mirror effect on the text (for default theme) 😉

    .posts .content a {
      background-image: linear-gradient(to right, #54b3d6, #54b3d6 50%, #337ab7 50%);
      background-size: 200% 100%;
      background-position: -100%;
      display: inline-block;
      padding: 5px 0;
      position: relative;
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
      transition: all 0.3s ease-in-out;
    }
    
    .posts .content a:before {
      content: '';
      background: #54b3d6;
      display: block;
      position: absolute;
      bottom: 1px;
      left: 0;
      width: 0;
      height: 1px;
      transition: all 0.3s ease-in-out;
    } 
    
    .posts .content a:hover {
     background-position: 0;
    }
    
    .posts .content a:hover::before{
      width: 100%;
    }
    
  • DownPW DownPW has marked this topic as solved on
  • @phenomlab

    And here is mine with mirror effect on the text (for default theme) 😉

    .posts .content a {
      background-image: linear-gradient(to right, #54b3d6, #54b3d6 50%, #337ab7 50%);
      background-size: 200% 100%;
      background-position: -100%;
      display: inline-block;
      padding: 5px 0;
      position: relative;
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
      transition: all 0.3s ease-in-out;
    }
    
    .posts .content a:before {
      content: '';
      background: #54b3d6;
      display: block;
      position: absolute;
      bottom: 1px;
      left: 0;
      width: 0;
      height: 1px;
      transition: all 0.3s ease-in-out;
    } 
    
    .posts .content a:hover {
     background-position: 0;
    }
    
    .posts .content a:hover::before{
      width: 100%;
    }
    
    wrote on last edited by
    #8

    With my code the only problem is I have the same effect on images (on mouse hover) that contain a url.

    Do you have a solution to fix this @phenomlab ?

  • wrote on last edited by
    #9

    @DownPW I had exactly the same issue. Before I provide my solution, from recollection, you are using Fancybox ?

  • @DownPW I had exactly the same issue. Before I provide my solution, from recollection, you are using Fancybox ?

    wrote on last edited by
    #10
  • wrote on last edited by
    #11

    @DownPW in that case, you’ll need to add the below jQuery function just after the one you should already have

        $(window).on('action:posts.loaded', function(data) {
            console.log("Polling DOM for lazyLoaded images to apply Fancybox");
            $(document).ready(function() {
                $('a').not('.forum-logo').not(".avatar").not(".emoji").not(".bmac-noanimate").each(function() {
                    $('a[href*=".jpg"], a[href*=".jpeg"], a[href*=".png"], a[href*=".gif"], a[href*=".webp"]').addClass("noanimate");
                });
            });
        });
    

    What we are doing here is polling the DOM looking for any new images as posts are being loaded (hence the hook action:posts.loaded, and then it we get a match, we add new class .noanimate. You’ll need to modify your existing class block you are using for the hover effect so that it is not being executed against any HTML that contains this class - see below for an example (in your use case)

    .posts .content a:not(.noanimate) {
      background-image: linear-gradient(to right, #54b3d6, #54b3d6 50%, #337ab7 50%);
      background-size: 200% 100%;
      background-position: -100%;
      display: inline-block;
      padding: 5px 0;
      position: relative;
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
      transition: all 0.3s ease-in-out;
    }
    
  • @DownPW in that case, you’ll need to add the below jQuery function just after the one you should already have

        $(window).on('action:posts.loaded', function(data) {
            console.log("Polling DOM for lazyLoaded images to apply Fancybox");
            $(document).ready(function() {
                $('a').not('.forum-logo').not(".avatar").not(".emoji").not(".bmac-noanimate").each(function() {
                    $('a[href*=".jpg"], a[href*=".jpeg"], a[href*=".png"], a[href*=".gif"], a[href*=".webp"]').addClass("noanimate");
                });
            });
        });
    

    What we are doing here is polling the DOM looking for any new images as posts are being loaded (hence the hook action:posts.loaded, and then it we get a match, we add new class .noanimate. You’ll need to modify your existing class block you are using for the hover effect so that it is not being executed against any HTML that contains this class - see below for an example (in your use case)

    .posts .content a:not(.noanimate) {
      background-image: linear-gradient(to right, #54b3d6, #54b3d6 50%, #337ab7 50%);
      background-size: 200% 100%;
      background-position: -100%;
      display: inline-block;
      padding: 5px 0;
      position: relative;
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
      transition: all 0.3s ease-in-out;
    }
    
    wrote on last edited by
    #12

    @phenomlab

    Thanks dude I will test that

  • @DownPW in that case, you’ll need to add the below jQuery function just after the one you should already have

        $(window).on('action:posts.loaded', function(data) {
            console.log("Polling DOM for lazyLoaded images to apply Fancybox");
            $(document).ready(function() {
                $('a').not('.forum-logo').not(".avatar").not(".emoji").not(".bmac-noanimate").each(function() {
                    $('a[href*=".jpg"], a[href*=".jpeg"], a[href*=".png"], a[href*=".gif"], a[href*=".webp"]').addClass("noanimate");
                });
            });
        });
    

    What we are doing here is polling the DOM looking for any new images as posts are being loaded (hence the hook action:posts.loaded, and then it we get a match, we add new class .noanimate. You’ll need to modify your existing class block you are using for the hover effect so that it is not being executed against any HTML that contains this class - see below for an example (in your use case)

    .posts .content a:not(.noanimate) {
      background-image: linear-gradient(to right, #54b3d6, #54b3d6 50%, #337ab7 50%);
      background-size: 200% 100%;
      background-position: -100%;
      display: inline-block;
      padding: 5px 0;
      position: relative;
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
      transition: all 0.3s ease-in-out;
    }
    
    wrote on last edited by
    #13

    @phenomlab said in hover link effect:

    .posts .content a:not(.noanimate) {
    background-image: linear-gradient(to right, #54b3d6, #54b3d6 50%, #337ab7 50%);
    background-size: 200% 100%;
    background-position: -100%;
    display: inline-block;
    padding: 5px 0;
    position: relative;
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    transition: all 0.3s ease-in-out;
    }

    it’s worked, thank you.

  • @phenomlab said in hover link effect:

    .posts .content a:not(.noanimate) {
    background-image: linear-gradient(to right, #54b3d6, #54b3d6 50%, #337ab7 50%);
    background-size: 200% 100%;
    background-position: -100%;
    display: inline-block;
    padding: 5px 0;
    position: relative;
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    transition: all 0.3s ease-in-out;
    }

    it’s worked, thank you.

    wrote on last edited by DownPW
    #14

    Hello ✋

    I play with URL/Link CSS Trick for topic on nodebb V3

    Here are 3 effects I love that I share with you I love the first one and I think it’s the one I’d keep in production.

    – Style 1 :

    test.gif

    .posts .content a {
        box-shadow: inset 0 0 0 0 var(--bs-link-color);
        color: var(--bs-link-color);
        padding: 0 .25rem;
        margin: 0 -.25rem;
        transition: color .3s ease-in-out, box-shadow .3s ease-in-out;
        border-radius: 0.5rem;
    }
    
    .posts .content a:hover {
        color: #fff;
        box-shadow: inset 200px 0 0 0 var(--bs-link-color);
        border-radius: 0.5rem;
    }
    
    .posts .content a:hover::before{
        width: 100%;
    } 
    

    – Style 2 :

    test2.gif

     .posts .content a {
        color: var(--bs-link-color);
        background-image: linear-gradient(to right, var(--bs-link-color), var(--bs-link-color) 50%, var(--bs-link-hover-color) 50%);
        background-size: 200% 100%;
        background-position: -100%;
        display: inline-block;
        padding: 5px 0;
        position: relative;
        -webkit-background-clip: text;
        -webkit-text-fill-color: transparent;
        transition: all 0.3s ease-in-out;
    }
    
    .posts .content a:hover {
     background-position: 0;
    }
    
    .posts .content a:hover::before{
        width: 100%;
    }
    

    – Style 3 :

    test3.gif

    .posts .content a {
        color: var(--bs-link-color);
        text-decoration: none;
        background: linear-gradient(to right, var(--bs-link-color), var(--bs-link-color)), linear-gradient(to right, var(--bs-link-hover-color), var(--bs-link-hover-color), var(--bs-link-hover-color));
        background-size: 100% 3px, 0 3px;
        background-position: 100% 100%, 0 100%;
        background-repeat: no-repeat;
        transition: background-size 400ms;
        padding-bottom: 3px;
    }
    
    .posts .content a:hover {
     background-size: 0 3px, 100% 3px;
    }
    
    .posts .content a:hover::before{
        width: 100%;
    }
    

    –> It’s up to you to play with colors, adapt the code to your environment etc.

    Have fun 😉

  • Hello ✋

    I play with URL/Link CSS Trick for topic on nodebb V3

    Here are 3 effects I love that I share with you I love the first one and I think it’s the one I’d keep in production.

    – Style 1 :

    test.gif

    .posts .content a {
        box-shadow: inset 0 0 0 0 var(--bs-link-color);
        color: var(--bs-link-color);
        padding: 0 .25rem;
        margin: 0 -.25rem;
        transition: color .3s ease-in-out, box-shadow .3s ease-in-out;
        border-radius: 0.5rem;
    }
    
    .posts .content a:hover {
        color: #fff;
        box-shadow: inset 200px 0 0 0 var(--bs-link-color);
        border-radius: 0.5rem;
    }
    
    .posts .content a:hover::before{
        width: 100%;
    } 
    

    – Style 2 :

    test2.gif

     .posts .content a {
        color: var(--bs-link-color);
        background-image: linear-gradient(to right, var(--bs-link-color), var(--bs-link-color) 50%, var(--bs-link-hover-color) 50%);
        background-size: 200% 100%;
        background-position: -100%;
        display: inline-block;
        padding: 5px 0;
        position: relative;
        -webkit-background-clip: text;
        -webkit-text-fill-color: transparent;
        transition: all 0.3s ease-in-out;
    }
    
    .posts .content a:hover {
     background-position: 0;
    }
    
    .posts .content a:hover::before{
        width: 100%;
    }
    

    – Style 3 :

    test3.gif

    .posts .content a {
        color: var(--bs-link-color);
        text-decoration: none;
        background: linear-gradient(to right, var(--bs-link-color), var(--bs-link-color)), linear-gradient(to right, var(--bs-link-hover-color), var(--bs-link-hover-color), var(--bs-link-hover-color));
        background-size: 100% 3px, 0 3px;
        background-position: 100% 100%, 0 100%;
        background-repeat: no-repeat;
        transition: background-size 400ms;
        padding-bottom: 3px;
    }
    
    .posts .content a:hover {
     background-size: 0 3px, 100% 3px;
    }
    
    .posts .content a:hover::before{
        width: 100%;
    }
    

    –> It’s up to you to play with colors, adapt the code to your environment etc.

    Have fun 😉

    wrote on last edited by
    #15

    @DownPW these look great! Thanks for sharing.

  • Hello ✋

    I play with URL/Link CSS Trick for topic on nodebb V3

    Here are 3 effects I love that I share with you I love the first one and I think it’s the one I’d keep in production.

    – Style 1 :

    test.gif

    .posts .content a {
        box-shadow: inset 0 0 0 0 var(--bs-link-color);
        color: var(--bs-link-color);
        padding: 0 .25rem;
        margin: 0 -.25rem;
        transition: color .3s ease-in-out, box-shadow .3s ease-in-out;
        border-radius: 0.5rem;
    }
    
    .posts .content a:hover {
        color: #fff;
        box-shadow: inset 200px 0 0 0 var(--bs-link-color);
        border-radius: 0.5rem;
    }
    
    .posts .content a:hover::before{
        width: 100%;
    } 
    

    – Style 2 :

    test2.gif

     .posts .content a {
        color: var(--bs-link-color);
        background-image: linear-gradient(to right, var(--bs-link-color), var(--bs-link-color) 50%, var(--bs-link-hover-color) 50%);
        background-size: 200% 100%;
        background-position: -100%;
        display: inline-block;
        padding: 5px 0;
        position: relative;
        -webkit-background-clip: text;
        -webkit-text-fill-color: transparent;
        transition: all 0.3s ease-in-out;
    }
    
    .posts .content a:hover {
     background-position: 0;
    }
    
    .posts .content a:hover::before{
        width: 100%;
    }
    

    – Style 3 :

    test3.gif

    .posts .content a {
        color: var(--bs-link-color);
        text-decoration: none;
        background: linear-gradient(to right, var(--bs-link-color), var(--bs-link-color)), linear-gradient(to right, var(--bs-link-hover-color), var(--bs-link-hover-color), var(--bs-link-hover-color));
        background-size: 100% 3px, 0 3px;
        background-position: 100% 100%, 0 100%;
        background-repeat: no-repeat;
        transition: background-size 400ms;
        padding-bottom: 3px;
    }
    
    .posts .content a:hover {
     background-size: 0 3px, 100% 3px;
    }
    
    .posts .content a:hover::before{
        width: 100%;
    }
    

    –> It’s up to you to play with colors, adapt the code to your environment etc.

    Have fun 😉

    wrote on last edited by
    #16

    @DownPW good job 🙂

  • wrote on last edited by
    #17

    Hello !!!

    I search to have this hover link effect on nodebb without success.
    If anyone has an idea, I’m a taker.

    go to the download button

    https://www.warp.dev

  • Hello !!!

    I search to have this hover link effect on nodebb without success.
    If anyone has an idea, I’m a taker.

    go to the download button

    https://www.warp.dev

    wrote on last edited by
    #18

    @DownPW Looking at the underlying code, class start is being added on hover by jQuery in this function

    
      document.querySelectorAll(".button-gradient, .button-transparent").forEach((button) => {
        const style = getComputedStyle(button);
    
        const lines = document.createElement("div");
    
        lines.classList.add("lines");
    
        const groupTop = document.createElement("div");
        const groupBottom = document.createElement("div");
    
        const svg = createSVG(
          button.offsetWidth,
          button.offsetHeight,
          parseInt(style.borderRadius, 10)
        );
    
        groupTop.appendChild(svg);
        groupTop.appendChild(svg.cloneNode(true));
        groupTop.appendChild(svg.cloneNode(true));
        groupTop.appendChild(svg.cloneNode(true));
    
        groupBottom.appendChild(svg.cloneNode(true));
        groupBottom.appendChild(svg.cloneNode(true));
        groupBottom.appendChild(svg.cloneNode(true));
        groupBottom.appendChild(svg.cloneNode(true));
    
        lines.appendChild(groupTop);
        lines.appendChild(groupBottom);
    
        button.appendChild(lines);
    
        button.addEventListener("pointerenter", () => {
          button.classList.add("start");
        });
    
        svg.addEventListener("animationend", () => {
          button.classList.remove("start");
        });
      });
    })
    

    The CSS for start is below

    .button-gradient.start .lines svg, .button-transparent.start .lines svg {
      animation: stroke 0.3s linear;
    }
    

    And this is the corresponding keyframe

    @keyframes stroke {
      30%, 55% {
        opacity: 1;
      }
      100% {
        stroke-dashoffset: 5;
        opacity: 0;
      }
    }
    

    It’s using both CSS and SVG, so might not be a simple affair to replicate without the SVG files.


Did this solution help you?
Did you find the suggested solution useful? Support 💗 Sudonix with a coffee ☕
If your organisation needs deeper expertise around infrastructure, security, or technology leadership, learn more about Phenomlab Ltd. Many of the deeper technical guides behind Sudonix are published there.

Related Topics
  • CSS code customization for the link preview plugin

    Solved Customisation css nodebb
    6
    2
    3 Votes
    6 Posts
    3k Views
    phenomlab
    @kadir-ay-0 marking as resolved based on https://community.nodebb.org/topic/17109/manual-build-a-night-mode-for-harmony/5 Please do not raise requests in two places - here and the NodeBB forums. All this does is create unnecessary load for both parties.
  • 5 Votes
    2 Posts
    2k Views
    DownPW
    Nice. Very good tips Mark
  • Link Not Working

    Solved Customisation link
    5
    1 Votes
    5 Posts
    2k Views
    phenomlab
    @cagatay Good question, but one that’s likely best answered by the devs themselves. Could easily be done with a simple jQuery regex but that would really just be painting over rotten wood.
  • Bottom footer navbar button extend

    Solved Customisation css javascript customisation footer navbar
    32
    9 Votes
    32 Posts
    16k Views
    phenomlab
    @DownPW said in Bottom footer navbar button extend: Oh my god, it’s beautiful mark I liked this design so much, I’ve implemented it here. I intend to do a lot more with the footer in due course, so hiding it makes a lot of sense. Thanks @DownPW for the idea and initial concept
  • Blinking text Effect

    Customisation nodebb text effect css
    3
    5 Votes
    3 Posts
    2k Views
    DownPW
    @phenomlab I love it too @phenomlab said in Blinking text Effect: Has that “broken neon light” look that you see in films. It’s exactly that, kind of old neon signs of bar or pubs a bit cyberpunk too
  • [NodeBB] Import custom Font

    Solved Customisation custom fonts nodebb css
    12
    3 Votes
    12 Posts
    5k Views
    phenomlab
    @cagatay you’ll need to define this in the body tag (or another element if you want greater or more granular targets) - for example body { font-family: "Poppins"; font-size: 16px; } Essentially, you use the font-size CSS directive.
  • Avatar on Topic Header

    Solved Customisation css avatar header
    9
    1
    0 Votes
    9 Posts
    3k Views
    JAC
    @jac said in Avatar on Topic Header: @downpw said in Avatar on Topic Header: Great Plugin I make it a bit cleaner via this CSS code: /*------------------------------------------------------------------*/ /*---------------- nodebb-plugin-browsing-users -----------------*/ /*------------------------------------------------------------------*/ /*Space between the avatar and the RSS icon */ .topic [component="topic/browsing-users"] { margin-bottom: -5px; padding-left: 10px; } /*Space between avatars*/ .pull-left { float: left!important; padding-right: 5px; } Do you have a screenshot of how this looks with the CSS change? Just added this change, thanks @DownPW
  • Multiple link on one ico non Navbar

    Solved Customisation links css navbar
    7
    1
    2 Votes
    7 Posts
    3k Views
    DownPW
    yeah you’re right @phenomlab. Problem of NodeBB Version