iPhone Click Effect Using MooTools or jQuery

Written by David Walsh on Tuesday, September 22, 2009


One thing I love about love about Safari on the iPhone is that Safari provides a darkened background effect when you click a link. It’s the most subtle of details but just enforces than an action is taking place. So why not implement that on any page? We can easily do so using MooTools or jQuery.

The CSS

.clicked { padding:1px 2px; -moz-border-radius:5px; background:#aaa; }

Style as you wish!

The MooTools Javascript

window.addEvent('domready',function() {
	var lynx = $$('a');
	lynx.addEvent('click',function(e) {
		lynx.removeClass('clicked'); //remove from others
		this.addClass('clicked');
	});
});

The syntax between the two frameworks is very similar.

The jQuery Javascript

$(document).ready(function() {
	var lynx = $('a');
	lynx.click(function(e) {
		lynx.removeClass('clicked');
		$(this).addClass('clicked');
	});
});

My example shows the gray background but what’s great is that since the snippet uses a CSS class, you can make the background any color you’d like. You could add a spinner next to the link or italicize the link text. Of course when a link is clicked there’s only a moment where you can see the added effect but I think it’s worth it!


Follow via RSS Epic Discussion

Commenter Avatar September 22 / #

You’re right, this effect very subtle, but incredibly effective.

Curious how a linked transparent gif/png would be affected? I’m assuming you would see the ‘clicked’ background on those as well?

Commenter Avatar September 22 / #

Nice stuff, but shouldn’t it be e.preventDefault(); on the mootools version too?
I would like to know how you did this textmate snippet integration too, your awesome!

David Walsh September 22 / #

My bad — I forgot to remove the “stop” and “preventDefault()” ’s from when they were demos. We don’t want to stop or prevent anything.

Commenter Avatar September 22 / #
Mr.X. says:

I love it! I’ve made a hover effect a while back and this is a great add to it since a lot of my site uses ajax!

Here is my hover-effect script:
$$(‘a[not!=e]‘).each(function(el){

el.addEvent(‘mouseover’, function(event){
var morph = new Fx.Morph(el, {duration: ’short’, transition: Fx.Transitions.Sine.easeOut});
var bgcolor = el.getStyle(‘background-color’);
morph.start({
‘padding-top’: [0 , 5],
‘padding-bottom’: [0 , 5],
‘background-Color’:'#cfffff’
});

});
el.addEvent(‘mouseout’, function(event){
morph_delay = function(){
var morph = new Fx.Morph(el, {duration: ’short’, transition: Fx.Transitions.Sine.easeOut});
morph.start({
‘padding-top’: [5 , 0],
‘padding-bottom’: [5 , 0],
‘background-Color’:this.bgcolor
});
}
morph_delay.delay(50)
});
})

Commenter Avatar September 22 / #
Thomas says:

Excuse me, but why just not use the :active CSS-pseudo class?

Commenter Avatar September 22 / #
Thomas says:

@Thomas: CSS-pseudo selector* even

Commenter Avatar September 22 / #

Couldn’t you mostly do this with CSS? the a:active pseudo-class will give you something when they click on it.

It’ll go away when they release the mouse button (so I wouldn’t do it if you wanted a spinner or something fancy) but if you just want to visually register that they clicked a link, :active might be enough.

David Walsh September 22 / #

“:active” is a great option but prefer the javascript method because it gives me more options.

Commenter Avatar September 22 / #
Mr.X. says:

Is it my imagination or lynx is named by new Ubuntu 10.04: Lucid Lynx ?

Commenter Avatar September 22 / #
Thomas says:

@David Walsh: I don’t see what additional options you’re referring to in the above example that can’t be solved with the :active pseudo-selector.

I found a nice article that pretty much sums up my thoughts about the use of (redundant) Javascript: http://css-tricks.com/you-know-you-should-use-javascript-when/
“JavaScript: If it can be done in another language, it should be done in another language.”

Regards

Commenter Avatar September 22 / #

Don’t waste resources and just remove the class from the active link ;)

http://paste.davidwalsh.name/99

David Walsh September 22 / #

Good call Kassens!

David Walsh September 22 / #

Thomas: I realize that. One thing I wanted to toy with was leaving the class on anything clicked. Maybe a different color for those that weren’t the most recent clicked. In that case I’d definitely JS. I do, however, see where you’re coming from.

Commenter Avatar September 22 / #

I hardly see anything that resembles the iPhone UI, but thanks for the post and the mootools & jQuery comparison code. Also I love your code preview, it is FTW.

Commenter Avatar September 24 / #

I don’t mean to repeat what others have already stated, but I have to agree that CSS is the right tool for this task.

I believe that :focus is what you’re after, not :active. The link remains “focused” even after the mouse button is released.

Commenter Avatar September 25 / #

Agree, the :active selector is there for a reason, and you don’t need any javascript at all for it!

Commenter Avatar October 12 / #
Andrew says:

Personally, I don’t think he was trying to show a better than css way, simply showing up to do. Also, if we’re doing this for Safari, should we not be using the -webkit-border-radius? I was under the impression Safari doesn’t use the -moz. Cheers.

Commenter Avatar October 29 / #
Al says:

Would like to know how to apply it to a specific div so that it’s not applied to all clickable links including pics, thx.

Commenter Avatar January 08 / #
Grauer says:

I’d humbly suggest a mousedown for the addClass and mouseup and mouseout for removeClass to better resemble iPhone functionality.

Be Heard!

I want to hear what you have to say! Share your comments and questions below.

Name*:
Email*:
Website:  


© David Walsh 2007-2010. Contact David Walsh. Powered by the remarkable MooTools javascript framework.