MooTools Link Fading

By  on  

We all know that we can set a different link color (among other properties) on the hover event, but why not show a little bit more dynamism by making the original color fade to the next? Using MooTools 1.2, you can achieve that effect.

The MooTools JavaScript

window.addEvent('domready',function() {
	$each($$('.fade'), function(el) {
		var original = el.getStyle('color');
		var morph = new Fx.Morph(el,{ 'duration':'300', link:'cancel' });
		el.addEvents({
			'mouseenter' : function() { morph.start({ 'color':'#ff8c00' }) },
			'mouseleave' : function() { morph.start({ 'color': original }) }
		});
	});
});

For every link with the fade class, a transition occurs on the mouseenter and mouseleave events. You'll place the "to" color in the spot designated in comments in the code above.

What are your thoughts on this? Too much? Just right? Let me know!

Recent Features

  • By
    Serving Fonts from CDN

    For maximum performance, we all know we must put our assets on CDN (another domain).  Along with those assets are custom web fonts.  Unfortunately custom web fonts via CDN (or any cross-domain font request) don't work in Firefox or Internet Explorer (correctly so, by spec) though...

  • By
    JavaScript Promise API

    While synchronous code is easier to follow and debug, async is generally better for performance and flexibility. Why "hold up the show" when you can trigger numerous requests at once and then handle them when each is ready?  Promises are becoming a big part of the JavaScript world...

Incredible Demos

  • By
    Creating Spacers with Flexbox

    I was one of the biggest fans of flexbox before it hit but, due to being shuffled around at Mozilla, I never had the chance to use it in any practice project; thus, flexbox still seems like a bit of a mystery to me.  This greatly...

  • By
    Using Opacity to Show Focus with MooTools

    I'm a huge fan of using subtle effects like link nudging (jQuery, MooTools) to enhance the user experience and increase the perceived dynamism of my websites. Trust me -- a lot of little things are what take websites to the next level.

Discussion

  1. Kinda cool, and could work in the right application. It’s always worth remembering what the users expects from a link though.

    Unfortunately events don’t finish if a new one is fired right now, so the links can become locked to their active colour until the mouse enters again.

  2. thats why i’m using mootools, thanks for the great idea, i’m looking to integrate it in my blog… ^^

  3. thomasd

    I agree with Paul, there’s a problem with effects starting and ending.
    Here is my solution, 100% mootools-sugar!

    $$('.fade').set('morph', {'duration': '300'}).addEvents({
        'mouseenter': function(){
            if(!this.retrieve('original')){ this.store('original', this.getStyle('color'));}
            this.morph({'color': '#ff8c00'});
        },
        'mouseleave': function(){
            this.morph({'color': this.retrieve('original')});
        }
    });
    
  4. @thomasd: I’ll try that sometime today! Thanks for contributing!

  5. norpius

    the problem can be resolved simply like this:

    var morph = new Fx.Morph(el,{ 'duration':'300', link: 'cancel' });
  6. @norpius: Yep, just got that a few minutes ago.

  7. Hmm.. I thought Fx.Tween is enough for this..

  8. Alex

    Man, you’re F A N T A S T I C !

  9. Why not use addClass()?

  10. How I can implement this on wordpress sidebar links…

    I’m got trouble adding class and id to the specified links.. tq..

  11. I like this, useful and small. I think change my blog’s links. Thank you for sharing…

  12. speed

    Hey one more cool script :)

    Thanks man!

    One quick question: How can I replace the “Color” with “Background Image” ?
    I tired but it ain’t working :(

    Any help would be appreciated!

  13. stefan

    yeah, I’m also looking at a way to do a background fade? any idea where to find this?
    cheers
    s

  14. cyrille

    Hi,

    Speed, Stefan, did you find the way to morph a photo by an other one ?
    I accept with pleasure your solutons if you got some !

    cheers

  15. h-a-r-v

    Hey,

    What should I do to make it get the target color value from a specified css class instead of hard-coding it in the script as above?

    I had a special class written to do it in 1.11, but it doesn’t work under 1.2.1. I’ve already received some feedback and I guess I can fix it, but that person suggested me using fx.morph, but looking at the given example I can’t really figure out how.

    Thanks in advance,
    Kind regards,
    h-a-r-v

  16. Hello,

    I’m trying to write a link fading plugin for Joomla but i cant get it to work because Joomla uses Mootools 1.11
    It seems mootools 1.11 doesnt know $each and Fx.morph
    Do you have any advice how to get this to work with mootools 1.11?

    Thank you!

  17. johan

    Looks very sweet & simple and will deff. try this out. :)
    But …
    I would like only the underlines to fade, not the letters is this possible?
    If so, how?

  18. I think this should work:

    Set in the CSS: text-decoration: none; for .fade and text-decoration: none; border-bottom: #000 1px solid; for .fade:hover

    Then replace in the script color with border-bottom and replace #ff8c00 with #ff8c00 1px solid

    Adjust the color-codes and you’re done ;)

  19. Birke

    Isn´t it possible to use the link fading with the email protection script? Both together doesn´t work. :(

  20. Hey, here’s code for MooTools 1.11 for menu in Joomla. Just assign ID in menu module configuration.
    I got help from http://demos111.mootools.net/Fx.Styles

    window.addEvent('domready', function() {
    
    var list = $$('#mainmenu li a');
    var original;
    list.each(function(element)
    {
        if ( element.parentNode != $('current')) {
            var fx = new Fx.Styles(element, {duration: 1000, wait: false, transition: Fx.Transitions.Sine.easeIn});
            original = element.getStyle('color');
    
            element.addEvent('mouseenter', function(){
                fx.start({
                    //'opacity' : 1,
                    'color': '#333333'
                });
            });
    
            element.addEvent('mouseleave', function(){
                fx.start({
                    //'opacity' : 0.8, 
                    'color': original
                });
            });
        };
    });
    });
    
  21. man you are awesome… really helpd me!!!

  22. paps

    hi david
    great code and thanks a lot for all you make !!

    i use your script in a website with “opacity” and it work !

    window.addEvent('domready',function() {
    	$each($$('.fade'), function(el) {
    		var original = el.getStyle('opacity');
    		var morph = new Fx.Morph(el,{ 'duration':'100', link:'cancel'});
    		el.addEvents({
    			'mouseenter' : function() { morph.start({ 'opacity':0.5}) },
    			'mouseleave' : function() { morph.start({ 'opacity':original}) }
    		});
    	});
    });
    

    but I would like my div with "opacity:0.5" when the page open, and when you click on the div, it stay on "opacity:original" (the link is on the same page with a function show/hide)
    Is that possible ?

    thanks for your answers, and excuse me for my poor english (I’m french :-))

    paps

  23. moprhwarp

    Hi, thanks the script, simple and easy to use, but I definitely miss one small one function for the active class, i could figure it out it should look like a kind like that:

    ‘mouseenter’ : function() { morph.start({ ‘color’:’#2727f9′ }) },
    ‘mouseleave’ : function() { morph.start({ ‘color’: original }) },
    ‘click’ : function() { morph.start({ ‘color’:’#FF0000′ }) }

    but on mouseleave the ‘click’ color should stay, anyone knows how?

    best regards

    • morphwarp

      the best way was only one clicked event is stored and overrides other actives with original color again

  24. Johan

    Your comment formatting screws up the “” thingys around the selectors!

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!