<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>a pint of javascript (and general web stuff) &#187; mootools</title>
	<atom:link href="http://blog.gonchuki.com/category/javascript/mootools/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gonchuki.com</link>
	<description></description>
	<lastBuildDate>Tue, 06 Jul 2010 21:45:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CSS Sprites2 &#8211; It&#039;s MooTools Time</title>
		<link>http://blog.gonchuki.com/archives/css-sprites2-its-mootools-time/</link>
		<comments>http://blog.gonchuki.com/archives/css-sprites2-its-mootools-time/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 17:29:20 +0000</pubDate>
		<dc:creator>gonchuki</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[patterns]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[sprites]]></category>

		<guid isPermaLink="false">http://blog.gonchuki.com/?p=34</guid>
		<description><![CDATA[A few months ago you may have read Dave Shea&#039;s entry on A List Apart &#034;CSS Sprites2 &#8211; It&#039;s JavaScript Time&#034; where he implemented a variant of his own CSS Sprites article by adding jQuery based animations. In this same article Dave encouraged us [developers] to port it to other libraries, so after a few [...]]]></description>
			<content:encoded><![CDATA[<p>A few months ago you may have read <a href="http://www.mezzoblue.com/">Dave Shea</a>&#039;s entry on A List Apart &#034;<a href="http://www.alistapart.com/articles/sprites2"><acronym title="Cascading Style Sheets">CSS</acronym> Sprites2 &#8211; It&#039;s JavaScript Time</a>&#034; where he implemented a variant of his own <a href="http://www.alistapart.com/articles/sprites"><acronym title="Cascading Style Sheets">CSS</acronym> Sprites</a> article by adding <a href="http://jquery.com">jQuery</a> based animations. In this same article Dave encouraged us [developers] to port it to other libraries, so after a few months of inactivity I&#039;m back with the <a href="http://mootools.net">MooTools</a> port of this slick effect.<br />
<span id="more-34"></span></p>
<link rel="stylesheet" type="text/css" href="http://sandbox.gonchuki.com/sprites2/sprites2.css" media="all" />
<h3 class="section">Enter the MooTools</h3>
<p>While the original version used jQuery (1.2.6 at that time) and lots of people like it, we (mootoolers) have a different approach to code specially emphasizing on OOP techniques and readability. Part of the issue might not be jQuery per-se and be Dave&#039;s code that was a little obfuscated, but it anyways has a lot of room for improvement.<br />
This article will just describe differences between the MooTools implementation and the Dave&#039;s jQuery one, so unless stated otherwise, everything from the ALA article applies here.</p>
<h3 class="section">enter the Sprites2 class</h3>
<p>Part of the requirements I imposed myself when porting to MooTools was that it had to be easier to use than the jQuery version, and that it should give a certain degree of flexibility to extend the possible transition effects.<br />
End result is a class intuitively named Sprites2, where you gracefully pass named parameters:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">new</span> Sprites2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>mode<span style="color: #339933;">:</span> <span style="color: #3366CC;">'fade'</span><span style="color: #339933;">,</span> item_selector<span style="color: #339933;">:</span> <span style="color: #3366CC;">'ul.nav a'</span><span style="color: #339933;">,</span> duration<span style="color: #339933;">:</span> <span style="color: #CC0000;">250</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

Now that&#039;s classy! [stupid pun, I know]<br />
Notice that these parameters above are the class defaults, so you could have just as easily used <var>new Sprites2();</var> and the end result would be the same.</p>
<h3 class="section">changes to original code and idea</h3>
<p>Apart from moving the code to a class, a change to note is the removal of the :active state from the <acronym title="Cascading Style Sheets">CSS</acronym> and the <var>setActive</var> parameter in the <acronym title="JavaScript">JS</acronym> code. This was mostly a personal preference as the :active pseudo-class created a few issues when holding the mouse on the element and releasing outside of it. Other notable changes in the <acronym title="Cascading Style Sheets">CSS</acronym> are the simplification of the implementation/adaptation process by using a simpler approach on the styles (for example, using <var>height:100%;</var> where applicable instead of <a href="http://www.alistapart.com/d/sprites2/examples/example-script.css">redefining height:48px; 5 times in the <acronym title="Cascading Style Sheets">CSS</acronym></a>).</p>
<p>MooTools also has a free &#034;upgrade&#034; built-in: animations have an internal state so that if you roll out from the element and enter it again, the transition will continue to run smoothly. In contrast, jQuery version (may be by code design, maybe because of a library limitation) flickers madly when you roll over and out of the element repeatedly with an interval less than the effect duration.</p>
<p>Also to note, and as mentioned, the Sprites2 class can be easily extended outside of the sprites2.js file with just a few lines of code to create for example a horizontal slide effect:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">Sprites2.<span style="color: #660066;">implement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
  effects<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
    slide_x<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>fx_element<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      fx_element.<span style="color: #660066;">store</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'width'</span><span style="color: #339933;">,</span> fx_element.<span style="color: #660066;">getSize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">x</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">setStyles</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'width'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">show_fn</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>fx_element<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> fx_element.<span style="color: #660066;">tween</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'width'</span><span style="color: #339933;">,</span> fx_element.<span style="color: #660066;">retrieve</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'width'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">hide_fn</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>fx_element<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> fx_element.<span style="color: #660066;">tween</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'width'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>and you can start using it right away with <var>new Sprites2({mode: &#039;slide_x&#039;});</var>. This obviously works any way you want, as you can manually add or remove the effects directly in the source file.</p>
<h3 class="section">download, full demo and requirements</h3>
<p>The example here is running on a standard <a href="http://ajax.googleapis.com/ajax/libs/mootools/1.2.1/mootools-yui-compressed.js">google hosted version of mootools 1.2.1</a>. For those of you that use custom builds, just be sure to add FX.Tween and FX.Morph to your standard array of includes (morph is only used by the &#034;animate&#034; effect, so if you don&#039;t use that one you can exclude it.)</p>
<p><a href="http://sandbox.gonchuki.com/sprites2/sprites2_moo.html">View full online demo</a></p>
<p><a href="http://sandbox.gonchuki.com/sprites2/sprites2.zip" rel="download" class="download">Download Sprites2</a> for MooTools [zip].</p>
<p><strong>new!</strong> &#8211; by popular demand (not really), I have just set-up a git repo so you can fork the latest source: <a href="http://github.com/gonchuki/sprites2-moo">http://github.com/gonchuki/sprites2-moo</a></p>
<p><strong>License:</strong> <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-Share Alike 3.0</a><br />
<small>disclaimer: original code did not contain any license whatsoever (like all ALA code), so I assumed a CC share-alike license applies perfectly in this case.</small><br />]]></content:encoded>
			<wfw:commentRss>http://blog.gonchuki.com/archives/css-sprites2-its-mootools-time/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>updating moopop for mootools 1.2</title>
		<link>http://blog.gonchuki.com/archives/updating-moopop-for-mootools-12/</link>
		<comments>http://blog.gonchuki.com/archives/updating-moopop-for-mootools-12/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 02:37:31 +0000</pubDate>
		<dc:creator>gonchuki</dc:creator>
				<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[moopop]]></category>
		<category><![CDATA[mootools 1.2]]></category>

		<guid isPermaLink="false">http://blog.gonchuki.com/?p=22</guid>
		<description><![CDATA[After several requests to update the script, I finally had time to make the update. In fact the script was under production for more than a month running over mootools SVN builds. The update also comes with a couple additions suggested by users, and also some optimizations thanks to the new mootools 1.2 element storage.

so&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>After several requests to update the script, I finally had time to make the update. In fact the script was under production for more than a month running over mootools SVN builds. The update also comes with a couple additions suggested by users, and also some optimizations thanks to the new mootools 1.2 <a href="http://blog.mootools.net/2008/1/22/Element_Storage">element storage</a>.</p>
<p><span id="more-22"></span></p>
<h3 class="section">so&#8230; what&#039;s new?</h3>
<p>the basic improvement is that the code now works with mootools 1.2, be warned that this actually *breaks* compatibility with mootools 1.11 so please use <a href="http://blog.gonchuki.com/archives/moopop-unobtrusive-popups-with-mootools/">the older version</a> if you haven&#039;t yet gone to 1.2</p>
<p>and then, what else?<br />
<strong>resizable windows</strong><br />
I got some requests for this feature, so it&#039;s here. Just mix a &#034;r&#034; parameter in this format: &#034;[600,400,r]&#034; and the popup window generated will be resizable.</p>
<p><strong>ability to reuse the same popup</strong><br />
the old moopop had a bad habit of creating a new popup window for each link and not offering an option to reuse the same window. now you can use the &#034;name&#034; attribute native to &lt;a&gt; tags to specify the target of the popup.</p>
<p><strong>defaulting to rel=&#034;popup&#034;</strong><br />
now you can just call moopop.captureByRel() without arguments and the script will default to the most common use case.</p>
<p><strong>under the hood&#8230;</strong><br />
optimized code a bit, and now it&#039;s using both element storage to avoid memory leaks and cleaner CSS2 selectors that got native in mootools 1.2</p>
<h3 class="section">documentation?</h3>
<p>yes sure, unless for the additions specified in this post, all documentation remains the same and you can get it either in <a href="http://blog.gonchuki.com/archives/moopop-unobtrusive-popups-with-mootools/">the original post</a>, or looking at the source of the uncompressed moopop 1.1</p>
<h3 class="section">download</h3>
<p>as with previous version, you just need Selectors and DomReady from the <a href="http://mootools.net/core">mootools core builder</a> and the rest of the dependencies are automatically selected.</p>
<p><a href="http://sandbox.gonchuki.com/moopop_1.1/moopop.js" rel="download" class="download">Download moopop 1.1</a> with documentation<br />
or<br />
<a href="http://sandbox.gonchuki.com/moopop_1.1/moopop_min.js" rel="download" class="download">Download minified version</a> without docs to save bandwidth.</p>
<p><strong>License:</strong> <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-Share Alike 3.0</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.gonchuki.com/archives/updating-moopop-for-mootools-12/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>usability 101: adding a global &quot;back to top&quot; to your site</title>
		<link>http://blog.gonchuki.com/archives/usability-101-adding-a-global-back-to-top-to-your-site/</link>
		<comments>http://blog.gonchuki.com/archives/usability-101-adding-a-global-back-to-top-to-your-site/#comments</comments>
		<pubDate>Sun, 11 Nov 2007 19:26:04 +0000</pubDate>
		<dc:creator>gonchuki</dc:creator>
				<category><![CDATA[accessibility]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://blog.gonchuki.com/archives/usability-101-adding-a-global-back-to-top-to-your-site/</guid>
		<description><![CDATA[If there has to be one single usability issue I dislike from most sites, it is the &#034;back to top&#034; feature. Ugly links spread all over the place clogging the visuals of your site. It is for this reason that some months ago we developed a global unobtrusive back to top for Operator11.

identifying the problem
As [...]]]></description>
			<content:encoded><![CDATA[<p>If there has to be one single usability issue I dislike from most sites, it is the &#034;back to top&#034; feature. Ugly links spread all over the place clogging the visuals of your site. It is for this reason that some months ago we developed a global unobtrusive back to top for <a href="http://operator11.com">Operator11</a>.<br />
<span id="more-18"></span></p>
<h3 class="section">identifying the problem</h3>
<p>As we have seen before, <a href="http://poorbuthappy.com/ease/archives/2007/08/30/3804/ia-for-beginners-long-pages-work">long pages work</a>. But we always have an issue in the process: if one wants to navigate to other section of the site you have to scroll all the way up or use your other hand to hit the [Home] key.<br />
Given that the average internet user (I would say more than 90%) use their mouse to browse the web, either having to use your other hand and hunt for a key, scrolling up repetitively or clicking on that very top portion of that 16px wide scrollbar adds complexity to the task we are doing and <a href="http://www.humanized.com/weblog/2006/07/22/know_when_to_stop_designing_quantitatively/">decreases our efficiency</a>.<br />
Users love to hunt for information from page to page, and our task as user experience designers is to give them the tools to ease their stay.</p>
<h3 class="section">the wrong approach</h3>
<p>The classic solution of spreading links all over the place has great design, usability and accessibility problems.<br />
From the design point of view you either come up with a clever way to disguise the links or just leave them out there clogging the visuals. Not good either way!<br />
Usability wise, do you really know when the user wants to go back to the top of the page? Is there a need to spam the user with back to top links?<br />
And that spamming also means for decreased accessibility, screen reader or keyboard users will be constantly spammed with those meaningless links. They <strong>already</strong> know how to get back to the top of the page without the need for your &#034;shortcuts&#034;.<br />
Shouldn&#039;t there be a wiser and cleaner solution?</p>
<h3 class="section">developing a solution</h3>
<p>Fortunately, <strong>there is</strong> a fairly good solution. And armed with a bit of javascript and standards compliant <acronym title="Cascading Style Sheets">CSS</acronym> we can pull the trick.<br />
Did I just say javascript? why, yes! The back to top link is a navigational aid for mouse users and not real content in your page, think of it as an escape pod for when you want to get away from the current page.<br />
When developing this together with <a href="http://nicolassanguinetti.info">Nicolas Sanguinetti</a> for <a href="http://operator11.com">Operator11</a> our main goals were:<br />
- keep it clean<br />
- be unobtrusive<br />
- keep it usable<br />
The final solution ended as a tiny piece of code written with the aid of <a href="http://prototypejs.org">Prototype</a>.<br />
However as you may know, my personal and professional focus is into the <a href="http://mootools.net">mootools</a> library and for this reason the solution presented today will be an adaptation from the original code.</p>
<h3 class="section">methodology and code</h3>
<p><strong>Q:</strong> So when should we show the back to top link?<br />
<strong>A:</strong> Once we think the user needs it.<br />
Getting this metric can be a bit tricky and it&#039;s mostly arbitrary, but we finally settled for <strong>80% of a full page scroll</strong>. It&#039;s around this point that we need at least two mouse wheel scrolls to reach the top and hitting the back to top link becomes more efficient.<br />
the javascript:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">addEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'load'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">new</span> Element<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #3366CC;">'id'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'back-to-top'</span><span style="color: #339933;">,</span> 
    <span style="color: #3366CC;">'styles'</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'opacity'</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">0.6</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #3366CC;">'events'</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>window.<span style="color: #660066;">location</span>.<span style="color: #660066;">hash</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> window.<span style="color: #660066;">location</span>.<span style="color: #660066;">hash</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;page&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
      <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span> window.<span style="color: #660066;">scrollTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #660066;">setText</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'back to top'</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #660066;">injectInside</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">body</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  window.<span style="color: #660066;">addEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'scroll'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> fn <span style="color: #339933;">=</span> window.<span style="color: #660066;">getScrollTop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#40;</span>window.<span style="color: #660066;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">0.8</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #3366CC;">&quot;addClass&quot;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;removeClass&quot;</span><span style="color: #339933;">;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'back-to-top'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>fn<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'visible'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>and this simple CSS:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#back-to-top</span><span style="color: #00AA00;">,</span>
<span style="color: #cc00cc;">#back-to-top</span><span style="color: #6666ff;">.visible</span> <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
body<span style="color: #00AA00;">&gt;</span><span style="color: #cc00cc;">#back-to-top</span> <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">position</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">fixed</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">bottom</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">cursor</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">pointer</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">3px</span> <span style="color: #933;">17px</span> <span style="color: #933;">3px</span> <span style="color: #933;">7px</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span> <span style="color: #933;">14px</span> Arial<span style="color: #00AA00;">,</span> Helvetica<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#fff</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#555</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000; font-style: italic;">triangle-gray-up.png</span><span style="color: #00AA00;">&#41;</span> <span style="color: #993333;">no-repeat</span> <span style="color: #000000; font-weight: bold;">right</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
body<span style="color: #00AA00;">&gt;</span><span style="color: #cc00cc;">#back-to-top</span><span style="color: #6666ff;">.visible</span> <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">inline</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p></p>
<h3 class="section">pitfalls and caveats</h3>
<p>Just a few notes on usage and explanation of the methodology are needed.<br />
The code as you see purposely ignores IE6 as it has inexistent support for <code>position: fixed</code>. By using a CSS2 selector we gracefully degrade and ignore that browser and only display the link on standards compliant browsers.<br />
There is also another issue with <acronym title="Internet Explorer">IE</acronym> (6 and 7) that throws the infamous <a href="http://clientside.cnet.com/code-snippets/manipulating-the-dom/ie-and-operation-aborted/">Operation aborted</a> error and it&#039;s the reason behind using the <code>onload</code> event instead of <code>ondomready</code>.<br />
Last, but not the least, removing the hash part in the <acronym title="Uniform Resource Locator">URL</acronym> reloads the page instead of just cleaning that part of the location. This happens *at least* in Firefox and it is enough to conclude that setting <code>window.location.hash = ""</code> is not an option. For this is that we check the existence of the hash in the current location, and if not present we scroll to the top with javascript or else we set the location to the topmost element in our page.<br />
Be warned then, that if you use internal anchors in your site, you must have an element with an ID at the top of your page, preferably the body tag.<br />
For the curious, we re-set the hash part just for bookmarking purposes. If you hit the back to top link, then you are supposedly at the top and not on #someplace in the page.</p>
<h3 class="section">compatibility, download and legal bits</h3>
<p>The code is tested and works under Firefox, Opera 9, Safari 3 (both Windows and Mac) and Internet Explorer 7.<br />
As for <a href="http://mootools.net/download">mootools</a>, you just need the &#034;Element.Event&#034; and &#034;Window.Size&#034; modules, pretty much standard stuff.</p>
<p>By the way, you should have already noticed the back to top link in action in this post, feel free to try it out before leaving your comments ;)</p>
<p><a href="http://sandbox.gonchuki.com/btt/back-to-top.zip" class="download">Download back-to-top.zip</a></p>
<p><strong>License:</strong> <a href="http://creativecommons.org/licenses/by-sa/3.0/" class="cc">Creative Commons Attribution-Share Alike 3.0</a></p>
<p><strong>2009/02/27 &#8211; Update:</strong> The original code above was originally intended for mootools 1.11 (bleeding edge at that time in 2007), but given that 1.2 has been out for a long time I guess it&#039;s time for a quick update for <strong>mootools 1.2.x</strong><br />
I also took a few minutes to clean-up the <acronym title="Cascading Style Sheets">CSS</acronym> (no more CSS2 descendant rule to hide from IE6) and moved the &#034;fixed&#034; styles to the Element creation in the <acronym title="JavaScript">JS</acronym>. Now all that remains in the <acronym title="Cascading Style Sheets">CSS</acronym> is the customization on font, color, padding and background. The effect now also uses a fade in tween if it&#039;s available in your custom Mootools build.<br />
<a href="http://sandbox.gonchuki.com/btt/back-to-top_1.2.zip" class="download">Download back-to-top for mootools 1.2.x</a> [zip]</p>
<h3 class="section">addendum: original Prototype code</h3>
<p>Being that I was struck by <del datetime="2007-11-15T17:41:52+00:00">a very strange bug in mootools 1.11</del> <ins datetime="2007-11-15T17:41:52+00:00"><a href="http://dev.wp-plugins.org/ticket/723">a lame overriding of the addEvent function</a> by the <a href="http://wordpress.org/extend/plugins/stats/" rel="nofollow">Wordpress.com Stats plugin</a></ins>, I&#039;m putting here also the original Prototype-based implementation either for comparison or just for those Prototype users out there:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">BackToTop <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
    initialize<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>
            BackToTop.<span style="color: #660066;">link</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Element<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'back-to-top'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
                .<span style="color: #660066;">update</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;back to top&quot;</span><span style="color: #009900;">&#41;</span>
                .<span style="color: #660066;">setOpacity</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0.6</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        BackToTop.<span style="color: #660066;">link</span>.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;click&quot;</span><span style="color: #339933;">,</span> BackToTop.<span style="color: #660066;">onLinkClick</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Event.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;scroll&quot;</span><span style="color: #339933;">,</span> BackToTop.<span style="color: #660066;">onWindowScroll</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    onLinkClick<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>window.<span style="color: #660066;">location</span>.<span style="color: #660066;">hash</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            window.<span style="color: #660066;">location</span>.<span style="color: #660066;">hash</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;page&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            window.<span style="color: #660066;">scrollTo</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    onWindowScroll<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">viewport</span>.<span style="color: #660066;">getScrollY</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">viewport</span>.<span style="color: #660066;">getHeight</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">0.8</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            BackToTop.<span style="color: #660066;">link</span>.<span style="color: #660066;">addClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'visible'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            BackToTop.<span style="color: #660066;">link</span>.<span style="color: #660066;">removeClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'visible'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
Event.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span>window<span style="color: #339933;">,</span> <span style="color: #3366CC;">'load'</span><span style="color: #339933;">,</span> BackToTop.<span style="color: #660066;">initialize</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>notice that this was first written to be a <a href="http://www.danwebb.net/2006/9/3/low-pro-unobtrusive-scripting-for-prototype">LowPro</a> behaviour (and fitting more of Nicolas&#039; coding style) but given the Operation Aborted bug in <acronym title="Internet Explorer">IE</acronym> we reverted back to plain Event.observe from Prototype.<br />
<script type="text/javascript" src="http://sandbox.gonchuki.com/btt/mootools.js"></script><br />
<script type="text/javascript" src="http://sandbox.gonchuki.com/btt/back-to-top.js"></script></p>]]></content:encoded>
			<wfw:commentRss>http://blog.gonchuki.com/archives/usability-101-adding-a-global-back-to-top-to-your-site/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>moopop: &quot;unobtrusive&quot; popups with mootools</title>
		<link>http://blog.gonchuki.com/archives/moopop-unobtrusive-popups-with-mootools/</link>
		<comments>http://blog.gonchuki.com/archives/moopop-unobtrusive-popups-with-mootools/#comments</comments>
		<pubDate>Mon, 13 Aug 2007 01:14:23 +0000</pubDate>
		<dc:creator>gonchuki</dc:creator>
				<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://blog.gonchuki.com/archives/moopop-unobtrusive-popups-with-mootools/</guid>
		<description><![CDATA[I know, it&#039;s quite ironic to call unobtrusive a popup window. However there are times when clients, coworkers or maintainers demand for a &#034;simple&#034; popup window solution. It&#039;s for that cases that I built moopop some months ago and I&#039;m now sharing the code.


Important:
The code and samples in this page are aimed towards mootools 1.11. [...]]]></description>
			<content:encoded><![CDATA[<p>I know, it&#039;s quite ironic to call unobtrusive a popup window. However there are times when clients, coworkers or maintainers demand for a &#034;simple&#034; popup window solution. It&#039;s for that cases that I built <em>moopop</em> some months ago and I&#039;m now sharing the code.</p>
<p><span id="more-16"></span></p>
<div class="big_sign notice">
<h3>Important:</h3>
<p>The code and samples in this page are aimed towards mootools 1.11. <br />If you are using mootools 1.2 please use <a href="http://blog.gonchuki.com/archives/updating-moopop-for-mootools-12/">the new version</a></p>
</div>
<h3 class="section">the call for a simple solution</h3>
<p>What&#039;s more annoying than a popup window? Writing code to execute them.<br />
- &#034;<em>Was it with quotes or without them?</em>&#034;<br />
- &#034;<em>Should I write px to specify it&#039;s in pixels?</em>&#034;<br />
These questions and more always raise in the seldom event that we need to write some kind of code for a popup window. Even worse, we feel it&#039;s a waste of time to write spiffy code to manage the popups since we are coding an <strong>ugly</strong> feature.<br />
Fear not, as I created a simple yet elegant solution based on the <a href="http://mootools.net">mootools</a> framework (In fact, the solution is pretty much library-agnostic, changing 2-3 lines of code is all you need to adapt it.)</p>
<h3 class="section">how simple can it be?</h3>
<p>As simple as adding the <acronym title="JavaScript">JS</acronym> to your site and adding a <var>rel</var> attribute to your links.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.google.com&quot;</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;popup&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>popup google<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><a href="http://www.google.com" rel="popup">see it in action</a><br />
<var>rel=&#034;popup&#034;</var> will trigger the standard popup behavior that is to open the link in a new window, pretty much works as a <var>target=&#034;_blank&#034;</var> while keeping our code tidy, standards based and semantically meaningful.</p>
<h3 class="section">what about arbitrarily sized windows?</h3>
<p>Thanks for asking. That&#039;s where moopop shines as you can have a ton of different sized popups in your page while still having to write no javascript code. This is where site maintainers start to love you, as they can edit or add new content without having to learn the intricacies of javascript.<br />
Let&#039;s see the code:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;http://www.google.com&quot;</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">&quot;popup[600,400]&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>popup google at 600x400<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p><a href="http://www.google.com" rel="popup[600,400]">see it in action</a><br />
as simple as that, we can personalize each popup window by adding the size between square brackets.</p>
<h3 class="section">documentation, requirements and download</h3>
<p>Documentation is built-in on the <acronym title="JavaScript">JS</acronym> file in case you want to take a peek in a mootools-esque style for easier understanding.<br />
There are more possible uses for this such as setting a default size for all the popups without a given size, but I will leave that to you as that&#039;s a silly feature I had to build for a lazy coworker.</p>
<p>If you are already using mootools it&#039;s pretty much sure that you have the required dependencies. If not, it requires Element.Selectors, Window.DomReady and the rest of the requirements are automatically selected by the <a href="http://mootools.net/download">mootools download builder</a></p>
<p>- Download <a href="http://sandbox.gonchuki.com/moopop/moopop.js" rel="download">moopop with documentation</a><br />
or<br />
- Download <a href="http://www.crockford.com/javascript/jsmin.html" rel="external">JSMin</a> <a href="http://sandbox.gonchuki.com/moopop/moopop_min.js" rel="download">stripped version</a></p>
<p><strong>License:</strong> <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-Share Alike 3.0</a></p>
<p><script type="text/javascript" src="http://sandbox.gonchuki.com/moopop/mootools.js"></script><br />
<script type="text/javascript" src="http://sandbox.gonchuki.com/moopop/moopop_min.js"></script></p>]]></content:encoded>
			<wfw:commentRss>http://blog.gonchuki.com/archives/moopop-unobtrusive-popups-with-mootools/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
