O'Reilly

Create an Animated Sliding Button Using MooTools

By on  
MooTools Sliding Button

Buttons (or links) are usually the elements on our sites that we want to draw a lot of attention to. Unfortunately many times they end up looking the most boring. You don't have to let that happen though! I recently found a Tympanus post which provided a great method for making button have an unexpected pop. Here's a quick tutorial on how to duplicate that look using MooTools.

The HTML





The system works off of one DIV, two As and SPAN elements. Note the IDs and CSS classes for the CSS.

The CSS

.button_wrap{ position:relative; width:225px; height:36px; overflow:hidden; font-weight:bold; font-size:11px; margin:10px; }
.button_aLeft{ width:70px; height:36px; -moz-border-radius:20px; -webkit-border-radius:20px; background-color:#093d6f; color:#fff; top:0px; right:0px; position:absolute; line-height:36px; text-align:left; }
.button_aLeft span{ /* display:none; */ visibility:hidden; padding-left:20px; color:#fff; }
.button_aRight{ width:70px; height:36px; -moz-border-radius:20px; -webkit-border-radius:20px; background-color:#093d6f; color:#fff; top:0px; left:0px; position:absolute; line-height:36px; text-align:right; }
.button_aRight span{ /* display:none; */ visibility:hidden; padding-right:20px; color:#fff; }

.button_bLeft{ width:64px; height:30px; background-color:#fff; -moz-border-radius:20px; -webkit-border-radius:20px; color:#000; position:absolute; top:3px; right:3px; text-transform:uppercase; line-height:30px; text-align:center; cursor:pointer; }
.button_bLeft span{ color:#008ddd; }
.button_bRight{ width:64px; height:30px; background-color:#fff; -moz-border-radius:20px; -webkit-border-radius:20px; color:#000; position:absolute; top:3px; left:3px; text-transform:uppercase; line-height:30px; text-align:center; cursor:pointer; }
.button_bRight span{ color:#008ddd; }

.button_c{ background-color:#008ddd; color:#fff; text-transform:uppercase; }
.button_c span{ color:#093d6f; }

The CSS code above mirrors the original code with the exception that "display:none;" was changed to "visibility:hidden", per the differences in MooTools and jQuery fading methodology. Feel free to modify the basic color/formatting styles in any way you'd like.

The MooTools JavaScript

window.addEvent('domready',function() {
	$$('.slidebttn').each(function(btn) {
		var prev = btn.getPrevious('a').set('tween',{ duration: 200 });
		var span = prev.getElement('span');
		btn.addEvents({
			mouseenter: function(e) { 
				btn.addClass('button_c');
				prev.tween('width',225);
				span.fade('in');
			},
			mouseleave:function(e) {
				btn.removeClass('button_c');
				prev.tween('width',70);
				span.fade('out');
			}
		});
	});
});

The first step is grabbing all button containers and identifying the SPAN and A elements within them. Then we add mouseenter and mouseleave events to the container which do the animation of the primary A/SPAN elements.

Great work by Tympanus. The effect is classy and well executed. Now go and use this on your next project!

O'Reilly Velocity Conference
Save 20% with discount code AFF20

Recent Features

  • 9 Mind-Blowing WebGL Demos

    As much as developers now loathe Flash, we're still playing a bit of catch up to natively duplicate the animation capabilities that Adobe's old technology provided us.  Of course we have canvas, an awesome technology, one which I highlighted 9 mind-blowing demos.  Another technology available...

  • Chris Coyier’s Favorite CodePen Demos

    David asked me if I'd be up for a guest post picking out some of my favorite Pens from CodePen. A daunting task! There are so many! I managed to pick a few though that have blown me away over the past few months. If you...

Incredible Demos

Discussion

  1. Very good, Mr Walsh.

  2. I like this, but I think it comes with a very slight usability issue – when I hovered over and the “Use Twitter account” text popped out, I tried a couple of times to move over and click it like it was offering an alternative sign-in method. Could be a teeny bit frustrating for an impatient user thinking they’re just slipping off the button when it shoots back in.

  3. adlib

    this one doesn’t work very well with opera…

  4. derdummkopf

    sorry for this stupid question, i’am a newbe
    but how looks the function if i have only one button
    $$('.slidebttn').each(function(btn) {...

    i think each is then not necessary or?

  5. I like. However, IE not allowing border-radius kinda kills the effect. Looks much better in firefox or chrome.

  6. @derdummkopf: How would you accomplish this without each? The only way I can see of doing so would repeat walks through the DOM to get the previous items.

    @John: It may be something where you don’t show IE users this effect.

  7. Nice little dilly hoper here David.

    @derdummkopf
    you could just take the function from within .each() and name it. then pass it a single mootooled element $("one_element_ID").

    function makeSlideBTN(btn) {
    	var prev = btn.getPrevious('a').set('tween',{ duration: 200 });
    	var span = prev.getElement('span');
    	btn.addEvents({
    		mouseenter: function(e) { 
    			btn.addClass('button_c');
    			prev.tween('width',225);
    			span.fade('in');
    		},
    		mouseleave:function(e) {
    			btn.removeClass('button_c');
    			prev.tween('width',70);
    			span.fade('out');
    		}
    	});
    }
    
    window.addEvent("domready",function(){
         //make an element slide
         makeSlide($("whattever-ID"))
    })
    
    

    Remember to keep the classname or it’ll not have any style

  8. That is a really neat user interface object, I am sure clients will understand what you want from them when buttons start opening and closing for them.

  9. Insane :) Hehe.. have to love it..

    Great for exercise … Soon to be implemented on my secret project :D

  10. Hi,

    Nice work,

    Can u please say what the below line will do in above code.

    var prev = btn.getPrevious(‘a’).set(‘tween’,{ duration: 200 });

    Specially getPrevious function

  11. ethan

    how can i make it work with master/content pages?

  12. Verry nice and simple! With a little customization it fits perfect on my site! Thanx.

  13. Joe

    How do I add a link to these? I tried but keep failing :(

  14. Joe

    How do I add a link to this button?

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

Recently on David Walsh Blog

  • Prevent Chrome from Translating a Page

    A while back I shared my favorite Google Chrome extension:  Google Art Project.  I've enjoyed seeing beautiful art when I open a new tab -- it's brought genuine happiness to my day, however small that happiness may be.  About a week ago, however, the art presented had...

  • Create Any Type Of Website With These Multi-Purpose Themes

    We have selected what we believe are the very best multipurpose WordPress themes on the market today. Our list contains a number of best sellers, several newcomers that are proving to be highly popular, and a few themes that are ideal for creating the types of...

  • An Introduction to Static Site Generators

    Static site generators seem to have been becoming more and more popular recently, but they’re not one of those ephemeral novelty things that grow in popularity as quickly as they fall into oblivion shortly after. For over a decade, many different projects — 394 of...

  • Automated Tests for Visual Responsive Layouts

    Today it's all about testing. In 2015, many developers knows about TDD and I personally think that testing is one of the key for quality products. But what about testing in a Front-end environment? How do you guys write your tests for a responsive page or...

  • Getting Dicey With Flexbox

    What if you could build complex CSS layouts in minutes? Flexbox is a new CSS layout spec that makes it easy to construct dynamic layouts. With flexbox, vertical centering, same-height columns, reordering, and direction agnosticism are a piece of cake. There's a popular myth floating around that...