<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title><![CDATA[Heygrady]]></title>
  <link href="http://heygrady.com/atom.xml" rel="self"/>
  <link href="http://heygrady.com/"/>
  <updated>2013-04-27T15:35:45-07:00</updated>
  <id>http://heygrady.com/</id>
  <author>
    <name><![CDATA[Grady Kuhnline]]></name>
    <email><![CDATA[blog@heygrady.net]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
    <entry>
      




<title type="html"><![CDATA[State of Browsers, July 2012]]></title>
<link href="http://heygrady.com/blog/2012/07/03/state-of-browsers-july-2012/"/>
<updated>2012-07-03T11:51:00-07:00</updated>
<id>http://heygrady.com/blog/2012/07/03/state-of-browsers-july-2012</id>
<category term="browsers" />

      <content type="html"><![CDATA[<p>There have been some big changes in the browser world in the last year. Google&#39;s Chrome has continued to make tremendous gains, and IE9 has started to supplant the older versions of Microsoft&#39;s much-maligned browser. Mobile browsers have also started to take a big bite of the overall browser market.</p>

<p>Web developers need to know about browser usage in order to make rational choices for browser testing and for choosing which features to rely on. With <a href="http://blog.jquery.com/2012/07/01/jquery-1-9-and-2-0-tldr-edition/">jQuery&#39;s recent choice to phase out legacy IE support</a> and the continued mainstreaming of mobile browsers, there&#39;s a renewed focus on which browsers it makes sense to support.</p>

<!--more-->

<h2 id="market-share-for-past-12-months--as-of-july-2012">Market Share for Past 12 Months; As of July 2012</h2>

<figure>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/static/modules/gviz/1.0/chart.js"> {"dataSourceUrl":"//docs.google.com/spreadsheet/tq?key=0Ajlnzthl1cAzdDdYM3VQUG5CTjVqdy1OVEkxLU4tZWc&transpose=1&headers=1&range=A1%3AN12&gid=0&pub=1","options":{"vAxes":[{"useFormatFromData":false,"formatOptions":{"source":"inline","suffix":"%"},"viewWindowMode":"pretty","format":"0.##'%'","viewWindow":{}},{"useFormatFromData":true,"viewWindowMode":"pretty","viewWindow":{}}],"series":{"1":{"color":"#3c78d8"},"2":{"color":"#6d9eeb"},"3":{"color":"#a4c2f4"},"4":{"color":"#ff9900"},"5":{"color":"#f6b26b"},"6":{"color":"#109618"},"7":{"color":"#990099"},"8":{"color":"#b82e2e"},"9":{"color":"#0099c6"},"10":{"color":"#b7b7b7"}},"title":"Browser Market Share, July 2011 - June 2012","curveType":"","booleanRole":"certainty","height":389,"animation":{"duration":0},"width":618,"lineWidth":2,"hAxis":{"useFormatFromData":true,"viewWindowMode":"pretty","viewWindow":{}}},"state":{},"chartType":"LineChart","chartName":"Browse Market Share, July 2012"} </script>
</figure>

<p>Since the beginning of the year, IE9 has been gaining ground while IE8 has been plummeting. This is probably due to a combination of <a href="http://paulirish.com/2012/the-skinny-on-ies-update-policy/">Microsoft&#39;s much-touted update policy</a> and the <a href="http://gs.statcounter.com/#os-US-monthly-201106-201206">continued success of Windows 7</a>. Meanwhile, Chrome has continued to see tremendous growth &mdash; nearly 7% in only a year. But, in the past 12 months, IE9 was the big winner with a 13% increase.</p>

<p>Mobile is the other major success story of the last year. Combining iPad with the mobile statistics, mobile has grown more than 3% in the last year.</p>

<p>Read <a href="#about-the-data">about the data</a> below.</p>

<h3 id="comparing-june-2011-vs--june-2012">Comparing June 2011 vs. June 2012</h3>

<figure>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/static/modules/gviz/1.0/chart.js"> {"dataSourceUrl":"//docs.google.com/spreadsheet/tq?key=0Ajlnzthl1cAzdDdYM3VQUG5CTjVqdy1OVEkxLU4tZWc&transpose=0&headers=1&range=A1%3AC8&gid=20&pub=1","options":{"vAxes":[{"useFormatFromData":false,"formatOptions":{"source":"inline","suffix":"%"},"viewWindowMode":"pretty","format":"0.##'%'","viewWindow":{}},{"useFormatFromData":true,"viewWindowMode":"pretty","viewWindow":{}}],"title":"Browser Market Share, June 2011 vs. June 2012","booleanRole":"certainty","animation":{"duration":0},"hAxis":{"useFormatFromData":true,"title":"","slantedTextAngle":30,"slantedText":true,"viewWindowMode":"pretty","viewWindow":{}},"isStacked":false,"width":600,"height":371},"state":{},"chartType":"ColumnChart","chartName":"Chart 6"} </script>
</figure>

<p>As usual, <a href="http://gs.statcounter.com/#browser-US-monthly-201106-201206">Firefox, Safari and Opera have remained fairly static</a>. Overall, Firefox has dropped a few percentage points, likely due to users switching to Chrome. Firefox has been hovering around 20% for several years and has bounced back from slumps before. Safari&#39;s market share seems to be linked to the <a href="http://gs.statcounter.com/#os-US-monthly-201106-201206">market share of OSX</a>, which also tends not to fluctuate much.</p>

<p>The only two browser segments that are seeing overall positive trending are Chrome and Mobile. While Chrome continues to steal from Firefox, the bigger victim appears to be IE. It&#39;s reasonable to assume that mobile is diluting the market share for all browsers equally.</p>

<h3 id="individual-versions--june-2011-vs--june-2012">Individual Versions; June 2011 vs. June 2012</h3>

<figure>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/static/modules/gviz/1.0/chart.js"> {"dataSourceUrl":"//docs.google.com/spreadsheet/tq?key=0Ajlnzthl1cAzdDdYM3VQUG5CTjVqdy1OVEkxLU4tZWc&transpose=0&headers=1&range=A11%3AC22&gid=20&pub=1","options":{"vAxes":[{"useFormatFromData":false,"title":null,"formatOptions":{"source":"inline","suffix":"%"},"minValue":null,"viewWindowMode":"pretty","format":"0.##'%'","viewWindow":{"min":null,"max":null},"maxValue":null},{"useFormatFromData":true,"viewWindowMode":"pretty","viewWindow":{}}],"booleanRole":"certainty","title":"Browser Market Share, June 2011 vs. June 2012","animation":{"duration":0},"hAxis":{"useFormatFromData":true,"viewWindowMode":"pretty","viewWindow":{}},"isStacked":false,"width":600,"height":371},"state":{},"chartType":"ColumnChart","chartName":"Chart 6"} </script>
</figure>

<p>While IE overall has seen a large decline, IE9 has seen huge gains. In fact, all of the &ldquo;modern&rdquo; browsers have seen dramatic increases, while all of the &ldquo;legacy&rdquo; browsers have started to decline. IE6, IE7 and IE8 have all seen their market share drop by half in the last year.</p>

<p>Legacy Firefox has plummeted nearly 7%. The modern versions of Firefox have made modest gains, although not enough to offset the decline of the legacy versions, causing an overall decline (as shown above).</p>

<p>This is all great news for web developers. Not only are modern browsers releasing great new technologies, users are actually adopting these browsers en masse.</p>

<h3 id="market-share-in-june-2012">Market Share in June 2012</h3>

<figure>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/static/modules/gviz/1.0/chart.js"> {"dataSourceUrl":"//docs.google.com/spreadsheet/tq?key=0Ajlnzthl1cAzdDdYM3VQUG5CTjVqdy1OVEkxLU4tZWc&transpose=0&headers=1&merge=COLS&range=A1%3AA12%2CN1%3AN12&gid=0&pub=1","options":{"vAxes":[{"title":null,"useFormatFromData":true,"minValue":null,"viewWindowMode":"pretty","viewWindow":{"min":null,"max":null},"maxValue":null},{"useFormatFromData":true,"viewWindowMode":"pretty","viewWindow":{}}],"pieHole":0,"booleanRole":"certainty","title":" Browser Market Share, June 2012","animation":{"duration":0},"colors":["#3366CC","#3c78d8","#6d9eeb","#6d9eeb","#ff9900","#f6b26b","#109618","#990099","#B82E2E","#0099c6","#b7b7b7","#22AA99","#AAAA11","#6633CC","#E67300","#8B0707","#651067","#329262","#5574A6","#3B3EAC","#B77322","#16D620","#B91383","#F4359E","#9C5935","#A9C413","#2A778D","#668D1C","#BEA413","#0C5922","#743411"],"is3D":false,"annotations":{"domain":{}},"hAxis":{"useFormatFromData":true,"viewWindowMode":"pretty","viewWindow":{}},"width":618,"height":389},"state":{},"chartType":"PieChart","chartName":"Chart 3"} </script>
</figure>

<p>The pie-chart above shows the combined mobile and desktop browser market share for June 2012. The top browsers in the US are Chrome, IE9, Firefox, and IE8. When combined together, mobile has a greater market share than Safari, Opera, legacy Firefox and IE6/7 combined. We&#39;re now in an interesting period where it makes more sense to focus developer resources on mobile platforms rather than legacy versions of IE.</p>

<h4 id="ie6-is-gone-forever--ie7-is-hot-on-its-heels">IE6 Is Gone Forever; IE7 Is Hot On Its Heels</h4>

<p>The good news is that IE6 is nearly invisible in the United States now. Above, you can see it has around 0.3% market share. Even the <a href="http://www.netmarketshare.com/browser-market-share.aspx?qprid=2&amp;qpcustomd=0&amp;qptimeframe=M&amp;qpsp=161">NetMarketshare</a> data &mdash; NetMarketshare is typically more generous to IE than StatCounter Global Stats &mdash; that&#39;s used on <a href="http://www.ie6countdown.com/">IE6 Countdown</a> shows IE6 at 0.6% in the US. By this time next year IE will likely be an afterthought in every market except China. Even in <a href="http://gs.statcounter.com/#browser_version_partially_combined-CN-monthly-201106-201206">China</a>, IE6 has been taking a severe nosedive in the past 12 months.</p>

<p>IE7&#39;s downward trend has been fairly constant and predictable, losing an average of 0.33% per month &mdash; more than half of its market share in the last 12 months. By this time next year IE7 will undoubtedly be well below the 1% mark.</p>

<h4 id="mobile-is-here-to-stay">Mobile Is Here to Stay</h4>

<p>Mobile devices have made great strides in the past few years. The mobile browsers are just as capable as any of the other modern browsers. And the devices feel just as snappy as a regular (budget) computer. The days of crappy, Java-based browsers and cumbersome experiences are long gone and users have taken notice. It&#39;s fast becoming a requirement to consider mobile devices as first-class citizens. In the <a href="http://www.webdesignerdepot.com/2012/07/insider-views-on-responsive-design-the-debate-continues/">debate over responsive design</a> vs. m-dot websites, usage trends are pointing towards responsive design.</p>

<h2 id="choosing-a-grade-browsers">Choosing A-Grade Browsers</h2>

<figure>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/static/modules/gviz/1.0/chart.js"> {"dataSourceUrl":"//docs.google.com/spreadsheet/tq?key=0Ajlnzthl1cAzdDdYM3VQUG5CTjVqdy1OVEkxLU4tZWc&transpose=1&headers=1&range=A1%3AB15&gid=19&pub=1","options":{"vAxes":[{"useFormatFromData":false,"minorGridlines":{"count":"2"},"formatOptions":{"source":"inline","suffix":"%"},"viewWindowMode":"pretty","format":"0.##'%'","viewWindow":{}},{"useFormatFromData":true,"viewWindowMode":"pretty","viewWindow":{}}],"series":{"0":{"color":"#109618"},"1":{"color":"#3366cc"},"3":{"color":"#3c78d8"},"5":{"color":"#0099c6"},"7":{"color":"#8e7cc3"},"8":{"color":"#6d9eeb"},"9":{"color":"#b7b7b7"}},"booleanRole":"certainty","title":"Browser Market Share, July 2012","animation":{"duration":0},"hAxis":{"useFormatFromData":true,"viewWindowMode":"pretty","viewWindow":{}},"isStacked":false,"width":618,"height":389},"state":{},"view":{"columns":[{"calc":"stringify","type":"string","sourceColumn":0},1,2,3,4,5,6,7,8,9,10]},"chartType":"ColumnChart","chartName":"Chart 4"} </script>
</figure>

<p>The chart above shows how all of the A-grade browsers measure up. With the inclusion of IE7, the A-grade browsers above cover nearly 95% of browsers. A-grade browsers are the browsers you&#39;re willing to promise the client their site will be tested in. For my money, the most obvious choices are browsers that real people are using. It&#39;s sensible to ignore browsers with a negligible market share (less than 1%) and once a browser drops below 5%, it should be marked for removal. It&#39;s usually really obvious where to draw the line.</p>

<p>With the exception of IE7/8 (and Safari), every other browser in the list is trending upwards. While Safari is staying relatively stagnant, IE8 has been declining rapidly. Since December, it has lost an average of 2% market share every month. It seems to have leveled off temporarily but it would be reasonable to expect IE8 to drop to around 5% in the next 12 months.</p>

<p>A safe rule is that any browser under 2% is on its way out, and any browser under 1% is too small to focus on. The amount of developer effort doesn&#39;t match the size of the audience. And, usually the less popular browsers have enough in common with the A-grade browsers that users will still be able to use the site (although that&#39;s not the case for IE6). For instance, even though you shouldn&#39;t really ever bother testing in Opera in the US, Opera is highly likely to render your site perfectly. Similarly, legacy versions of Firefox typically look just fine even if you only test in the latest Firefox. In essence, these B-grade platforms can be safely ignored without having any major impact on the overall site experience.</p>

<h4 id="my-gbs-for-clients">My GBS for Clients</h4>

<p>Here&#39;s what I&#39;ve been giving my clients:</p>

<ul>
<li>IE9, IE8, IE7

<ul>
<li>consider dropping IE7</li>
</ul></li>
<li>Chrome Latest</li>
<li>Firefox Latest</li>
<li>Safari Latest</li>
<li>Mobile

<ul>
<li>iPad (latest iOS)</li>
<li>iPhone (latest iOS)</li>
<li>Android (latest OS, 2.3)</li>
<li>No <a href="http://www.reuters.com/article/2012/07/03/us-rim-ceo-idUSBRE8620NL20120703">Blackberry</a> (it certainly <em>isn&#39;t</em> in a &ldquo;death spiral&rdquo;)</li>
<li>No non-native mobile browsers</li>
</ul></li>
</ul>

<h4 id="other-gbs-lists">Other GBS Lists</h4>

<p>Yahoo! keeps an updated <a href="http://yuilibrary.com/yui/docs/tutorials/gbs/">Graded Browser Support</a> document that lists the browsers that YUI supports. It&#39;s a good starting point for any solid testing strategy. <a href="http://jquerymobile.com/gbs/">jQuery Mobile also keeps a <abbr title="Graded Browser Support">GBS</abbr></a>, but I would advise against relying on this mobile-oriented GBS unless you&#39;re on a mobile-only project.</p>

<h3 id="consider-dropping-ie7--picking-up-ios-android">Consider Dropping IE7; Picking Up iOS, Android</h3>

<p>Now is the time to start dropping IE7. It&#39;s below 2% nationally and it&#39;s continuing to fall. Meanwhile, iPhone, iPad and Android have gained enough market share to start trending as top-shelf browsers. </p>

<p>Already, these mobile browsers are outperforming desktop browsers like Opera, and IE6/7. This is significant because the other mobile browsers, like Blackberry at 0.33%, have abysmal market share in the US. Even Opera Mobile, which has a <a href="http://gs.statcounter.com/#mobile_browser-ww-monthly-201106-201206">good worldwide market share</a>, has only a 0.16% market share in the US when compared against all browsers.</p>

<p>However, iPad, iPhone and Android are fully capable browsers on fully capable devices. Now is the time to start testing each of these platforms as A-Grade browsers.</p>

<h3 id="dropping-legacy-ie-altogether">Dropping Legacy IE Altogether</h3>

<p>As I mentioned in the intro, <a href="http://blog.jquery.com/2012/07/01/jquery-1-9-and-2-0-tldr-edition/">jQuery has announced</a> that the next major release of jQuery will come in two flavors. One flavor will drop legacy IE altogether. For most people this is a non-starter, and jQuery knows better than to leave regular folks out in the cold. The other flavor supports IE6/7/8. However, the jQuery team is likely reading the same tea-leaves that I am and can see that before next major version of jQuery releases (early 2013), IE7 will like be passing the 1% threshold and IE8 will have a greatly diminished market share.</p>

<p>Between now and 2013 there&#39;s some major things happening. First, there&#39;ll be a <a href="http://www.electoral-vote.com/">presidential election</a>. Second, <a href="http://windowsteamblog.com/windows/b/bloggingwindows/archive/2012/07/02/upgrade-to-windows-8-pro-for-39-99.aspx">Windows 8 will be shipping</a>. And Windows 8 will ship with IE 10 pre-installed. Windows 7 users are also likely to get IE 10 as an automatic update. This will make 2013 another exciting transition year for IE, where users of legacy XP and Vista computers upgrade to the new OS, and IE10.</p>

<p>The jQuery team is claiming that the first pure &ldquo;legacy free&rdquo; version of jQuery won&#39;t really arrive until 2014. By that time, assuming Microsoft&#39;s marketing team can sell enough $40 copies of Windows 8, IE8 should be approaching the magic 1% threshold, and sailing out of our collective memories forever.</p>

<h2 id="conclusion--predictions">Conclusion; Predictions</h2>

<figure>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/static/modules/gviz/1.0/chart.js"> {"dataSourceUrl":"//docs.google.com/spreadsheet/tq?key=0Ajlnzthl1cAzdDdYM3VQUG5CTjVqdy1OVEkxLU4tZWc&transpose=1&headers=1&merge=ROWS&range=A1%3AN4%2CA6%3AN6%2CA8%3AN9%2CA23%3AN24%2CA20%3AN20&gid=0&pub=1","options":{"vAxes":[{"useFormatFromData":false,"minorGridlines":{"count":"0"},"formatOptions":{"source":"inline","prefix":"","suffix":"%"},"viewWindowMode":"pretty","format":"0.##'%'","viewWindow":{}},{"useFormatFromData":true,"viewWindowMode":"pretty","viewWindow":{}}],"series":{"1":{"color":"#3c78d8"},"2":{"color":"#6fa8dc"},"3":{"color":"#ff9900"},"4":{"color":"#109618"},"5":{"color":"#990099"},"6":{"color":"#8e7cc3"},"7":{"color":"#0099c6"},"8":{"color":"#dd4477"}},"curveType":"","booleanRole":"certainty","title":"A-Grade Browser's Market Share, July 2011 - June 2012","height":389,"animation":{"duration":0},"width":618,"lineWidth":2,"hAxis":{"useFormatFromData":true,"viewWindowMode":"pretty","viewWindow":{}}},"state":{},"chartType":"LineChart","chartName":"Chart 2"} </script>
</figure>

<p>The above data shows a few exciting things. First, the majority of the A-grade browsers are modern browsers with good HTML5/CSS3 support. Second, the only browsers showing an overall decline are the legacy browsers. The only legacy browsers on the list are IE8, which is in rapid decline, and IE7, which is nearly dead.</p>

<p>Second, mobile browsers have arrived and are no longer easy to ignore. While the national data shows mobile at nearly 13%, I&#39;ve seen the Google Analytics for clients with mobile usage approaching 30%!</p>

<h3 id="predictions-for-the-next-12-months">Predictions for the Next 12 Months</h3>

<ul>
<li>Combined, mobile will overtake IE8 in the next 3 months.</li>
<li>IE7 will drop well below 1% in the next 12 months.</li>
<li>IE8 will drop below 5% in the next 12 months.</li>
<li>IE9 will start beating Chrome relatively soon (next 3 months).</li>
<li>IE10 will severely impact IE9 once it is released.</li>
<li>Windows 8 + IE10 will clear out any remaining pockets of [non-corporate] IE7 users and speed the decline of IE8.</li>
<li>Corporations that standardized on Vista/IE7 in the last few years as an &ldquo;upgrade&rdquo; from XP/IE6 will become a major nuisance!</li>
<li>Corporations will begin to standardize on Win7/IE8 just to be spiteful.</li>
<li>Legacy Firefox will be well below 1% in the next 12 months.</li>
</ul>

<h2 id="about-the-data">About the Data</h2>

<p>The above stats are culled from the <a href="http://gs.statcounter.com/#browser_version_partially_combined-US-monthly-201106-201206">StatCounter Global Stats</a>. Their data isn&#39;t perfect (<a href="http://gs.statcounter.com/faq">read the FAQ</a>), but it&#39;s a good starting point for understanding the current browser landscape. Ultimately, your own Google Analytics data should be used for analyzing the right browsers to test for your site.</p>

<h3 id="choosing-a-region">Choosing a Region</h3>

<p>All of the stats above are for the United States region. Many <a href="http://www.sitepoint.com/browser-trends-july-2012/">articles using StatCounter stats</a> use the worldwide stats but those can be very misleading. For instance, <a href="http://gs.statcounter.com/#browser_version_partially_combined-eu-monthly-201206-201206-bar">Europe</a> is very different from <a href="http://gs.statcounter.com/#browser_version_partially_combined-af-monthly-201206-201206-bar">Africa</a>, which is very different from <a href="http://gs.statcounter.com/#browser_version_partially_combined-as-monthly-201206-201206-bar">Asia</a>, and so on.</p>

<p>The whole point of browser stats is to gain insight into what browsers your site&#39;s visitors are using. To that end, most site&#39;s visitors overwhelmingly come from a specific region. Mixing all of them together as &ldquo;worldwide&rdquo; isn&#39;t actually useful for any specific project. Even if you have a global site, you usually have a dedicated team for each region.</p>

<p>I live in the US and the majority of the sites I work on are for a US audience. If you live somewhere else, you can easily pull the data from StatCounter for your country.</p>

<h3 id="combining-desktop-and-mobile">Combining Desktop and Mobile</h3>

<p>I&#39;ve combined the desktop and the mobile data into one chart. The resulting <a href="https://docs.google.com/spreadsheet/pub?key=0Ajlnzthl1cAzdDdYM3VQUG5CTjVqdy1OVEkxLU4tZWc&amp;output=html">spreadsheet has been published</a> so that you can see the raw data. StatCounter keeps mobile and desktop browsers separate, so combining them means multiplying the percentages by the <a href="http://gs.statcounter.com/#mobile_vs_desktop-US-monthly-201106-201206">Mobile vs. Desktop</a> ratios. Because of this, the values shown above will differ slightly from the <a href="http://gs.statcounter.com/#browser_version_partially_combined-US-monthly-201106-201206">Partially Combined Browser Versions</a> on the StatCounter site.</p>

<h3 id="combining-browser-versions">Combining Browser Versions</h3>

<p>All versions of Chrome are combined into a single stat because that browser auto-updates, and the differences between versions are negligible. The same is true of Firefox 4+, Safari and Opera. All of these browsers have aggressive updating policies and the differences between the versions is largely irrelevant because the majority of users upgrade their browsers quickly.</p>

<p>The different versions of IE are listed separately because of the significant differences between each release. IE also lacks a comprehensive updating policy, which means older browsers keep their market share for much longer.</p>

<p>Older versions of Firefox (below version 4) are also lumped together. Although those versions lacked an aggressive auto update feature, legacy Firefox versions are too numerous to call out separately. It&#39;s more interesting to track Firefox&#39;s market share before and after Firefox 4. That&#39;s when Firefox started rapidly releasing new versions, similar to Chrome.</p>

<h3 id="combining-iphone-and-ipod-touch">Combining iPhone and iPod Touch</h3>

<p>To the best of my knowledge these devices are extremely similar and, as far as the browser is concerned, they are identical devices. For the purposes of browser market share, these two devices should be combined.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Responsive Images without JavaScript]]></title>
<link href="http://heygrady.com/blog/2012/05/25/responsive-images-without-javascript/"/>
<updated>2012-05-25T15:44:00-07:00</updated>
<id>http://heygrady.com/blog/2012/05/25/responsive-images-without-javascript</id>
<category term="adaptive" /><category term="css" /><category term="design" /><category term="images" /><category term="responsive" />

      <content type="html"><![CDATA[<p>The hot topic in web development right now is how to gracefully handle images when building a responsive website. Images that change based on media queries are known as responsive or <a href="http://html5doctor.com/html5-adaptive-images-end-of-round-one/">adaptive images</a>. The W3C is currently trying to sort out competing <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content-1.html#attr-img-srcset">specifications</a> and <a href="http://www.w3.org/community/respimg/">ideas from the community</a>. While the debate continues, many clever developers are coming up with <a href="https://github.com/scottjehl/picturefill">JavaScript-based solutions</a>. But there&#39;s a way to provide responsive images without using any JavaScript at all.</p>

<p>If you <a href="http://timkadlec.com/2012/05/wtfwg/">don&#39;t like the <code>srcset</code></a> solution being proposed, or you simply need something that works in today&#39;s browsers and doesn&#39;t use JavaScript, read below for a potential solution to the responsive image problem.</p>

<!--more-->

<h2 id="tl-dr">TL;DR</h2>

<p>This article covers a method for using CSS to handle responsive images instead of using JavaScript. There are two use-cases discussed in-depth below. <a href="#part-1-responsive-images-using-css">Part 1</a> covers how to create an responsive image using only CSS. <a href="#part-2-proportionally-scaling-responsive-images">Part 2</a> covers how to create a proportionally scaled responsive images using only CSS.</p>

<p><strong>Example:</strong> <em>See a live example of a <a href="http://heygrady.com/assets/adaptive-image-example/step-5.html">CSS-only responsive image</a>.</em></p>

<p><strong>Example:</strong> <em>See a live example of a <a href="http://heygrady.com/assets/adaptive-image-example/proportional-step-3.html">CSS-only responsive image that scales proportionally</a>.</em></p>

<h3 id="css-only-responsive-images">CSS-Only Responsive Images</h3>

<p>Here&#39;s a quick preview of the technique. This method for responsive images uses CSS in a <code>&lt;style&gt;</code> tag to make a <code>&lt;span&gt;</code> behave like an image. This method has broad browser support, is accessible and does not require JavaScript.</p>

<p>First is some generic CSS that belongs in a global stylesheet and can be used for all responsive images. The CSS is for making the <code>&lt;span&gt;</code> behave more like a native <code>&lt;img&gt;</code>. The key to this is <code>display: inline-block</code> and <code>background-size: 100%</code>.</p>

<figure class='code'><figcaption>final.css<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="c">/* place these styles in your global stylesheet */</span>
</div><div class='line'><span class="nc">.image</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">display</span><span class="o">:</span> <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="k">inline</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">orient</span><span class="o">:</span> <span class="n">vertical</span><span class="p">;</span>
</div><div class='line'>  <span class="k">display</span><span class="o">:</span> <span class="k">inline</span><span class="o">-</span><span class="k">block</span><span class="p">;</span>
</div><div class='line'>  <span class="k">vertical-align</span><span class="o">:</span> <span class="k">middle</span><span class="p">;</span>
</div><div class='line'>  <span class="o">*</span><span class="k">vertical-align</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span>
</div><div class='line'>  <span class="k">font</span><span class="o">:</span> <span class="m">0</span><span class="o">/</span><span class="m">0</span> <span class="k">serif</span><span class="p">;</span>
</div><div class='line'>  <span class="k">text-shadow</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</div><div class='line'>  <span class="k">color</span><span class="o">:</span> <span class="k">transparent</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="k">background</span><span class="o">-</span><span class="k">size</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="k">background</span><span class="o">-</span><span class="k">size</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">o</span><span class="o">-</span><span class="k">background</span><span class="o">-</span><span class="k">size</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background</span><span class="o">-</span><span class="k">size</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background-position</span><span class="o">:</span> <span class="m">50</span><span class="o">%</span> <span class="m">50</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background-repeat</span><span class="o">:</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.image</span> <span class="p">{</span>
</div><div class='line'>  <span class="o">*</span><span class="k">display</span><span class="o">:</span> <span class="k">inline</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.image</span> <span class="nc">.inner</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">display</span><span class="o">:</span> <span class="k">block</span><span class="p">;</span>
</div><div class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<p><strong>NOTE:</strong> please <a href="#step-3-generic-styles-for-all-images">see below for an explanation of this CSS</a>.</p>

<p>Second is the base HTML for all responsive images. Essentially the HTML below will replace each <code>&lt;img&gt;</code> tag that needs to respond to media queries. Of course the media queries themselves should be placed inside the <code>&lt;style&gt;</code> tag.</p>

<figure class='code'><figcaption>final.html<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="c">&lt;!-- adaptive image --&gt;</span>
</div><div class='line'><span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;image-scope&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;style </span><span class="na">scoped</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="c">/* apply background image and dimensions to the span below */</span>
</div><div class='line'>  <span class="nt">&lt;/style&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;road&quot;</span> <span class="na">class=</span><span class="s">&quot;image&quot;</span> <span class="na">role=</span><span class="s">&quot;img&quot;</span> <span class="na">aria-label=</span><span class="s">&quot;A road in Sweden during winter.&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;inner&quot;</span><span class="nt">&gt;&lt;/span&gt;&lt;/span&gt;</span>
</div><div class='line'><span class="nt">&lt;/span&gt;</span>
</div></pre></td></tr></table></div></figure>

<p><strong>NOTE:</strong> The media queries are explained in <a href="#step-4-specific-styles-for-the-individual-image">step 4</a> below.</p>

<h2 id="part-1-responsive-images-using-css">Part 1: Responsive Images Using CSS</h2>

<p>There are many <a href="http://css-tricks.com/on-responsive-images/">good articles about handling responsive images</a> and they all have the same goal of supporting the types of media query wizardry that can be accomplished in CSS for swapping out images. While most of those solutions utilize JavaScript to swap the <code>src</code> of an <code>&lt;img&gt;</code>, I&#39;m proposing that using CSS background images is probably good enough and avoids most of the pitfalls of the other techniques. It&#39;s fairly easy to make a <code>&lt;span&gt;</code> with a background image behave exactly like a real <code>&lt;img&gt;</code> with some basic CSS, primarily relying on <a href="https://developer.mozilla.org/en/CSS/display"><code>display: inline-block</code></a> and <a href="https://developer.mozilla.org/en/CSS/background-size"><code>background-size: 100%</code></a>.</p>

<p>Of course, moving every in-page image on your site to your global stylesheets is impractical and ill-advised. The images we&#39;re talking about are part of the content and have no place in your site&#39;s global styles; they&#39;re very likely to be managed by a CMS. The solution is to embed the styles in the HTML by placing a <code>&lt;style&gt;</code> tag in the <code>&lt;body&gt;</code> instead of in the global stylesheet.</p>

<p>A recent draft of HTML5 spec would allow for <code>&lt;style&gt;</code> tags in the <code>&lt;body&gt;</code> as long as they carry a <code>scoped</code> attribute (<a href="http://stackoverflow.com/questions/6751922/what-practice-to-use-for-html5-scoped-attribute">although this currently won&#39;t validate</a>). Using a <code>&lt;style&gt;</code> tag this way is only marginally different than the usage of <code>&lt;source&gt;</code> as proposed in <a href="http://www.w3.org/community/respimg/2012/03/07/14/">the picturefill method</a> and it&#39;s certainly less confusing than the <a href="http://lists.w3.org/Archives/Public/public-whatwg-archive/2012May/0247.html">srcset proposal</a>. Using CSS carries with it the benefit of a familiar, flexible syntax and broad browser support. This also avoids relying on an <a href="http://blog.cloudfour.com/the-real-conflict-behind-picture-and-srcset/">emerging and contentious standard</a>.</p>

<h3 id="start-with-a-regular-image">Start with a Regular Image</h3>

<p>To start, we need a regular <code>&lt;img&gt;</code> that we wish was responsive. The example below is just that: a boring old image that doesn&#39;t do anything special.</p>

<figure class='code'><figcaption>step-0.html<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">&quot;road.jpg&quot;</span> <span class="na">alt=</span><span class="s">&quot;A road in Sweden during winter.&quot;</span><span class="nt">&gt;</span>
</div></pre></td></tr></table></div></figure>

<p><strong>Example:</strong> <em><a href="http://heygrady.com/assets/adaptive-image-example/step-0.html">See a live example</a> even though this isn&#39;t responsive and is just a regular image.</em></p>

<h3 id="step-1-use-a-span">Step 1: Use a SPAN</h3>

<p>In order to fake an image using CSS, we need to start with a <code>&lt;span&gt;</code>. Because a <code>&lt;span&gt;</code> is inline by default, <a href="http://www.quirksmode.org/css/display.html"><code>display: inline-block</code> is supported on that element in IE6 and IE7</a>. There&#39;s long been a usable <a href="http://blog.mozilla.org/webdev/2009/02/20/cross-browser-inline-block/">hasLayout hack that makes IE6 and IE7 apply inline-block to any element</a> but &mdash; to me at least &mdash; a <code>&lt;span&gt;</code> is already closer to the image layout we want before any styles have been applied. For now we&#39;ll place the alt text inside the <code>&lt;span&gt;</code> but we&#39;ll fix that in the next step.</p>

<p>Below you can see a simple <code>&lt;span&gt;</code> with an <code>.image</code> class ready to be styled.</p>

<figure class='code'><figcaption>step-1.html<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;image&quot;</span><span class="nt">&gt;</span>A road in Sweden during winter.<span class="nt">&lt;/span&gt;</span>
</div></pre></td></tr></table></div></figure>

<p><strong>Example:</strong> <em><a href="http://heygrady.com/assets/adaptive-image-example/step-1.html">See a live example</a> although there&#39;s not much to see yet.</em></p>

<p><strong>NOTE:</strong> You could use a fictional tag like <code>&lt;picture&gt;</code> instead of <code>&lt;span&gt;</code> but that would require a <a href="http://ejohn.org/blog/html5-shiv/">shim for IE6, IE7 and IE8</a>. You could also use <code>&lt;div&gt;</code> instead of <code>&lt;span&gt;</code> without any adverse effects.</p>

<h3 id="step-2-add-an-aria-role">Step 2: Add an ARIA Role</h3>

<p><a href="http://www.w3.org/WAI/intro/aria.php">ARIA</a> supplies <a href="http://www.w3.org/TR/wai-aria/roles#img">a <code>role=&quot;img&quot;</code> for a container that visually represents an image</a>. Applying this will help ARIA-enabled browsers understand what this <code>&lt;span&gt;</code> is used for. ARIA also specifies that the <code>role=&quot;img&quot;</code> is not labeled by its contents so we need to move the alt text to the <code>aria-label</code> attribute.</p>

<p>Below you can see the <code>&lt;span&gt;</code> with an ARIA <code>role</code> applied and the alt text moved to an ARIA label.</p>

<figure class='code'><figcaption>step-2.html<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;image&quot;</span> <span class="na">role=</span><span class="s">&quot;img&quot;</span> <span class="na">aria-label=</span><span class="s">&quot;A road in Sweden during winter.&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div></pre></td></tr></table></div></figure>

<p><strong>Example:</strong> <em><a href="http://heygrady.com/assets/adaptive-image-example/step-2.html">See a live example</a> although there&#39;s still not much to see.</em></p>

<h3 id="step-3-generic-styles-for-all-images">Step 3: Generic Styles for All Images</h3>

<p>Now that we&#39;ve got the mark-up for an accessible image, we need to make it behave like an image using some CSS. This CSS is generic to all <code>.image</code> elements and can be placed in your global stylesheets.</p>

<p>First we&#39;ll use <a href="http://compass-style.org/">Compass</a> to generate our generic styles. Although Compass isn&#39;t available in a browser, it&#39;s a good start for generating the default styles needed for our new <code>.image</code> elements. Compass already has some mixins for <a href="http://compass-style.org/reference/compass/css3/inline_block/">cross-browser inline-block</a>, <a href="http://compass-style.org/reference/compass/typography/text/replacement/#mixin-squish-text">squishing text</a> and <a href="http://compass-style.org/reference/compass/css3/background_size/">vendor-prefixed background-size</a>. This helps immensely because they&#39;ve already done the research for us to make this work seamlessly across all browsers. (If you&#39;re unfamiliar, learn how to <a href="http://thesassway.com/beginner/getting-started-with-sass-and-compass">get started with Sass and Compass</a>.)</p>

<ul>
<li><code>display: inline-block</code> makes the <code>&lt;span&gt;</code> behave like an <code>&lt;img&gt;</code>. Inline-block allows the element to follow the document flow like an inline element but it can also have dimension (height and width) like a block element. Here&#39;s <a href="http://designshack.net/articles/css/whats-the-deal-with-display-inline-block/">an article about inline-block</a>.</li>
<li>Squishing text is preferred to hiding text in this case because of <a href="http://www.zeldman.com/2012/03/01/replacing-the-9999px-hack-new-image-replacement/">some issues with text-indent in mobile WebKit</a>.</li>
<li><code>background-size: 100%</code> forces the background image to stretch to the full size of the element so that it behaves like a real image. Read about <a href="https://developer.mozilla.org/en/CSS/background-size"><code>background-size</code> on MDN</a>.</li>
<li><code>background-position: 50% 50%</code> helps out browsers that don&#39;t support <code>background-size</code> by keeping the image centered in the <code>.image</code>.</li>
<li><code>background-repeat: no-repeat</code> keeps the background from repeating.</li>
</ul>

<p>Below is the example SCSS code that was used to generate the generic CSS needed for this technique. Again, generating styles with Compass is an unnecessary step in this case but it was included as a shortcut explanation for all of the crazy styles required for cross-browser support.</p>

<figure class='code'><figcaption>generic.scss<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div></pre></td><td class='main  scss'><pre><div class='line'><span class="k">@import</span> <span class="s2">&quot;compass/css3/inline-block&quot;</span><span class="p">;</span>
</div><div class='line'><span class="k">@import</span> <span class="s2">&quot;compass/typography/text/replacement&quot;</span><span class="p">;</span>
</div><div class='line'><span class="k">@import</span> <span class="s2">&quot;compass/css3/background-size&quot;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="nc">.image</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> inline-block</span><span class="p">;</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> squish-text</span><span class="p">;</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> background-size</span><span class="p">(</span><span class="mi">100</span><span class="kt">%</span><span class="p">);</span>
</div><div class='line'>  <span class="na">background-position</span><span class="o">:</span> <span class="mi">50</span><span class="kt">%</span> <span class="mi">50</span><span class="kt">%</span><span class="p">;</span>
</div><div class='line'>  <span class="na">background-repeat</span><span class="o">:</span> <span class="no">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<p>Once compiled, the SCSS code above looks like the following CSS. The generic styles for <code>.image</code> can be shared for all responsive images on the page. That helps make the specific styles for the individual responsive images more compact and readable. The code below is ready to use and should be placed in your site&#39;s global stylesheets.</p>

<figure class='code'><figcaption>generic.css<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nc">.image</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">display</span><span class="o">:</span> <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="k">inline</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">orient</span><span class="o">:</span> <span class="n">vertical</span><span class="p">;</span>
</div><div class='line'>  <span class="k">display</span><span class="o">:</span> <span class="k">inline</span><span class="o">-</span><span class="k">block</span><span class="p">;</span>
</div><div class='line'>  <span class="k">vertical-align</span><span class="o">:</span> <span class="k">middle</span><span class="p">;</span>
</div><div class='line'>  <span class="o">*</span><span class="k">vertical-align</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span>
</div><div class='line'>  <span class="k">font</span><span class="o">:</span> <span class="m">0</span><span class="o">/</span><span class="m">0</span> <span class="k">serif</span><span class="p">;</span>
</div><div class='line'>  <span class="k">text-shadow</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</div><div class='line'>  <span class="k">color</span><span class="o">:</span> <span class="k">transparent</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="k">background</span><span class="o">-</span><span class="k">size</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="k">background</span><span class="o">-</span><span class="k">size</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">o</span><span class="o">-</span><span class="k">background</span><span class="o">-</span><span class="k">size</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background</span><span class="o">-</span><span class="k">size</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background-position</span><span class="o">:</span> <span class="m">50</span><span class="o">%</span> <span class="m">50</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background-repeat</span><span class="o">:</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.image</span> <span class="p">{</span>
</div><div class='line'>  <span class="o">*</span><span class="k">display</span><span class="o">:</span> <span class="k">inline</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<p><strong>Example:</strong> <em><a href="http://heygrady.com/assets/adaptive-image-example/step-3.html">See a live example</a> although there&#39;s yet again not much to see.</em></p>

<p><strong>NOTE:</strong> IE6, IE7 and IE8 (and some other legacy browsers) don&#39;t support <code>background-size</code>. This only affects those browser&#39;s ability to scale the image. It will work just fine for a fixed-dimension image that is shown at its default size. See <a href="http://caniuse.com/background-img-opts">background-size support on When Can I Use</a>. It&#39;s important to note that <a href="http://caniuse.com/css-mediaqueries">support for media queries</a> closely matches support for <code>background-size</code>. Basically it&#39;s safe to assume that a browser that doesn&#39;t support media queries also doesn&#39;t support background-size and vice versa. So your fall-back styles in the next step should take that limitation into account.</p>

<h3 id="step-4-specific-styles-for-the-individual-image">Step 4: Specific Styles for the Individual Image</h3>

<p>Now it&#39;s time to apply the background image to our <code>&lt;span&gt;</code>. We don&#39;t want to place these styles in the global stylesheet because our image is specific to the content of our page. The rule of thumb is that if you&#39;d normally use an <code>&lt;img&gt;</code> you probably want it to be in-page using this technique. For each image we&#39;ll be placing a <code>&lt;style&gt;</code> element just above it. Each image also needs a unique ID to make sure our styles are applied to the correct image. Although placing a <code>&lt;style&gt;</code> element in the body is not technically allowed in HTML, it actually works just fine in all browsers.</p>

<p>For each media query we need to provide a background image and a height and width. The result is very similar to the mark-up for <a href="https://github.com/scottjehl/picturefill#markup-pattern-and-explanation">the Picturefill solution proposed for the <code>&lt;picture&gt;</code> tag</a>. Although using a <code>&lt;style&gt;</code> tag is decidedly more verbose &mdash; CSS is not known for brevity &mdash; it doesn&#39;t require the weird duplicative HTML comments <code>&lt;picture&gt;</code> requires for full browser support. Plus, a pure CSS method doesn&#39;t require any JavaScript whatsoever.</p>

<p>The example below shows the <code>&lt;style&gt;</code> element just above our <code>&lt;span&gt;</code> with all of the styles for our responsive image. In this example the fall-back is the desktop version but otherwise a <a href="http://www.stuffandnonsense.co.uk/blog/about/this_is_the_new_320_and_up">mobile first approach</a> is used in the media queries. The media queries below are simple examples and your project will undoubtedly require <a href="http://www.palantir.net/re-thinking-breakpoints">different break points</a>.</p>

<ul>
<li>The fall-back should probably be the default desktop image.</li>
<li>Each media query should supply a <code>background-image</code> as well as the <code>height</code> and <code>width</code> because the browser can&#39;t guess the size of a background image the way it can with regular <code>&lt;img&gt;</code> elements.</li>
<li>Other necessary styles like <code>display: inline-block</code> and <code>background-size: 100%</code> are handled by the global CSS styles described in <a href="#step-3-generic-styles-for-all-images">step 3 above</a>.</li>
<li>The <code>&lt;span&gt;</code> must be given a unique ID to ensure that styles are applied correctly.</li>
</ul>

<figure class='code'><figcaption>step-4.html<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;style&gt;</span>
</div><div class='line'>  <span class="c">/* fall-back styles for browsers without media query support (IE6-8) */</span>
</div><div class='line'>  <span class="nf">#road</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;road.jpg&#39;)</span><span class="p">;</span>
</div><div class='line'>    <span class="k">height</span><span class="o">:</span> <span class="m">681px</span><span class="p">;</span>
</div><div class='line'>    <span class="k">width</span><span class="o">:</span> <span class="m">1024px</span><span class="p">;</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c">/* small image for mobile */</span>
</div><div class='line'>  <span class="k">@media</span> <span class="o">(</span><span class="nt">min-width</span><span class="o">:</span> <span class="nt">0px</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="nf">#road</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;road-small.jpg&#39;)</span><span class="p">;</span>
</div><div class='line'>      <span class="k">height</span><span class="o">:</span> <span class="m">213px</span><span class="p">;</span>
</div><div class='line'>      <span class="k">width</span><span class="o">:</span> <span class="m">320px</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c">/* medium image for tablets */</span>
</div><div class='line'>  <span class="k">@media</span> <span class="o">(</span><span class="nt">min-width</span><span class="o">:</span> <span class="nt">640px</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="nf">#road</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;road-medium.jpg&#39;)</span><span class="p">;</span>
</div><div class='line'>      <span class="k">height</span><span class="o">:</span> <span class="m">426px</span><span class="p">;</span>
</div><div class='line'>      <span class="k">width</span><span class="o">:</span> <span class="m">640px</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c">/* large image for desktop */</span>
</div><div class='line'>  <span class="k">@media</span> <span class="o">(</span><span class="nt">min-width</span><span class="o">:</span> <span class="nt">1024px</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="nf">#road</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;road.jpg&#39;)</span><span class="p">;</span>
</div><div class='line'>      <span class="k">height</span><span class="o">:</span> <span class="m">681px</span><span class="p">;</span>
</div><div class='line'>      <span class="k">width</span><span class="o">:</span> <span class="m">1024px</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="nt">&lt;/style&gt;</span>
</div><div class='line'><span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;road&quot;</span> <span class="na">class=</span><span class="s">&quot;image&quot;</span> <span class="na">role=</span><span class="s">&quot;img&quot;</span> <span class="na">aria-label=</span><span class="s">&quot;A road in Sweden during winter.&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div></pre></td></tr></table></div></figure>

<p><strong>Example:</strong> <em><a href="http://heygrady.com/assets/adaptive-image-example/step-4.html">See a live example</a>; now we&#39;re in business.</em></p>

<p><strong>NOTE:</strong> Although the vast majority of examples on the web recommend adding the smallest, mobile optimized image as the fall-back, I prefer to supply the default desktop image to the browsers that don&#39;t support media queries. The only browsers that get the fall-back image are browsers that don&#39;t support media queries, and those browsers are almost exclusively IE6, IE7 and IE8. Supplying the mobile image as the fall-back is silly considering that there aren&#39;t any mobile browsers with any noticeable marketshare that require the fall-back. The mobile browsers we&#39;re targeting all support media queries.</p>

<p>In general, I&#39;m of the opinion that browsers that don&#39;t natively support responsive design should simply be served the vanilla desktop experience, since that&#39;s almost certainly what those users were expecting anyway.</p>

<h3 id="step-5-add-in-scoped">Step 5: Add in Scoped</h3>

<p>To make ourselves feel better about using invalid markup, let&#39;s add <code>scoped</code> to our style tag to at least <a href="http://html5doctor.com/the-scoped-attribute/">conform to the new HTML5 standard</a>. This won&#39;t make our code validate any better than it would have otherwise and support for the <code>scoped</code> attribute is currently non-existent.</p>

<p>The lack of support for <code>scoped</code> means that we&#39;ll have to keep using the <code>id</code> in our styles instead of being able to use more generic <code>.image</code> to add the background image and dimensions. That&#39;s ok though; we&#39;re only adding in the scoped attribute to appear to be writing valid markup and to hopefully prepare for future compatibility and validity. WebKit already has experimental support and other browsers are sure to follow.</p>

<p>Scoped <code>&lt;style&gt;</code> elements need a wrapper element to define, well&hellip;the scope. If we use an inline element like a <code>&lt;span&gt;</code> as the wrapper it will automatically shrink-wrap our responsive image and not have any negative effect on our layout. (**UPDATE:** It appears that <a href="http://validator.w3.org/check?uri=http%3A%2F%2Fheygrady.com%2Fassets%2Fadaptive-image-example%2Fproportional-step-3.html&amp;charset=%28detect+automatically%29&amp;doctype=HTML5&amp;group=0">inline elements are not valid style scopes</a>)</p>

<p>Below you can see the identical markup from <a href="#step-4-specific-styles-for-the-individual-image">step 4</a> with the addition of the <code>scoped</code> attribute and a new <code>.image-scope</code> element. The <code>.image-scope</code> element doesn&#39;t require any additional styles because it is a <code>&lt;span&gt;</code> and is <code>display: inline</code> already.</p>

<figure class='code'><figcaption>step-5.html<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;image-scope&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;style </span><span class="na">scoped</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="c">/* fall-back styles for browsers without media query support (IE6-8) */</span>
</div><div class='line'>    <span class="nf">#road</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;road.jpg&#39;)</span><span class="p">;</span>
</div><div class='line'>      <span class="k">height</span><span class="o">:</span> <span class="m">681px</span><span class="p">;</span>
</div><div class='line'>      <span class="k">width</span><span class="o">:</span> <span class="m">1024px</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c">/* small image for mobile */</span>
</div><div class='line'>    <span class="k">@media</span> <span class="o">(</span><span class="nt">min-width</span><span class="o">:</span> <span class="nt">0px</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>      <span class="nf">#road</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;road-small.jpg&#39;)</span><span class="p">;</span>
</div><div class='line'>        <span class="k">height</span><span class="o">:</span> <span class="m">213px</span><span class="p">;</span>
</div><div class='line'>        <span class="k">width</span><span class="o">:</span> <span class="m">320px</span><span class="p">;</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c">/* medium image for tablets */</span>
</div><div class='line'>    <span class="k">@media</span> <span class="o">(</span><span class="nt">min-width</span><span class="o">:</span> <span class="nt">640px</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>      <span class="nf">#road</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;road-medium.jpg&#39;)</span><span class="p">;</span>
</div><div class='line'>        <span class="k">height</span><span class="o">:</span> <span class="m">426px</span><span class="p">;</span>
</div><div class='line'>        <span class="k">width</span><span class="o">:</span> <span class="m">640px</span><span class="p">;</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c">/* large image for desktop */</span>
</div><div class='line'>    <span class="k">@media</span> <span class="o">(</span><span class="nt">min-width</span><span class="o">:</span> <span class="nt">1024px</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>      <span class="nf">#road</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;road.jpg&#39;)</span><span class="p">;</span>
</div><div class='line'>        <span class="k">height</span><span class="o">:</span> <span class="m">681px</span><span class="p">;</span>
</div><div class='line'>        <span class="k">width</span><span class="o">:</span> <span class="m">1024px</span><span class="p">;</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="nt">&lt;/style&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;road&quot;</span> <span class="na">class=</span><span class="s">&quot;image&quot;</span> <span class="na">role=</span><span class="s">&quot;img&quot;</span> <span class="na">aria-label=</span><span class="s">&quot;A road in Sweden during winter.&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'><span class="nt">&lt;/span&gt;</span>
</div></pre></td></tr></table></div></figure>

<p><strong>Example:</strong> <em><a href="http://heygrady.com/assets/adaptive-image-example/step-5.html">See a live example</a> that looks exactly the same as <a href="#step-4-specific-styles-for-the-individual-image">step 4</a>.</em></p>

<p><strong>NOTE:</strong> Because of the lack of browser support for <code>scoped</code>, this step is completely optional and only serves to make the mark-up slightly more compliant. Even then, using <code>scoped</code> is pretty controversial &mdash; there&#39;s severe backwards compatibility issues &mdash; and you may wish to skip it altogether.</p>

<h2 id="part-2-proportionally-scaling-responsive-images">Part 2: Proportionally Scaling Responsive Images</h2>

<p>When working with responsive design, it&#39;s becoming increasingly popular to use fluid layouts to ensure that the content is fitting the screen properly. When using a normal <code>&lt;img&gt;</code> it&#39;s easy to support scalable dimensions by defining only the width of the image with a percentage and letting the browser proportionally scale the image height. Although it requires some ingenuity, the responsive image techniques described above can also be combined with <a href="http://haslayout.net/css-tuts/CSS-Proportional-Image-Scale">proportional scaling</a>.</p>

<h3 id="normal-example">Normal Example</h3>

<p>Below is an example of how this is handled with a normal image. The <code>&lt;img&gt;</code> will scale proportionally, meaning the width will always match the width of its container. The height will always be the appropriate height. This way the image will never appear stretched or distorted. This trick is useful for fluid layouts where you don&#39;t know the exact width of the column.</p>

<figure class='code'><figcaption>proportional-step-0.html<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="c">&lt;!-- This image will scale proportionally to be the full width of the column --&gt;</span>
</div><div class='line'><span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">&quot;road.jpg&quot;</span> <span class="na">alt=</span><span class="s">&quot;A road in Sweden during winter.&quot;</span> <span class="na">width=</span><span class="s">&quot;100%&quot;</span><span class="nt">&gt;</span>
</div></pre></td></tr></table></div></figure>

<p><strong>Example:</strong> <em><a href="http://heygrady.com/assets/adaptive-image-example/proportional-step-0.html">See a live example</a> even though this isn&#39;t responsive and is just a regular image. It does scale proportionally though.</em></p>

<h3 id="step-1-adding-an-inner-element">Step 1: Adding an Inner Element</h3>

<p>Background images can&#39;t affect layout, which forces us to define a fixed height and width to use the responsive techniques outlined above. So it&#39;s not immediately obvious how to proportionally scale the height of the <code>&lt;span&gt;</code>. The solution is to use a percentage <code>padding-top</code> on an inner element to provide the proportionate height (see <a href="https://developer.mozilla.org/en/CSS/padding">padding on MDN</a>).</p>

<p>For <code>padding</code>, percentages are defined relative to the parent element&#39;s width. Somewhat counter-intuitively, <code>padding-top</code> is <em>also</em> defined as a percentage of the parent element&#39;s width &mdash; not the height as you might expect. Using <code>padding-top</code> on an inner element allows the height to be proportionally scaled.</p>

<p>Below is the <code>.image</code> as described above with an additional <code>.inner</code> element.</p>

<figure class='code'><figcaption>proportional-step-1.html<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;road&quot;</span> <span class="na">class=</span><span class="s">&quot;image&quot;</span> <span class="na">role=</span><span class="s">&quot;img&quot;</span> <span class="na">aria-label=</span><span class="s">&quot;A road in Sweden during winter.&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;inner&quot;</span><span class="nt">&gt;&lt;/span&gt;&lt;/span&gt;</span>
</div></pre></td></tr></table></div></figure>

<p><strong>Example:</strong> <em><a href="http://heygrady.com/assets/adaptive-image-example/proportional-step-1.html">See a live example</a> although it doesn&#39;t scale yet.</em></p>

<h3 id="step-2-adding-more-generic-styles">Step 2: Adding More Generic Styles</h3>

<p>The <code>.inner</code> element needs to be set to <code>display: block</code> so that it can have dimensions applied. The <code>height: 0</code> is required because it gets its height from padding that is applied in the <code>&lt;style&gt;</code> element. The CSS below should be added to the generic CSS created in <a href="#step-3-generic-styles-for-all-images">step 3 above</a>.</p>

<figure class='code'><figcaption>proportional.css<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="c">/* additional generic styles to be added to the styles from step 3 above */</span>
</div><div class='line'><span class="nc">.image</span> <span class="nc">.inner</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">display</span><span class="o">:</span> <span class="k">block</span><span class="p">;</span>
</div><div class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<p><strong>Example:</strong> <em><a href="http://heygrady.com/assets/adaptive-image-example/proportional-step-2.html">See a live example</a> although it still doesn&#39;t scale.</em></p>

<h3 id="step-3-responsive-proportionally-scaled-images">Step 3: Responsive, Proportionally-Scaled Images</h3>

<p>As mentioned above, the height of the <code>.inner</code> element comes from a percentage applied to <code>padding-top</code>. The percentage is calculated by dividing the height of the source image by the width. For instance, if an image is 200 pixels wide and 100 pixels tall, the <code>padding-top</code> would be 50% (100px / 200px * 100% = 50%).</p>

<p>The example below allows the responsive image to scale proportionally.</p>

<figure class='code'><figcaption>proportional-step-3.html<a href='https://gist.github.com/2815664'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;image-scope&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;style </span><span class="na">scoped</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="c">/* fall-back styles for browsers without media query support (IE6-8) */</span>
</div><div class='line'>    <span class="nf">#road</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;road.jpg&#39;)</span><span class="p">;</span>
</div><div class='line'>      <span class="k">width</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>      <span class="c">/* don&#39;t define a height on the .image */</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>    <span class="nf">#road</span> <span class="nc">.inner</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">padding-top</span><span class="o">:</span> <span class="m">66</span><span class="o">.</span><span class="m">5039</span><span class="o">%</span><span class="p">;</span> <span class="c">/* 681px / 1024px * 100% = 66.5039% */</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c">/* small image for mobile */</span>
</div><div class='line'>    <span class="k">@media</span> <span class="o">(</span><span class="nt">min-width</span><span class="o">:</span> <span class="nt">0px</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>      <span class="nf">#road</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;road-small.jpg&#39;)</span><span class="p">;</span>
</div><div class='line'>        <span class="c">/* width of 100% is inherited from the fall-back styles */</span>
</div><div class='line'>        <span class="c">/* don&#39;t define a height on the .image */</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>      <span class="nf">#road</span> <span class="nc">.inner</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">padding-top</span><span class="o">:</span> <span class="m">66</span><span class="o">.</span><span class="m">5625</span><span class="o">%</span><span class="p">;</span> <span class="c">/* 213px / 320px * 100% = 66.5625% */</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c">/* medium image for tablets */</span>
</div><div class='line'>    <span class="k">@media</span> <span class="o">(</span><span class="nt">min-width</span><span class="o">:</span> <span class="nt">640px</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>      <span class="nf">#road</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;road-medium.jpg&#39;)</span><span class="p">;</span>
</div><div class='line'>        <span class="c">/* width of 100% is inherited from the fall-back styles */</span>
</div><div class='line'>        <span class="c">/* don&#39;t define a height on the .image */</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>      <span class="nf">#road</span> <span class="nc">.inner</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">padding-top</span><span class="o">:</span> <span class="m">66</span><span class="o">.</span><span class="m">5625</span><span class="o">%</span><span class="p">;</span> <span class="c">/* 426px / 640px * 100% = 66.5625% */</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c">/* large image for desktop */</span>
</div><div class='line'>    <span class="k">@media</span> <span class="o">(</span><span class="nt">min-width</span><span class="o">:</span> <span class="nt">1024px</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>      <span class="nf">#road</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;road.jpg&#39;)</span><span class="p">;</span>
</div><div class='line'>        <span class="c">/* width of 100% is inherited from the fall-back styles */</span>
</div><div class='line'>        <span class="c">/* don&#39;t define a height on the .image */</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>      <span class="nf">#road</span> <span class="nc">.inner</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">padding-top</span><span class="o">:</span> <span class="m">66</span><span class="o">.</span><span class="m">5039</span><span class="o">%</span><span class="p">;</span> <span class="c">/* 681px / 1024px * 100% = 66.5039% */</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="nt">&lt;/style&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;road&quot;</span> <span class="na">class=</span><span class="s">&quot;image&quot;</span> <span class="na">role=</span><span class="s">&quot;img&quot;</span> <span class="na">aria-label=</span><span class="s">&quot;A road in Sweden during winter.&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;inner&quot;</span><span class="nt">&gt;&lt;/span&gt;&lt;/span&gt;</span>
</div><div class='line'><span class="nt">&lt;/span&gt;</span>
</div></pre></td></tr></table></div></figure>

<p><strong>Example:</strong> <em><a href="http://heygrady.com/assets/adaptive-image-example/proportional-step-3.html">See a live example</a> that should scale proportionally as expected in browsers that support <code>background-size</code>.</em></p>

<p><strong>NOTE:</strong> As mentioned above, proportional scaling will only work in browsers that support <code>background-size</code>. Unsupported browsers will simply show the background at full-size, centered inside the <code>&lt;span&gt;</code>. If the <code>&lt;span&gt;</code> is smaller than the image in IE8 and below, the image will appear clipped.</p>

<h2 id="conclusion">Conclusion</h2>

<p>This idea is in its infancy right now but I think it may be a good alternative to the many JavaScript-based solutions out there. The positive side is that it makes it simple to supply media queries for creating responsive/responsive images and it doesn&#39;t use any JavaScript at all. The negative side is that the markup isn&#39;t 100% valid and the CSS can get a little verbose. At the same time, none of the other proposed solutions have a particularly clean syntax either. The <code>&lt;picture&gt;</code> tag requires multiple <code>&lt;source&gt;</code> tags, each with their own media query and relies on JavaScript. The <code>srcset</code> proposal uses an alternate syntax to media queries, is not easy to understand and also will require JavaScript to function cross-browser.</p>

<p>The biggest concern is how to roll out responsive images over a large organization. What happens if a large corporation upgrades their website with a new responsive design to take full advantage of the rapidly growing mobile market? Should they roll out the <code>&lt;picture&gt;</code> tag or the <code>srcset</code> solutions? Should they roll out a complicated <code>&lt;style scoped&gt;</code> solution like what&#39;s proposed above? No matter what path is chosen, the result is going to be slightly messy because there are no CMS that currently provide a nice solution for managing responsive images across a large organization.</p>

<p>Although most people are probably not going to be comfortable faking images using a <code>&lt;span&gt;</code> and an embedded <code>&lt;style&gt;</code> tag, I believe the immediate browser support and predictable behavior of this solution make it a compelling addition to the responsive image conversation.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Compass Grid Plugin and A New Fluid Grid Option]]></title>
<link href="http://heygrady.com/blog/2012/04/20/compass-grid-gem-and-new-fluid-grid/"/>
<updated>2012-04-20T23:17:00-07:00</updated>
<id>http://heygrady.com/blog/2012/04/20/compass-grid-gem-and-new-fluid-grid</id>
<category term="compass" /><category term="css" /><category term="grid" /><category term="sass" />

      <content type="html"><![CDATA[<p>In a previous post on <a href="http://heygrady.com/blog/2011/02/17/using-sass-with-the-1kb-grid-system/">using Sass with the 1KB CSS Grid</a>, I reviewed in depth the concept of using Sass and Compass to remove unnecessary classes from your HTML markup, and recommended usimg mixins instead. After using this grid on my own projects for the past year I&#39;ve finally created a Ruby Gem called <a href="http://rubygems.org/gems/compass-grid-plugin">compass-grid-plugin</a> and I&#39;ve updated the <a href="https://github.com/heygrady/compass-grid-plugin">GitHub repository</a> to include a fluid grid option as well. For now I&#39;m calling it &ldquo;Grid&rdquo; because that&#39;s what I&#39;ve been calling it. The fluid grid will be documented below.</p>

<ul>
<li><a href="https://github.com/heygrady/compass-grid-plugin">Grid on Github</a></li>
<li><a href="http://rubygems.org/gems/compass-grid-plugin">Grid on Ruby Gems</a></li>
</ul>

<!--more-->

<h2 id="introducing-grid">Introducing Grid</h2>

<p>Although this grid plugin is inspired by the 1KB CSS Grid, it&#39;s not simply the Sass version of that grid. So I&#39;ve opted to rename the grid to simply &ldquo;Grid&rdquo; and gobbled up the &ldquo;compass-grid-plugin&rdquo; gem name because some <a href="http://wizzart.at/about.html">Austrian guy</a> already has &ldquo;<a href="http://rubygems.org/gems/compass-grid">compass-grid</a>&rdquo; (it&#39;s helpful that all of the other Compass grids use &ldquo;-plugin&rdquo; in the gem name also). That&#39;s the unimaginative name I&#39;m going with until someone asks me to use a name less confusingly generic. I could maybe be convinced to call it &ldquo;Pancakes&rdquo; or &ldquo;Simple.&rdquo;</p>

<h3 id="what-does-grid-do">What does Grid do?</h3>

<p>The point of Grid is to make grid math easier and make working with grids much more flexible. Old-school CSS-only grids require classes to be added to the markup and do not make working with the grid very easy. What happens when you need padding or a border on your column? What happens when the designer needs to cheat the grid in a few places? Compass Grid makes all of these situations much easier to handle because the measurements are not baked into the CSS and don&#39;t require hard-coded classes in the markup.</p>

<h3 id="how-is-grid-different-than-other-compass-grids">How is Grid different than other Compass grids?</h3>

<p>There&#39;s a few other notable Compass grids. Of course Compass has always shipped with <a href="http://compass-style.org/reference/blueprint/grid/">Blueprint</a> pre-installed. There&#39;s also a port of <a href="https://github.com/nextmat/compass-960-plugin">960.gs</a> as well as a relatively new entrant, <a href="https://github.com/ericam/compass-susy-plugin">Susy</a>. Someone has also ported <a href="https://github.com/diogob/compass-columnal-plugin">Columnal</a> to Compass. The original author of the 1KB CSS Grid has created <a href="http://semantic.gs/">The Semantic Grid System</a> to take advantage of Sass/Less and remove the need for classes in the markup. All of these Compass-powered grids are great and you should use them! But they all are a little more complicated than &ldquo;just a grid&rdquo; (with the exception of The Semantic Grid System). At a glance, I think the main differences between most other grids and Grid are as follows:</p>

<ul>
<li>Grid does not require Alpha and Omega. This is actually a big win for simplicity. Grid uses negative margins on the rows to accomplish the same thing.</li>
<li>Grid is designed specifically for cheating the grid using the <code>$plus</code> argument.</li>
<li>Grid is designed specifically to support row nesting.</li>
<li>Grid only does grid measurements and has no other capabilities.</li>
</ul>

<h2 id="installing-grid">Installing Grid</h2>

<h4>Install the Ruby Gem.</h4>

<figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  bash'><pre><div class='line'>gem install compass-grid-plugin
</div></pre></td></tr></table></div></figure>

<h4>Existing Compass Projects</h4>

<p>You can include it in any existing Compass project by adding it to your config.rb file.</p>

<figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="c1"># Require any additional compass plugins here.</span>
</div><div class='line'><span class="nb">require</span> <span class="s1">&#39;compass-grid&#39;</span>
</div></pre></td></tr></table></div></figure>

<h4>New Compass Projects</h4>

<figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  bash'><pre><div class='line'>compass create my_project -r compass-grid -u compass-grid
</div></pre></td></tr></table></div></figure>

<p>You can install the grid plugin as part of a new Compass project.</p>

<h2 id="introducing-fluid-grid">Introducing Fluid Grid</h2>

<ul>
<li>Documentation is available in the <a href="https://github.com/heygrady/compass-grid-plugin/blob/master/README.md">readme on Github</a></li>
</ul>

<p>While the original grid was pointedly <strong>not</strong> fluid, this new version does support fluid percentage-based grids. The original 1KB CSS Grid series by <a href="http://tylertate.com/">Tyler Tate</a> pointed out that <a href="http://www.usabilitypost.com/2009/06/19/the-1kb-css-grid-part-3/">nesting fluid grids can be difficult</a>. Very similar to <a href="http://susy.oddbird.net/">Susy</a> and <a href="http://www.columnal.com/">Columnal</a>, the fluid grid requires context in order to nest columns. This is because of the relative nature of percentages: 25% is a totally meaningless number by itself.</p>

<h3 id="basic-html">Basic HTML</h3>

<p>Just like the <a href="http://heygrady.com/blog/2011/02/17/using-sass-with-the-1kb-grid-system/">previous article</a>, we&#39;ll use a relatively simple 3-column layout for our page. The HTML below is a basic web page with a <code>header</code>, <code>footer</code>, and main area. For this example only the main area will contain columns. The <code>.main-column</code> will have two columns nested inside of it.</p>

<figure class='code'><figcaption>layout.html<a href='https://gist.github.com/2460901'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'>  ...
</div><div class='line'>  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;header&gt;</span>
</div><div class='line'>        <span class="nt">&lt;h1&gt;</span>Header<span class="nt">&lt;/h1&gt;</span>
</div><div class='line'>        <span class="nt">&lt;nav&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>Nav Link<span class="nt">&lt;/a&gt;&lt;/nav&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/header&gt;</span>
</div><div class='line'>    <span class="nt">&lt;div</span> <span class="na">role=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>      <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;left-column&quot;</span><span class="nt">&gt;</span>Left Column<span class="nt">&lt;/div&gt;</span>
</div><div class='line'>      <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;main-column&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;section</span> <span class="na">class=</span><span class="s">&quot;hero&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>          Hero Space, I take the full width
</div><div class='line'>        <span class="nt">&lt;/section&gt;</span>
</div><div class='line'>        <span class="nt">&lt;section&gt;</span>
</div><div class='line'>          <span class="nt">&lt;article</span> <span class="na">id=</span><span class="s">&quot;content&quot;</span><span class="nt">&gt;</span>Actual Content<span class="nt">&lt;/article&gt;</span>
</div><div class='line'>          <span class="nt">&lt;aside</span> <span class="na">id=</span><span class="s">&quot;right-column&quot;</span><span class="nt">&gt;</span>Right Column<span class="nt">&lt;/aside&gt;</span>
</div><div class='line'>        <span class="nt">&lt;/section&gt;</span>
</div><div class='line'>      <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>    <span class="nt">&lt;footer&gt;</span>
</div><div class='line'>      <span class="nt">&lt;p&gt;</span><span class="ni">&amp;copy;</span> Copyright 2011<span class="nt">&lt;/p&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/footer&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>  ...
</div></pre></td></tr></table></div></figure>

<h3 id="using-a-fixed-grid">Using a Fixed Grid</h3>

<ul>
<li><a href="http://heygrady.com/assets/compass-grid-example/fixed.html">Fixed grid example</a></li>
</ul>

<p>Before diving into the fluid grid, it&#39;s important to see how it works with the static grid because the two are highly related. Below is the SCSS for a normal fixed grid similar to the example from the <a href="http://heygrady.com/blog/2011/02/17/using-sass-with-the-1kb-grid-system/">previous post]</a>. Borders have been added to some of the elements to demonstrate how to use the grid correction features using the <code>$plus</code> argument available in all of the functions. </p>

<figure class='code'><figcaption>fixed.scss<a href='https://gist.github.com/2460901'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div></pre></td><td class='main  scss'><pre><div class='line'><span class="nv">$grid-clearfix-class</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">// import the grid</span>
</div><div class='line'><span class="k">@import</span> <span class="s2">&quot;grid&quot;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">// establishes page width and centers</span>
</div><div class='line'><span class="nn">#container</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-page</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// main page sections</span>
</div><div class='line'><span class="o">[</span><span class="nt">role</span><span class="o">=</span><span class="s2">&quot;main&quot;</span><span class="o">]</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-row</span><span class="p">(</span><span class="n-Pseudo">true</span><span class="p">);</span> <span class="c1">//true indicates a row is directly inside a page</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// header and footer don&#39;t have columns in this example</span>
</div><div class='line'><span class="nt">header</span><span class="o">,</span> <span class="nt">footer</span> <span class="p">{</span>
</div><div class='line'>  <span class="na">margin</span><span class="o">:</span> <span class="mi">0</span> <span class="nv">$grid-gutter-width</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span> <span class="c1">// margins, like full-width columns</span>
</div><div class='line'>  <span class="na">border</span><span class="o">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="no">solid</span> <span class="nb">black</span><span class="p">;</span>
</div><div class='line'>  <span class="na">margin-bottom</span><span class="o">:</span> <span class="nv">$grid-gutter-width</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// side columns</span>
</div><div class='line'><span class="nn">#left-column</span><span class="o">,</span> <span class="nn">#right-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-column</span><span class="p">(</span><span class="mi">3</span><span class="o">,</span> <span class="mi">-2</span><span class="kt">px</span><span class="p">);</span> <span class="c1">//3 columns wide, adjust for border</span>
</div><div class='line'>  <span class="na">border</span><span class="o">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="no">solid</span> <span class="nb">red</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// main column</span>
</div><div class='line'><span class="nn">#main-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-column</span><span class="p">(</span><span class="mi">9</span><span class="p">);</span> <span class="c1">//9 columns wide</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// sections in the main column are rows</span>
</div><div class='line'>  <span class="o">&gt;</span> <span class="nt">section</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">@include</span><span class="nd"> grid-row</span><span class="p">;</span>
</div><div class='line'>    <span class="na">margin-bottom</span><span class="o">:</span> <span class="nv">$grid-gutter-width</span><span class="p">;</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// hero sections don&#39;t have columns in this example</span>
</div><div class='line'>  <span class="o">&gt;</span> <span class="nt">section</span><span class="nc">.hero</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">border</span><span class="o">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="no">solid</span> <span class="nb">black</span><span class="p">;</span>
</div><div class='line'>    <span class="na">margin-left</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// remove the right and left margins because this isn&#39;t a row</span>
</div><div class='line'>    <span class="na">margin-right</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// center column</span>
</div><div class='line'><span class="nn">#content</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-column</span><span class="p">(</span><span class="mi">6</span><span class="o">,</span> <span class="mi">-2</span><span class="kt">px</span><span class="p">);</span> <span class="c1">//6 columns wide, adjust for border</span>
</div><div class='line'>  <span class="na">border</span><span class="o">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="no">solid</span> <span class="nb">blue</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.clearfix</span> <span class="p">{</span> <span class="k">@include</span><span class="nd"> pie-clearfix</span><span class="p">;</span> <span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<h4>Notes:</h4>

<ul>
<li>As you can see, <code>@include grid-column(6, -2px);</code> subtracts 2px from the calculated column width to account for the borders on the column. A six-columns-wide column is normally 460px but using the <code>$plus</code> argument of -2px, it becomes 458px.</li>
<li>Although all <code>section</code> elements in the <code>.main-column</code> are set to be rows, the <code>section.hero</code> doesn&#39;t have any sub-columns in this example so the normal negative margins are removed.</li>
</ul>

<h3 id="using-a-fluid-grid">Using a Fluid Grid</h3>

<ul>
<li><a href="http://heygrady.com/assets/compass-grid-example/fluid.html">Fluid grid example</a></li>
</ul>

<p>The fluid grid is set up similarly to the fixed grid, except the word &ldquo;grid&rdquo; is replaced by the word &ldquo;fluid&rdquo; in all of the mixins and functions. The fluid grid relies on the fixed grid for most of the width calculations and it also uses the same configuration options. The nested columns, <code>#right-column</code> and <code>#content</code>, require additional parameters to provide context because they are nested in the <code>#main-column</code>.</p>

<figure class='code'><figcaption>fluid.scss<a href='https://gist.github.com/2460901'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div><div data-line='56' class='line-number'></div><div data-line='57' class='line-number'></div><div data-line='58' class='line-number'></div><div data-line='59' class='line-number'></div><div data-line='60' class='line-number'></div><div data-line='61' class='line-number'></div><div data-line='62' class='line-number'></div><div data-line='63' class='line-number'></div><div data-line='64' class='line-number'></div><div data-line='65' class='line-number'></div><div data-line='66' class='line-number'></div><div data-line='67' class='line-number'></div><div data-line='68' class='line-number'></div><div data-line='69' class='line-number'></div><div data-line='70' class='line-number'></div><div data-line='71' class='line-number'></div></pre></td><td class='main  scss'><pre><div class='line'><span class="nv">$grid-clearfix-class</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">;</span> <span class="c1">// don&#39;t auto create the clearfix</span>
</div><div class='line'> </div><div class='line'><span class="c1">// import the grid</span>
</div><div class='line'><span class="k">@import</span> <span class="s2">&quot;grid/fluid&quot;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">// establishes page width and centers</span>
</div><div class='line'><span class="nn">#container</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> fluid-page</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// main page sections</span>
</div><div class='line'><span class="o">[</span><span class="nt">role</span><span class="o">=</span><span class="s2">&quot;main&quot;</span><span class="o">]</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> fluid-row</span><span class="p">(</span><span class="n-Pseudo">true</span><span class="p">);</span> <span class="c1">// row is directly inside a page</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// header and footer don&#39;t have columns in this example</span>
</div><div class='line'><span class="nt">header</span><span class="o">,</span> <span class="nt">footer</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> fluid-gutters</span><span class="p">;</span> <span class="c1">// gutters, like full-width columns</span>
</div><div class='line'>  <span class="na">border</span><span class="o">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="no">solid</span> <span class="nb">black</span><span class="p">;</span>
</div><div class='line'>  <span class="na">margin-bottom</span><span class="o">:</span> <span class="nv">$grid-gutter-width</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// column rules so that float and border-box aren&#39;t repeated</span>
</div><div class='line'><span class="nc">.column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> fluid-column</span><span class="p">(</span><span class="nv">$with-gutters</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">);</span> <span class="c1">// omit gutters</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// side columns</span>
</div><div class='line'><span class="nn">#left-column</span><span class="o">,</span> <span class="nn">#right-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@extend</span> <span class="nc">.column</span><span class="o">;</span>
</div><div class='line'>  <span class="nt">border</span><span class="nd">:</span> <span class="nt">1px</span> <span class="nt">solid</span> <span class="nt">red</span><span class="o">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nn">#left-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> fluid</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span> <span class="c1">//3 columns wide, don&#39;t adjust for border</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> fluid-gutters</span><span class="p">;</span> <span class="c1">// gutters</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nn">#right-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> fluid</span><span class="p">(</span><span class="mi">3</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">9</span><span class="p">);</span> <span class="c1">//3 columns wide, 9 column parent, don&#39;t adjust for border</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> fluid-gutters</span><span class="p">(</span><span class="mi">9</span><span class="p">);</span> <span class="c1">// gutters in a 9 column parent</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// main column</span>
</div><div class='line'><span class="nn">#main-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@extend</span> <span class="nc">.column</span><span class="o">;</span>
</div><div class='line'>  <span class="o">@</span><span class="nt">include</span> <span class="nt">fluid</span><span class="o">(</span><span class="nt">9</span><span class="o">);</span> <span class="o">//</span><span class="nt">9</span> <span class="nt">columns</span> <span class="nt">wide</span>
</div><div class='line'>  <span class="o">@</span><span class="nt">include</span> <span class="nt">fluid-gutters</span><span class="o">;</span> <span class="o">//</span> <span class="nt">gutters</span>
</div><div class='line'> </div><div class='line'>  <span class="o">//</span> <span class="nt">sections</span> <span class="nt">in</span> <span class="nt">the</span> <span class="nt">main</span> <span class="nt">column</span> <span class="nt">are</span> <span class="nt">rows</span>
</div><div class='line'>  <span class="o">&gt;</span> <span class="nt">section</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">@include</span><span class="nd"> fluid-row</span><span class="p">(</span><span class="n-Pseudo">false</span><span class="o">,</span> <span class="mi">9</span><span class="p">);</span>
</div><div class='line'>    <span class="na">margin-bottom</span><span class="o">:</span> <span class="nv">$grid-gutter-width</span><span class="p">;</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// hero sections don&#39;t have columns in this example</span>
</div><div class='line'>  <span class="o">&gt;</span> <span class="nt">section</span><span class="nc">.hero</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">border</span><span class="o">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="no">solid</span> <span class="nb">black</span><span class="p">;</span>
</div><div class='line'>    <span class="na">margin-left</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// remove the right and left margins because this isn&#39;t a row</span>
</div><div class='line'>    <span class="na">margin-right</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// center column</span>
</div><div class='line'><span class="nn">#content</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@extend</span> <span class="nc">.column</span><span class="o">;</span>
</div><div class='line'>  <span class="o">@</span><span class="nt">include</span> <span class="nt">fluid</span><span class="o">(</span><span class="nt">6</span><span class="o">,</span> <span class="nt">0</span><span class="o">,</span> <span class="nt">9</span><span class="o">);</span> <span class="o">//</span><span class="nt">6</span> <span class="nt">columns</span> <span class="nt">wide</span><span class="o">,</span> <span class="nt">don</span><span class="s1">&#39;</span><span class="s2">t adjust for border</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> fluid-gutters</span><span class="p">(</span><span class="mi">9</span><span class="p">);</span> <span class="c1">// gutters</span>
</div><div class='line'>  <span class="na">border</span><span class="o">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="no">solid</span> <span class="nb">blue</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// define our own clearfix</span>
</div><div class='line'><span class="nc">.clearfix</span> <span class="p">{</span> <span class="k">@include</span><span class="nd"> pie-clearfix</span><span class="p">;</span> <span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<h4>Notes:</h4>

<ul>
<li>Measurements that affect horizontal spacing, like <code>width</code>, <code>margin-left/right</code> and <code>padding-left/right</code>, should be provided in percentages as well to make sure everything scales well with the browser.</li>
<li>The <code>fluid-gutters</code> mixin returns left and right margins for a column.

<ul>
<li>The <code>fluid-width</code> function, combined with the <code>grid-column-width</code> function can be used to calculate margins as well.</li>
<li>Example: <code>margin: 0 fluid-width($grid-gutter-width/2, grid-column-width(9, $grid-gutter-width));</code></li>
<li>Fluid gutters are different for rows and columns. Columns are relative to the parent row (a row is wider by the width of the gutter). Rows are relative to the parent column which is narrower than a row by the width of the gutter.</li>
</ul></li>
<li>When calculating percentages on a child of a row, like <code>.row &gt; *</code>, it&#39;s important to remember that a row&#39;s width is the width of its containing column <em>plus</em> the <code>$grid-gutter-width</code>.

<ul>
<li>A nine-columns-wide column: <code>grid-column-width(9)</code></li>
<li>A nine-columns-wide row: <code>grid-column-width(9, $grid-gutter-width)</code></li>
</ul></li>
<li>There&#39;s no need to account for border or padding because all rows and columns have <code>box-sizing: border-box</code> applied. You can read more about <a href="https://developer.mozilla.org/En/CSS/Box-sizing">box-sizing on MDN</a>.

<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=243412">Box-sizing requires a prefix on Mozilla</a> which is being handled by the <a href="http://compass-style.org/reference/compass/css3/box_sizing/">Compass Box Sizing mixin</a></li>
<li><a href="http://caniuse.com/#feat=css3-boxsizing">Box-sizing isn&#39;t supported in IE7 or below</a></li>
</ul></li>
<li>Chrome/Safari/Opera, Firefox/IE8/IE9 and IE6/IE7 all disagree on how to handle fractional pixels.

<ul>
<li>Firefox and IE8/9 re-balance the columns so that some columns may be 1px too wide but the total of the columns is exact.</li>
<li>Chrome/Safari/Opera simply round down, resulting in all columns being 1px too narrow. This gets really messy when working with deeply nested columns.</li>
<li>IE6/7 rounds <em>up</em>, making all of the columns too wide and causing one to wrap.</li>
</ul></li>
<li>For now the fluid grid is designed for IE8 and above. Adding fixes for IE6 and IE7 may come later although there&#39;ll never be a way to bring in box-sizing support.</li>
</ul>

<h3 id="generated-css">Generated CSS</h3>

<p>For those that are curious, the CSS from the examples above looks like this.</p>

<h4 id="fixed-grid-generated-css">Fixed Grid Generated CSS</h4>

<figure class='code'><figcaption>fixed.css<a href='https://gist.github.com/2460901'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nf">#container</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">960px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="k">auto</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="o">[</span><span class="nt">role</span><span class="o">=</span><span class="s2">&quot;main&quot;</span><span class="o">]</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nt">header</span><span class="o">,</span> <span class="nt">footer</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">10px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="nb">black</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin-bottom</span><span class="o">:</span> <span class="m">20px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nf">#left-column</span><span class="o">,</span> <span class="nf">#right-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">10px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">float</span><span class="o">:</span> <span class="k">left</span><span class="p">;</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">218px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="nb">red</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nf">#main-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">10px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">float</span><span class="o">:</span> <span class="k">left</span><span class="p">;</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">700px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nf">#main-column</span> <span class="o">&gt;</span> <span class="nt">section</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">-10px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin-bottom</span><span class="o">:</span> <span class="m">20px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nf">#main-column</span> <span class="o">&gt;</span> <span class="nt">section</span><span class="nc">.hero</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="nb">black</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin-left</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin-right</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nf">#content</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">10px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">float</span><span class="o">:</span> <span class="k">left</span><span class="p">;</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">458px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="nb">blue</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.clearfix</span><span class="o">,</span> <span class="nf">#container</span><span class="o">,</span> <span class="o">[</span><span class="nt">role</span><span class="o">=</span><span class="s2">&quot;main&quot;</span><span class="o">],</span> <span class="nf">#main-column</span> <span class="o">&gt;</span> <span class="nt">section</span> <span class="p">{</span>
</div><div class='line'>  <span class="o">*</span><span class="n">zoom</span><span class="o">:</span> <span class="m">1</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.clearfix</span><span class="nd">:after</span><span class="o">,</span> <span class="nf">#container</span><span class="nd">:after</span><span class="o">,</span> <span class="o">[</span><span class="nt">role</span><span class="o">=</span><span class="s2">&quot;main&quot;</span><span class="o">]</span><span class="nd">:after</span><span class="o">,</span> <span class="nf">#main-column</span> <span class="o">&gt;</span> <span class="nt">section</span><span class="nd">:after</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">content</span><span class="o">:</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
</div><div class='line'>  <span class="k">display</span><span class="o">:</span> <span class="n">table</span><span class="p">;</span>
</div><div class='line'>  <span class="k">clear</span><span class="o">:</span> <span class="k">both</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<h4 id="fluid-grid-generated-css">Fluid Grid Generated CSS</h4>

<figure class='code'><figcaption>fluid.css<a href='https://gist.github.com/2460901'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div><div data-line='56' class='line-number'></div><div data-line='57' class='line-number'></div><div data-line='58' class='line-number'></div><div data-line='59' class='line-number'></div><div data-line='60' class='line-number'></div><div data-line='61' class='line-number'></div><div data-line='62' class='line-number'></div><div data-line='63' class='line-number'></div><div data-line='64' class='line-number'></div><div data-line='65' class='line-number'></div><div data-line='66' class='line-number'></div><div data-line='67' class='line-number'></div><div data-line='68' class='line-number'></div><div data-line='69' class='line-number'></div><div data-line='70' class='line-number'></div><div data-line='71' class='line-number'></div><div data-line='72' class='line-number'></div><div data-line='73' class='line-number'></div><div data-line='74' class='line-number'></div><div data-line='75' class='line-number'></div><div data-line='76' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nf">#container</span> <span class="p">{</span>
</div><div class='line'>  <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="k">max-width</span><span class="o">:</span> <span class="m">960px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="k">auto</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="o">[</span><span class="nt">role</span><span class="o">=</span><span class="s2">&quot;main&quot;</span><span class="o">]</span> <span class="p">{</span>
</div><div class='line'>  <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nt">header</span><span class="o">,</span> <span class="nt">footer</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">1</span><span class="o">.</span><span class="m">0416667</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="nb">black</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin-bottom</span><span class="o">:</span> <span class="m">20px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.column</span><span class="o">,</span> <span class="nf">#left-column</span><span class="o">,</span> <span class="nf">#right-column</span><span class="o">,</span> <span class="nf">#main-column</span><span class="o">,</span> <span class="nf">#content</span> <span class="p">{</span>
</div><div class='line'>  <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="k">float</span><span class="o">:</span> <span class="k">left</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nf">#left-column</span><span class="o">,</span> <span class="nf">#right-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="nb">red</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nf">#left-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">22</span><span class="o">.</span><span class="m">9166667</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">1</span><span class="o">.</span><span class="m">0416667</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nf">#right-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">30</span><span class="o">.</span><span class="m">5555556</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">1</span><span class="o">.</span><span class="m">3888889</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nf">#main-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">72</span><span class="o">.</span><span class="m">9166667</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">1</span><span class="o">.</span><span class="m">0416667</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nf">#main-column</span> <span class="o">&gt;</span> <span class="nt">section</span> <span class="p">{</span>
</div><div class='line'>  <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">-1</span><span class="o">.</span><span class="m">4285714</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin-bottom</span><span class="o">:</span> <span class="m">20px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nf">#main-column</span> <span class="o">&gt;</span> <span class="nt">section</span><span class="nc">.hero</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="nb">black</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin-left</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin-right</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nf">#content</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">63</span><span class="o">.</span><span class="m">8888889</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">1</span><span class="o">.</span><span class="m">3888889</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="nb">blue</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.clearfix</span><span class="o">,</span> <span class="nf">#container</span><span class="o">,</span> <span class="o">[</span><span class="nt">role</span><span class="o">=</span><span class="s2">&quot;main&quot;</span><span class="o">],</span> <span class="nf">#main-column</span> <span class="o">&gt;</span> <span class="nt">section</span> <span class="p">{</span>
</div><div class='line'>  <span class="o">*</span><span class="n">zoom</span><span class="o">:</span> <span class="m">1</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.clearfix</span><span class="nd">:after</span><span class="o">,</span> <span class="nf">#container</span><span class="nd">:after</span><span class="o">,</span> <span class="o">[</span><span class="nt">role</span><span class="o">=</span><span class="s2">&quot;main&quot;</span><span class="o">]</span><span class="nd">:after</span><span class="o">,</span> <span class="nf">#main-column</span> <span class="o">&gt;</span> <span class="nt">section</span><span class="nd">:after</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">content</span><span class="o">:</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
</div><div class='line'>  <span class="k">display</span><span class="o">:</span> <span class="n">table</span><span class="p">;</span>
</div><div class='line'>  <span class="k">clear</span><span class="o">:</span> <span class="k">both</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Building jQuery on Windows]]></title>
<link href="http://heygrady.com/blog/2012/01/04/building-jquery-on-windows/"/>
<updated>2012-01-04T13:02:00-08:00</updated>
<id>http://heygrady.com/blog/2012/01/04/building-jquery-on-windows</id>
<category term="jquery" /><category term="windows" />

      <content type="html"><![CDATA[<p>Like many things involving open source development, the jQuery project is designed to be worked on in a Unix-like environment such as OS X. Most regular people have a Windows machine (<a href="http://www.netmarketshare.com/operating-system-market-share.aspx?qprid=8">around 90%</a>) but <a href="http://sixrevisions.com/infographics/web-designers-vs-web-developers-infographic/">developers aren't regular people</a>. Regardless, I primarily develop on Windows and I recently wanted to work with the jQuery code base and found the instructions for setting up your environment on Windows to be a little outdated. Thankfully the open source world is getting much friendlier for Windows developers. This article covers the official jQuery instructions and my preferred setup.</p>
<!--more-->
<h2 id="existing-instructions">Existing Instructions</h2>
<p>Likely because the jQuery developers are busy with more important things, the documentation for actually setting up your environment to properly develop for jQuery is a little sparse. In the case of a Windows setup the documentation is also a little outdated and possibly overkill.</p>
<h4 id="the-instructions-jquery-provides">The Instructions jQuery Provides</h4>
<ul>
	<li>From the <a href="https://github.com/jquery/jquery">Readme on the jQuery GitHub</a>
		<ul>
			<li>Option 1: Install <a href="https://code.google.com/p/msysGit/downloads/list">msysGit</a>, <a href="http://gnuwin32.sourceforge.net/packages/make.htm">GNU Make</a> and <a href="http://nodejs.org/">Node.js</a>.</li>
			<li>Option 2: Install <a href="http://cygwin.com/">Cygwin</a> and <a href="http://nodejs.org/">Node.js</a>.</li>
		</ul>
	</li>
	<li>from the <a href="http://docs.jquery.com/Tips_for_jQuery_Bug_Patching">Tips for jQuery Bug Patching</a>
		<ul>
			<li>Use <a href="http://www.wampserver.com/en/">WAMP</a>.</li>
		</ul>
	</li>
</ul>
<h3 id="whats-outdated">What's Outdated</h3>
<h4 id="node-js">Node.js</h4>
<p>The links provided to Node.js on the jQuery GitHub page are to <a href="http://node-js.prcn.co.cc/">old binary builds of Node.js for Windows</a>. Node.js was recently updated with a <a href="http://blog.nodejs.org/2011/06/23/porting-node-to-windows-with-microsoft%E2%80%99s-help/">full installer for Windows thanks to Microsoft</a>. You can <a href="http://nodejs.org/#download">download Node.js for Widows here</a>.</p>
<h3 id="whats-overkill">What's Overkill</h3>
<h4 id="gnu-make">GNU Make</h4>
<p>If you install the full version of msysGit you shouldn't need to also install GNU Make (<a href="#msysgit-and-tortoisegit">more details below</a>). More importantly, When you install GNU Make by itself it actually doesn't work. The jQuery make file is filled with Linux-specific shell commands that Windows doesn't support natively so the build will always fail. It's actually not possible to fix it by re-writing the Makefile to be Windows compatible because Windows batch files aren't as full-featured as a Linux shell script.</p>
<h4 id="cygwin">Cygwin</h4>
<p>Cygwin is a "collection of tools which provide a Linux look and feel environment for Windows." It's nothing too magical; it basically ports common command-line programs to Windows. For instance, normally in a Windows command prompt to get a director listing you'd have to type <code>dir</code> but on Linux you type <code>ls</code> and the results looks different. What Cygwin does is makes the <code>ls</code> command (and many others) work correctly on Windows. It doesn't, however, make Windows magically become Linux. The primary benefit is that programs that rely on Linux command-line tools (but don't require Linux specifically) can run on Windows using Cygwin. However, <a href="http://stackoverflow.com/questions/771756/what-is-the-difference-between-cygwin-and-mingw">Cygwin is a bit overkill for our purposes</a>. We don't need a "complete UNIX/POSIX environment on Windows."</p>
<p>Cygwin isn't necessary if you install the full version of msysGit (<a href="#msysgit-and-tortoisegit">more details below</a>).</p>
<h4 id="wamp">WAMP</h4>
<p>WAMP is a great tool for getting up and running with Apache, MySQL and PHP very quickly. There's no doubt that WAMP is extremely popular. However, for the sole purpose of running the jQuery unit tests it's a bit overkill. For instance, there's no need for MySQL at all and Apache is just <em>one</em> way to run PHP in Windows.</p>
<h2 id="better-instructions">Better Instructions</h2>
<ol>
	<li>Install <a href="https://code.google.com/p/msysGit/downloads/list">msysGit-netinstall</a> (<a href="https://code.google.com/p/msysgit/downloads/detail?name=msysGit-netinstall-1.7.8-preview20111206.exe&amp;can=2&amp;q=">msysGit-netinstall-1.7.8-preview20111206.exe</a> as of 1/4/2012)</li>
	<li>Install <a href="http://code.google.com/p/tortoisegit/downloads/list">TortoiseGIT</a> (optional)</li>
	<li>Install <a href="http://nodejs.org/#download">Node.js for Widows</a></li>
	<li>Configure your environment path.</li>
	<li>Install <a href="http://technet.microsoft.com/en-us/library/cc731911.aspx">IIS for Widows 7</a></li>
	<li>Install <a href="http://windows.php.net/download/">PHP for Windows</a> (installer)</li>
	<li>Edit the jQuery Makefile.</li>
</ol>
<h2 id="installing-msysgit-and-tortoisegit">Installing MsysGit and TortoiseGIT</h2>
<p>The msysGit download page is needlessly confusing with a range of different packages available. The two important versions are the "Full installer for official Git for Windows" and the "Full installer (self-contained) if you want to hack on Git." The primary difference between the two is that the self-contained version is "complete, in the sense that you just need to install msysGit, and then you can build Git without installing any 3rd-party software." The differences are explained in <a href="https://git.wiki.kernel.org/articles/i/n/s/MSysGit~InstallMSysGit_1a31.html">the msysGit wiki</a>.</p>
<p>The part about being "complete" is key because, similar to Cygwin, the developers of msysGit have re-created a handful of required Linux commands and made them compatible with Windows (actually the <a href="http://www.mingw.org/">MinGW</a> guys did it). This essentially means that installing msysGit gives you something similar to what Cygwin offers. More importantly, you can use those commands for building jQuery on Windows without installing anything as large or complex as Cygwin. MsysGit actually includes a full version of GNU Make as well so there's no reason to download GNU Make separately.</p>
<p>The net install version is different than the version used in the <a href="http://help.github.com/win-set-up-git/">Github Instructions for installing Git on Windows</a>. If you've already installed that version it's ok. You can leave it in place and install this version as well. What we're really after is the GNU Make that comes with the netinstall of msysGit.</p>
<ol>
	<li>Download the netinstall version of msysGit</li>
	<li>Install msysGit to the recommended location.<br>
		<img src="http://heygrady.com/assets/building-jquery-example/msysgit-1.png"></li>
	<li>It will open a command prompt and start downloading and compiling stuff for a while. At the end you can safely close the window.<br>
		<img src="http://heygrady.com/assets/building-jquery-example/msysgit-2.png"></li>
</ol>
<h4 id="tortoisegit">TortoiseGIT</h4>
<p>TortoiseGIT is totally optional but it is nearly as full-featured as TortoiseSVN and is an extremely easy way to work with Git on Windows. I would highly recommend it for anyone new to Git, particularly if you've used SVN in the past.</p>
<h2 id="installing-node-js">Installing Node.js</h2>
<p>The Node.js installer is really straight-forward. After installing you may need to restart your command prompt to make the <code>node</code> command available.</p>
<h2 id="configuring-your-environment-path">Configuring Your Environment Path</h2>
<p>Both Git and Node.js need to be added to the your windows environment paths.</p>
<ol>
	<li>Open the Control Panel and search for "environment." Then choose "Edit the system environment variables."<br>
		<img src="http://heygrady.com/assets/building-jquery-example/control-panel-1.png">
	</li>
	<li>Click the "Environment Variables..." button.<br>
		<img src="http://heygrady.com/assets/building-jquery-example/control-panel-2.png">
	</li>
	<li>Locate and highlight the "Path" system variable and click the "Edit..." button.<br>
		<img src="http://heygrady.com/assets/building-jquery-example/control-panel-3.png">
	</li>
	<li>Verify that the correct paths have been set in text field. <strong>HINT:</strong> it's useful to copy all of the paths into Notepad or a similar tool to make it easier to read. The following entries should exist in your path. The Node.js entries likely exist already.
		<ul>
			<li>C:\Users\<em>{your user name}</em>\AppData\Roaming\npm;</li>
			<li>C:\Program Files (x86)\nodejs\;</li>
			<li>C:\msysgit\mingw\bin;</li>
			<li>C:\msysgit\bin;</li>
		</ul>
		<img src="http://heygrady.com/assets/building-jquery-example/control-panel-4.png">
	</li>
</ol>
<h2 id="installing-iis-and-php-for-windows-7">Installing IIS and PHP for Windows 7</h2>
<p>IIS comes with Windows and can be easily installed by following the <a href="http://technet.microsoft.com/en-us/library/cc731911.aspx">IIS instructions provided by Microsoft</a>. However, Microsoft also offers a <a href="http://learn.iis.net/page.aspx/375/set-up-fastcgi-for-php/">video tutorial for configuring FastCGI with IIS and PHP</a> and even has a <a href="http://www.microsoft.com/web/gallery/install.aspx?appid=PHP53">quick install program available to install PHP with IIS</a>.</p>
<p>Once PHP is installed in IIS, all that's left is to create a new site in the "Internet Information Services (IIS) Manager" that points to the jQuery source directory.</p>
<ol>
	<li>Install PHP in IIS as described (look up one paragraph).</li>
	<li>Check out the jQuery source of jQuery as described in the "Build a Local Copy of jQuery" section of <a href="http://docs.jquery.com/Tips_for_jQuery_Bug_Patching">Tips for jQuery Bug Patching</a>.</li>
	<li>You can open IIS by searching for it in the start menu.<br>
		<img src="http://heygrady.com/assets/building-jquery-example/iis-0.png"></li>
	<li>Rick-click on the sites tab and choose "Add Web Site..." from the menu.<br>
		<img src="http://heygrady.com/assets/building-jquery-example/iis-1.png"></li>
	<li>Fill-in your site details. The Site name is arbitrary. The Physical path is where you checked out the jQuery source code to. The Port is also arbitrary. It's common to specify a non-standard port number for security reasons. Below a port number of 8000 was specified. With that configuration, visiting "localhost:8000/test/" in your browser will begin executing the jQuery unit tests.<br>
		<img src="http://heygrady.com/assets/building-jquery-example/iis-2.png"></li>
</ol>
<h2 id="editing-the-jquery-makefile">Editing the jQuery Makefile</h2>
<p>The MinGW binaries will enable the `make` command and allow the Linux-specific shell commands to work flawlessly on Windows. However, the jQuery Makefile has a line that tries to find Node.js which causes the build script to think that Node.js is missing from your system. This is easy enough to correct.</p>
<figure class='code'><figcaption>Original Makefile </figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>SRC_DIR = src
</div><div class='line'>TEST_DIR = test
</div><div class='line'>BUILD_DIR = build
</div><div class='line'> </div><div class='line'>PREFIX = .
</div><div class='line'>DIST_DIR = ${PREFIX}/dist
</div><div class='line'> </div><div class='line'>JS_ENGINE ?= `which node nodejs 2>/dev/null`
</div><div class='line'>...</div></pre></td></tr></table></div></figure>
<figure class='code'><figcaption>Windows Friendly Makefile </figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>SRC_DIR = src
</div><div class='line'>TEST_DIR = test
</div><div class='line'>BUILD_DIR = build
</div><div class='line'> </div><div class='line'>PREFIX = .
</div><div class='line'>DIST_DIR = ${PREFIX}/dist
</div><div class='line'> </div><div class='line'>JS_ENGINE = node
</div><div class='line'>...</div></pre></td></tr></table></div></figure>
<h2 id="conclusion">Conclusion</h2>
<p>After following the steps above you should be able to execute commands in the Windows Command Prompt similar to Unix-like environments. This should make it trivial to work with the jQuery source code. The basic steps above could be used to make development of almost any Linux-centric project easier on Windows.</p>
<p>The following shows Node.js, GNU Make, Git and PHP available from the windows command-prompt.<br><img src="http://heygrady.com/assets/building-jquery-example/final.png"></p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Length Unit Conversion in JavaScript]]></title>
<link href="http://heygrady.com/blog/2011/12/21/length-and-angle-unit-conversion-in-javascript/"/>
<updated>2011-12-21T10:18:00-08:00</updated>
<id>http://heygrady.com/blog/2011/12/21/length-and-angle-unit-conversion-in-javascript</id>
<category term="css" /><category term="javascript" />

      <content type="html"><![CDATA[<p>When creating JavaScript libraries, it's difficult to support the full range of units and most developers settle on just supporting pixels. CSS supports several <a href="https://developer.mozilla.org/en/CSS/length">units for length as explained in this <abbr title="Mozilla Developer Network">MDN</abbr> article</a> but supporting them with JavaScript can be tricky. This post explains the basic technique for converting units and the inherent browser bugs that need to be overcome. This post also introduces a new <a href="https://github.com/heygrady/Units">Units library</a> I've created and posted to GitHub.</p>
<p>If you have some weird reason to handle arbitrary units in your JavaScript library, the code demonstrated below should offer the most complete solution possible in the smallest possible package.</p>
<!--more-->
<h2 id="what-were-trying-to-do">What We're Trying to Do</h2>
<p>The basic goal is to create a small library that will make it possible to convert any valid value to pixels. This makes it possible to do further calculations using that pixel value.</p>
<figure class='code'><figcaption>example.js </figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div></pre></td><td class='main  js'><pre><div class='line'><span class="c1">// find our target element</span>
</div><div class='line'><span class="kd">var</span> <span class="nx">elem</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s1">&#39;#some-elem&#39;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'><span class="c1">// find an arbitrary value in pixels</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;10%&#39;</span><span class="p">);</span> <span class="c1">// depends on parent width</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;96px&#39;</span><span class="p">);</span> <span class="c1">// 96px</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;25.4mm&#39;</span><span class="p">);</span> <span class="c1">// 96px</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;2.54cm&#39;</span><span class="p">);</span> <span class="c1">// 96px</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;1in&#39;</span><span class="p">);</span> <span class="c1">// 96px</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;72pt&#39;</span><span class="p">);</span> <span class="c1">// 96px</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;6pc&#39;</span><span class="p">);</span> <span class="c1">// 96px</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;25.4mozmm&#39;</span><span class="p">);</span> <span class="c1">// around 96px</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;10vh&#39;</span><span class="p">);</span> <span class="c1">// depends on viewport</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;10vw&#39;</span><span class="p">);</span> <span class="c1">// depends on viewport</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;10vm&#39;</span><span class="p">);</span> <span class="c1">// depends on viewport</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;6em&#39;</span><span class="p">);</span> <span class="c1">// 96px with default font styles</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;6rem&#39;</span><span class="p">);</span> <span class="c1">// 96px with default font styles</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;13.4ex&#39;</span><span class="p">);</span> <span class="c1">// around 96px with default font styles</span>
</div><div class='line'><span class="nx">Length</span><span class="p">.</span><span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;12ch&#39;</span><span class="p">);</span> <span class="c1">// around 96px with default font styles</span>
</div></pre></td></tr></table></div></figure>
<h2 id="the-trouble-with-units">The Trouble with Units</h2>
<p>Converting between length units is not exactly straight-forward because each unit can have different pixel value based on a variety of uncontrollable conditions. Factors such as font properties (em, ch, ex), the <abbr title="Operating System">OS</abbr> settings for your display <abbr title="Dots Per Inch">DPI</abbr> (in, mm, cm, pt, pc) or even the dimensions of the browser (vh, vw, vm) can change the pixel value of a unit. Because there is no direct conversion function available to JavaScript it's necessary to rely on manipulating the <code>style</code> attribute on the element in-order-to trick the browser into doing the conversion for you.</p>
<h3 id="absolute-units">Absolute Units</h3>
<p>The easiest units to convert are the absolute units. These are units that presumably represent real, fixed lengths (but actually don't). In the the real world there is no such thing as a relative inch &mdash; an inch is always an inch regardless of the settings on your monitor. On computers it's a little different; the absolute lengths are based on the DPI setting. On the vast majority of computers this is set to 96, which means that 1 inch usually equals 96 pixels. However, this can sometimes change: it's not entirely uncommon for the DPI to be set to 120 which would make 1 inch equal to 120 pixels. This is also already different on mobile devices like <a href="http://www.theregister.co.uk/2010/06/25/retina_display_claims_upheld/">the iPhone 4 or newer</a> (although the <a href="http://www.mobilexweb.com/blog/iphone4-ios4-detection-safari-viewport">iPhone currently lies and claims to be 163DPI</a>).</p>
<p>Because DPI is the deciding factor in absolute lengths, it's useful to define the conversions relative to the inch; this makes all of the other conversions easier (thankfully a pixel is always a pixel &mdash; except on iPhones). If you know the pixels in an inch, you can easily know the pixels in a pica.</p>
<dl>
	<dt>inches</dt>
	<dd>relative to OS DPI, usually 96px</dd>
	<dt>millimeters</dt>
	<dd>1mm = 1in/25.4</dd>
	<dt>centimeters</dt>
	<dd>1cm = 1in/2.54</dd>
	<dt>point</dt>
	<dd>1pt = 1in/72</dd>
	<dt>picas</dt>
	<dd>1pc = 1in/6</dd>
    <dt>Mozilla millimeters</dt>
    <dd>1mozmm = whatever Mozilla feels like</dd>
</dl>
<h3 id="font-relative-units">Font-relative Units</h3>
<p>As the name might suggest, font-relative units are dependent on the font settings of the element itself. The most commonly used is the em unit. One em equals the <code>font-size</code> of the element (except in the case of the <code>font-size</code> property where it means the <code>font-size</code> of the parent element). The ex and ch units are rarely used and equal the height of lower-case "x" and the width of a "0" respectively. New to CSS3 &mdash; and much more useful than ex &mdash; is the rem unit which equals the em of the <code>html</code> element. Converting rem and em to pixels is relatively straight-forward &mdash; all you really need is the element's (or the parent or <code>html</code> element's) <code>font-size</code> &mdash; but ex and ch require using the <code>style</code> attribute as we'll see later.</p>
<h3 id="viewport-relative-units">Viewport-relative Units</h3>
<p>Presumably useful for flexible layouts, these units are calculated relative to the browser dimensions and are currently only supported in IE9 and Opera. The three units are vh (viewport height/100) vw (viewport width/100) and vm (the smaller of vh or vw). These units change every time the browser is resized.</p>
<h3 id="percentage-lengths">Percentage Lengths</h3>
<p>Perhaps the most complex unit to convert is percentage. The relative length for a percentage can differ based on the CSS property but it is usually based on the width of the parent element. For instance, a <code>width</code> of 50% means 50% of the width of the parent element. For things like <code>padding</code> and <code>margin</code> it can get confusing because these also always mean the width of the parent; counter-intuitively, <code>padding-top</code> of 50% means 50% of the width of the parent element as well, not the height. The best way to figure out what percentage is referring to is to <a href="https://developer.mozilla.org/en/CSS/padding">look the property up on the MDN website</a>.</p>
<h2 id="converting-units">Converting Units</h2>
<p>As mentioned above, converting units can be done reliably* by setting the value using the <code>style</code> property and reading it back using <code>getComputedStyle</code>**. The <code>getComputedStyle</code> function always*** returns values using pixels.</p>
<p class="fine-print">*sometimes **in supported browsers ***usually</p>
<figure class='code'><figcaption>Simple.js<a href='https://gist.github.com/1516965'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div><div data-line='56' class='line-number'></div><div data-line='57' class='line-number'></div><div data-line='58' class='line-number'></div><div data-line='59' class='line-number'></div><div data-line='60' class='line-number'></div><div data-line='61' class='line-number'></div><div data-line='62' class='line-number'></div><div data-line='63' class='line-number'></div><div data-line='64' class='line-number'></div><div data-line='65' class='line-number'></div><div data-line='66' class='line-number'></div><div data-line='67' class='line-number'></div><div data-line='68' class='line-number'></div><div data-line='69' class='line-number'></div><div data-line='70' class='line-number'></div></pre></td><td class='main  js'><pre><div class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">,</span> <span class="kc">undefined</span><span class="p">){</span>
</div><div class='line'><span class="s2">&quot;use strict&quot;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="kd">var</span> <span class="nx">runit</span> <span class="o">=</span> <span class="sr">/^(-?[\d+\.\-]+)([a-z]+|%)$/i</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">// convert a value to pixels</span>
</div><div class='line'><span class="kd">function</span> <span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">prop</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="c1">// use width as the default property, or specify your own</span>
</div><div class='line'>    <span class="nx">prop</span> <span class="o">=</span> <span class="nx">prop</span> <span class="o">||</span> <span class="s1">&#39;width&#39;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// begin &quot;the awesome hack by Dean Edwards&quot;</span>
</div><div class='line'>    <span class="c1">// @see http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// remember the current style</span>
</div><div class='line'>    <span class="kd">var</span> <span class="nx">style</span> <span class="o">=</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">style</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">inlineValue</span> <span class="o">=</span> <span class="nx">style</span><span class="p">[</span><span class="nx">prop</span><span class="p">],</span>
</div><div class='line'>        <span class="nx">ret</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// set the style on the target element</span>
</div><div class='line'>    <span class="k">try</span> <span class="p">{</span>
</div><div class='line'>        <span class="nx">style</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">catch</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// IE 8 and below throw an exception when setting unsupported units</span>
</div><div class='line'>        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// read the computed value</span>
</div><div class='line'>    <span class="c1">// if style is nothing we probably set an unsupported unit</span>
</div><div class='line'>    <span class="nx">ret</span> <span class="o">=</span> <span class="o">!</span><span class="nx">style</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="nx">currCSS</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">prop</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// reset the style back to what it was or blank it out</span>
</div><div class='line'>    <span class="nx">style</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">inlineValue</span> <span class="o">!==</span> <span class="kc">undefined</span> <span class="o">?</span> <span class="nx">inlineValue</span> <span class="o">:</span> <span class="kc">null</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// remove the unit and return a number</span>
</div><div class='line'>    <span class="k">return</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">ret</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// return the computed value of a CSS property</span>
</div><div class='line'><span class="kd">function</span> <span class="nx">currCSS</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">prop</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="kd">var</span> <span class="nx">value</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">pixel</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">getComputedStyle</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">defaultView</span> <span class="o">&amp;&amp;</span> <span class="nb">document</span><span class="p">.</span><span class="nx">defaultView</span><span class="p">.</span><span class="nx">getComputedStyle</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">unit</span><span class="p">;</span>
</div><div class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">getComputedStyle</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// FireFox, Chrome/Safari, Opera and IE9+</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">getComputedStyle</span><span class="p">(</span><span class="nx">elem</span><span class="p">)[</span><span class="nx">prop</span><span class="p">];</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">pixel</span> <span class="o">=</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">style</span><span class="p">[</span><span class="s1">&#39;pixel&#39;</span> <span class="o">+</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="nx">toUpperCase</span><span class="p">()</span> <span class="o">+</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">1</span><span class="p">)])</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// IE and Opera support pixel shortcuts for top, bottom, left, right, height, width</span>
</div><div class='line'>        <span class="c1">// Chrome supports pixel shortcuts for those properties only when an absolute unit is used</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">pixel</span> <span class="o">+</span> <span class="s1">&#39;px&#39;</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// IE 8 and below won&#39;t convert units for us</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">currentStyle</span><span class="p">[</span><span class="nx">prop</span><span class="p">];</span>
</div><div class='line'> </div><div class='line'>        <span class="c1">// check the unit</span>
</div><div class='line'>        <span class="nx">unit</span> <span class="o">=</span> <span class="p">(</span><span class="nx">value</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">runit</span><span class="p">)</span><span class="o">||</span><span class="p">[])[</span><span class="mi">2</span><span class="p">];</span>
</div><div class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">unit</span> <span class="o">&amp;&amp;</span> <span class="nx">unit</span> <span class="o">!==</span> <span class="s1">&#39;px&#39;</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>            <span class="c1">// try to convert using a prop that will return pixels</span>
</div><div class='line'>            <span class="c1">// this will be accurate for everything (except font-size and some percentages)</span>
</div><div class='line'>            <span class="nx">value</span> <span class="o">=</span> <span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;px&#39;</span><span class="p">;</span>
</div><div class='line'>        <span class="p">}</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>    <span class="k">return</span> <span class="nx">value</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// expose the conversion function to the window object</span>
</div><div class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">Length</span> <span class="o">=</span> <span class="p">{</span>
</div><div class='line'>    <span class="nx">toPx</span><span class="o">:</span> <span class="nx">toPx</span>
</div><div class='line'><span class="p">};</span>
</div><div class='line'><span class="p">}(</span><span class="k">this</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nb">document</span><span class="p">));</span>
</div></pre></td></tr></table></div></figure>
<h3 id="how-conversion-works">How Conversion Works</h3>
<p>The code above is the bare minimum necessary to convert pixel units but it has a few problems that will be discussed later. But first, let's look at what we're doing in the code. In the the <code>toPx</code> function, we can convert any unit to pixels by assigning the value to the elements <code>style</code> property, reading that value back as using the <code>curCSS</code> function (which uses <code>getComputedStyle</code>) and then changing the element's <code>style</code> back.</p>
<p>This method of checking a property, changing it, measuring it and changing it back is commonly referred to as the <a href="http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291">"awesome hack by Dean Edwards"</a>. (The Dean Edwards hack relies on the proprietary <code><a href="http://msdn.microsoft.com/en-us/library/ms535889(v=VS.85).aspx">runtimeStyle</a></code> property because his comment was originally meant to address an IE-specific issue).</p>
<p>Using <code>getComputedStyle</code> isn't supported in IE 8 and below; they use <code>currentStyle</code> instead, and it works slightly differently. Specifically, <code>currentStyle</code> won't convert anything to pixels; it just returns raw values (known as the <em>specified value</em>). For instance, if the <code>fontSize</code> is set to 10mm, IE8 and below will return it as 10mm instead of 37.795276px. This problem is discussed in more detail below.</p>
<p>In the example above the default property is set to <code>width</code> ("the awesome hack by Dean Edwards" uses the <code>left</code> property) because in non-IE browsers <code>left</code> cannot be set on a <code>position: static</code> element. Width will reliably return pixel results even when the element is <code>display: inline</code> in any browser. It should be noted that in IE 8 and below, <code>left</code> can be reliably set and retrieved on any element regardless of its <code>position</code> property.</p>
<h3 id="problems-with-this-method">Problems with this Method</h3>
<p>If browsers were perfect, the code above would work perfectly. However there are a number of bugs that need to be accounted for. Surprisingly, most of these bugs occur in WebKit, not IE.</p>
<h4 id="webkit-and-computed-value-and-used-value">WebKit and Computed Value and Used Value</h4>
<p>WebKit will not convert percentages when they are applied to <code>margin</code>, <code>top</code>, <code>bottom</code>, <code>left</code>, or <code>right</code>. There is a <a href="https://bugs.webkit.org/show_bug.cgi?id=29084">bug report for the position properties</a> but it isn't clear that the WebKit team intends to fix it. The <a href="https://developer.mozilla.org/en/DOM/window.getComputedStyle">MDN page for <code>getComputedStyle</code></a> explains that the function should report the <a href="https://developer.mozilla.org/en/CSS/used_value"><em>used value</em></a> and not the <a href="https://developer.mozilla.org/en/CSS/computed_value"><em>computed value</em></a> (which is confusing to say the least). The primary difference between the two is that a <em>computed value</em> can sometimes be a percentage (in the case of <code>margin</code>, <code>top</code>, <code>bottom</code>, <code>left</code>, <code>right</code>, <code>text-indent</code> and others). WebKit is apparently using the <em>computed value</em> in <code>getComputedStyle</code> which the bug tracker suggests is due to a disagreement about the spec. All other browsers are using the <em>used value</em>.</p>
<p>A ticket in the jQuery bug tracker proposes a <a href="http://bugs.jquery.com/ticket/10639">fix for WebKet returning a percentage for margin</a>. However, as noted above, this bug also applies to positioning properties as well (and <code>text-indent</code>). The <a href="https://github.com/jquery/jquery/commit/7f6a991313380b74d5fb18782fb6b99fd6c4a22d">commit for fixing percentage margins in jQuery</a> specifically addresses margins but it could easily be extended to support the other affected properties.</p>
<h4 id="ie-8-and-below-and-specified-value">IE 8 and Below and Specified Value</h4>
<p>IE8 and below don't support the <code>getComputedStyle</code> function so the non-standard <code><a href="http://msdn.microsoft.com/en-us/library/ms535231(v=vs.85).aspx">currentStyle</a></code> property must be used. Unlike <code>getComputedStyle</code>, which is supposed to return the <em>used value</em>, <code>currentStyle</code> returns the <a href="https://developer.mozilla.org/en/CSS/specified_value"><em>specified value</em></a> (the <abbr title="Microsoft Developer Network">MSDN</abbr> manual calls this the "cascaded value"). The <em>specified value</em> is the value that should be assigned to the property but before it has been converted to an absolute unit. This is more useful than the <a href="https://developer.mozilla.org/en/DOM/element.style"><code>style</code> property</a>, which only exposes the inline values for the element; <code>currentStyle</code> will return values specified in CSS as well as inherited values.</p>
<p>Thankfully IE 8 and below support a few non-standard properties that always return pixel values. The most commonly used property is <a href="http://msdn.microsoft.com/en-us/library/ms531129(v=VS.85).aspx">pixelLeft</a> (this is used in "the awesome hack"), however <a href="http://msdn.microsoft.com/en-us/library/ms531135(v=VS.85).aspx">pixelWidth</a> and <a href="http://msdn.microsoft.com/en-us/library/ms531127(v=VS.85).aspx">pixelHeight</a> work just as well. Opera also supports the non-standard pixel properties. WebKit supports them only for absolute units and Firefox doesn't support them at all. Interestingly, IE9 doesn't support them anymore because they were deprecated in an earlier version of IE.</p>
<p>Every unit (except percentages) is the same pixel value on an element no matter which property it is applied to (except <code>fontSize</code>). For instance, a <code>marginLeft</code> of 1em is the same length as a <code>lineHeight</code> of 1em. Because of this fact, it is reasonably safe to use the special pixel values to convert units in IE 8 and below.</p>
<p>There is no direct way to convert the <code>fontSize</code> because it could be relative to the parent elements <code>fontSize</code> in the case of em and percentages. A <a href="http://bugs.jquery.com/ticket/760">jQuery bug about differing values for <code>fontSize</code></a> points to a fix where using a <a href="https://github.com/jquery/jquery/commit/449e099b97d823ed0252d8821880bc0e471701ea"><code>left</code> of 1em will always equal the element's current <code>fontSize</code></a>.</p>
<h4 id="what--code-runtimestyle--code--does">What <code>runtimeStyle</code> Does</h4>
<p>As noted above, "the awesome hack by Dean Edwards" uses <code>runtimeStyle</code> for pixel conversions in IE. This IE-specific property is higher than the <code>style</code> property in the <a href="https://developer.mozilla.org/en/CSS/Getting_Started/Cascading_and_inheritance">CSS cascade</a> which means that a <code>runtimeStyle</code> value supersedes a <code>style</code> value. By copying the <code>currentStyle</code> value to the <code>runtimeStyle</code>, "the awesome hack" avoids any potential for a <abbr title="Flash of Unstyled Content">FOUC</abbr>. This works because changes to the <code>style</code>  property aren't rendered in the browser when a <code>runtimeStyle</code> is set and the special pixel properties don't pay attention to the <code>runtimeStyle</code> (because they belong to the <code>style</code> object), so they can still be used to return the pixel value of the <code>style</code> property. The <code>runtimeStyle</code> is only available in IE and isn't useful for unit conversion beyond trying to fix FOUC issues if they appear in IE 8 or below.</p>
<h2 id="fixing-the-bugs">Fixing the Bugs</h2>
<p>Now that we understand the problems, we need to set about fixing them! The code below contains a patched <code>curCSS</code> function.</p>
<figure class='code'><figcaption>Patched.js<a href='https://gist.github.com/1516965'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div><div data-line='56' class='line-number'></div><div data-line='57' class='line-number'></div><div data-line='58' class='line-number'></div><div data-line='59' class='line-number'></div><div data-line='60' class='line-number'></div><div data-line='61' class='line-number'></div><div data-line='62' class='line-number'></div><div data-line='63' class='line-number'></div><div data-line='64' class='line-number'></div><div data-line='65' class='line-number'></div><div data-line='66' class='line-number'></div><div data-line='67' class='line-number'></div><div data-line='68' class='line-number'></div><div data-line='69' class='line-number'></div><div data-line='70' class='line-number'></div><div data-line='71' class='line-number'></div><div data-line='72' class='line-number'></div><div data-line='73' class='line-number'></div><div data-line='74' class='line-number'></div><div data-line='75' class='line-number'></div><div data-line='76' class='line-number'></div><div data-line='77' class='line-number'></div><div data-line='78' class='line-number'></div><div data-line='79' class='line-number'></div><div data-line='80' class='line-number'></div><div data-line='81' class='line-number'></div><div data-line='82' class='line-number'></div><div data-line='83' class='line-number'></div><div data-line='84' class='line-number'></div><div data-line='85' class='line-number'></div><div data-line='86' class='line-number'></div><div data-line='87' class='line-number'></div><div data-line='88' class='line-number'></div><div data-line='89' class='line-number'></div><div data-line='90' class='line-number'></div><div data-line='91' class='line-number'></div><div data-line='92' class='line-number'></div><div data-line='93' class='line-number'></div><div data-line='94' class='line-number'></div><div data-line='95' class='line-number'></div><div data-line='96' class='line-number'></div><div data-line='97' class='line-number'></div><div data-line='98' class='line-number'></div><div data-line='99' class='line-number'></div><div data-line='100' class='line-number'></div><div data-line='101' class='line-number'></div><div data-line='102' class='line-number'></div><div data-line='103' class='line-number'></div><div data-line='104' class='line-number'></div><div data-line='105' class='line-number'></div><div data-line='106' class='line-number'></div><div data-line='107' class='line-number'></div><div data-line='108' class='line-number'></div><div data-line='109' class='line-number'></div><div data-line='110' class='line-number'></div><div data-line='111' class='line-number'></div><div data-line='112' class='line-number'></div><div data-line='113' class='line-number'></div><div data-line='114' class='line-number'></div><div data-line='115' class='line-number'></div><div data-line='116' class='line-number'></div><div data-line='117' class='line-number'></div><div data-line='118' class='line-number'></div><div data-line='119' class='line-number'></div><div data-line='120' class='line-number'></div><div data-line='121' class='line-number'></div><div data-line='122' class='line-number'></div></pre></td><td class='main  js'><pre><div class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">,</span> <span class="kc">undefined</span><span class="p">){</span>
</div><div class='line'><span class="s2">&quot;use strict&quot;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="kd">var</span> <span class="nx">testElem</span><span class="p">,</span>
</div><div class='line'>    <span class="nx">docElement</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">documentElement</span><span class="p">,</span>
</div><div class='line'>    <span class="nx">defaultView</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">defaultView</span><span class="p">,</span>
</div><div class='line'>    <span class="nx">getComputedStyle</span> <span class="o">=</span> <span class="nx">defaultView</span> <span class="o">&amp;&amp;</span> <span class="nx">defaultView</span><span class="p">.</span><span class="nx">getComputedStyle</span><span class="p">,</span>
</div><div class='line'>    <span class="nx">computedValueBug</span><span class="p">,</span>
</div><div class='line'>    <span class="nx">runit</span> <span class="o">=</span> <span class="sr">/^(-?[\d+\.\-]+)([a-z]+|%)$/i</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">// test for the WebKit getComputedStyle bug</span>
</div><div class='line'><span class="c1">// @see http://bugs.jquery.com/ticket/10639</span>
</div><div class='line'><span class="k">if</span> <span class="p">(</span><span class="nx">getComputedStyle</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="c1">// create a test element</span>
</div><div class='line'>    <span class="nx">testElem</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;test&#39;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// add the test element to the dom</span>
</div><div class='line'>    <span class="nx">docElement</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">testElem</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// add a percentage margin and measure it</span>
</div><div class='line'>    <span class="nx">testElem</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">marginTop</span> <span class="o">=</span> <span class="s1">&#39;1%&#39;</span><span class="p">;</span>
</div><div class='line'>    <span class="nx">computedValueBug</span> <span class="o">=</span> <span class="nx">getComputedStyle</span><span class="p">(</span><span class="nx">testElem</span><span class="p">).</span><span class="nx">marginTop</span> <span class="o">===</span> <span class="s1">&#39;1%&#39;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// remove the test element from the DOM and delete it</span>
</div><div class='line'>    <span class="nx">docElement</span><span class="p">.</span><span class="nx">removeChild</span><span class="p">(</span><span class="nx">testElem</span><span class="p">);</span>
</div><div class='line'>    <span class="nx">testElem</span> <span class="o">=</span> <span class="kc">undefined</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// convert a value to pixels</span>
</div><div class='line'><span class="kd">function</span> <span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">prop</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="c1">// use width as the default property, or specify your own</span>
</div><div class='line'>    <span class="nx">prop</span> <span class="o">=</span> <span class="nx">prop</span> <span class="o">||</span> <span class="s1">&#39;width&#39;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// begin &quot;the awesome hack by Dean Edwards&quot;</span>
</div><div class='line'>    <span class="c1">// @see http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// remember the current style</span>
</div><div class='line'>    <span class="kd">var</span> <span class="nx">style</span> <span class="o">=</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">style</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">inlineValue</span> <span class="o">=</span> <span class="nx">style</span><span class="p">[</span><span class="nx">prop</span><span class="p">],</span>
</div><div class='line'>        <span class="nx">ret</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// set the style on the target element</span>
</div><div class='line'>    <span class="k">try</span> <span class="p">{</span>
</div><div class='line'>        <span class="nx">style</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">catch</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// IE 8 and below throw an exception when setting unsupported units</span>
</div><div class='line'>        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// read the computed value</span>
</div><div class='line'>    <span class="c1">// if style is nothing we probably set an unsupported unit</span>
</div><div class='line'>    <span class="nx">ret</span> <span class="o">=</span> <span class="o">!</span><span class="nx">style</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="nx">curCSS</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">prop</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// reset the style back to what it was or blank it out</span>
</div><div class='line'>    <span class="nx">style</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">inlineValue</span> <span class="o">!==</span> <span class="kc">undefined</span> <span class="o">?</span> <span class="nx">inlineValue</span> <span class="o">:</span> <span class="kc">null</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// remove the unit and return a number</span>
</div><div class='line'>    <span class="k">return</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">ret</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// return the computed value of a CSS property</span>
</div><div class='line'><span class="kd">function</span> <span class="nx">curCSS</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">prop</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="kd">var</span> <span class="nx">value</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">pixel</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">unit</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">rvpos</span> <span class="o">=</span> <span class="sr">/^top|bottom/</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">outerProp</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;paddingTop&quot;</span><span class="p">,</span> <span class="s2">&quot;paddingBottom&quot;</span><span class="p">,</span> <span class="s2">&quot;borderTop&quot;</span><span class="p">,</span> <span class="s2">&quot;borderBottom&quot;</span><span class="p">],</span>
</div><div class='line'>        <span class="nx">innerHeight</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">parent</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">i</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span> <span class="c1">// outerProp.length</span>
</div><div class='line'> </div><div class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">getComputedStyle</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// FireFox, Chrome/Safari, Opera and IE9+</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">getComputedStyle</span><span class="p">(</span><span class="nx">elem</span><span class="p">)[</span><span class="nx">prop</span><span class="p">];</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">pixel</span> <span class="o">=</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">style</span><span class="p">[</span><span class="s1">&#39;pixel&#39;</span> <span class="o">+</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="nx">toUpperCase</span><span class="p">()</span> <span class="o">+</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">1</span><span class="p">)])</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// IE and Opera support pixel shortcuts for top, bottom, left, right, height, width</span>
</div><div class='line'>        <span class="c1">// WebKit supports pixel shortcuts only when an absolute unit is used</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">pixel</span> <span class="o">+</span> <span class="s1">&#39;px&#39;</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">prop</span> <span class="o">===</span> <span class="s1">&#39;fontSize&#39;</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// correct IE issues with font-size</span>
</div><div class='line'>        <span class="c1">// @see http://bugs.jquery.com/ticket/760</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;1em&#39;</span><span class="p">,</span> <span class="s1">&#39;left&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;px&#39;</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// IE 8 and below return the specified style</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">currentStyle</span><span class="p">[</span><span class="nx">prop</span><span class="p">];</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// check the unit</span>
</div><div class='line'>    <span class="nx">unit</span> <span class="o">=</span> <span class="p">(</span><span class="nx">value</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">runit</span><span class="p">)</span><span class="o">||</span><span class="p">[])[</span><span class="mi">2</span><span class="p">];</span>
</div><div class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">unit</span> <span class="o">===</span> <span class="s1">&#39;%&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">computedValueBug</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// WebKit won&#39;t convert percentages for top, bottom, left, right, margin and text-indent</span>
</div><div class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">rvpos</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">prop</span><span class="p">))</span> <span class="p">{</span>
</div><div class='line'>            <span class="c1">// Top and bottom require measuring the innerHeight of the parent.</span>
</div><div class='line'>            <span class="nx">innerHeight</span> <span class="o">=</span> <span class="p">(</span><span class="nx">parent</span> <span class="o">=</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">parentNode</span> <span class="o">||</span> <span class="nx">elem</span><span class="p">).</span><span class="nx">offsetHeight</span><span class="p">;</span>
</div><div class='line'>            <span class="k">while</span> <span class="p">(</span><span class="nx">i</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>              <span class="nx">innerHeight</span> <span class="o">-=</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">curCSS</span><span class="p">(</span><span class="nx">parent</span><span class="p">,</span> <span class="nx">outerProp</span><span class="p">[</span><span class="nx">i</span><span class="p">]));</span>
</div><div class='line'>            <span class="p">}</span>
</div><div class='line'>            <span class="nx">value</span> <span class="o">=</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="o">/</span> <span class="mi">100</span> <span class="o">*</span> <span class="nx">innerHeight</span> <span class="o">+</span> <span class="s1">&#39;px&#39;</span><span class="p">;</span>
</div><div class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</div><div class='line'>            <span class="c1">// This fixes margin, left, right and text-indent</span>
</div><div class='line'>            <span class="c1">// @see https://bugs.webkit.org/show_bug.cgi?id=29084</span>
</div><div class='line'>            <span class="c1">// @see http://bugs.jquery.com/ticket/10639</span>
</div><div class='line'>            <span class="nx">value</span> <span class="o">=</span> <span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">value</span><span class="p">);</span>
</div><div class='line'>        <span class="p">}</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">((</span><span class="nx">value</span> <span class="o">===</span> <span class="s1">&#39;auto&#39;</span> <span class="o">||</span> <span class="p">(</span><span class="nx">unit</span> <span class="o">&amp;&amp;</span> <span class="nx">unit</span> <span class="o">!==</span> <span class="s1">&#39;px&#39;</span><span class="p">))</span> <span class="o">&amp;&amp;</span> <span class="nx">getComputedStyle</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// WebKit and Opera will return auto in some cases</span>
</div><div class='line'>        <span class="c1">// Firefox will pass back an unaltered value when it can&#39;t be set, like top on a static element</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">unit</span> <span class="o">&amp;&amp;</span> <span class="nx">unit</span> <span class="o">!==</span> <span class="s1">&#39;px&#39;</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">getComputedStyle</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// IE 8 and below won&#39;t convert units for us</span>
</div><div class='line'>        <span class="c1">// try to convert using a prop that will return pixels</span>
</div><div class='line'>        <span class="c1">// this will be accurate for everything (except font-size and some percentages)</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;px&#39;</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>    <span class="k">return</span> <span class="nx">value</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// expose the conversion function to the window object</span>
</div><div class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">Length</span> <span class="o">=</span> <span class="p">{</span>
</div><div class='line'>    <span class="nx">toPx</span><span class="o">:</span> <span class="nx">toPx</span>
</div><div class='line'><span class="p">};</span>
</div><div class='line'><span class="p">}(</span><span class="k">this</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nb">document</span><span class="p">));</span>
</div></pre></td></tr></table></div></figure>
<p>The code above adds several fixes to the <code>curCSS</code> function to correct for the issues mentioned above. It also adds a check to see if the browser is incorrectly returning the <em>current value</em> instead of the <em>used value</em>.</p>
<h4 id="changes-to-the-curcss-function">Changes to the curCSS Function</h4>
<ul>
    <li>Correct for IE being unable to reconcile the <code>fontSize</code> property by converting the <code>left</code> of 1em to pixels.</li>
    <li>Check for percentage units in WebKit.
        <ul>
            <li>For <code>top</code> and <code>bottom</code>, compute the parent element's inner height and return the percentage.</li>
            <li>For other properties (<code>margin</code>, <code>left</code>, <code>right</code>, <code>text-indent</code>) convert to pixels using the <code>width</code> property.</li>
        </ul>
    </li>
    <li>Correct for WebKit and Opera returning the <em>computed value</em> "auto" in cases <code>top</code> on an element that is <code>position: static</code>.</li>
    <li>Correct for Firefox returning the <em>specified value</em> when it can't be set in cases like <code>top</code> on an element that is <code>position: static</code>.</li>
</ul>
<h2 id="finishing-the-job">Finishing the Job</h2>
<p>Now that we've fixed all of the bugs with <code>curCSS</code>, it's time to make <code>toPx</code> a little smarter. For instance, absolute units will never change under any circumstances once they've been calculated. This means that once you know how many pixels are in an inch, converting an inch unit requires only simple algebra and you can skip "the awesome hack" altogether. The same goes for em and rem: once you know the correct <code>fontSize</code> in pixels, a little algebra finishes the job, no "the awesome hack" necessary. This actually covers the majority of cases for units and leaves only percentages as the primary need for mucking with the element's <code>style</code> property.</p>
<figure class='code'><figcaption>Final.js<a href='https://gist.github.com/1516965'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div><div data-line='56' class='line-number'></div><div data-line='57' class='line-number'></div><div data-line='58' class='line-number'></div><div data-line='59' class='line-number'></div><div data-line='60' class='line-number'></div><div data-line='61' class='line-number'></div><div data-line='62' class='line-number'></div><div data-line='63' class='line-number'></div><div data-line='64' class='line-number'></div><div data-line='65' class='line-number'></div><div data-line='66' class='line-number'></div><div data-line='67' class='line-number'></div><div data-line='68' class='line-number'></div><div data-line='69' class='line-number'></div><div data-line='70' class='line-number'></div><div data-line='71' class='line-number'></div><div data-line='72' class='line-number'></div><div data-line='73' class='line-number'></div><div data-line='74' class='line-number'></div><div data-line='75' class='line-number'></div><div data-line='76' class='line-number'></div><div data-line='77' class='line-number'></div><div data-line='78' class='line-number'></div><div data-line='79' class='line-number'></div><div data-line='80' class='line-number'></div><div data-line='81' class='line-number'></div><div data-line='82' class='line-number'></div><div data-line='83' class='line-number'></div><div data-line='84' class='line-number'></div><div data-line='85' class='line-number'></div><div data-line='86' class='line-number'></div><div data-line='87' class='line-number'></div><div data-line='88' class='line-number'></div><div data-line='89' class='line-number'></div><div data-line='90' class='line-number'></div><div data-line='91' class='line-number'></div><div data-line='92' class='line-number'></div><div data-line='93' class='line-number'></div><div data-line='94' class='line-number'></div><div data-line='95' class='line-number'></div><div data-line='96' class='line-number'></div><div data-line='97' class='line-number'></div><div data-line='98' class='line-number'></div><div data-line='99' class='line-number'></div><div data-line='100' class='line-number'></div><div data-line='101' class='line-number'></div><div data-line='102' class='line-number'></div><div data-line='103' class='line-number'></div><div data-line='104' class='line-number'></div><div data-line='105' class='line-number'></div><div data-line='106' class='line-number'></div><div data-line='107' class='line-number'></div><div data-line='108' class='line-number'></div><div data-line='109' class='line-number'></div><div data-line='110' class='line-number'></div><div data-line='111' class='line-number'></div><div data-line='112' class='line-number'></div><div data-line='113' class='line-number'></div><div data-line='114' class='line-number'></div><div data-line='115' class='line-number'></div><div data-line='116' class='line-number'></div><div data-line='117' class='line-number'></div><div data-line='118' class='line-number'></div><div data-line='119' class='line-number'></div><div data-line='120' class='line-number'></div><div data-line='121' class='line-number'></div><div data-line='122' class='line-number'></div><div data-line='123' class='line-number'></div><div data-line='124' class='line-number'></div><div data-line='125' class='line-number'></div><div data-line='126' class='line-number'></div><div data-line='127' class='line-number'></div><div data-line='128' class='line-number'></div><div data-line='129' class='line-number'></div><div data-line='130' class='line-number'></div><div data-line='131' class='line-number'></div><div data-line='132' class='line-number'></div><div data-line='133' class='line-number'></div><div data-line='134' class='line-number'></div><div data-line='135' class='line-number'></div><div data-line='136' class='line-number'></div><div data-line='137' class='line-number'></div><div data-line='138' class='line-number'></div><div data-line='139' class='line-number'></div><div data-line='140' class='line-number'></div><div data-line='141' class='line-number'></div><div data-line='142' class='line-number'></div><div data-line='143' class='line-number'></div><div data-line='144' class='line-number'></div><div data-line='145' class='line-number'></div><div data-line='146' class='line-number'></div><div data-line='147' class='line-number'></div></pre></td><td class='main  js'><pre><div class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nb">window</span><span class="p">,</span> <span class="nb">document</span><span class="p">,</span> <span class="kc">undefined</span><span class="p">){</span>
</div><div class='line'><span class="s2">&quot;use strict&quot;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">// create a test element</span>
</div><div class='line'><span class="kd">var</span> <span class="nx">testElem</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;test&#39;</span><span class="p">),</span>
</div><div class='line'>    <span class="nx">docElement</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">documentElement</span><span class="p">,</span>
</div><div class='line'>    <span class="nx">defaultView</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">defaultView</span><span class="p">,</span>
</div><div class='line'>    <span class="nx">getComputedStyle</span> <span class="o">=</span> <span class="nx">defaultView</span> <span class="o">&amp;&amp;</span> <span class="nx">defaultView</span><span class="p">.</span><span class="nx">getComputedStyle</span><span class="p">,</span>
</div><div class='line'>    <span class="nx">computedValueBug</span><span class="p">,</span>
</div><div class='line'>    <span class="nx">runit</span> <span class="o">=</span> <span class="sr">/^(-?[\d+\.\-]+)([a-z]+|%)$/i</span><span class="p">,</span>
</div><div class='line'>    <span class="nx">convert</span> <span class="o">=</span> <span class="p">{},</span>
</div><div class='line'>    <span class="nx">conversions</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="o">/</span><span class="mf">25.4</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mf">2.54</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">72</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">6</span><span class="p">],</span>
</div><div class='line'>    <span class="nx">units</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;mm&#39;</span><span class="p">,</span> <span class="s1">&#39;cm&#39;</span><span class="p">,</span> <span class="s1">&#39;pt&#39;</span><span class="p">,</span> <span class="s1">&#39;pc&#39;</span><span class="p">,</span> <span class="s1">&#39;in&#39;</span><span class="p">,</span> <span class="s1">&#39;mozmm&#39;</span><span class="p">],</span>
</div><div class='line'>    <span class="nx">i</span> <span class="o">=</span> <span class="mi">6</span><span class="p">;</span> <span class="c1">// units.length</span>
</div><div class='line'> </div><div class='line'><span class="c1">// add the test element to the dom</span>
</div><div class='line'><span class="nx">docElement</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">testElem</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'><span class="c1">// test for the WebKit getComputedStyle bug</span>
</div><div class='line'><span class="c1">// @see http://bugs.jquery.com/ticket/10639</span>
</div><div class='line'><span class="k">if</span> <span class="p">(</span><span class="nx">getComputedStyle</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="c1">// add a percentage margin and measure it</span>
</div><div class='line'>    <span class="nx">testElem</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">marginTop</span> <span class="o">=</span> <span class="s1">&#39;1%&#39;</span><span class="p">;</span>
</div><div class='line'>    <span class="nx">computedValueBug</span> <span class="o">=</span> <span class="nx">getComputedStyle</span><span class="p">(</span><span class="nx">testElem</span><span class="p">).</span><span class="nx">marginTop</span> <span class="o">===</span> <span class="s1">&#39;1%&#39;</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// pre-calculate absolute unit conversions</span>
</div><div class='line'><span class="k">while</span><span class="p">(</span><span class="nx">i</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="nx">convert</span><span class="p">[</span><span class="nx">units</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;toPx&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">conversions</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">?</span> <span class="nx">conversions</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">*</span> <span class="nx">convert</span><span class="p">.</span><span class="nx">inToPx</span> <span class="o">:</span> <span class="nx">toPx</span><span class="p">(</span><span class="nx">testElem</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span> <span class="o">+</span> <span class="nx">units</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// remove the test element from the DOM and delete it</span>
</div><div class='line'><span class="nx">docElement</span><span class="p">.</span><span class="nx">removeChild</span><span class="p">(</span><span class="nx">testElem</span><span class="p">);</span>
</div><div class='line'><span class="nx">testElem</span> <span class="o">=</span> <span class="kc">undefined</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">// convert a value to pixels</span>
</div><div class='line'><span class="kd">function</span> <span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">prop</span><span class="p">,</span> <span class="nx">force</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="c1">// use width as the default property, or specify your own</span>
</div><div class='line'>    <span class="nx">prop</span> <span class="o">=</span> <span class="nx">prop</span> <span class="o">||</span> <span class="s1">&#39;width&#39;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="kd">var</span> <span class="nx">style</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">inlineValue</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">ret</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">unit</span> <span class="o">=</span> <span class="p">(</span><span class="nx">value</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">runit</span><span class="p">)</span><span class="o">||</span><span class="p">[])[</span><span class="mi">2</span><span class="p">],</span>
</div><div class='line'>        <span class="nx">conversion</span> <span class="o">=</span> <span class="nx">unit</span> <span class="o">===</span> <span class="s1">&#39;px&#39;</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="nx">convert</span><span class="p">[</span><span class="nx">unit</span> <span class="o">+</span> <span class="s1">&#39;toPx&#39;</span><span class="p">],</span>
</div><div class='line'>        <span class="nx">rem</span> <span class="o">=</span> <span class="sr">/r?em/i</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">conversion</span> <span class="o">||</span> <span class="nx">rem</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">unit</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">force</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// calculate known conversions immediately</span>
</div><div class='line'>        <span class="c1">// find the correct element for absolute units or rem or fontSize + em or em</span>
</div><div class='line'>        <span class="nx">elem</span> <span class="o">=</span> <span class="nx">conversion</span> <span class="o">?</span> <span class="nx">elem</span> <span class="o">:</span> <span class="nx">unit</span> <span class="o">===</span> <span class="s1">&#39;rem&#39;</span> <span class="o">?</span> <span class="nx">docElement</span> <span class="o">:</span> <span class="nx">prop</span> <span class="o">===</span> <span class="s1">&#39;fontSize&#39;</span> <span class="o">?</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">parentNode</span> <span class="o">||</span> <span class="nx">elem</span> <span class="o">:</span> <span class="nx">elem</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>        <span class="c1">// use the pre-calculated conversion or fontSize of the element for rem and em</span>
</div><div class='line'>        <span class="nx">conversion</span> <span class="o">=</span> <span class="nx">conversion</span> <span class="o">||</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">curCSS</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;fontSize&#39;</span><span class="p">));</span>
</div><div class='line'> </div><div class='line'>        <span class="c1">// multiply the value by the conversion</span>
</div><div class='line'>        <span class="nx">ret</span> <span class="o">=</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="o">*</span> <span class="nx">conversion</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// begin &quot;the awesome hack by Dean Edwards&quot;</span>
</div><div class='line'>        <span class="c1">// @see http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291</span>
</div><div class='line'> </div><div class='line'>        <span class="c1">// remember the current style</span>
</div><div class='line'>        <span class="nx">style</span> <span class="o">=</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">style</span><span class="p">;</span>
</div><div class='line'>        <span class="nx">inlineValue</span> <span class="o">=</span> <span class="nx">style</span><span class="p">[</span><span class="nx">prop</span><span class="p">];</span>
</div><div class='line'> </div><div class='line'>        <span class="c1">// set the style on the target element</span>
</div><div class='line'>        <span class="k">try</span> <span class="p">{</span>
</div><div class='line'>            <span class="nx">style</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span>
</div><div class='line'>        <span class="p">}</span> <span class="k">catch</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>            <span class="c1">// IE 8 and below throw an exception when setting unsupported units</span>
</div><div class='line'>            <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>        <span class="p">}</span>
</div><div class='line'> </div><div class='line'>        <span class="c1">// read the computed value</span>
</div><div class='line'>        <span class="c1">// if style is nothing we probably set an unsupported unit</span>
</div><div class='line'>        <span class="nx">ret</span> <span class="o">=</span> <span class="o">!</span><span class="nx">style</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">curCSS</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">prop</span><span class="p">));</span>
</div><div class='line'> </div><div class='line'>        <span class="c1">// reset the style back to what it was or blank it out</span>
</div><div class='line'>        <span class="nx">style</span><span class="p">[</span><span class="nx">prop</span><span class="p">]</span> <span class="o">=</span> <span class="nx">inlineValue</span> <span class="o">!==</span> <span class="kc">undefined</span> <span class="o">?</span> <span class="nx">inlineValue</span> <span class="o">:</span> <span class="kc">null</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// return a number</span>
</div><div class='line'>    <span class="k">return</span> <span class="nx">ret</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// return the computed value of a CSS property</span>
</div><div class='line'><span class="kd">function</span> <span class="nx">curCSS</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">prop</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="kd">var</span> <span class="nx">value</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">pixel</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">unit</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">rvpos</span> <span class="o">=</span> <span class="sr">/^top|bottom/</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">outerProp</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;paddingTop&quot;</span><span class="p">,</span> <span class="s2">&quot;paddingBottom&quot;</span><span class="p">,</span> <span class="s2">&quot;borderTop&quot;</span><span class="p">,</span> <span class="s2">&quot;borderBottom&quot;</span><span class="p">],</span>
</div><div class='line'>        <span class="nx">innerHeight</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">parent</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">i</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span> <span class="c1">// outerProp.length</span>
</div><div class='line'> </div><div class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">getComputedStyle</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// FireFox, Chrome/Safari, Opera and IE9+</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">getComputedStyle</span><span class="p">(</span><span class="nx">elem</span><span class="p">)[</span><span class="nx">prop</span><span class="p">];</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">pixel</span> <span class="o">=</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">style</span><span class="p">[</span><span class="s1">&#39;pixel&#39;</span> <span class="o">+</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="nx">toUpperCase</span><span class="p">()</span> <span class="o">+</span> <span class="nx">prop</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">1</span><span class="p">)])</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// IE and Opera support pixel shortcuts for top, bottom, left, right, height, width</span>
</div><div class='line'>        <span class="c1">// WebKit supports pixel shortcuts only when an absolute unit is used</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">pixel</span> <span class="o">+</span> <span class="s1">&#39;px&#39;</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">prop</span> <span class="o">===</span> <span class="s1">&#39;fontSize&#39;</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// correct IE issues with font-size</span>
</div><div class='line'>        <span class="c1">// @see http://bugs.jquery.com/ticket/760</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="s1">&#39;1em&#39;</span><span class="p">,</span> <span class="s1">&#39;left&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;px&#39;</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// IE 8 and below return the specified style</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">currentStyle</span><span class="p">[</span><span class="nx">prop</span><span class="p">];</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// check the unit</span>
</div><div class='line'>    <span class="nx">unit</span> <span class="o">=</span> <span class="p">(</span><span class="nx">value</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">runit</span><span class="p">)</span><span class="o">||</span><span class="p">[])[</span><span class="mi">2</span><span class="p">];</span>
</div><div class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">unit</span> <span class="o">===</span> <span class="s1">&#39;%&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">computedValueBug</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// WebKit won&#39;t convert percentages for top, bottom, left, right, margin and text-indent</span>
</div><div class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">rvpos</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">prop</span><span class="p">))</span> <span class="p">{</span>
</div><div class='line'>            <span class="c1">// Top and bottom require measuring the innerHeight of the parent.</span>
</div><div class='line'>            <span class="nx">innerHeight</span> <span class="o">=</span> <span class="p">(</span><span class="nx">parent</span> <span class="o">=</span> <span class="nx">elem</span><span class="p">.</span><span class="nx">parentNode</span> <span class="o">||</span> <span class="nx">elem</span><span class="p">).</span><span class="nx">offsetHeight</span><span class="p">;</span>
</div><div class='line'>            <span class="k">while</span> <span class="p">(</span><span class="nx">i</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>              <span class="nx">innerHeight</span> <span class="o">-=</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">curCSS</span><span class="p">(</span><span class="nx">parent</span><span class="p">,</span> <span class="nx">outerProp</span><span class="p">[</span><span class="nx">i</span><span class="p">]));</span>
</div><div class='line'>            <span class="p">}</span>
</div><div class='line'>            <span class="nx">value</span> <span class="o">=</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="o">/</span> <span class="mi">100</span> <span class="o">*</span> <span class="nx">innerHeight</span> <span class="o">+</span> <span class="s1">&#39;px&#39;</span><span class="p">;</span>
</div><div class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</div><div class='line'>            <span class="c1">// This fixes margin, left, right and text-indent</span>
</div><div class='line'>            <span class="c1">// @see https://bugs.webkit.org/show_bug.cgi?id=29084</span>
</div><div class='line'>            <span class="c1">// @see http://bugs.jquery.com/ticket/10639</span>
</div><div class='line'>            <span class="nx">value</span> <span class="o">=</span> <span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">value</span><span class="p">);</span>
</div><div class='line'>        <span class="p">}</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">((</span><span class="nx">value</span> <span class="o">===</span> <span class="s1">&#39;auto&#39;</span> <span class="o">||</span> <span class="p">(</span><span class="nx">unit</span> <span class="o">&amp;&amp;</span> <span class="nx">unit</span> <span class="o">!==</span> <span class="s1">&#39;px&#39;</span><span class="p">))</span> <span class="o">&amp;&amp;</span> <span class="nx">getComputedStyle</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// WebKit and Opera will return auto in some cases</span>
</div><div class='line'>        <span class="c1">// Firefox will pass back an unaltered value when it can&#39;t be set, like top on a static element</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">unit</span> <span class="o">&amp;&amp;</span> <span class="nx">unit</span> <span class="o">!==</span> <span class="s1">&#39;px&#39;</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">getComputedStyle</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="c1">// IE 8 and below won&#39;t convert units for us</span>
</div><div class='line'>        <span class="c1">// try to convert using a prop that will return pixels</span>
</div><div class='line'>        <span class="c1">// this will be accurate for everything (except font-size and some percentages)</span>
</div><div class='line'>        <span class="nx">value</span> <span class="o">=</span> <span class="nx">toPx</span><span class="p">(</span><span class="nx">elem</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;px&#39;</span><span class="p">;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>    <span class="k">return</span> <span class="nx">value</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// expose the conversion function to the window object</span>
</div><div class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">Length</span> <span class="o">=</span> <span class="p">{</span>
</div><div class='line'>    <span class="nx">toPx</span><span class="o">:</span> <span class="nx">toPx</span>
</div><div class='line'><span class="p">};</span>
</div><div class='line'><span class="p">}(</span><span class="k">this</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nb">document</span><span class="p">));</span>
</div></pre></td></tr></table></div></figure>
<h4 id="what-just-happened">What Just Happened?</h4>
<p>The final code above makes a few changes to the <code>toPx</code> function as well as pre-computing all of the conversions for the absolute units.</p>
<ul>
    <li>Pre-calculate the absolute units by converting mozmm and in to pixels using the <code>toPx</code> function and then using using the pixels-per-inch value to store the other conversions.</li>
    <li>Look for a pre-calculated conversion or a rem or em unit to convert the value to pixels immediately.</li>
    <li>For rem and em, choose the correct element to get the <code>fontSize</code> from and get the <code>fontSize</code> in pixels using the <code>curCSS</code> function and use that as the conversion.</li>
</ul>
<h2 id="what-is-this-good-for">What Is This Good For?</h2>
<p>Nothing? It depends.</p>
<p>Anyone familiar with jQuery knows that <code><a href="http://api.jquery.com/css/">$.css</a></code> will return the correct value for a property on an element but jQuery doesn't directly expose a method for converting units arbitrarily on an element. jQuery will convert units when calculating the start and end values for an animation (and it uses a version of "the awesome hack" to do it) but the conversion performed is limited in scope.</p>
<p>It's not possible to rely on jQuery (1.7.1 as of this writing) to handle unit conversion because it doesn't expose those methods to the API. Further, the optimizations for converting absolute, rem and em units without using "the awesome hack" should provide some speed improvements on any code that needs to rely on conversions. If you are writing a plugin, particularly a polyfill that requires some calculations to be done on a CSS property, properly converting units will allow users to specify values using the units that make sense to them instead of forcing everything to be specified in pixels.</p>
<p>JavaScript plug-ins don't usually do full-featured unit conversions because the code is typically too large to justify inclusion. However, the <a href="https://raw.github.com/gist/1516965/95dbb99b80b135fca5bb3ec5a5a397b26ded6e2c/Final.js">Final.js</a> file above will minify to around 1.24KB (774 bytes gzipped) using <a href="http://www.refresh-sf.com/yui/">YUI Compressor</a>, 1.2KB (758 bytes gzipped) using <a href="http://marijnhaverbeke.nl/uglifyjs">uglify.js</a> or 1.16KB (745 bytes gzipped) using <a href="http://closure-compiler.appspot.com/home">Google Closure Compiler</a>. The Google Closure Compiler <a href="https://raw.github.com/gist/1516965/7acdffc8a35aa66597bfabd280c26f116a6d4efe/Final.min.js">minified version can be downloaded here</a>.</p>
<p>The <a href="https://github.com/heygrady/Units">GitHub repo for Length and Angle units</a> will hold the latest code and also contains a straight-forward Angle conversion library.</p>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Using Images and JavaScript and Compass for Easy Cross-Browser Rounded Corners]]></title>
<link href="http://heygrady.com/blog/2011/08/25/using-images-and-javascript-and-compass-for-easy-cross-browser-rounded-corners/"/>
<updated>2011-08-25T13:14:00-07:00</updated>
<id>http://heygrady.com/blog/2011/08/25/using-images-and-javascript-and-compass-for-easy-cross-browser-rounded-corners</id>
<category term="compass" /><category term="js" /><category term="plug-in" /><category term="polyfill" /><category term="sass" />

      <content type="html"><![CDATA[<p>In a previous <a href="http://heygrady.com/blog/2011/02/24/cross-browser-rounded-corners-overview/">post exploring rounded corner methods</a>, I covered a technique using absolute positioning for faking rounded corners in browsers greater than IE6. One issue with faking rounded corners is the amount of HTML markup required as well as the hassle of crafting the accompanying CSS. I have created a jQuery plug-in for adding the required markup and a complementary Sass/Compass @mixin for generating the required CSS. The markup generated utilizes jQuery UI theming for the CSS class names. The code is <a href="https://github.com/heygrady/corners" title="jQuery corners">available on GitHub</a></p>
<!--more-->
<h2 id="summary-of-the-technique">Summary of the Technique</h2>
<p><a href="http://heygrady.com/blog/2011/02/24/cross-browser-rounded-corners-overview/#using-absolute-positioning">As covered before</a>, the idea is to use extra markup and CSS to create rounded corners even without support for <code>border-radius</code>. Of course the technique is also useful for creating fancy corners that <code>border-radius</code> wouldn't support. The two examples below show a normal <code>div</code> using <code>border-radius</code> and a box that is using the absolutely positioned <code>span</code> technique from the previous article.</p>
<figure>
	<img id="fig-border-radius-image" src="http://assets.heygrady.com/corners/border-radius-box.png" alt="simple box with a red border" />
	<iframe id="fig-border-radius-iframe" width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners/border-radius-box.html"></iframe>
	<script>
		if (Modernizr.borderradius) {
			document.getElementById("fig-border-radius-image").style.display = "none";
		} else {
			document.getElementById("fig-border-radius-iframe").style.display = "none";
		}
	</script>
	<figcaption>Border Radius<br>(<a href="http://assets.heygrady.com/corners/border-radius-box.html" target="_blank">view live example</a>)</figcaption>
</figure>
<figure>
	<iframe width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners/position-box-sprite.html"></iframe>
	<figcaption>Absolute Position using a Sprite<br>(<a href="http://assets.heygrady.com/corners/position-box-sprite.html" target="_blank">view live example</a>)</figcaption>
</figure>
<h3 id="basic-markup">Basic Markup</h3>
<p>The absolute positioning technique requires some additional markup to be added to the page for the corners and sides of the box. Below the initial <code>.box</code> is shown with no additional markup.</p>
<figure class='code'><figcaption>box.html<a href='https://gist.github.com/1161561'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;box&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;h2&gt;</span>Some Headline<span class="nt">&lt;/h2&gt;</span>
</div><div class='line'>  <span class="nt">&lt;p&gt;</span>My content.<span class="nt">&lt;/p&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div></pre></td></tr></table></div></figure>
<p>In order to create the illusion of corners, some additional markup must be added to the page. First the content is wrapped in a <code>.ui-corners-content</code> that is used with <code>z-index</code> to <a href="http://jsfiddle.net/heygrady/3YbNk/">ensure that the corners never cover up the content</a> of our <code>.box</code> &mdash; <a href="http://www.w3.org/TR/css3-background/#corner-clipping"
><code>border-radius</code> doesn't clip content</a> unless <code>overflow: hidden;</code> is set. Next, eight <code>span</code>s are added; one for each corner and side. Below is the markup used for creating the rounded corner illusion.</p>
<figure class='code'><figcaption>corners.html<a href='https://gist.github.com/1161561'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;box ui-corners&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;ui-corners-content&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;h2&gt;</span>Some Headline<span class="nt">&lt;/h2&gt;</span>
</div><div class='line'>    <span class="nt">&lt;p&gt;</span>My content.<span class="nt">&lt;/p&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-corners-corner ui-corners-corner-tl&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-corners-corner ui-corners-corner-tr&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-corners-corner ui-corners-corner-br&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-corners-corner ui-corners-corner-bl&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-corners-side ui-corners-side-top&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-corners-side ui-corners-side-right&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-corners-side ui-corners-side-bottom&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-corners-side ui-corners-side-left&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div></pre></td></tr></table></div></figure>
<p>As you can see above, the extra markup is very straightforward but it's not exactly ideal to have to add this to every box on a website &mdash; this is the point of the jQuery plug-in that will be discussed further down.</p>
<h3 id="basic-css">Basic CSS</h3>
<p>In order to optimize performance and simplify the JavaScript plug-in, all of the styling is done using CSS. The base CSS will set the <code>z-index</code> of the <code>.ui-corners-content</code> and position each of the corners and sides. As mentioned in the previous article, conflicting positioning properties are used to ensure that the sides stretch the fill width of the <code>.box</code>. For instance the left side, <code>.ui-corners-side-left</code>, is given a <code>top</code> and a <code>bottom</code> of 10px. Setting the <code>top</code> and <code>bottom</code> at the same time has the effect of stretching the <code>span</code> the entire height because both properties are honored. The 10px spacing is to prevent the sides from overlapping the corners. As mentioned in the previous article, IE6 will ignore the conflicting properties which makes this a poor solution for sites that require IE6 support.</p>
<p>The CSS below will correctly position all of the <code>span</code>s and set some default heights and widths. In order to actually see something, the base CSS needs to be extended by adding background images and altering the default heights and widths &mdash; this is the point of the Compass <code>@mixin</code> that will be discussed further down.</p>
<figure class='code'><figcaption>base.css<a href='https://gist.github.com/1161561'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="c">/* Default Corners CSS*/</span>
</div><div class='line'><span class="nc">.ui-corners</span> <span class="p">{</span> <span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-content</span> <span class="p">{</span> <span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span> <span class="k">z-index</span><span class="o">:</span> <span class="m">1</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-corner</span><span class="o">,</span> <span class="nc">.ui-corners-side</span> <span class="p">{</span> <span class="k">position</span><span class="o">:</span> <span class="k">absolute</span><span class="p">;</span> <span class="k">z-index</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-corner</span> <span class="p">{</span> <span class="k">height</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span> <span class="k">background-repeat</span><span class="o">:</span> <span class="k">no-repeat</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-corner-tl</span> <span class="p">{</span> <span class="k">top</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">left</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="k">left</span> <span class="k">top</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-corner-tr</span> <span class="p">{</span> <span class="k">top</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">right</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="k">right</span> <span class="k">top</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-corner-br</span> <span class="p">{</span> <span class="k">bottom</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">right</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="k">right</span> <span class="k">bottom</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-corner-bl</span> <span class="p">{</span> <span class="k">bottom</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">left</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="k">left</span> <span class="k">bottom</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-side-top</span><span class="o">,</span> <span class="nc">.ui-corners-side-bottom</span> <span class="p">{</span> <span class="k">left</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span> <span class="k">right</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span> <span class="k">background-repeat</span><span class="o">:</span> <span class="k">repeat-x</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-side-left</span><span class="o">,</span> <span class="nc">.ui-corners-side-right</span> <span class="p">{</span> <span class="k">top</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span> <span class="k">bottom</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span> <span class="k">background-repeat</span><span class="o">:</span> <span class="k">repeat-y</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-side-top</span> <span class="p">{</span> <span class="k">top</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="k">left</span> <span class="k">top</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-side-bottom</span> <span class="p">{</span> <span class="k">bottom</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="k">left</span> <span class="k">bottom</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-side-left</span> <span class="p">{</span> <span class="k">left</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="k">left</span> <span class="k">top</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.ui-corners-side-right</span> <span class="p">{</span> <span class="k">right</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="k">right</span> <span class="k">top</span><span class="p">;</span> <span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>Although absolutely positioned background images can look like a native <code>border-radius</code>, they don't actually affect the sizing of the box like a real border does. It's easy to fake the presence of a border by adding <code>padding</code> to the <code>.box</code> equal to the width of the border. While it's possible to simply set a transparent border &mdash; <code>border: 10px solid transparent;</code> &mdash; setting a border will require additional calculations for the corner and side <code>span</code>s because <a href="http://jsfiddle.net/heygrady/HVNEJ/">border appears outside the box</a>.</p>
<h2 id="using-the-jquery-corners-plug-in">Using the jQuery Corners Plug-in</h2>
<p>The jQuery Corners plug-in is very straightforward. Exactly as described in the basic markup section above, it wraps the content of the container in a <code>div</code> and adds eight <code>span</code>s to the container. Again, starting with the basic box.html file in the basic markup section above, the additional markup can be added as shown below.</p>
<figure class='code'><figcaption>usage.js<a href='https://gist.github.com/1161561'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  js'><pre><div class='line'><span class="nx">$</span><span class="p">(</span><span class="s1">&#39;.box&#39;</span><span class="p">).</span><span class="nx">corners</span><span class="p">();</span>
</div></pre></td></tr></table></div></figure>
<p>Currently the plug-in takes no arguments and does not apply any styling to the page. This is intentional because the styling should be controlled using CSS, similar to most jQuery UI widgets.</p>
<h3 id="the-actual-plug-in">The Actual Plug-In</h3>
<p>Below is the actual plug-in that adds the markup to the page. As noted above, the plug-in wraps the contents of the target element in a <code>.ui-corners-content</code> and then appends all of the side and corner <code>span</code>s.</p>
<figure class='code'><figcaption>jquery-corners.js<a href='https://gist.github.com/1161561'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div></pre></td><td class='main  js'><pre><div class='line'><span class="c1">///////////////////////////////////////////////////////</span>
</div><div class='line'><span class="c1">// Corners</span>
</div><div class='line'><span class="c1">///////////////////////////////////////////////////////</span>
</div><div class='line'><span class="p">;(</span><span class="kd">function</span><span class="p">(</span><span class="nx">$</span><span class="p">,</span> <span class="kc">undefined</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="c1">// set up strings</span>
</div><div class='line'>    <span class="kd">var</span> <span class="nx">corners</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;tl&quot;</span><span class="p">,</span> <span class="s2">&quot;tr&quot;</span><span class="p">,</span> <span class="s2">&quot;br&quot;</span><span class="p">,</span> <span class="s2">&quot;bl&quot;</span><span class="p">],</span>
</div><div class='line'>        <span class="nx">sides</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;top&quot;</span><span class="p">,</span> <span class="s2">&quot;right&quot;</span><span class="p">,</span> <span class="s2">&quot;bottom&quot;</span><span class="p">,</span> <span class="s2">&quot;left&quot;</span><span class="p">],</span>
</div><div class='line'>        <span class="nx">className</span> <span class="o">=</span> <span class="s2">&quot;ui-corners&quot;</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">cornerClassName</span> <span class="o">=</span> <span class="nx">className</span> <span class="o">+</span> <span class="s2">&quot;-corner&quot;</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">sideClassName</span> <span class="o">=</span> <span class="nx">className</span> <span class="o">+</span> <span class="s2">&quot;-side&quot;</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">spans</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</div><div class='line'>        <span class="nx">spanStart</span>  <span class="o">=</span> <span class="s1">&#39;&lt;span class=&quot;&#39;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// creat the span string</span>
</div><div class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="nx">corners</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</div><div class='line'>        <span class="nx">spans</span> <span class="o">+=</span> <span class="nx">spanStart</span> <span class="o">+</span> <span class="nx">cornerClassName</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nx">cornerClassName</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="k">this</span> <span class="o">+</span> <span class="s1">&#39;&quot;/&gt;&#39;</span><span class="p">;</span>
</div><div class='line'>    <span class="p">});</span>
</div><div class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">each</span><span class="p">(</span><span class="nx">sides</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</div><div class='line'>        <span class="nx">spans</span> <span class="o">+=</span> <span class="nx">spanStart</span> <span class="o">+</span> <span class="nx">sideClassName</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nx">sideClassName</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span> <span class="o">+</span> <span class="k">this</span> <span class="o">+</span> <span class="s1">&#39;&quot;/&gt;&#39;</span><span class="p">;</span>
</div><div class='line'>    <span class="p">});</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// add corners/sides to an element</span>
</div><div class='line'>    <span class="c1">// wrap the contents with a content div</span>
</div><div class='line'>    <span class="kd">function</span> <span class="nx">addCorners</span><span class="p">(</span><span class="nx">el</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>        <span class="nx">$</span><span class="p">(</span><span class="nx">el</span><span class="p">).</span><span class="nx">wrapInner</span><span class="p">(</span><span class="s1">&#39;&lt;div class=&quot;&#39;</span> <span class="o">+</span> <span class="nx">className</span> <span class="o">+</span> <span class="s1">&#39;-content&quot; /&gt;&#39;</span><span class="p">).</span><span class="nx">append</span><span class="p">(</span><span class="nx">spans</span><span class="p">).</span><span class="nx">addClass</span><span class="p">(</span><span class="nx">className</span><span class="p">);</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'> </div><div class='line'>    <span class="c1">// create a jQuery plugin for adding in the corners</span>
</div><div class='line'>    <span class="nx">$</span><span class="p">.</span><span class="nx">fn</span><span class="p">.</span><span class="nx">corners</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</div><div class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">not</span><span class="p">(</span><span class="s1">&#39;.&#39;</span> <span class="o">+</span> <span class="nx">className</span><span class="p">).</span><span class="nx">each</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</div><div class='line'>            <span class="nx">addCorners</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</div><div class='line'>        <span class="p">});</span>
</div><div class='line'>    <span class="p">};</span>
</div><div class='line'><span class="p">})(</span><span class="nx">jQuery</span><span class="p">);</span>
</div></pre></td></tr></table></div></figure>
<p>Special care is taken to avoid adding the extra markup to elements that have already been processed. The <code>.ui-corners</code> class is detected and those elements are skipped. Also, repeated strings are saved in variables to <a href="http://yuiblog.com/blog/2008/02/11/helping-the-yui-compressor">aid in compressing</a>. The script is only 402 characters after running it through <a href="http://www.refresh-sf.com/yui/">YUI Compressor</a> and 267 bytes after gzipping.</p>
<h3 id="seeing-the-plug-in-in-action">Seeing the Plug-in In Action</h3>
<p>Below you can see a <code>.box</code> that has had the corners applied. The base.css file shown above is used for the styling. Background colors have been applied to the side and corner <code>span</code>s to make them visible. It's also clear that the corners and sides are not overlapping the content.</p>
<figure>
	<iframe width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners-2/base.html"></iframe>
	<figcaption>jQuery Corners Basic Usage<br>(<a href="http://assets.heygrady.com/corners-2/base.html" target="_blank">view live example</a>)</figcaption>
</figure>
<p>For more advanced styling it is recommended to use the SASS <code>@mixin</code> described below.</p>
<h2 id="using-the-ui-corners--code--mixin--code">Using the UI Corners <code>@mixin</code></h2>
<p>Although the base.css above will correctly position all of the corners and sides, more calculations are needed for actually using background images. For these purposes the SASS/Compass plug-in provides two <code>@mixin</code>s: <code>corner-images</code> and <code>corner-border-width</code>. These <code>@mixin</code>s greatly simplify the creation of CSS for mimicking rounded corners as well as more advanced examples.</p>
<h4 id="using--mixin-corner-images">Using @mixin corner-images</h4>
<p>The <code>corner-images</code> <code>@mixin</code> takes eight arguments, one for each corner and side. The arguments are ordered clockwise starting with the top-left corner and ending with the left side. Each argument is a <a href="http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#lists">Sass list</a> of values. The corners and sides require slightly different values in the list &mdash; corners have a height and width while sides only have one dimension that can be specified &mdash; however <code>background-image</code> value is always the first value. All other values in the list can be left at default. Each argument is optional and may be skipped by passing in "auto" or using <a href="http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#keyword_arguments">Sass keyword arguments</a>.</p>
<h5><code>@include corner-images( [$tl], [$t], [$tr], [$r], [$br], [$b], [$bl], [$l] )</code></h5>
<ul>
	<li><code>$tl</code> &mdash; [background-image] [width] [height] [background-position-x] [background-position-y] [left] [top] </li>
	<li><code>$t</code> &mdash; [background-image] [height] [background-position-x] [background-position-y] [top] [left] [right]</li>
	<li><code>$tr</code> &mdash; [background-image] [width] [height] [background-position-x] [background-position-y] [right] [top]</li>
	<li><code>$r</code> &mdash; [background-image] [width] [background-position-x] [background-position-y] [right] [top] [bottom]</li>
	<li><code>$br</code> &mdash; [background-image] [width] [height] [background-position-x] [background-position-y] [right] [bottom]</li>
	<li><code>$b</code> &mdash; [background-image] [height] [background-position-x] [background-position-y] [bottom] [left] [right]</li>
	<li><code>$bl</code> &mdash; [background-image] [width] [height] [background-position-x] [background-position-y] [left] [bottom]</li>
	<li><code>$l</code> &mdash; [background-image] [width] [background-position-x] [background-position-y] [left] [top] [bottom]</li>
</ul>
<h4 id="using--mixin-corner-border-width">Using @mixin corner-border-width</h4>
<p>The <code>corner-border-width</code> <code>@mixin</code> mimics a real border on the <code>box</code> using padding. As discussed above, setting a transparent border will cause some positioning issues because <a href="http://jsfiddle.net/heygrady/HVNEJ/">borders appears outside of the element</a>. This issues is overcome by simply using <code>padding</code>. For convenience, if real padding is needed it can be passed as the second argument which will be added to the first argument. Both arguments are <a href="http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#lists">Sass lists</a> taking the same values as the <a href="http://reference.sitepoint.com/css/padding">CSS padding property</a>. Similar to <code>padding</code>, each argument can take a list of one, two, three or four values.</p>
<h5><code>@include corner-border-width( $border-width, [$padding] )</code></h5>
<ul>
	<li><code>$border-width</code> &mdash; [top-width] [right-width] [bottom-width] [left-width]</li>
	<li><code>$padding</code> &mdash; [top-width] [right-width] [bottom-width] [left-width]</li>
</ul>
<h3 id="the-actual--mixin">The Actual @mixin</h3>
<p>Below is the entire <code>@mixin</code> that is used for generating the CSS. There are the two mixins mentioned above as well as a number of helper functions for manipulation all of the list values. Close inspection reveals that there are a number over default variables available. Passing "default" instead of "auto" for any value will favor the default value if it exists. Auto values are based on the other passed values while default values rely blindly on the default variables. The <a href="http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#variable_defaults_">default variables can be easily overridden</a>. At the bottom of the file, the default styles are visible. Simply including this plugin will generate the default styles as shown in the base.css above.</p>
<figure class='code'><figcaption>_ui-corners.scss<a href='https://gist.github.com/1161561'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div><div data-line='56' class='line-number'></div><div data-line='57' class='line-number'></div><div data-line='58' class='line-number'></div><div data-line='59' class='line-number'></div><div data-line='60' class='line-number'></div><div data-line='61' class='line-number'></div><div data-line='62' class='line-number'></div><div data-line='63' class='line-number'></div><div data-line='64' class='line-number'></div><div data-line='65' class='line-number'></div><div data-line='66' class='line-number'></div><div data-line='67' class='line-number'></div><div data-line='68' class='line-number'></div><div data-line='69' class='line-number'></div><div data-line='70' class='line-number'></div><div data-line='71' class='line-number'></div><div data-line='72' class='line-number'></div><div data-line='73' class='line-number'></div><div data-line='74' class='line-number'></div><div data-line='75' class='line-number'></div><div data-line='76' class='line-number'></div><div data-line='77' class='line-number'></div><div data-line='78' class='line-number'></div><div data-line='79' class='line-number'></div><div data-line='80' class='line-number'></div><div data-line='81' class='line-number'></div><div data-line='82' class='line-number'></div><div data-line='83' class='line-number'></div><div data-line='84' class='line-number'></div><div data-line='85' class='line-number'></div><div data-line='86' class='line-number'></div><div data-line='87' class='line-number'></div><div data-line='88' class='line-number'></div><div data-line='89' class='line-number'></div><div data-line='90' class='line-number'></div><div data-line='91' class='line-number'></div><div data-line='92' class='line-number'></div><div data-line='93' class='line-number'></div><div data-line='94' class='line-number'></div><div data-line='95' class='line-number'></div><div data-line='96' class='line-number'></div><div data-line='97' class='line-number'></div><div data-line='98' class='line-number'></div><div data-line='99' class='line-number'></div><div data-line='100' class='line-number'></div><div data-line='101' class='line-number'></div><div data-line='102' class='line-number'></div><div data-line='103' class='line-number'></div><div data-line='104' class='line-number'></div><div data-line='105' class='line-number'></div><div data-line='106' class='line-number'></div><div data-line='107' class='line-number'></div><div data-line='108' class='line-number'></div><div data-line='109' class='line-number'></div><div data-line='110' class='line-number'></div><div data-line='111' class='line-number'></div><div data-line='112' class='line-number'></div><div data-line='113' class='line-number'></div><div data-line='114' class='line-number'></div><div data-line='115' class='line-number'></div><div data-line='116' class='line-number'></div><div data-line='117' class='line-number'></div><div data-line='118' class='line-number'></div><div data-line='119' class='line-number'></div><div data-line='120' class='line-number'></div><div data-line='121' class='line-number'></div><div data-line='122' class='line-number'></div><div data-line='123' class='line-number'></div><div data-line='124' class='line-number'></div><div data-line='125' class='line-number'></div><div data-line='126' class='line-number'></div><div data-line='127' class='line-number'></div><div data-line='128' class='line-number'></div><div data-line='129' class='line-number'></div><div data-line='130' class='line-number'></div><div data-line='131' class='line-number'></div><div data-line='132' class='line-number'></div><div data-line='133' class='line-number'></div><div data-line='134' class='line-number'></div><div data-line='135' class='line-number'></div><div data-line='136' class='line-number'></div><div data-line='137' class='line-number'></div><div data-line='138' class='line-number'></div><div data-line='139' class='line-number'></div><div data-line='140' class='line-number'></div><div data-line='141' class='line-number'></div><div data-line='142' class='line-number'></div><div data-line='143' class='line-number'></div><div data-line='144' class='line-number'></div><div data-line='145' class='line-number'></div><div data-line='146' class='line-number'></div><div data-line='147' class='line-number'></div><div data-line='148' class='line-number'></div><div data-line='149' class='line-number'></div><div data-line='150' class='line-number'></div><div data-line='151' class='line-number'></div><div data-line='152' class='line-number'></div><div data-line='153' class='line-number'></div><div data-line='154' class='line-number'></div><div data-line='155' class='line-number'></div><div data-line='156' class='line-number'></div><div data-line='157' class='line-number'></div><div data-line='158' class='line-number'></div><div data-line='159' class='line-number'></div><div data-line='160' class='line-number'></div><div data-line='161' class='line-number'></div><div data-line='162' class='line-number'></div><div data-line='163' class='line-number'></div><div data-line='164' class='line-number'></div><div data-line='165' class='line-number'></div><div data-line='166' class='line-number'></div><div data-line='167' class='line-number'></div><div data-line='168' class='line-number'></div><div data-line='169' class='line-number'></div><div data-line='170' class='line-number'></div><div data-line='171' class='line-number'></div><div data-line='172' class='line-number'></div><div data-line='173' class='line-number'></div><div data-line='174' class='line-number'></div><div data-line='175' class='line-number'></div><div data-line='176' class='line-number'></div><div data-line='177' class='line-number'></div><div data-line='178' class='line-number'></div><div data-line='179' class='line-number'></div><div data-line='180' class='line-number'></div><div data-line='181' class='line-number'></div><div data-line='182' class='line-number'></div><div data-line='183' class='line-number'></div><div data-line='184' class='line-number'></div><div data-line='185' class='line-number'></div><div data-line='186' class='line-number'></div><div data-line='187' class='line-number'></div><div data-line='188' class='line-number'></div><div data-line='189' class='line-number'></div><div data-line='190' class='line-number'></div><div data-line='191' class='line-number'></div><div data-line='192' class='line-number'></div><div data-line='193' class='line-number'></div><div data-line='194' class='line-number'></div><div data-line='195' class='line-number'></div><div data-line='196' class='line-number'></div><div data-line='197' class='line-number'></div><div data-line='198' class='line-number'></div><div data-line='199' class='line-number'></div><div data-line='200' class='line-number'></div><div data-line='201' class='line-number'></div><div data-line='202' class='line-number'></div><div data-line='203' class='line-number'></div><div data-line='204' class='line-number'></div><div data-line='205' class='line-number'></div><div data-line='206' class='line-number'></div><div data-line='207' class='line-number'></div><div data-line='208' class='line-number'></div><div data-line='209' class='line-number'></div><div data-line='210' class='line-number'></div><div data-line='211' class='line-number'></div><div data-line='212' class='line-number'></div><div data-line='213' class='line-number'></div><div data-line='214' class='line-number'></div><div data-line='215' class='line-number'></div><div data-line='216' class='line-number'></div><div data-line='217' class='line-number'></div><div data-line='218' class='line-number'></div><div data-line='219' class='line-number'></div><div data-line='220' class='line-number'></div><div data-line='221' class='line-number'></div><div data-line='222' class='line-number'></div><div data-line='223' class='line-number'></div><div data-line='224' class='line-number'></div><div data-line='225' class='line-number'></div><div data-line='226' class='line-number'></div><div data-line='227' class='line-number'></div><div data-line='228' class='line-number'></div><div data-line='229' class='line-number'></div><div data-line='230' class='line-number'></div><div data-line='231' class='line-number'></div><div data-line='232' class='line-number'></div><div data-line='233' class='line-number'></div><div data-line='234' class='line-number'></div><div data-line='235' class='line-number'></div><div data-line='236' class='line-number'></div><div data-line='237' class='line-number'></div><div data-line='238' class='line-number'></div><div data-line='239' class='line-number'></div><div data-line='240' class='line-number'></div><div data-line='241' class='line-number'></div><div data-line='242' class='line-number'></div><div data-line='243' class='line-number'></div><div data-line='244' class='line-number'></div><div data-line='245' class='line-number'></div><div data-line='246' class='line-number'></div><div data-line='247' class='line-number'></div><div data-line='248' class='line-number'></div><div data-line='249' class='line-number'></div><div data-line='250' class='line-number'></div><div data-line='251' class='line-number'></div><div data-line='252' class='line-number'></div><div data-line='253' class='line-number'></div><div data-line='254' class='line-number'></div><div data-line='255' class='line-number'></div><div data-line='256' class='line-number'></div><div data-line='257' class='line-number'></div><div data-line='258' class='line-number'></div><div data-line='259' class='line-number'></div><div data-line='260' class='line-number'></div><div data-line='261' class='line-number'></div><div data-line='262' class='line-number'></div><div data-line='263' class='line-number'></div><div data-line='264' class='line-number'></div><div data-line='265' class='line-number'></div><div data-line='266' class='line-number'></div><div data-line='267' class='line-number'></div><div data-line='268' class='line-number'></div><div data-line='269' class='line-number'></div><div data-line='270' class='line-number'></div><div data-line='271' class='line-number'></div><div data-line='272' class='line-number'></div><div data-line='273' class='line-number'></div><div data-line='274' class='line-number'></div><div data-line='275' class='line-number'></div><div data-line='276' class='line-number'></div><div data-line='277' class='line-number'></div><div data-line='278' class='line-number'></div><div data-line='279' class='line-number'></div><div data-line='280' class='line-number'></div><div data-line='281' class='line-number'></div><div data-line='282' class='line-number'></div><div data-line='283' class='line-number'></div><div data-line='284' class='line-number'></div><div data-line='285' class='line-number'></div><div data-line='286' class='line-number'></div><div data-line='287' class='line-number'></div><div data-line='288' class='line-number'></div><div data-line='289' class='line-number'></div><div data-line='290' class='line-number'></div><div data-line='291' class='line-number'></div><div data-line='292' class='line-number'></div><div data-line='293' class='line-number'></div><div data-line='294' class='line-number'></div><div data-line='295' class='line-number'></div><div data-line='296' class='line-number'></div><div data-line='297' class='line-number'></div><div data-line='298' class='line-number'></div><div data-line='299' class='line-number'></div><div data-line='300' class='line-number'></div><div data-line='301' class='line-number'></div><div data-line='302' class='line-number'></div><div data-line='303' class='line-number'></div><div data-line='304' class='line-number'></div><div data-line='305' class='line-number'></div><div data-line='306' class='line-number'></div><div data-line='307' class='line-number'></div><div data-line='308' class='line-number'></div><div data-line='309' class='line-number'></div><div data-line='310' class='line-number'></div><div data-line='311' class='line-number'></div><div data-line='312' class='line-number'></div><div data-line='313' class='line-number'></div><div data-line='314' class='line-number'></div><div data-line='315' class='line-number'></div><div data-line='316' class='line-number'></div><div data-line='317' class='line-number'></div><div data-line='318' class='line-number'></div><div data-line='319' class='line-number'></div><div data-line='320' class='line-number'></div><div data-line='321' class='line-number'></div><div data-line='322' class='line-number'></div><div data-line='323' class='line-number'></div><div data-line='324' class='line-number'></div><div data-line='325' class='line-number'></div><div data-line='326' class='line-number'></div><div data-line='327' class='line-number'></div><div data-line='328' class='line-number'></div><div data-line='329' class='line-number'></div><div data-line='330' class='line-number'></div><div data-line='331' class='line-number'></div><div data-line='332' class='line-number'></div><div data-line='333' class='line-number'></div><div data-line='334' class='line-number'></div><div data-line='335' class='line-number'></div><div data-line='336' class='line-number'></div><div data-line='337' class='line-number'></div><div data-line='338' class='line-number'></div><div data-line='339' class='line-number'></div><div data-line='340' class='line-number'></div><div data-line='341' class='line-number'></div><div data-line='342' class='line-number'></div><div data-line='343' class='line-number'></div><div data-line='344' class='line-number'></div><div data-line='345' class='line-number'></div><div data-line='346' class='line-number'></div><div data-line='347' class='line-number'></div><div data-line='348' class='line-number'></div><div data-line='349' class='line-number'></div><div data-line='350' class='line-number'></div><div data-line='351' class='line-number'></div><div data-line='352' class='line-number'></div><div data-line='353' class='line-number'></div><div data-line='354' class='line-number'></div><div data-line='355' class='line-number'></div><div data-line='356' class='line-number'></div><div data-line='357' class='line-number'></div><div data-line='358' class='line-number'></div><div data-line='359' class='line-number'></div><div data-line='360' class='line-number'></div><div data-line='361' class='line-number'></div><div data-line='362' class='line-number'></div><div data-line='363' class='line-number'></div><div data-line='364' class='line-number'></div><div data-line='365' class='line-number'></div><div data-line='366' class='line-number'></div><div data-line='367' class='line-number'></div><div data-line='368' class='line-number'></div><div data-line='369' class='line-number'></div><div data-line='370' class='line-number'></div><div data-line='371' class='line-number'></div><div data-line='372' class='line-number'></div><div data-line='373' class='line-number'></div><div data-line='374' class='line-number'></div><div data-line='375' class='line-number'></div><div data-line='376' class='line-number'></div><div data-line='377' class='line-number'></div><div data-line='378' class='line-number'></div><div data-line='379' class='line-number'></div><div data-line='380' class='line-number'></div><div data-line='381' class='line-number'></div><div data-line='382' class='line-number'></div><div data-line='383' class='line-number'></div><div data-line='384' class='line-number'></div><div data-line='385' class='line-number'></div><div data-line='386' class='line-number'></div><div data-line='387' class='line-number'></div><div data-line='388' class='line-number'></div><div data-line='389' class='line-number'></div><div data-line='390' class='line-number'></div><div data-line='391' class='line-number'></div><div data-line='392' class='line-number'></div><div data-line='393' class='line-number'></div><div data-line='394' class='line-number'></div><div data-line='395' class='line-number'></div><div data-line='396' class='line-number'></div><div data-line='397' class='line-number'></div><div data-line='398' class='line-number'></div><div data-line='399' class='line-number'></div><div data-line='400' class='line-number'></div><div data-line='401' class='line-number'></div><div data-line='402' class='line-number'></div><div data-line='403' class='line-number'></div><div data-line='404' class='line-number'></div><div data-line='405' class='line-number'></div><div data-line='406' class='line-number'></div><div data-line='407' class='line-number'></div><div data-line='408' class='line-number'></div><div data-line='409' class='line-number'></div><div data-line='410' class='line-number'></div><div data-line='411' class='line-number'></div><div data-line='412' class='line-number'></div><div data-line='413' class='line-number'></div><div data-line='414' class='line-number'></div><div data-line='415' class='line-number'></div><div data-line='416' class='line-number'></div><div data-line='417' class='line-number'></div><div data-line='418' class='line-number'></div><div data-line='419' class='line-number'></div><div data-line='420' class='line-number'></div><div data-line='421' class='line-number'></div><div data-line='422' class='line-number'></div><div data-line='423' class='line-number'></div><div data-line='424' class='line-number'></div><div data-line='425' class='line-number'></div><div data-line='426' class='line-number'></div><div data-line='427' class='line-number'></div><div data-line='428' class='line-number'></div><div data-line='429' class='line-number'></div><div data-line='430' class='line-number'></div><div data-line='431' class='line-number'></div><div data-line='432' class='line-number'></div><div data-line='433' class='line-number'></div><div data-line='434' class='line-number'></div><div data-line='435' class='line-number'></div><div data-line='436' class='line-number'></div><div data-line='437' class='line-number'></div><div data-line='438' class='line-number'></div><div data-line='439' class='line-number'></div><div data-line='440' class='line-number'></div><div data-line='441' class='line-number'></div><div data-line='442' class='line-number'></div><div data-line='443' class='line-number'></div><div data-line='444' class='line-number'></div><div data-line='445' class='line-number'></div><div data-line='446' class='line-number'></div><div data-line='447' class='line-number'></div><div data-line='448' class='line-number'></div><div data-line='449' class='line-number'></div><div data-line='450' class='line-number'></div><div data-line='451' class='line-number'></div><div data-line='452' class='line-number'></div><div data-line='453' class='line-number'></div><div data-line='454' class='line-number'></div><div data-line='455' class='line-number'></div><div data-line='456' class='line-number'></div><div data-line='457' class='line-number'></div><div data-line='458' class='line-number'></div><div data-line='459' class='line-number'></div><div data-line='460' class='line-number'></div><div data-line='461' class='line-number'></div><div data-line='462' class='line-number'></div><div data-line='463' class='line-number'></div><div data-line='464' class='line-number'></div><div data-line='465' class='line-number'></div><div data-line='466' class='line-number'></div><div data-line='467' class='line-number'></div><div data-line='468' class='line-number'></div><div data-line='469' class='line-number'></div><div data-line='470' class='line-number'></div><div data-line='471' class='line-number'></div><div data-line='472' class='line-number'></div><div data-line='473' class='line-number'></div><div data-line='474' class='line-number'></div><div data-line='475' class='line-number'></div><div data-line='476' class='line-number'></div><div data-line='477' class='line-number'></div><div data-line='478' class='line-number'></div><div data-line='479' class='line-number'></div><div data-line='480' class='line-number'></div></pre></td><td class='main  scss'><pre><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="c1">// Variables</span>
</div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="nv">$ui-corners-cache-buster</span><span class="o">:</span> <span class="n-Pseudo">true</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">// default widths</span>
</div><div class='line'><span class="nv">$ui-corners-corner-height</span><span class="o">:</span> <span class="mi">10</span><span class="kt">px</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'><span class="nv">$ui-corners-corner-width</span><span class="o">:</span> <span class="mi">10</span><span class="kt">px</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'><span class="nv">$ui-corners-side-width</span><span class="o">:</span> <span class="mi">10</span><span class="kt">px</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">// defaults per corner</span>
</div><div class='line'><span class="nv">$ui-corners-corner-tl-height</span><span class="o">:</span> <span class="nv">$ui-corners-corner-height</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'><span class="nv">$ui-corners-corner-tl-width</span><span class="o">:</span> <span class="nv">$ui-corners-corner-width</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'><span class="nv">$ui-corners-corner-tr-height</span><span class="o">:</span> <span class="nv">$ui-corners-corner-height</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'><span class="nv">$ui-corners-corner-tr-width</span><span class="o">:</span> <span class="nv">$ui-corners-corner-width</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'><span class="nv">$ui-corners-corner-br-height</span><span class="o">:</span> <span class="nv">$ui-corners-corner-height</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'><span class="nv">$ui-corners-corner-br-width</span><span class="o">:</span> <span class="nv">$ui-corners-corner-width</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'><span class="nv">$ui-corners-corner-bl-height</span><span class="o">:</span> <span class="nv">$ui-corners-corner-height</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'><span class="nv">$ui-corners-corner-bl-width</span><span class="o">:</span> <span class="nv">$ui-corners-corner-width</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">// defaults per side</span>
</div><div class='line'><span class="nv">$ui-corners-side-top-width</span><span class="o">:</span> <span class="nv">$ui-corners-side-width</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'><span class="nv">$ui-corners-side-bottom-width</span><span class="o">:</span> <span class="nv">$ui-corners-side-width</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'><span class="nv">$ui-corners-side-left-width</span><span class="o">:</span> <span class="nv">$ui-corners-side-width</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'><span class="nv">$ui-corners-side-right-width</span><span class="o">:</span> <span class="nv">$ui-corners-side-width</span> <span class="nv">!default</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="c1">// Corner Border Width</span>
</div><div class='line'><span class="c1">// Adds padding to the corner container to simulate a border</span>
</div><div class='line'><span class="c1">// The second parameter allows for setting an inner padding in addition to the border</span>
</div><div class='line'><span class="c1">// @param list $width border-width list: [top] [right] [bottom] [left]</span>
</div><div class='line'><span class="c1">// @param list $padding (optional) padding list: [top] [right] [bottom] [left]</span>
</div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="k">@mixin</span><span class="nf"> corner-border-width</span> <span class="p">(</span><span class="nv">$border-width</span><span class="o">,</span> <span class="nv">$padding</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$padding</span> <span class="p">{</span>
</div><div class='line'>    <span class="nv">$border-width</span><span class="o">:</span> <span class="nf">corner-zip-widths</span><span class="p">(</span><span class="nv">$border-width</span><span class="o">,</span> <span class="nv">$padding</span><span class="p">);</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'>  <span class="k">&amp;</span><span class="nc">.ui-corners</span> <span class="p">{</span> <span class="na">padding</span><span class="o">:</span> <span class="nv">$border-width</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="c1">// Corner Zip Widths</span>
</div><div class='line'><span class="c1">// returns a list of the two lists added together</span>
</div><div class='line'><span class="c1">// @param list $a list of widths: [top] [right] [bottom] [left]</span>
</div><div class='line'><span class="c1">// @param list $b (optional) list of widths: [top] [right] [bottom] [left]</span>
</div><div class='line'><span class="c1">// @return list</span>
</div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="k">@function</span> <span class="nt">corner-zip-widths</span><span class="o">(</span><span class="err">$</span><span class="nt">a</span><span class="o">,</span> <span class="err">$</span><span class="nt">b</span><span class="nd">:</span> <span class="nt">0</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="nv">$a-t</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$a</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$a-r</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$a</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="nv">$a-t</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$a-b</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$a</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="nv">$a-t</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$a-l</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$a</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="nv">$a-r</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>  <span class="nv">$b-t</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$b</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$b-r</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$b</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="nv">$b-t</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$b-b</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$b</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="nv">$b-t</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$b-l</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$b</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="nv">$b-r</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>  <span class="nv">$a-t</span><span class="o">:</span> <span class="nv">$a-t</span> <span class="o">+</span> <span class="nv">$b-t</span><span class="p">;</span>
</div><div class='line'>  <span class="nv">$a-r</span><span class="o">:</span> <span class="nv">$a-r</span> <span class="o">+</span> <span class="nv">$b-r</span><span class="p">;</span>
</div><div class='line'>  <span class="nv">$a-b</span><span class="o">:</span> <span class="nv">$a-b</span> <span class="o">+</span> <span class="nv">$b-b</span><span class="p">;</span>
</div><div class='line'>  <span class="nv">$a-l</span><span class="o">:</span> <span class="nv">$a-l</span> <span class="o">+</span> <span class="nv">$b-l</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>  <span class="k">@if</span> <span class="nv">$a-t</span> <span class="o">==</span> <span class="nv">$a-b</span> <span class="ow">and</span> <span class="nv">$a-r</span> <span class="o">==</span> <span class="nv">$a-l</span> <span class="ow">and</span> <span class="nv">$a-t</span> <span class="o">==</span> <span class="nv">$a-r</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">@return</span> <span class="err">$</span><span class="nt">a-t</span><span class="o">;</span> <span class="o">//</span> <span class="nt">all</span> <span class="nt">equal</span>
</div><div class='line'>  <span class="p">}</span> <span class="k">@elseif</span> <span class="err">$</span><span class="nt">a-t</span> <span class="o">==</span> <span class="err">$</span><span class="nt">a-b</span> <span class="nt">and</span> <span class="err">$</span><span class="nt">a-r</span> <span class="o">==</span> <span class="err">$</span><span class="nt">a-l</span> <span class="nt">and</span> <span class="err">$</span><span class="nt">a-t</span> <span class="o">!=</span> <span class="err">$</span><span class="nt">a-r</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">@return</span> <span class="err">$</span><span class="nt">a-t</span> <span class="err">$</span><span class="nt">a-r</span><span class="o">;</span> <span class="o">//</span> <span class="nt">x</span> <span class="nt">and</span> <span class="nt">y</span> <span class="nt">different</span>
</div><div class='line'>  <span class="p">}</span> <span class="k">@elseif</span> <span class="err">$</span><span class="nt">a-t</span> <span class="o">!=</span> <span class="err">$</span><span class="nt">a-b</span> <span class="nt">and</span> <span class="err">$</span><span class="nt">a-r</span> <span class="o">==</span> <span class="err">$</span><span class="nt">a-l</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">@return</span> <span class="err">$</span><span class="nt">a-t</span> <span class="err">$</span><span class="nt">a-r</span> <span class="err">$</span><span class="nt">a-b</span><span class="o">;</span> <span class="o">//</span> <span class="nt">y</span> <span class="nt">different</span>
</div><div class='line'>  <span class="p">}</span> <span class="k">@else</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">@return</span> <span class="err">$</span><span class="nt">a-t</span> <span class="err">$</span><span class="nt">a-r</span> <span class="err">$</span><span class="nt">a-b</span> <span class="err">$</span><span class="nt">a-l</span><span class="o">;//</span> <span class="nt">all</span> <span class="nt">different</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="c1">// Corner Images</span>
</div><div class='line'><span class="c1">// @param list $tl [background-image] [width] [height] [background-position-x] [background-position-y] [left] [top] top-left corner</span>
</div><div class='line'><span class="c1">// @param list $t  [background-image] [height] [background-position-x] [background-position-y] [left] [right] [top] top side</span>
</div><div class='line'><span class="c1">// @param list $tr [background-image] [width] [height] [background-position-x] [background-position-y] [right] [top] top-right corner</span>
</div><div class='line'><span class="c1">// @param list $r  [background-image] [width] [background-position-x] [background-position-y] [right] [top] [bottom] right side</span>
</div><div class='line'><span class="c1">// @param list $br [background-image] [width] [height] [background-position-x] [background-position-y] [right] [bottom] bottom-right corner</span>
</div><div class='line'><span class="c1">// @param list $b  [background-image] [height] [background-position-x] [background-position-y] [left] [right] [bottom] bottom side</span>
</div><div class='line'><span class="c1">// @param list $bl [background-image] [width] [height] [background-position-x] [background-position-y] [left] [bottom] bottom-left corner</span>
</div><div class='line'><span class="c1">// @param list $l  [background-image] [width] [background-position-x] [background-position-y] [left] [top] [bottom] left side</span>
</div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="k">@mixin</span><span class="nf"> corner-images</span> <span class="p">(</span><span class="nv">$tl</span><span class="o">:</span> <span class="no">auto</span><span class="o">,</span> <span class="nv">$t</span><span class="o">:</span> <span class="no">auto</span><span class="o">,</span> <span class="nv">$tr</span><span class="o">:</span> <span class="no">auto</span><span class="o">,</span> <span class="nv">$r</span><span class="o">:</span> <span class="no">auto</span><span class="o">,</span> <span class="nv">$br</span><span class="o">:</span> <span class="no">auto</span><span class="o">,</span> <span class="nv">$b</span><span class="o">:</span> <span class="no">auto</span><span class="o">,</span> <span class="nv">$bl</span><span class="o">:</span> <span class="no">auto</span><span class="o">,</span> <span class="nv">$l</span><span class="o">:</span> <span class="no">auto</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="c1">// corner images and dimensions</span>
</div><div class='line'>  <span class="nv">$tl-image</span><span class="o">:</span>  <span class="nf">nth</span><span class="p">(</span><span class="nv">$tl</span><span class="o">,</span> <span class="mi">1</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$tl-width</span><span class="o">:</span>  <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tl</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="nf">corner-image-width</span><span class="p">(</span><span class="nv">$tl-image</span><span class="p">)</span> <span class="nv">$ui-corners-corner-tl-width</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$tl-height</span><span class="o">:</span> <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tl</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="nf">corner-image-height</span><span class="p">(</span><span class="nv">$tl-image</span><span class="p">)</span> <span class="nv">$ui-corners-corner-tl-height</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$tr-image</span><span class="o">:</span>  <span class="nf">nth</span><span class="p">(</span><span class="nv">$tr</span><span class="o">,</span> <span class="mi">1</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$tr-width</span><span class="o">:</span>  <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tr</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="nf">corner-image-width</span><span class="p">(</span><span class="nv">$tr-image</span><span class="p">)</span> <span class="nv">$ui-corners-corner-tr-width</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$tr-height</span><span class="o">:</span> <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tr</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="nf">corner-image-height</span><span class="p">(</span><span class="nv">$tr-image</span><span class="p">)</span> <span class="nv">$ui-corners-corner-tr-height</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$br-image</span><span class="o">:</span>  <span class="nf">nth</span><span class="p">(</span><span class="nv">$br</span><span class="o">,</span> <span class="mi">1</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$br-width</span><span class="o">:</span>  <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$br</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="nf">corner-image-width</span><span class="p">(</span><span class="nv">$br-image</span><span class="p">)</span> <span class="nv">$ui-corners-corner-br-width</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$br-height</span><span class="o">:</span> <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$br</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="nf">corner-image-height</span><span class="p">(</span><span class="nv">$br-image</span><span class="p">)</span> <span class="nv">$ui-corners-corner-br-height</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$bl-image</span><span class="o">:</span>  <span class="nf">nth</span><span class="p">(</span><span class="nv">$bl</span><span class="o">,</span> <span class="mi">1</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$bl-width</span><span class="o">:</span>  <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$bl</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="nf">corner-image-width</span><span class="p">(</span><span class="nv">$bl-image</span><span class="p">)</span> <span class="nv">$ui-corners-corner-bl-width</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$bl-height</span><span class="o">:</span> <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$bl</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="nf">corner-image-height</span><span class="p">(</span><span class="nv">$bl-image</span><span class="p">)</span> <span class="nv">$ui-corners-corner-bl-height</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$t-image</span><span class="o">:</span> <span class="nf">nth</span><span class="p">(</span><span class="nv">$t</span><span class="o">,</span> <span class="mi">1</span><span class="p">);</span> <span class="nv">$r-image</span><span class="o">:</span> <span class="nf">nth</span><span class="p">(</span><span class="nv">$r</span><span class="o">,</span> <span class="mi">1</span><span class="p">);</span> <span class="nv">$b-image</span><span class="o">:</span> <span class="nf">nth</span><span class="p">(</span><span class="nv">$b</span><span class="o">,</span> <span class="mi">1</span><span class="p">);</span> <span class="nv">$l-image</span><span class="o">:</span> <span class="nf">nth</span><span class="p">(</span><span class="nv">$l</span><span class="o">,</span> <span class="mi">1</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// all backgrounds are the same</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$tl-image</span> <span class="o">!=</span> <span class="no">none</span> <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$t-image</span> <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$tr-image</span> <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$r-image</span>
</div><div class='line'>      <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$br-image</span> <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$b-image</span> <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$b-image</span> <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$l-image</span> <span class="p">{</span>
</div><div class='line'>    <span class="nc">.ui-corners-corner</span><span class="o">,</span> <span class="nc">.ui-corners-side</span> <span class="p">{</span> <span class="na">background-image</span><span class="o">:</span> <span class="nf">image-url</span><span class="p">(</span><span class="nv">$tl-image</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$ui-corners-cache-buster</span><span class="p">);</span> <span class="p">}</span>
</div><div class='line'>    <span class="nv">$tl-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$tr-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$br-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$bl-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span>
</div><div class='line'>    <span class="nv">$t-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$r-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$b-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$l-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// normalize height and width</span>
</div><div class='line'>  <span class="nv">$width</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">;</span>
</div><div class='line'>  <span class="nv">$height</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// check all width are the same</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$tl-width</span> <span class="o">==</span> <span class="nv">$tr-width</span> <span class="ow">and</span> <span class="nv">$tl-width</span> <span class="o">==</span> <span class="nv">$br-width</span> <span class="ow">and</span> <span class="nv">$tl-width</span> <span class="o">==</span> <span class="nv">$bl-width</span> <span class="p">{</span> <span class="nv">$width</span><span class="o">:</span> <span class="nv">$tl-width</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// check all heights are the same</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$tl-height</span> <span class="o">==</span> <span class="nv">$tr-height</span> <span class="ow">and</span> <span class="nv">$tl-height</span> <span class="o">==</span> <span class="nv">$br-height</span> <span class="ow">and</span> <span class="nv">$tl-height</span> <span class="o">==</span> <span class="nv">$bl-height</span> <span class="p">{</span> <span class="nv">$height</span><span class="o">:</span> <span class="nv">$tl-height</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// set the width and height with a generic class</span>
</div><div class='line'>  <span class="k">@if</span> <span class="p">(</span><span class="nv">$width</span> <span class="ow">and</span> <span class="nv">$width</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-width</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="nv">$height</span> <span class="ow">and</span> <span class="nv">$height</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-height</span><span class="p">)</span>
</div><div class='line'>    <span class="ow">or</span> <span class="p">(</span><span class="nv">$tl-image</span> <span class="o">!=</span> <span class="no">none</span> <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$tr-image</span> <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$br-image</span> <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$bl-image</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="c1">// when it matches default, fall back to generic corner class</span>
</div><div class='line'>    <span class="nc">.ui-corners-corner</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">@if</span> <span class="nv">$width</span> <span class="ow">and</span> <span class="nv">$width</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-width</span> <span class="p">{</span> <span class="na">width</span><span class="o">:</span> <span class="nv">$width</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>      <span class="k">@if</span> <span class="nv">$height</span> <span class="ow">and</span> <span class="nv">$height</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-height</span> <span class="p">{</span> <span class="na">height</span><span class="o">:</span> <span class="nv">$height</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>      <span class="k">@if</span> <span class="nv">$tl-image</span> <span class="o">!=</span> <span class="no">none</span> <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$tr-image</span> <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$br-image</span> <span class="ow">and</span> <span class="nv">$tl-image</span> <span class="o">==</span> <span class="nv">$bl-image</span> <span class="p">{</span>
</div><div class='line'>        <span class="na">background-image</span><span class="o">:</span> <span class="nf">image-url</span><span class="p">(</span><span class="nv">$tl-image</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$ui-corners-cache-buster</span><span class="p">);</span>
</div><div class='line'>        <span class="nv">$tl-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$tr-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$br-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$bl-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span>
</div><div class='line'>      <span class="p">}</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// Top Left</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$tl</span> <span class="o">!=</span> <span class="no">auto</span> <span class="p">{</span>
</div><div class='line'>    <span class="nc">.ui-corners-corner-tl</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">@include</span><span class="nd"> corner-props</span><span class="p">(</span>
</div><div class='line'>        <span class="nv">$image</span><span class="o">:</span> <span class="nv">$tl-image</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$w</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$width</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$tl-width</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$h</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$height</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$tl-height</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$x</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tl</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$y</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tl</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$l</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tl</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$t</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tl</span><span class="o">,</span> <span class="mi">7</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span>
</div><div class='line'>      <span class="p">);</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// Top Right</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$tr</span> <span class="o">!=</span> <span class="no">auto</span> <span class="p">{</span>
</div><div class='line'>    <span class="nc">.ui-corners-corner-tr</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">@include</span><span class="nd"> corner-props</span><span class="p">(</span>
</div><div class='line'>        <span class="nv">$image</span><span class="o">:</span> <span class="nv">$tr-image</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$w</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$width</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$tr-width</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$h</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$height</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$tr-height</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$x</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tr</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$y</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tr</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$r</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tr</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$t</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tr</span><span class="o">,</span> <span class="mi">7</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span>
</div><div class='line'>      <span class="p">);</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// Bottom Right</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$br</span> <span class="o">!=</span> <span class="no">auto</span> <span class="p">{</span>
</div><div class='line'>    <span class="nc">.ui-corners-corner-br</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">@include</span><span class="nd"> corner-props</span><span class="p">(</span>
</div><div class='line'>        <span class="nv">$image</span><span class="o">:</span> <span class="nv">$br-image</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$w</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$width</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$br-width</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$h</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$height</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$br-height</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$x</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$br</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$y</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$br</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$r</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$br</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$b</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$br</span><span class="o">,</span> <span class="mi">7</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span>
</div><div class='line'>      <span class="p">);</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// Bottom Left</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$bl</span> <span class="o">!=</span> <span class="no">auto</span> <span class="p">{</span>
</div><div class='line'>    <span class="nc">.ui-corners-corner-bl</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">@include</span><span class="nd"> corner-props</span><span class="p">(</span>
</div><div class='line'>        <span class="nv">$image</span><span class="o">:</span> <span class="nv">$bl-image</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$w</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$width</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$bl-width</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$h</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$height</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$bl-height</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$x</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$bl</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$y</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$bl</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$l</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$bl</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$b</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$bl</span><span class="o">,</span> <span class="mi">7</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span>
</div><div class='line'>      <span class="p">);</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// Side left, right, top and bottom</span>
</div><div class='line'>  <span class="nv">$t-height</span><span class="o">:</span> <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$t</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="nv">$tl-height</span> <span class="nv">$ui-corners-side-left-width</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$t-left</span><span class="o">:</span>   <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$t</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="p">(</span><span class="nv">$tl-width</span> <span class="o">+</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tl</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="mi">0</span><span class="p">))</span> <span class="nv">$ui-corners-corner-width</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$t-right</span><span class="o">:</span>  <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$t</span><span class="o">,</span> <span class="mi">7</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="p">(</span><span class="nv">$tr-width</span> <span class="o">+</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tr</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="mi">0</span><span class="p">))</span> <span class="nv">$ui-corners-corner-width</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$b-height</span><span class="o">:</span> <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$b</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="nv">$bl-height</span> <span class="nv">$ui-corners-side-left-width</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$b-left</span><span class="o">:</span>   <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$b</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="p">(</span><span class="nv">$bl-width</span> <span class="o">+</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$bl</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="mi">0</span><span class="p">))</span> <span class="nv">$ui-corners-corner-width</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$b-right</span><span class="o">:</span>  <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$b</span><span class="o">,</span> <span class="mi">7</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="p">(</span><span class="nv">$br-width</span> <span class="o">+</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$br</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="mi">0</span><span class="p">))</span> <span class="nv">$ui-corners-corner-width</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$l-width</span><span class="o">:</span>  <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$l</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="nv">$tl-width</span> <span class="nv">$ui-corners-side-left-width</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$l-top</span><span class="o">:</span>    <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$l</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="p">(</span><span class="nv">$tl-height</span> <span class="o">+</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tl</span><span class="o">,</span> <span class="mi">7</span><span class="o">,</span> <span class="mi">0</span><span class="p">))</span> <span class="nv">$ui-corners-corner-height</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$l-bottom</span><span class="o">:</span> <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$l</span><span class="o">,</span> <span class="mi">7</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="p">(</span><span class="nv">$bl-height</span> <span class="o">+</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$bl</span><span class="o">,</span> <span class="mi">7</span><span class="o">,</span> <span class="mi">0</span><span class="p">))</span> <span class="nv">$ui-corners-corner-height</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$r-width</span><span class="o">:</span>  <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$r</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="nv">$tr-width</span> <span class="nv">$ui-corners-side-right-width</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$r-top</span><span class="o">:</span>    <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$r</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="p">(</span><span class="nv">$tr-height</span> <span class="o">+</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tr</span><span class="o">,</span> <span class="mi">7</span><span class="o">,</span> <span class="mi">0</span><span class="p">))</span> <span class="nv">$ui-corners-corner-height</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$r-bottom</span><span class="o">:</span> <span class="nf">corner-var</span><span class="p">(</span><span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$r</span><span class="o">,</span> <span class="mi">7</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="p">(</span><span class="nv">$br-height</span> <span class="o">+</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$br</span><span class="o">,</span> <span class="mi">7</span><span class="o">,</span> <span class="mi">0</span><span class="p">))</span> <span class="nv">$ui-corners-corner-height</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// normalize left and right, top and bottom</span>
</div><div class='line'>  <span class="nv">$left</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">;</span>
</div><div class='line'>  <span class="nv">$right</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">;</span>
</div><div class='line'>  <span class="nv">$top</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">;</span>
</div><div class='line'>  <span class="nv">$bottom</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">;</span>
</div><div class='line'>  <span class="nv">$width</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">;</span>
</div><div class='line'>  <span class="nv">$height</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// check all sides are the same</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$t-left</span> <span class="o">==</span> <span class="nv">$b-left</span> <span class="p">{</span> <span class="nv">$left</span><span class="o">:</span> <span class="nv">$t-left</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$t-right</span> <span class="o">==</span> <span class="nv">$b-right</span> <span class="p">{</span> <span class="nv">$right</span><span class="o">:</span> <span class="nv">$t-right</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$t-height</span> <span class="o">==</span> <span class="nv">$b-height</span> <span class="p">{</span> <span class="nv">$height</span><span class="o">:</span> <span class="nv">$t-height</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$l-top</span> <span class="o">==</span> <span class="nv">$r-top</span> <span class="p">{</span> <span class="nv">$top</span><span class="o">:</span> <span class="nv">$l-top</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$l-bottom</span> <span class="o">==</span> <span class="nv">$r-bottom</span> <span class="p">{</span> <span class="nv">$bottom</span><span class="o">:</span> <span class="nv">$l-bottom</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$l-width</span> <span class="o">==</span> <span class="nv">$r-width</span> <span class="p">{</span> <span class="nv">$width</span><span class="o">:</span> <span class="nv">$l-width</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="k">@if</span> <span class="nv">$t-image</span> <span class="o">!=</span> <span class="no">none</span> <span class="ow">and</span> <span class="nv">$t-image</span> <span class="o">==</span> <span class="nv">$r-image</span> <span class="ow">and</span> <span class="nv">$t-image</span> <span class="o">==</span> <span class="nv">$b-image</span> <span class="ow">and</span> <span class="nv">$t-image</span> <span class="o">==</span> <span class="nv">$l-image</span> <span class="p">{</span>
</div><div class='line'>    <span class="nc">.ui-corners-side</span> <span class="p">{</span> <span class="na">background-image</span><span class="o">:</span> <span class="nf">image-url</span><span class="p">(</span><span class="nv">$t-image</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$ui-corners-cache-buster</span><span class="p">);</span> <span class="p">}</span>
</div><div class='line'>    <span class="nv">$t-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$r-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$b-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$l-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// set the top and bottom sides with a generic class</span>
</div><div class='line'>  <span class="k">@if</span> <span class="p">(</span><span class="nv">$left</span> <span class="ow">and</span> <span class="nv">$left</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-width</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="nv">$right</span> <span class="ow">and</span> <span class="nv">$right</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-width</span><span class="p">)</span>
</div><div class='line'>      <span class="ow">or</span> <span class="p">(</span><span class="nv">$height</span> <span class="ow">and</span> <span class="nv">$height</span> <span class="o">!=</span> <span class="nv">$ui-corners-side-width</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="nv">$t-image</span> <span class="o">!=</span> <span class="no">none</span> <span class="ow">and</span> <span class="nv">$t-image</span> <span class="o">==</span> <span class="nv">$b-image</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="c1">// when it matches default, fall back to generic corner class</span>
</div><div class='line'>    <span class="nc">.ui-corners-side-top</span><span class="o">,</span> <span class="nc">.ui-corners-side-bottom</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">@if</span> <span class="nv">$left</span> <span class="ow">and</span> <span class="nv">$left</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-width</span> <span class="p">{</span> <span class="na">left</span><span class="o">:</span> <span class="nv">$left</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>      <span class="k">@if</span> <span class="nv">$right</span> <span class="ow">and</span> <span class="nv">$right</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-width</span> <span class="p">{</span> <span class="na">right</span><span class="o">:</span> <span class="nv">$right</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>      <span class="k">@if</span> <span class="nv">$height</span> <span class="ow">and</span> <span class="nv">$height</span> <span class="o">!=</span> <span class="nv">$ui-corners-side-width</span> <span class="p">{</span> <span class="na">height</span><span class="o">:</span> <span class="nv">$height</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>      <span class="k">@if</span> <span class="nv">$t-image</span> <span class="o">!=</span> <span class="no">none</span> <span class="ow">and</span> <span class="nv">$t-image</span> <span class="o">==</span> <span class="nv">$b-image</span> <span class="p">{</span> <span class="na">background-image</span><span class="o">:</span> <span class="nf">image-url</span><span class="p">(</span><span class="nv">$t-image</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$ui-corners-cache-buster</span><span class="p">);</span> <span class="nv">$t-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$b-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// set the left and right sides with a generic class</span>
</div><div class='line'>  <span class="k">@if</span> <span class="p">(</span><span class="nv">$top</span> <span class="ow">and</span> <span class="nv">$top</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-height</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="nv">$bottom</span> <span class="ow">and</span> <span class="nv">$bottom</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-height</span><span class="p">)</span>
</div><div class='line'>      <span class="ow">or</span> <span class="p">(</span><span class="nv">$width</span> <span class="ow">and</span> <span class="nv">$width</span> <span class="o">!=</span> <span class="nv">$ui-corners-side-width</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="nv">$l-image</span> <span class="o">!=</span> <span class="no">none</span> <span class="ow">and</span> <span class="nv">$l-image</span> <span class="o">==</span> <span class="nv">$r-image</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>    <span class="c1">// when it matches default, fall back to generic corner class</span>
</div><div class='line'>    <span class="nc">.ui-corners-side-left</span><span class="o">,</span> <span class="nc">.ui-corners-side-right</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">@if</span> <span class="nv">$top</span> <span class="ow">and</span> <span class="nv">$top</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-height</span> <span class="p">{</span> <span class="na">top</span><span class="o">:</span> <span class="nv">$top</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>      <span class="k">@if</span> <span class="nv">$bottom</span> <span class="ow">and</span> <span class="nv">$bottom</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-height</span> <span class="p">{</span> <span class="na">bottom</span><span class="o">:</span> <span class="nv">$bottom</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>      <span class="k">@if</span> <span class="nv">$width</span> <span class="ow">and</span> <span class="nv">$width</span> <span class="o">!=</span> <span class="nv">$ui-corners-side-width</span> <span class="p">{</span> <span class="na">width</span><span class="o">:</span> <span class="nv">$width</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>      <span class="k">@if</span> <span class="nv">$l-image</span> <span class="o">!=</span> <span class="no">none</span> <span class="ow">and</span> <span class="nv">$l-image</span> <span class="o">==</span> <span class="nv">$r-image</span> <span class="p">{</span> <span class="na">background-image</span><span class="o">:</span> <span class="nf">image-url</span><span class="p">(</span><span class="nv">$l-image</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$ui-corners-cache-buster</span><span class="p">);</span> <span class="nv">$l-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="nv">$r-image</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// Top</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$t</span> <span class="o">!=</span> <span class="no">auto</span> <span class="p">{</span>
</div><div class='line'>    <span class="nc">.ui-corners-side-top</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">@include</span><span class="nd"> corner-props</span><span class="p">(</span>
</div><div class='line'>        <span class="nv">$image</span><span class="o">:</span> <span class="nv">$t-image</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$h</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$height</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$t-height</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$x</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$t</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="no">left</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$y</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$t</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="no">top</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$l</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$left</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$t-left</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$r</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$right</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$t-right</span><span class="p">)</span> <span class="o">+</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$tr</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="mi">0</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$t</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$t</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span>
</div><div class='line'>      <span class="p">);</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// Bottom</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$b</span> <span class="o">!=</span> <span class="no">auto</span> <span class="p">{</span>
</div><div class='line'>    <span class="nc">.ui-corners-side-bottom</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">@include</span><span class="nd"> corner-props</span><span class="p">(</span>
</div><div class='line'>        <span class="nv">$image</span><span class="o">:</span> <span class="nv">$b-image</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$h</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$height</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$b-height</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$x</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$b</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="no">left</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$y</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$b</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="no">bottom</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$l</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$left</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$b-left</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$r</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$right</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$b-right</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$b</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$b</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span>
</div><div class='line'>      <span class="p">);</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// Left</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$l</span> <span class="o">!=</span> <span class="no">auto</span> <span class="p">{</span>
</div><div class='line'>    <span class="nc">.ui-corners-side-left</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">@include</span><span class="nd"> corner-props</span><span class="p">(</span>
</div><div class='line'>        <span class="nv">$image</span><span class="o">:</span> <span class="nv">$l-image</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$w</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$width</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$l-width</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$x</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$l</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="no">left</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$y</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$l</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="no">top</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$l</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$l</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$t</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$top</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$l-top</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$b</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$bottom</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$l-bottom</span><span class="p">)</span>
</div><div class='line'>      <span class="p">);</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// Right</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$r</span> <span class="o">!=</span> <span class="no">auto</span> <span class="p">{</span>
</div><div class='line'>    <span class="nc">.ui-corners-side-right</span> <span class="p">{</span>
</div><div class='line'>      <span class="k">@include</span><span class="nd"> corner-props</span><span class="p">(</span>
</div><div class='line'>        <span class="nv">$image</span><span class="o">:</span> <span class="nv">$r-image</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$w</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$width</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$r-width</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$x</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$r</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="no">right</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$y</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$r</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="no">top</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$r</span><span class="o">:</span> <span class="nf">corner-nth</span><span class="p">(</span><span class="nv">$r</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="no">auto</span><span class="p">)</span> <span class="n-Pseudo">false</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$t</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$top</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$r-top</span><span class="p">)</span><span class="o">,</span>
</div><div class='line'>        <span class="nv">$b</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$bottom</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$r-bottom</span><span class="p">)</span>
</div><div class='line'>      <span class="p">);</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="c1">// Corner Props</span>
</div><div class='line'><span class="c1">// creates the porperties of corner or side</span>
</div><div class='line'><span class="c1">// @param image $image (optional)</span>
</div><div class='line'><span class="c1">// @param list $w (optional) [value] [auto] [default] element width.</span>
</div><div class='line'><span class="c1">// @param list $h (optional) [value] [auto] [default] element height.</span>
</div><div class='line'><span class="c1">// @param list $x (optional) [value] [auto] [default] background position x.</span>
</div><div class='line'><span class="c1">// @param list $y (optional) [value] [auto] [default] background position y.</span>
</div><div class='line'><span class="c1">// @param list $l (optional) [value] [auto] [default] position left.</span>
</div><div class='line'><span class="c1">// @param list $r (optional) [value] [auto] [default] position right.</span>
</div><div class='line'><span class="c1">// @param list $t (optional) [value] [auto] [default] position top.</span>
</div><div class='line'><span class="c1">// @param list $b (optional) [value] [auto] [default] position bottom.</span>
</div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="k">@mixin</span><span class="nf"> corner-props</span> <span class="p">(</span><span class="nv">$image</span><span class="o">:</span> <span class="no">none</span><span class="o">,</span> <span class="nv">$w</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$h</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$x</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$y</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$l</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$r</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$t</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$b</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="c1">// each variable takes 3 values: passed auto default</span>
</div><div class='line'>  <span class="nv">$left</span><span class="o">:</span>   <span class="nf">corner-var</span><span class="p">(</span><span class="nv">$l</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$right</span><span class="o">:</span>  <span class="nf">corner-var</span><span class="p">(</span><span class="nv">$r</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$top</span><span class="o">:</span>    <span class="nf">corner-var</span><span class="p">(</span><span class="nv">$t</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$bottom</span><span class="o">:</span> <span class="nf">corner-var</span><span class="p">(</span><span class="nv">$b</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$width</span><span class="o">:</span>  <span class="nf">corner-var</span><span class="p">(</span><span class="nv">$w</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$height</span><span class="o">:</span> <span class="nf">corner-var</span><span class="p">(</span><span class="nv">$h</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>  <span class="k">@if</span> <span class="nv">$image</span>  <span class="o">!=</span> <span class="no">none</span> <span class="p">{</span> <span class="na">background-image</span><span class="o">:</span> <span class="nf">image-url</span><span class="p">(</span><span class="nv">$image</span><span class="o">,</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$ui-corners-cache-buster</span><span class="p">);</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$left</span>   <span class="o">!=</span> <span class="n-Pseudo">false</span> <span class="p">{</span> <span class="na">left</span><span class="o">:</span> <span class="nv">$left</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$right</span>  <span class="o">!=</span> <span class="n-Pseudo">false</span> <span class="p">{</span> <span class="na">right</span><span class="o">:</span> <span class="nv">$right</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$top</span>    <span class="o">!=</span> <span class="n-Pseudo">false</span> <span class="p">{</span> <span class="na">top</span><span class="o">:</span> <span class="nv">$top</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$bottom</span> <span class="o">!=</span> <span class="n-Pseudo">false</span> <span class="p">{</span> <span class="na">bottom</span><span class="o">:</span> <span class="nv">$bottom</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$width</span>  <span class="o">!=</span> <span class="n-Pseudo">false</span> <span class="p">{</span> <span class="na">width</span><span class="o">:</span> <span class="nv">$width</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$height</span> <span class="o">!=</span> <span class="n-Pseudo">false</span> <span class="p">{</span> <span class="na">height</span><span class="o">:</span> <span class="nv">$height</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="nv">$position-x</span><span class="o">:</span> <span class="nf">corner-var</span><span class="p">(</span><span class="nv">$x</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$position-y</span><span class="o">:</span> <span class="nf">corner-var</span><span class="p">(</span><span class="nv">$y</span><span class="p">);</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$position-x</span> <span class="o">!=</span> <span class="n-Pseudo">false</span> <span class="ow">or</span> <span class="nv">$position-y</span> <span class="o">!=</span> <span class="n-Pseudo">false</span> <span class="p">{</span> <span class="na">background-position</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$position-x</span> <span class="o">!=</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$position-x</span><span class="o">,</span> <span class="nf">nth</span><span class="p">(</span><span class="nv">$x</span><span class="o">,</span> <span class="mi">3</span><span class="p">))</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$position-y</span> <span class="o">!=</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="nv">$position-y</span><span class="o">,</span> <span class="nf">nth</span><span class="p">(</span><span class="nv">$x</span><span class="o">,</span> <span class="mi">3</span><span class="p">));</span> <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="c1">// Corner Nth</span>
</div><div class='line'><span class="c1">// returns the value of a list at an index or default value if the index is missing</span>
</div><div class='line'><span class="c1">// @param list $list value list</span>
</div><div class='line'><span class="c1">// @param int $n index within the lsit</span>
</div><div class='line'><span class="c1">// @param mixed $default default value if index does not exist </span>
</div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="k">@function</span> <span class="nt">corner-nth</span><span class="o">(</span><span class="err">$</span><span class="nt">list</span><span class="o">,</span> <span class="err">$</span><span class="nt">n</span><span class="o">,</span> <span class="err">$</span><span class="nt">default</span><span class="nd">:</span> <span class="nt">false</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="nv">$value</span><span class="o">:</span> <span class="nv">$default</span><span class="p">;</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nf">length</span><span class="p">(</span><span class="nv">$list</span><span class="p">)</span> <span class="o">&gt;</span> <span class="nv">$n</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">{</span> <span class="nv">$value</span><span class="o">:</span> <span class="nf">nth</span><span class="p">(</span><span class="nv">$list</span><span class="o">,</span> <span class="nv">$n</span><span class="p">)</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@return</span> <span class="err">$</span><span class="nt">value</span><span class="o">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="c1">// Corner Image Width/Height</span>
</div><div class='line'><span class="c1">// returns the width of an image or default</span>
</div><div class='line'><span class="c1">// @param image $image</span>
</div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="k">@function</span> <span class="nt">corner-image-width</span><span class="o">(</span><span class="err">$</span><span class="nt">image</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@if</span> <span class="p">(</span><span class="nv">$image</span> <span class="o">==</span> <span class="no">none</span><span class="p">)</span> <span class="p">{</span> <span class="k">@return</span> <span class="nt">default</span><span class="o">;</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@return</span> <span class="nt">image-width</span><span class="o">(</span><span class="err">$</span><span class="nt">image</span><span class="o">);</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="k">@function</span> <span class="nt">corner-image-height</span><span class="o">(</span><span class="err">$</span><span class="nt">image</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@if</span> <span class="p">(</span><span class="nv">$image</span> <span class="o">==</span> <span class="no">none</span><span class="p">)</span> <span class="p">{</span> <span class="k">@return</span> <span class="nt">default</span><span class="o">;</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@return</span> <span class="nt">image-height</span><span class="o">(</span><span class="err">$</span><span class="nt">image</span><span class="o">);</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="c1">// Corner Vars</span>
</div><div class='line'><span class="c1">// returns the current value unless it is &quot;auto&quot; or &quot;default&quot; then those values are returned</span>
</div><div class='line'><span class="c1">// @param list $list list if values [current value] [value of auto] [value of default]</span>
</div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="k">@function</span> <span class="nt">corner-var</span><span class="o">(</span><span class="err">$</span><span class="nt">list</span><span class="o">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="nv">$val</span><span class="o">:</span> <span class="nf">nth</span><span class="p">(</span><span class="nv">$list</span><span class="o">,</span> <span class="mi">1</span><span class="p">);</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$val</span> <span class="o">==</span> <span class="no">auto</span> <span class="p">{</span> <span class="nv">$val</span><span class="o">:</span> <span class="nf">nth</span><span class="p">(</span><span class="nv">$list</span><span class="o">,</span> <span class="mi">2</span><span class="p">);</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$val</span> <span class="o">==</span> <span class="no">default</span> <span class="p">{</span> <span class="nv">$val</span><span class="o">:</span> <span class="nf">nth</span><span class="p">(</span><span class="nv">$list</span><span class="o">,</span> <span class="mi">3</span><span class="p">);</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">@return</span> <span class="err">$</span><span class="nt">val</span><span class="o">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="c1">// Basic Styles (required)</span>
</div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="c1">// corner wrapper</span>
</div><div class='line'><span class="nc">.ui-corners</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">position</span><span class="o">:</span> <span class="no">relative</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// the content of the wrapper</span>
</div><div class='line'><span class="nc">.ui-corners-content</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">position</span><span class="o">:</span> <span class="no">relative</span><span class="p">;</span>
</div><div class='line'>    <span class="na">z-index</span><span class="o">:</span> <span class="mi">1</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// all corners and sides</span>
</div><div class='line'><span class="nc">.ui-corners-corner</span><span class="o">,</span> <span class="nc">.ui-corners-side</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">position</span><span class="o">:</span> <span class="no">absolute</span><span class="p">;</span>
</div><div class='line'>    <span class="na">z-index</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'> </div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="c1">// Corners</span>
</div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="nc">.ui-corners-corner</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">height</span><span class="o">:</span> <span class="nv">$ui-corners-corner-height</span><span class="p">;</span>
</div><div class='line'>    <span class="na">width</span><span class="o">:</span> <span class="nv">$ui-corners-corner-width</span><span class="p">;</span>
</div><div class='line'>    <span class="na">background-repeat</span><span class="o">:</span> <span class="no">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ui-corners-corner-tl</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">top</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="na">left</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="k">@if</span> <span class="nv">$ui-corners-corner-height</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-tl-height</span> <span class="p">{</span> <span class="na">height</span><span class="o">:</span> <span class="nv">$ui-corners-corner-tl-height</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="k">@if</span> <span class="nv">$ui-corners-corner-width</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-tl-width</span> <span class="p">{</span> <span class="na">width</span><span class="o">:</span> <span class="nv">$ui-corners-corner-tl-width</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="na">background-position</span><span class="o">:</span> <span class="no">left</span> <span class="no">top</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ui-corners-corner-tr</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">top</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="na">right</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="k">@if</span> <span class="nv">$ui-corners-corner-height</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-tr-height</span> <span class="p">{</span> <span class="na">height</span><span class="o">:</span> <span class="nv">$ui-corners-corner-tr-height</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="k">@if</span> <span class="nv">$ui-corners-corner-width</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-tr-width</span> <span class="p">{</span> <span class="na">width</span><span class="o">:</span> <span class="nv">$ui-corners-corner-tr-width</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="na">background-position</span><span class="o">:</span> <span class="no">right</span> <span class="no">top</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ui-corners-corner-br</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">bottom</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="na">right</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="k">@if</span> <span class="nv">$ui-corners-corner-height</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-br-height</span> <span class="p">{</span> <span class="na">height</span><span class="o">:</span> <span class="nv">$ui-corners-corner-br-height</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="k">@if</span> <span class="nv">$ui-corners-corner-width</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-br-width</span> <span class="p">{</span> <span class="na">width</span><span class="o">:</span> <span class="nv">$ui-corners-corner-br-width</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="na">background-position</span><span class="o">:</span> <span class="no">right</span> <span class="no">bottom</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ui-corners-corner-bl</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">bottom</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="na">left</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="k">@if</span> <span class="nv">$ui-corners-corner-height</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-bl-height</span> <span class="p">{</span> <span class="na">height</span><span class="o">:</span> <span class="nv">$ui-corners-corner-bl-height</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="k">@if</span> <span class="nv">$ui-corners-corner-width</span> <span class="o">!=</span> <span class="nv">$ui-corners-corner-bl-width</span> <span class="p">{</span> <span class="na">width</span><span class="o">:</span> <span class="nv">$ui-corners-corner-bl-width</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="na">background-position</span><span class="o">:</span> <span class="no">left</span> <span class="no">bottom</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="c1">// Sides</span>
</div><div class='line'><span class="c1">//-----------------------------------------------</span>
</div><div class='line'><span class="nc">.ui-corners-side-top</span><span class="o">,</span> <span class="nc">.ui-corners-side-bottom</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">left</span><span class="o">:</span> <span class="nv">$ui-corners-corner-width</span><span class="p">;</span>
</div><div class='line'>    <span class="na">right</span><span class="o">:</span> <span class="nv">$ui-corners-corner-width</span><span class="p">;</span>
</div><div class='line'>    <span class="na">height</span><span class="o">:</span> <span class="nv">$ui-corners-side-width</span><span class="p">;</span>
</div><div class='line'>    <span class="na">background-repeat</span><span class="o">:</span> <span class="no">repeat-x</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ui-corners-side-left</span><span class="o">,</span> <span class="nc">.ui-corners-side-right</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">top</span><span class="o">:</span> <span class="nv">$ui-corners-corner-height</span><span class="p">;</span>
</div><div class='line'>    <span class="na">bottom</span><span class="o">:</span> <span class="nv">$ui-corners-corner-height</span><span class="p">;</span>
</div><div class='line'>    <span class="na">width</span><span class="o">:</span> <span class="nv">$ui-corners-side-width</span><span class="p">;</span>
</div><div class='line'>    <span class="na">background-repeat</span><span class="o">:</span> <span class="no">repeat-y</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ui-corners-side-top</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">top</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="k">@if</span> <span class="nv">$ui-corners-side-width</span> <span class="o">!=</span> <span class="nv">$ui-corners-side-top-width</span> <span class="p">{</span> <span class="na">height</span><span class="o">:</span> <span class="nv">$ui-corners-side-top</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="na">background-position</span><span class="o">:</span> <span class="no">left</span> <span class="no">top</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ui-corners-side-bottom</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">bottom</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="k">@if</span> <span class="nv">$ui-corners-side-width</span> <span class="o">!=</span> <span class="nv">$ui-corners-side-bottom-width</span> <span class="p">{</span> <span class="na">height</span><span class="o">:</span> <span class="nv">$ui-corners-side-bottom</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="na">background-position</span><span class="o">:</span> <span class="no">left</span> <span class="no">bottom</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ui-corners-side-left</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">left</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="k">@if</span> <span class="nv">$ui-corners-side-width</span> <span class="o">!=</span> <span class="nv">$ui-corners-side-left-width</span> <span class="p">{</span> <span class="na">width</span><span class="o">:</span> <span class="nv">$ui-corners-side-left</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="na">background-position</span><span class="o">:</span> <span class="no">left</span> <span class="no">top</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ui-corners-side-right</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">right</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>    <span class="k">@if</span> <span class="nv">$ui-corners-side-width</span> <span class="o">!=</span> <span class="nv">$ui-corners-side-right-width</span> <span class="p">{</span> <span class="na">width</span><span class="o">:</span> <span class="nv">$ui-corners-side-right</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'>    <span class="na">background-position</span><span class="o">:</span> <span class="no">right</span> <span class="no">top</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<h2 id="basic-fake--code-border-radius--code--example">Basic Fake <code>border-radius</code> Example</h2>
<p>In order to mimic <code>border-radius</code> we'll need some images. For this example we'll use eight separate images as described in the <a href="http://heygrady.com/blog/2011/02/24/cross-browser-rounded-corners-overview/#background-images">previous article</a>. Using the <code>@mixin</code> this becomes very simple as shown below.</p>
<figure class='code'><figcaption>box.scss<a href='https://gist.github.com/1161561'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div></pre></td><td class='main  scss'><pre><div class='line'><span class="k">@import</span> <span class="s2">&quot;ui-corners&quot;</span><span class="p">;</span>
</div><div class='line'><span class="nc">.box</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> corner-images</span><span class="p">(</span>
</div><div class='line'>    <span class="s2">&quot;corner-tl.png&quot;</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-t.png&quot;</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-tr.png&quot;</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-l.png&quot;</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-br.png&quot;</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-b.png&quot;</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-bl.png&quot;</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-l.png&quot;</span>
</div><div class='line'>  <span class="p">);</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> corner-border-width</span><span class="p">(</span><span class="mi">1</span><span class="kt">px</span><span class="o">,</span> <span class="mi">10</span><span class="kt">px</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>Above is a <code>.box</code> where an image is used for each corner and side. The <code>.box</code> also has a <code>border-width</code> of 1px and <code>padding</code> of 10px. Below is the CSS code that is generated. Only the code that is distinct form the basic CSS is generated. The "?1313871969" after the images is a cache busting artifact caused by the <code>@mixin</code>s reliance on <a href="http://compass-style.org/reference/compass/helpers/urls/#image-url">Compass's <code>image-url</code> <code>@function</code></a> and can be turned off by setting the global <code>$ui-corners-cache-buster</code> variable to false.</p>
<figure class='code'><figcaption>box.css<a href='https://gist.github.com/1161561'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner-tl</span> <span class="p">{</span> <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;../i/corner-tl.png?1312605049&#39;)</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner-tr</span> <span class="p">{</span> <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;../i/corner-tr.png?1312605049&#39;)</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner-br</span> <span class="p">{</span> <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;../i/corner-br.png?1312605049&#39;)</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner-bl</span> <span class="p">{</span> <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;../i/corner-bl.png?1312605049&#39;)</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-top</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.ui-corners-side-bottom</span> <span class="p">{</span> <span class="k">left</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="k">right</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-left</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.ui-corners-side-right</span> <span class="p">{</span> <span class="k">top</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="k">bottom</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;../i/corner-l.png?1312605049&#39;)</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-top</span> <span class="p">{</span> <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;../i/corner-t.png?1312605049&#39;)</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-bottom</span> <span class="p">{</span> <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;../i/corner-b.png?1312605049&#39;)</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box.ui-corners</span> <span class="p">{</span> <span class="k">padding</span><span class="o">:</span> <span class="m">11px</span><span class="p">;</span> <span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>One important thing to note is that the images are all measured using the <a href="http://compass-style.org/reference/compass/helpers/image-dimensions/">Compass image dimension functions</a>. Because all of list values other than <code>[background-image]</code> were left to auto, the corners were given a height and width equal to their respective background images. Similarly the sides were given values based on the images. For instance, the left side was given a <code>top</code> equal to the hight of the top-left image, a <code>bottom</code> equal to the hight of the bottom-left image and a width equal to the width of the top-left image. By default the sides are given the respective width or height of the nearest corner instead of the height width of their own image. This will help in cases where background colors also need to be applied to the sides to match the desired design.</p>
<figure>
	<iframe width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners-2/box.html"></iframe>
	<figcaption>Mimicking <code>border-radius</code><br>(<a href="http://assets.heygrady.com/corners-2/box.html" target="_blank">view live example</a>)</figcaption>
</figure>
<h2 id="basic-sprite-example">Basic Sprite Example</h2>
<p>Of course include eight separate images just to mimic <code>border-radius</code> isn't most appealing thing in the world &mdash; <a href="http://css-tricks.com/158-css-sprites/">sprites are a good thing</a>. Currently the sprite needs to be produced beforehand and cannot be generated with <a href="http://compass-style.org/reference/compass/utilities/sprites/">Compass's excellent sprite functions</a>. The sprite image from the <a href="http://heygrady.com/blog/2011/02/24/cross-browser-rounded-corners-overview/#background-images">previous article</a> will be used.</p>
<figure class='code'><figcaption>box-sprite.scss<a href='https://gist.github.com/1161561'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div></pre></td><td class='main  scss'><pre><div class='line'><span class="k">@import</span> <span class="s2">&quot;ui-corners&quot;</span><span class="p">;</span>
</div><div class='line'><span class="nc">.box</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> corner-images</span><span class="p">(</span>
</div><div class='line'>    <span class="s2">&quot;corner.png&quot;</span> <span class="mi">12</span><span class="kt">px</span> <span class="mi">12</span><span class="kt">px</span> <span class="mi">-13</span><span class="kt">px</span> <span class="mi">-13</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner.png&quot;</span> <span class="no">auto</span> <span class="mi">0</span> <span class="mi">-25</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner.png&quot;</span> <span class="mi">12</span><span class="kt">px</span> <span class="mi">12</span><span class="kt">px</span> <span class="mi">-1</span><span class="kt">px</span> <span class="mi">-13</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner.png&quot;</span> <span class="no">auto</span> <span class="mi">11</span><span class="kt">px</span> <span class="mi">0</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner.png&quot;</span> <span class="mi">12</span><span class="kt">px</span> <span class="mi">12</span><span class="kt">px</span> <span class="mi">-1</span><span class="kt">px</span> <span class="mi">-1</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner.png&quot;</span> <span class="no">auto</span> <span class="mi">0</span> <span class="mi">11</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner.png&quot;</span> <span class="mi">12</span><span class="kt">px</span> <span class="mi">12</span><span class="kt">px</span> <span class="mi">-13</span><span class="kt">px</span> <span class="mi">-1</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner.png&quot;</span> <span class="no">auto</span> <span class="mi">-25</span><span class="kt">px</span> <span class="mi">0</span>
</div><div class='line'>  <span class="p">);</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> corner-border-width</span><span class="p">(</span><span class="mi">1</span><span class="kt">px</span><span class="o">,</span> <span class="mi">10</span><span class="kt">px</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>In the example above the same image is passed in for each of the corners and sides. For each corner a <code>width</code>, <code>height</code>, <code>background-position-x</code> and <code>background-position-y</code> are supplied. For the sides the respective <code>height</code> or <code>width</code> is specified as "auto" and then <code>background-position-x</code> and <code>background-position-y</code> are supplied. The above example will generate the CSS below.</p>
<figure class='code'><figcaption>box-sprite.css<a href='https://gist.github.com/1161561'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.ui-corners-side</span> <span class="p">{</span> <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;../i/corner.png?1312605049&#39;)</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner-tl</span> <span class="p">{</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">-13px</span> <span class="m">-13px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner-tr</span> <span class="p">{</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">-1px</span> <span class="m">-13px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner-br</span> <span class="p">{</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">-1px</span> <span class="m">-1px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner-bl</span> <span class="p">{</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">-13px</span> <span class="m">-1px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-top</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.ui-corners-side-bottom</span> <span class="p">{</span> <span class="k">left</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="k">right</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-left</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.ui-corners-side-right</span> <span class="p">{</span> <span class="k">top</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="k">bottom</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-top</span> <span class="p">{</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">0</span> <span class="m">-25px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-bottom</span> <span class="p">{</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">0</span> <span class="m">11px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-left</span> <span class="p">{</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">-25px</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-right</span> <span class="p">{</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">11px</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box.ui-corners</span> <span class="p">{</span> <span class="k">padding</span><span class="o">:</span> <span class="m">11px</span><span class="p">;</span> <span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>Similar to the basic example above, only the rules that differ from the basic.css are generated. When values are identical for groups of selectors they are appropriately grouped. For instance, the <code>background-image</code> is only specified once. Also of note, the <code>background-position</code> is no longer the default and is now in the CSS.</p>
<figure>
	<iframe width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners-2/box-sprite.html"></iframe>
	<figcaption>Sprite Example<br>(<a href="http://assets.heygrady.com/corners-2/box-sprite.html" target="_blank">view live example</a>)</figcaption>
</figure>
<p>Using a sprite in this example will significantly reduce the file sizes. The eight images together total 4.4KB while the sprite image is only 1.1KB. Of course this also removes eight HTTP requests which is always a good thing &mdash; <a href="http://code.google.com/speed/page-speed/docs/rtt.html#SpriteImages">ask Google</a>.</p>
<h2 id="fancy-sprite-example">Fancy Sprite Example</h2>
<p>Of course, this technique is not limited by simply mimicking <code>border-radius</code>. It's also possible to apply fancier borders that CSS could never do. For instance, imagine creating a box where nearly every Photoshop Layer Style has been applied &mdash; Drop Shadow, Inner Shadow, Outer Glow, Inner Glow, Bevel and Emboss and Color Overlay. It would be hard to mimick that without using images.</p>
<figure>
<img src="http://assets.heygrady.com/corners-2/i/box-fancy.png" alt="">
<figcaption>Super Fancy Border</figcaption>
</figure>
<figure>
<img src="http://assets.heygrady.com/corners-2/i/corner-fancy-sprite.png" alt="">
<figcaption>Super Fancy Sprite</figcaption>
</figure>
<figure>
<img src="http://assets.heygrady.com/corners-2/i/corner-fancy-sprite-sides.png" alt="">
<figcaption>Super Fancy Sides</figcaption>
</figure>
<p>Above is an image created using the list of Photoshop filters listed above. It has been turned into two different sprites. It's not possible to use a single sprite for all eight corners and sides when the sides are more that 1px solid colors. The top and bottom sides are repeated above and below the corners in the sprite.</p>
<figure class='code'><figcaption>box-fancy.scss<a href='https://gist.github.com/1161561'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div></pre></td><td class='main  scss'><pre><div class='line'><span class="k">@import</span> <span class="s2">&quot;ui-corners&quot;</span><span class="p">;</span>
</div><div class='line'><span class="nc">.box</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> corner-images</span><span class="p">(</span>
</div><div class='line'>    <span class="s2">&quot;corner-fancy-sprite.png&quot;</span> <span class="mi">18</span><span class="kt">px</span> <span class="mi">18</span><span class="kt">px</span> <span class="mi">1</span><span class="kt">px</span> <span class="mi">-18</span><span class="kt">px</span> <span class="mi">-9</span><span class="kt">px</span> <span class="mi">-4</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-fancy-sprite.png&quot;</span> <span class="no">auto</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">-4</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-fancy-sprite.png&quot;</span> <span class="mi">20</span><span class="kt">px</span> <span class="mi">18</span><span class="kt">px</span> <span class="mi">-16</span><span class="kt">px</span> <span class="mi">-18</span><span class="kt">px</span> <span class="mi">-2</span><span class="kt">px</span> <span class="mi">-4</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-fancy-sprite-sides.png&quot;</span> <span class="no">auto</span> <span class="mi">-18</span><span class="kt">px</span> <span class="mi">0</span> <span class="mi">-2</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-fancy-sprite.png&quot;</span> <span class="mi">20</span><span class="kt">px</span> <span class="mi">17</span><span class="kt">px</span> <span class="mi">-16</span><span class="kt">px</span> <span class="mi">-36</span><span class="kt">px</span> <span class="mi">-2</span><span class="kt">px</span> <span class="mi">-7</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-fancy-sprite.png&quot;</span> <span class="no">auto</span> <span class="mi">0</span> <span class="mi">-52</span><span class="kt">px</span> <span class="mi">-7</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-fancy-sprite.png&quot;</span> <span class="mi">18</span><span class="kt">px</span> <span class="mi">17</span><span class="kt">px</span> <span class="mi">1</span><span class="kt">px</span> <span class="mi">-36</span><span class="kt">px</span> <span class="mi">-9</span><span class="kt">px</span> <span class="mi">-7</span><span class="kt">px</span><span class="o">,</span>
</div><div class='line'>    <span class="s2">&quot;corner-fancy-sprite-sides.png&quot;</span> <span class="no">auto</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">-9</span><span class="kt">px</span>
</div><div class='line'>  <span class="p">);</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> corner-border-width</span><span class="p">(</span><span class="mi">7</span><span class="kt">px</span> <span class="mi">8</span><span class="kt">px</span> <span class="mi">5</span><span class="kt">px</span> <span class="mi">5</span><span class="kt">px</span><span class="o">,</span> <span class="mi">4</span><span class="kt">px</span> <span class="mi">3</span><span class="kt">px</span> <span class="mi">6</span><span class="kt">px</span> <span class="mi">6</span><span class="kt">px</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>In the above Sass, the positioning values are also used to move the shadow and glow outside the original box. For instance, the top-left corner is the first argument in <code>corner-images</code> and the first item in the list is the fancy sprite. The top left corner image is 18px by 18px and starts at 0px by 18px within the sprite. The first 8px of the corner are actually shadow as are the top 4px. The similar measurements are done for all of the corners and sides. The right and left sides get their own sprite because they didn't fit in the other one. This generates the CSS below.</p>
<figure class='code'><figcaption>box-fancy.css<a href='https://gist.github.com/1161561'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner</span> <span class="p">{</span> <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;../i/corner-fancy-sprite.png?1314340388&#39;)</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner-tl</span> <span class="p">{</span> <span class="k">left</span><span class="o">:</span> <span class="m">-8px</span><span class="p">;</span> <span class="k">top</span><span class="o">:</span> <span class="m">-4px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">18px</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">18px</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">0px</span> <span class="m">-18px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner-tr</span> <span class="p">{</span> <span class="k">right</span><span class="o">:</span> <span class="m">-4px</span><span class="p">;</span> <span class="k">top</span><span class="o">:</span> <span class="m">-4px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">20px</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">18px</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">-18px</span> <span class="m">-18px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner-br</span> <span class="p">{</span> <span class="k">right</span><span class="o">:</span> <span class="m">-4px</span><span class="p">;</span> <span class="k">bottom</span><span class="o">:</span> <span class="m">-7px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">20px</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">17px</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">-18px</span> <span class="m">-36px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-corner-bl</span> <span class="p">{</span> <span class="k">left</span><span class="o">:</span> <span class="m">-8px</span><span class="p">;</span> <span class="k">bottom</span><span class="o">:</span> <span class="m">-7px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">18px</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">17px</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">0px</span> <span class="m">-36px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-top</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.ui-corners-side-bottom</span> <span class="p">{</span> <span class="k">right</span><span class="o">:</span> <span class="m">16px</span><span class="p">;</span> <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;../i/corner-fancy-sprite.png?1314340388&#39;)</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-left</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.ui-corners-side-right</span> <span class="p">{</span> <span class="k">top</span><span class="o">:</span> <span class="m">14px</span><span class="p">;</span> <span class="k">background-image</span><span class="o">:</span> <span class="sx">url(&#39;../i/corner-fancy-sprite-sides.png?1314340389&#39;)</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-top</span> <span class="p">{</span> <span class="k">right</span><span class="o">:</span> <span class="n">false</span><span class="m">-4px</span><span class="p">;</span> <span class="k">top</span><span class="o">:</span> <span class="m">-4px</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">18px</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">0</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-bottom</span> <span class="p">{</span> <span class="k">bottom</span><span class="o">:</span> <span class="m">-7px</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">17px</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">0</span> <span class="m">-53px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-left</span> <span class="p">{</span> <span class="k">left</span><span class="o">:</span> <span class="m">-8px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">18px</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">0</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.ui-corners-side-right</span> <span class="p">{</span> <span class="k">right</span><span class="o">:</span> <span class="m">-4px</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">20px</span><span class="p">;</span> <span class="k">background-position</span><span class="o">:</span> <span class="m">-18px</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box.ui-corners</span> <span class="p">{</span> <span class="k">padding</span><span class="o">:</span> <span class="m">11px</span><span class="p">;</span> <span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>Below you can see the fancy sprite corners in a live example. It is important to note that the CSS will scale with the box as its content grows. The generated CSS would apply to any size box without any alterations.</p>
<figure>
	<iframe width="214" height="213" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners-2/box-fancy.html"></iframe>
	<figcaption>Fancy Example<br>(<a href="http://assets.heygrady.com/corners-2/box-fancy.html" target="_blank">view live example</a>)</figcaption>
</figure>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Recreating Photoshop Drop Shadows in CSS3 and Compass]]></title>
<link href="http://heygrady.com/blog/2011/08/06/recreating-photoshop-drop-shadows-in-css3-and-compass/"/>
<updated>2011-08-06T13:10:00-07:00</updated>
<id>http://heygrady.com/blog/2011/08/06/recreating-photoshop-drop-shadows-in-css3-and-compass</id>
<category term="compass" /><category term="css" /><category term="sass" />

      <content type="html"><![CDATA[<p>A challenge all web developers face is converting Photoshop documents into real, functioning web pages. Often this is a simple matter of measuring things and picking colors, but in the case of drop shadows recreating them in CSS3 can be challenging. For some reason I have yet to find a tool that will simply translate the settings from the Photoshop Layer Style Drop Shadow dialog into proper CSS3 &mdash; so I decided to create one in Compass. I created a Sass <code>@mixin</code> that relies on Compass to easily create CSS3 <code>box-shadow</code>s from the values found in Photoshop.</p>

<p><strong>UPDATE:</strong> a <a href="https://github.com/heygrady/compass-photoshop-drop-shadow">Github repo</a> and <a href="https://rubygems.org/gems/compass-photoshop-drop-shadow">Ruby Gem</a> have been created.</p>

<!--more-->

<h2 id="photoshop-layer-style-drop-shadow-dialog">Photoshop Layer Style Drop Shadow Dialog</h2>

<figure>
<img src="http://www.zetaprints.com/help/wp-content/uploads/2009/12/photoshop_drop_shadow_settings1.png" alt="Photoshop Layer Style Drop Shadow Dialog">
<figcaption>Photoshop Drop Shadow Dialog (<a href="http://www.google.com/search?q=photoshop+drop+shadow+dialog&tbm=isch&biw=1293&bih=1255">Internet</a>)</figcaption>
</figure>

<p>Above you can see the Drop Shadow dialog in Photoshop. There is an article online that does a great job of breaking down <a href="http://garymgordon.com/misc/tutorials/photoshop_tutorial/effects1/dropshadow.htm">what each of the properties does</a>. Once it&rsquo;s understood how Photoshop uses the values it&rsquo;s easy to translate those values into <a href="https://developer.mozilla.org/en/css/box-shadow">CSS3 <code>box-shadow</code> values</a>.</p>

<dl>
    <dt>Blend Mode</dt>
    <dd>Blends the shadow color with the background. CSS does not offer a similar property; this makes it difficult to match the colors exactly. CSS approximates a blend mode of &ldquo;Normal&rdquo;, but Photoshop uses &ldquo;Multiply&rdquo; by default. Using black (<code>#000</code>) will produce the same shadow in &ldquo;Normal&rdquo; and &ldquo;Multiply&rdquo;.</dd>

    <dt>Opacity</dt>
    <dd>Sets the opacity of the shadow. This is similar to using <code>rgba()</code>. <br><em>Note: <code>rgba()</code> is currently <a href="http://css3pie.com/documentation/supported-css3-features/#rgba">not supported in CSS3PIE</a> for <code>box-shadow</code></em>.</dd>

    <dt>Angle</dt>
    <dd>Controls the directions of the shadow. The <em>Angle</em> can be replicated using the <code>&lt;offset-x&gt;</code> and <code>&lt;offset-y&gt;</code> values of <code>box-shadow</code> and can be calculated with a little trigonometry.</dd>

    <dt>Distance</dt>
    <dd>Controls the shadow offset in the direction of the <em>Angle</em>. This combines with the <em>Angle</em> for calculating the <code>&lt;offset-x&gt;</code> and <code>&lt;offset-y&gt;</code>.</dd>

    <dt>Spread</dt>
    <dd>Determines the portion of the shadow (percentage of the <em>Size</em>) that is a solid color; the rest of the shadow is blurred. <em>Spread</em> is analogous to the <code>&lt;spread-radius&gt;</code> value of <code>box-shadow</code>.</dd>

    <dt>Size</dt>
    <dd>Sets the radius of the shadow in pixels. In CSS3 the <em>Size</em> is the <code>&lt;spread-radius&gt;</code> plus the <code>&lt;blur-radius&gt;</code>.</dd>

    <dt>Contour &amp; Noise:</dt>
    <dd>CSS3 <code>box-shadow</code> has no equivalent values.</dd>
</dl>

<h2 id="css3-box-shadow">CSS3 Box Shadow</h2>

<p>Now that we have a basic understanding of what Photoshop is doing, let&rsquo;s look at the <a href="https://developer.mozilla.org/En/CSS/Box-shadow#Values">values that <code>box-shadow</code> accepts</a> and see how they compare.</p>

<dl>
    <dt><code>&lt;offset-x&gt;</code> and <code>&lt;offset-y&gt;</code></dt>
    <dd>Moves the shadow on the x and y axis. These values are required and are always the first two length properties. These are calculated using the <em>Angle</em> and <em>Distance</em> in Photoshop.</dd>

    <dt><code>&lt;blur-radius&gt;</code></dt>
    <dd>The radius of the blur in addition to the spread. A blur of 10px with a spread of 10px will result in a 20px shadow where the first 10 pixels (the spread) is solid and the last 10 pixels gradually fade out (the blur). This is always the third length value and is optional.</dd>

    <dt><code>&lt;spread-radius&gt;</code></dt>
    <dd>Just like Photoshop, the spread is the portion of the shadow that is a solid color. Unlike Photoshop, spread is expressed in pixels instead of as a percentage of the total <em>Size</em>. A spread of 10px with a 0px blur will look similar to a 10px solid border. Spread is always the fourth length value and is optional.</dd>

    <dt><code>&lt;color&gt;</code></dt>
    <dd>Sets the color of the shadow. If a blur is set the shadow will automatically be slightly transparent. The spread area of the shadow will appear in the color specified. To have the entire shadow, including spread, appear transparent use <code><a href="https://developer.mozilla.org/en/CSS/color_value#section_9">rgba()</a></code>.</dd>
</dl>

<h2 id="generating-the-css3-values-from-the-photoshop-values">Generating the CSS3 Values from the Photoshop Values</h2>

<p>As mentioned before, although Photoshop and CSS3 represent the values differently, they are actually analogous to each other.</p>

<h3 id="calculating-the-offsets">Calculating the Offsets</h3>

<p>Photoshop uses <em>Angle</em> and <em>Distance</em>, which can be used to calculate the <code>&lt;offset-x&gt;</code> and <code>&lt;offset-y&gt;</code>. Imagine a right triangle where the <code>&lt;offset-x&gt;</code> and the <code>&lt;offset-y&gt;</code> formed the right angle. The <em>Distance</em> would be the hypotenuse and the <em>Angle</em> is the inner angle. There are <a href="http://easycalculation.com/trigonometry/triangle-angles.php">online triangle calculators</a> for this basic trigonometry. Again, the <code>&lt;offset-y&gt;</code> and <code>&lt;offset-x&gt;</code> are the opposite and adjacent sides, the <em>Distance</em> is the hypotenuse.</p>

<figure>
<svg xmlns="http://www.w3.org/2000/svg" width="210" height="210">
  <line x1="20" x2="20" y1="10" y2="190" stroke="red" fill="transparent" stroke-width="3"/>
  <line x1="20" x2="200" y1="190" y2="190" stroke="green" fill="transparent" stroke-width="3"/>
  <line x1="200" x2="20" y1="190" y2="10" stroke="black" fill="transparent" stroke-width="3"/>
  <path d="M 170 190 A 30 30, 0, 0, 1, 178.6 168.6" stroke="gray" fill="transparent" stroke-width="2"/>
  <text x="75" y="208" fill="green">x-offset</text>
  <text x="-135" y="13" fill="red" transform="rotate(270)">y-offset</text>
  <text x="30" y="-11" fill="black" transform="translate(60,60) rotate(45) translate(0,0)">distance</text>
  <text x="176" y="114" fill="gray" transform="rotate(20)">angle</text>
</svg>
<figcaption>Triangle formed by <code>&lt;offset-x&gt;</code>, <code>&lt;offset-y&gt;</code>, <br><em>Distance</em> and <em>Angle</em>. (<a href="http://caniuse.com/#feat=svg-html5">requires modern browser</a>)</figcaption>
</figure>

<p>Using this basic understanding of triangles it becomes easy to calculate the offsets using the Photoshop Drop Shadow values. As the online triangle calculator linked above points out, <code>Sin(&Theta;) = Opposite / Hypotenuse</code>. More importantly, <code>Opposite = Sin(&Theta;) * Hypotenuse</code>. The same is true of the adjacent side: <code>Adjacent = Cos(&Theta;) * Hypotenuse</code>. And if you&rsquo;re remembering your trig properly &mdash; or looking at the <a href="http://easycalculation.com/trigonometry/triangle-angles.php">cheat sheet</a> &mdash; you know that only two values are needed to calculate any other two. Thankfully, <a href="https://github.com/chriseppstein/compass/issues/201">basic trig functions were added to Compass</a> in version 0.11.</p>

<p>For those who are still totally lost:</p>

<ul>
    <li><em>Angle</em> == &Theta;</li>
    <li><em>Distance</em> == Hypotenuse;</li>
    <li><code>&lt;offset-y&gt;</code> == Opposite;</li>
    <li><code>&lt;offset-x&gt;</code> == Adjacent;</li>
</ul>

<h3 id="calculating-the-blur-and-spread">Calculating the Blur and Spread</h3>

<p> The <code>&lt;blur-radius&gt;</code> and <code>&lt;spread-radius&gt;</code> are not quite as straightforward but are equally easy to calculate. In Photoshop, the <em>Size</em> attribute represents the total length of the shadow and the <em>Spread</em> represents the percentage of the shadow that is a solid color &mdash; the rest is blurred. In CSS the spread is added to the blur for the total shadow size. With this in mind, <code>&lt;blur-radius&gt;</code> is equal to the Photoshop <em>Size</em> minus the <code>&lt;spread-radius&gt;</code> and the <code>&lt;spread-radius&gt;</code> equals the Photoshop <em>Size</em> multiplied by the Photoshop <em>Spread</em> percentage. Again, the code example above bears this out.</p>

<h3 id="the--code--mixin--code">The <code>@mixin</code></h3>

<p> Below is a Sass <code>@mixin</code> that takes values from Photoshop, converts them, and creates a CSS3 <code>box-shadow</code>.</p>

<figure class='code'><figcaption>photoshop-drop-shadow.scss<a href='https://gist.github.com/1039282'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div></pre></td><td class='main  scss'><pre><div class='line'><span class="k">@import</span> <span class="s2">&quot;compass/css3/box-shadow&quot;</span><span class="p">;</span>
</div><div class='line'><span class="k">@import</span> <span class="s2">&quot;compass/css3/text-shadow&quot;</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">//--------------------------------</span>
</div><div class='line'><span class="c1">// Photoshop Drop Shadow</span>
</div><div class='line'><span class="c1">//--------------------------------</span>
</div><div class='line'><span class="k">@mixin</span><span class="nf"> photoshop-drop-shadow</span> <span class="p">(</span><span class="nv">$angle</span><span class="o">:</span> <span class="mi">0</span><span class="o">,</span> <span class="nv">$distance</span><span class="o">:</span> <span class="mi">0</span><span class="o">,</span> <span class="nv">$spread</span><span class="o">:</span> <span class="mi">0</span><span class="o">,</span> <span class="nv">$size</span><span class="o">:</span> <span class="mi">0</span><span class="o">,</span> <span class="nv">$color</span><span class="o">:</span> <span class="mh">#000</span><span class="o">,</span> <span class="nv">$inner</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="nv">$angle</span><span class="o">:</span> <span class="p">(</span><span class="mi">180</span> <span class="o">-</span> <span class="nv">$angle</span><span class="p">)</span> <span class="o">*</span> <span class="nf">pi</span><span class="p">()</span> <span class="o">/</span> <span class="mi">180</span><span class="p">;</span> <span class="c1">// convert to radians</span>
</div><div class='line'>  <span class="nv">$h-shadow</span><span class="o">:</span> <span class="nf">round</span><span class="p">(</span><span class="nf">cos</span><span class="p">(</span><span class="nv">$angle</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$distance</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$v-shadow</span><span class="o">:</span> <span class="nf">round</span><span class="p">(</span><span class="nf">sin</span><span class="p">(</span><span class="nv">$angle</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$distance</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$css-spread</span><span class="o">:</span> <span class="nv">$size</span> <span class="o">*</span> <span class="nv">$spread</span><span class="o">/</span><span class="mi">100</span><span class="p">;</span>
</div><div class='line'>  <span class="nv">$blur</span><span class="o">:</span> <span class="p">(</span><span class="nv">$size</span> <span class="o">-</span> <span class="nv">$css-spread</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$inset</span><span class="o">:</span> <span class="nf">if</span><span class="p">(</span><span class="nv">$inner</span> <span class="o">!=</span> <span class="n-Pseudo">false</span><span class="o">,</span> <span class="s1">&#39;</span><span class="s2">inset&#39;</span><span class="o">,</span> <span class="s1">&#39;</span><span class="s2">&#39;</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>  <span class="k">@include</span><span class="nd"> box-shadow</span><span class="p">(</span><span class="nv">$h-shadow</span> <span class="nv">$v-shadow</span> <span class="nv">$blur</span> <span class="nv">$css-spread</span> <span class="nv">$color</span> <span class="nf">unquote</span><span class="p">(</span><span class="nv">$inset</span><span class="p">));</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'> </div><div class='line'><span class="c1">//--------------------------------</span>
</div><div class='line'><span class="c1">// Photoshop Inner Shadow</span>
</div><div class='line'><span class="c1">//--------------------------------</span>
</div><div class='line'><span class="k">@mixin</span><span class="nf"> photoshop-inner-shadow</span> <span class="p">(</span><span class="nv">$angle</span><span class="o">:</span> <span class="mi">0</span><span class="o">,</span> <span class="nv">$distance</span><span class="o">:</span> <span class="mi">0</span><span class="o">,</span> <span class="nv">$spread</span><span class="o">:</span> <span class="mi">0</span><span class="o">,</span> <span class="nv">$size</span><span class="o">:</span> <span class="mi">0</span><span class="o">,</span> <span class="nv">$color</span><span class="o">:</span> <span class="mh">#000</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> photoshop-drop-shadow</span> <span class="p">(</span><span class="nv">$angle</span><span class="o">,</span> <span class="nv">$distance</span><span class="o">,</span> <span class="nv">$spread</span><span class="o">,</span> <span class="nv">$size</span><span class="o">,</span> <span class="nv">$color</span><span class="o">,</span> <span class="n-Pseudo">true</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">//--------------------------------</span>
</div><div class='line'><span class="c1">// Photoshop Text Shadow</span>
</div><div class='line'><span class="c1">//--------------------------------</span>
</div><div class='line'><span class="k">@mixin</span><span class="nf"> photoshop-text-shadow</span> <span class="p">(</span><span class="nv">$angle</span><span class="o">:</span> <span class="mi">0</span><span class="o">,</span> <span class="nv">$distance</span><span class="o">:</span> <span class="mi">0</span><span class="o">,</span> <span class="nv">$spread</span><span class="o">:</span> <span class="mi">0</span><span class="o">,</span> <span class="nv">$size</span><span class="o">:</span> <span class="mi">0</span><span class="o">,</span> <span class="nv">$color</span><span class="o">:</span> <span class="mh">#000</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="c1">// NOTE: $spread has no effect for text shadows</span>
</div><div class='line'>  <span class="nv">$angle</span><span class="o">:</span> <span class="p">(</span><span class="mi">180</span> <span class="o">-</span> <span class="nv">$angle</span><span class="p">)</span> <span class="o">*</span> <span class="nf">pi</span><span class="p">()</span> <span class="o">/</span> <span class="mi">180</span><span class="p">;</span>
</div><div class='line'>  <span class="nv">$h-shadow</span><span class="o">:</span> <span class="nf">round</span><span class="p">(</span><span class="nf">cos</span><span class="p">(</span><span class="nv">$angle</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$distance</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$v-shadow</span><span class="o">:</span> <span class="nf">round</span><span class="p">(</span><span class="nf">sin</span><span class="p">(</span><span class="nv">$angle</span><span class="p">)</span> <span class="o">*</span> <span class="nv">$distance</span><span class="p">);</span>
</div><div class='line'>  <span class="nv">$css-spread</span><span class="o">:</span> <span class="nv">$size</span> <span class="o">*</span> <span class="nv">$spread</span><span class="o">/</span><span class="mi">100</span><span class="p">;</span>
</div><div class='line'>  <span class="nv">$blur</span><span class="o">:</span> <span class="p">(</span><span class="nv">$size</span> <span class="o">-</span> <span class="nv">$css-spread</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>  <span class="k">@include</span><span class="nd"> text-shadow</span><span class="p">(</span><span class="nv">$h-shadow</span> <span class="nv">$v-shadow</span> <span class="nv">$blur</span> <span class="nv">$color</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>The code above relies on the <a href="http://compass-style.org/reference/compass/css3/box_shadow/#mixin-box-shadow">Compass <code>box-shadow()</code></a> <code>@mixin</code> to generate the correct CSS rules with all of the correct vendor prefixes.</p>
<p>It&rsquo;s worth noting that two additional <code>@mixin</code>s are shown in the code above. <code>@mixin photoshop-inner-shadow</code> is for Photoshops Inner Shadow Layer Style, which is analogous to the <code>inset</code> value for <code>box-shadow</code>. <code>@mixin photoshop-text-shadow</code> is for <code><a href="https://developer.mozilla.org/en/CSS/text-shadow">text-shadow</a></code> which is implemented in Photoshop as a Drop Shadow applied to a text layer. It&rsquo;s also worth noting that CSS does not support a <em>Spread</em> on <code>text-shadow</code>s.</p>
<h2 id="seeing-it-in-action">Seeing It In Action</h2>
<figure>
    <img src="http://assets.heygrady.com/photoshop-drop-shadow/photoshop-drop-shadow.png" height="200" width="200" alt="">
    <figcaption>An image of red box with a drop <br> shadow created in Photoshop.</figcaption>
</figure>

<figure>
    <iframe src="http://assets.heygrady.com/photoshop-drop-shadow/photoshop-drop-shadow.html" height="200" width="200" scrolling="no" frameborder="0"></iframe>
    <figcaption>A red box with a <code>box-shadow</code> <br>(<a href="http://assets.heygrady.com/photoshop-drop-shadow/photoshop-drop-shadow.html" target="_blank">view live example</a>).</figcaption>
</figure>

<p>Using the <code>@mixin</code> is quite simple. Assume that we want to recreate the above Photoshop image in CSS. This image was created with the default <em>Blend Mode</em>, <em>Color</em> and <em>Opacity</em>. The <em>Angle</em> is 120&deg;, the <em>Distance</em> is 10px, the <em>Spread</em> is 50% and the <em>Size</em> is 10px. As the example below shows, all that is needed is to plug in the values as they appear in Photoshop into the <code>@mixin</code>.</p>

<figure class='code'><figcaption>example.scss<a href='https://gist.github.com/1039282'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div></pre></td><td class='main  scss'><pre><div class='line'><span class="nc">.box</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> photoshop-drop-shadow</span><span class="p">(</span><span class="mi">120</span><span class="o">,</span> <span class="mi">10</span><span class="kt">px</span><span class="o">,</span> <span class="mi">50</span><span class="o">,</span> <span class="mi">10</span><span class="kt">px</span><span class="o">,</span> <span class="nf">rgba</span><span class="p">(</span><span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">0</span><span class="mf">.75</span><span class="p">));</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<p>The <code>@mixin</code> will automatically convert the values and create the corresponding CSS rules as shown in the example below. It is important to note that the <em>Angle</em> and <em>Spread</em> values should always be unitless while the <em>Distance</em> and <em>Size</em> values require px as the unit.</p>

<figure class='code'><figcaption>example.css<a href='https://gist.github.com/1039282'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nc">.box</span> <span class="p">{</span>
</div><div class='line'>  <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">shadow</span><span class="o">:</span> <span class="m">5px</span> <span class="m">9px</span> <span class="m">5px</span> <span class="m">5px</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">.</span><span class="m">75</span><span class="p">);</span>
</div><div class='line'>  <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">shadow</span><span class="o">:</span> <span class="m">5px</span> <span class="m">9px</span> <span class="m">5px</span> <span class="m">5px</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">.</span><span class="m">75</span><span class="p">);</span>
</div><div class='line'>  <span class="o">-</span><span class="n">o</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">shadow</span><span class="o">:</span> <span class="m">5px</span> <span class="m">9px</span> <span class="m">5px</span> <span class="m">5px</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">.</span><span class="m">75</span><span class="p">);</span>
</div><div class='line'>  <span class="n">box</span><span class="o">-</span><span class="n">shadow</span><span class="o">:</span> <span class="m">5px</span> <span class="m">9px</span> <span class="m">5px</span> <span class="m">5px</span> <span class="n">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">.</span><span class="m">75</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[State of Browsers, August 2011]]></title>
<link href="http://heygrady.com/blog/2011/07/29/state-of-browsers/"/>
<updated>2011-07-29T11:47:00-07:00</updated>
<id>http://heygrady.com/blog/2011/07/29/state-of-browsers</id>
<category term="browsers" />

      <content type="html"><![CDATA[<p>Since the release of Internet Explorer 9 earlier this year, the browser landscape has continued to change rapidly. In early 2012 Internet Explorer 10 will be released &mdash; the second IE release in about a year &mdash; with a number of important advancements. Firefox will have fully adopted the same release cycle as Google Chrome with version 6 and 7 due by years end. Firefox 6, due August 16th, will be the third version of Firefox released this year! Browsers are getting released early and often and upgrades are now automatic in Chrome and Firefox, often without the user's knowledge.</p>
<p>Often overlooked in the hype over the browser wars is the role that the OS plays in all of this. Windows 7 is now the most popular OS in the United States; it passed Windows XP in April. It's set to become the number one operating system in the world sometime in October or November this year. Many commentators chastised Microsoft for not releasing a version of IE9 for Windows XP but that doesn't seem to have been a bad strategy for Microsoft. IE9 is already making impressive market share gains although Windows XP is likely to be a major operating system on the worldwide market for some time, it will likely still have around 30% market share by the time of the 2012 presidential elections. That means that the long tail of decline for the older IE versions is likely to be kept alive by the stubborn decline of Windows XP.</p>
<!--more-->
<h3 id="current-browser-market-share">Current Browser Market Share</h3>
<p>Although a lot of emphasis is often placed on particular browser features or the new technologies of HTML5, it's just as important to look at the real landscape of browsers in the marketplace &mdash; this indicates when developers can actually start using a feature. Websites like <a href="http://caniuse.com/">When can I use&hellip;</a> do an excellent job of tracking features and mapping them to current browsers.</p>
<p>Below you can see the market share of browsers in the US. The various flavors of IE have been separated out because they are so radically different from each other while versions of FireFox, Chrome and Safari have been merged because they are all reasonably up to date, and reasonably similar.</p>
<figure>
	<div id="us-browser-jul-2011"></div>
	<figcaption>US browser market share for July 2011 from <a href="http://gs.statcounter.com/#browser-US-monthly-201107-201107-bar">Global Stats</a></figcaption>
</figure>
<p>In the US, IE9 usage has risen quite dramatically since the year began, to 10% while IE8 has plunged. IE7 continues to drop rapidly and is now just over 5% in the US. The other big success story is Google Chrome, reaching 16% in the united states.</p>
<figure>
	<div id="world-browser-jul-2011"></div>
	<figcaption>Worldwide browser marketshare for July 2011 from <a href="http://gs.statcounter.com/#browser-ww-monthly-201107-201107-bar">Global Stats</a></figcaption>
</figure>
<p>Worldwide it's a slightly different story. Mostly because of Europe, Firefox and Chrome have much more impressive overall numbers. IE9 is catching on more slowly, largely because of IE's lower overall usage in Europe. Safari's market is largely tied to OSX which is much less popular worldwide than in the US.</p>
<h3 id="operating-system-market-share">Operating System Market Share</h3>
<p>In the US, <a href="http://gs.statcounter.com/#os-US-monthly-201101-201107">Windows 7 surpassed Windows XP in April</a> of this year and it will likely happen worldwide in November. Tracking Windows 7 adoption is important because IE6 and 7 are not available for Windows 7. Windows Vista never really caught on and the release of Windows 7 has decimated Vista's market share. Vista is set to drop to 8% by the end of the year and, if trends continue, it will be hanging out with desktop Linux by the end of 2012 &mdash; around 1% or 2%.</p>
<figure>
	<div id="os-jan-2011-to-dec-2012"></div>
	<figcaption>Operating system market share for January 2011 through July 2011 with trendlines from <a href="http://gs.statcounter.com/#os-ww-monthly-201101-201107">Global Stats</a></figcaption>
</figure>
<p>The chart above shows the global market share of the 4 top operating systems with trend lines drawn out for the rest of 2011. The lines for Windows 7 and Windows XP cross some time in November.</p>
<h2 id="predictions">Predictions</h2>
<figure>
	<div id="browser-jan-2011-to-dec-2011"></div>
	<figcaption>US Brower market share for January 2011 through July 2011 with trendlines from <a href="http://gs.statcounter.com/#browser-US-monthly-201101-201107">Global Stats</a></figcaption>
</figure>
<p>Trend lines have been added to the chart above for the rest of 2011. As the chart above shows, the release of IE9 has had a significant impact on IE8's market share &mdash; IE9 is climbing almost as fast as IE8 is falling. IE7 has also begun a dramatic fall since IE9's release in March. IE7 is on track to fall below 3% by the end of the year &mdash; this is pretty remarkable considering it started the year with nearly 12%. Chrome continues to make significant gains with the majority of its share coming from IE and is set to end 2011 with around 20% market share. Firefox has been in a slow decline for quite a while, losing around 3% a year since peaking in 2009 (around the time of Chrome 2's release).</p>
<h3 id="mobile">Mobile</h3>
<p>While Safari's numbers are basically stagnant and follow in line with OSX's market penetration, Safari for iPad and iPhone continue to grow and have begun showing up in the <a href="http://gs.statcounter.com/#browser_version-US-monthly-201107-201107-bar">top 10 browsers on Global Stats</a>, beating out IE6 in the US. Those numbers will continue to grow and become competitive with IE6 and IE7. This means that in 2012 &mdash; and likely well before that &mdash; it will make sense to weigh between iOS/Android support versus IE6/IE7 support. Yahoo! has already updated their <a href="http://developer.yahoo.com/yui/articles/gbs/"><acronym title="Graded Browser Support">GBS</acronym> list</a> to include mobile browsers. It may seem like a false choice to drop IE6/IE7 in favor of mobile support however, considering they likely take an equal amount of extra developer time, it makes sense to support the edge case with a growing market share instead of a shrinking one. Judging by new CSS frameworks like <a href="http://html5boilerplate.com/mobile/">Mobile Boilerplate</a>, <a href="http://stuffandnonsense.co.uk/projects/320andup/">320 and Up</a> and <a href="http://www.getskeleton.com/">Skeleton</a>, mobile is actually becoming a real consideration for front-end developers.</p>
<p>At the same time, the new focus on mobile caused a co-worker of mine to gripe, "Android is the new IE6." After reviewing the <a href="http://jquerymobile.com/gbs/">jQuery Mobile GBS</a> it's clear that mobile is still a wild frontier. This is likely why Yahoo! is still only supporting iOS and Android. Of course the stats tend to bear that out as well; <a href="http://gs.statcounter.com/#mobile_browser-US-monthly-201107-201107-bar">iOS and Android dominate the mobile handset market</a> and <a href="http://gs.statcounter.com/#mobile_browser-US-monthly-201102-201107">blackberry is in a sharp decline</a>.</p>
<h3 id="abandoning-ie6-completely">Abandoning IE6 Completely</h3>
<p>Most developers have been on this page for months or even years, but it is now obvious that IE6 will be hanging out with browsers like Firefox 3.0 and 3.5 Or Safari 4 by the end of the year. The only reason anyone had for supporting it this long was corporate clients that were reluctant to upgrade. From my experience, many corporate clients have begun the process of upgrading form Windows XP/IE6 to Windows Vista/IE7 &mdash; because if they upgraded to Windows 7 and IE9 the world would end.</p>
<h3 id="dropping-ie7-support">Dropping IE7 Support</h3>
<p>People (me) were calling for <a href="http://blog.solutionset.com/wpmu/2010/01/07/its-2010-do-you-know-where-your-ie6-is/">abandoning IE6 once it hit 5% in the US</a>. IE7 is now at that level and it has started to show the same consistent pattern of decline that IE6 was showing. IE7 has actually been declining much faster than IE6 ever did, similar to the decline of Windows XP versus Windows Vista. Halfway through 2011 IE7 has already dropped from nearly 12% to just over 5%. IE7 will probably adopt the slow death of dropping it's market share by more than half every year going forward, similar to what IE6 is doing now. This all means that by the time 2012 rolls around, IE7 will be a breath away from dropping off the required browsers list for most developers.</p>
<p>It's kind of a shame to see IE7 so close to obsolescence so soon after most developers were finally able to drop IE6. The developers that I work with regularly get excited when I tell them, "No IE6 testing, only IE7." Only having to test for IE7 is a sweet sigh of relief, but it's still a painful experience. Sadly IE7 can't be dropped right away because of corporate clients but by the end of the year, things will be a different story. With the rapid release of IE10 coming in the fall and the likely hot-on-its-heels announcement of IE11, corporate IT will have to rethink it's strategy of dictating specific IE versions within their network.</p>

<script src="https://www.google.com/jsapi"></script>
<script>
	 google.load("visualization", "1", {packages:["corechart"]});
	google.setOnLoadCallback(drawChart);
	function drawChart() {
		// us-browser-jul-2011
		var data = new google.visualization.DataTable();
		data.addColumn('string', 'Browser');
		data.addColumn('number', 'Percentage');
		data.addRows(8);
		data.setValue(0, 0, 'IE9');
		data.setValue(0, 1, 10.36);
		data.setValue(1, 0, 'IE8');
		data.setValue(1, 1, 27.56);
		data.setValue(2, 0, 'IE7');
		data.setValue(2, 1, 5.4);
		data.setValue(3, 0, 'IE6');
		data.setValue(3, 1, 1.35);
		data.setValue(4, 0, 'Firefox');
		data.setValue(4, 1, 24.44);
		data.setValue(5, 0, 'Chrome');
		data.setValue(5, 1, 16.29);
		data.setValue(6, 0, 'Safari');
		data.setValue(6, 1, 9.82);
		data.setValue(7, 0, 'Other');
		data.setValue(7, 1, 4.78);
		var chart = new google.visualization.PieChart(document.getElementById('us-browser-jul-2011'));
		chart.draw(data, {
	 		 width: 540/2, height: 300,
	 		 //title: 'US Browser Market Share July 2011',
	     		colors: ['#16365c', '#538dd5', '#8db4e2', '#c5d9f1', '#e26b0a', '#76933c', '#60497a', '#a6a6a6'],
	     		chartArea: {top: 0, height: '100%', width: '100%'},
	     		tooltipText: 'percentage',
	     		legend: 'in'
	     	});


		// world-browser-jul-2011
		var data = new google.visualization.DataTable();
		data.addColumn('string', 'Browser');
		data.addColumn('number', 'Percentage');
		data.addRows(8);
		data.setValue(0, 0, 'IE9');
		data.setValue(0, 1, 7.2);
		data.setValue(1, 0, 'IE8');
		data.setValue(1, 1, 26.39);
		data.setValue(2, 0, 'IE7');
		data.setValue(2, 1, 5.51);
		data.setValue(3, 0, 'IE6');
		data.setValue(3, 1, 3.45);
		data.setValue(4, 0, 'Firefox');
		data.setValue(4, 1, 27.51);
		data.setValue(5, 0, 'Chrome');
		data.setValue(5, 1, 21.03);
		data.setValue(6, 0, 'Safari');
		data.setValue(6, 1, 4.1);
		data.setValue(7, 0, 'Other');
		data.setValue(7, 1, 4.81);
		var chart = new google.visualization.PieChart(document.getElementById('world-browser-jul-2011'));
		chart.draw(data, {
	       		 width: 540/2, height: 300,
			 //title: 'World Browser Market Share July 2011',
			colors: ['#16365c', '#538dd5', '#8db4e2', '#c5d9f1', '#e26b0a', '#76933c', '#60497a', '#a6a6a6'],
         		chartArea: {top: 0, height: '100%', width: '100%'},
	     		tooltipText: 'percentage',
	     		legend: 'in'
	     	});

	 	//browser-jan-2011-to-dec-2011
	     	var data = new google.visualization.DataTable();
		data.addColumn('string', 'Month');
		data.addColumn('number', 'IE9');
		data.addColumn('number', 'IE8');
		data.addColumn('number', 'IE7');
		data.addColumn('number', 'IE6');
		data.addColumn('number', 'Firefox');
		data.addColumn('number', 'Chrome');
		data.addColumn('number', 'Safari');
		data.addColumn('number', 'IE9');
		data.addColumn('number', 'IE8');
		data.addColumn('number', 'IE7');
		data.addColumn('number', 'IE6');
		data.addColumn('number', 'Firefox');
		data.addColumn('number', 'Chrome');
		data.addColumn('number', 'Safari');
		data.addRows(12);
		data.setValue(0, 0, 'Jan');
		data.setValue(0, 1, 0.53);
		data.setValue(0, 2, 33.97);
		data.setValue(0, 3, 11.69);
		data.setValue(0, 4, 2.18);
		data.setValue(0, 5, 26.18);
		data.setValue(0, 6, 12.36);
		data.setValue(0, 7, 10.04);
		data.setValue(1, 0, 'Feb');
		data.setValue(1, 1, 0.6);
		data.setValue(1, 2, 33.76);
		data.setValue(1, 3, 11.03);
		data.setValue(1, 4, 1.97);
		data.setValue(1, 5, 26.33);
		data.setValue(1, 6, 13.15);
		data.setValue(1, 7, 10.24);
		data.setValue(2, 0, 'Mar');
		data.setValue(2, 1, 0.94);
		data.setValue(2, 2, 33.64);
		data.setValue(2, 3, 11.17);
		data.setValue(2, 4, 1.89);
		data.setValue(2, 5, 25.82);
		data.setValue(2, 6, 13.76);
		data.setValue(2, 7, 9.91);
		data.setValue(3, 0, 'Apr');
		data.setValue(3, 1, 2.99);
		data.setValue(3, 2, 33.87);
		data.setValue(3, 3, 8.7);
		data.setValue(3, 4, 1.7);
		data.setValue(3, 5, 25.33);
		data.setValue(3, 6, 14.44);
		data.setValue(3, 7, 9.93);
		data.setValue(4, 0, 'May');
		data.setValue(4, 1, 5.88);
		data.setValue(4, 2, 32.65);
		data.setValue(4, 3, 6.98);
		data.setValue(4, 4, 1.57);
		data.setValue(4, 5, 24.92);
		data.setValue(4, 6, 14.79);
		data.setValue(4, 7, 9.89);
		data.setValue(5, 0, 'Jun');
		data.setValue(5, 1, 8.38);
		data.setValue(5, 2, 30.39);
		data.setValue(5, 3, 6.23);
		data.setValue(5, 4, 1.47);
		data.setValue(5, 5, 24.51);
		data.setValue(5, 6, 15.57);
		data.setValue(5, 7, 9.84);
		data.setValue(6, 0, 'Jul');
		data.setValue(6, 1, 10.36);
		data.setValue(6, 2, 27.56);
		data.setValue(6, 3, 5.4);
		data.setValue(6, 4, 1.35);
		data.setValue(6, 5, 24.44);
		data.setValue(6, 6, 16.29);
		data.setValue(6, 7, 9.82);
		data.setValue(6, 8, 10.36);
		data.setValue(6, 9, 27.56);
		data.setValue(6, 10, 5.4);
		data.setValue(6, 11, 1.35);
		data.setValue(6, 12, 24.44);
		data.setValue(6, 13, 16.29);
		data.setValue(6, 14, 9.82);
		data.setValue(7, 0, 'Aug');
		data.setValue(7, 8, 12.6867);
		data.setValue(7, 9, 25.13);
		data.setValue(7, 10, 4.6233);
		data.setValue(7, 11, 1.2433);
		data.setValue(7, 12, 24.383);
		data.setValue(7, 13, 17.05);
		data.setValue(7, 14, 9.78);
		data.setValue(8, 0, 'Sep');
		data.setValue(8, 8, 14.9267);
		data.setValue(8, 9, 22.59);
		data.setValue(8, 10, 3.8333);
		data.setValue(8, 11, 1.1333);
		data.setValue(8, 12, 24.143);
		data.setValue(8, 13, 17.8);
		data.setValue(8, 14, 9.745);
		data.setValue(9, 0, 'Oct');
		data.setValue(9, 8, 17.1667);
		data.setValue(9, 9, 20.05);
		data.setValue(9, 10, 3.0433);
		data.setValue(9, 11, 1.0233);
		data.setValue(9, 12, 23.903);
		data.setValue(9, 13, 18.55);
		data.setValue(9, 14, 9.71);
		data.setValue(10, 0, 'Nov');
		data.setValue(10, 8, 19.4067);
		data.setValue(10, 9, 17.51);
		data.setValue(10, 10, 2.2533);
		data.setValue(10, 11, 0.9133);
		data.setValue(10, 12, 23.663);
		data.setValue(10, 13, 19.3);
		data.setValue(10, 14, 9.675);
		data.setValue(11, 0, 'Dec');
		data.setValue(11, 8, 21.6467);
		data.setValue(11, 9, 14.97);
		data.setValue(11, 10, 1.4633);
		data.setValue(11, 11, 0.8033);
		data.setValue(11, 12, 23.423);
		data.setValue(11, 13, 20.05);
		data.setValue(11, 14, 9.64);

		var chart = new google.visualization.LineChart(document.getElementById('browser-jan-2011-to-dec-2011'));
		chart.draw(data, {
	 		 width: 540, height: 300,
	 		 //title: 'US Browser Market Share January 2011 through December 2011',
	     		lineWidth: 3,
	     		colors: ['#16365c', '#538dd5', '#8db4e2', '#c5d9f1', '#e26b0a', '#76933c', '#60497a'],
	     		series: {
	     			7: {lineWidth: 1, visibleInLegend: false },
	     			8: {lineWidth: 1, visibleInLegend: false },
	     			9: {lineWidth: 1, visibleInLegend: false },
	     			10: {lineWidth: 1, visibleInLegend: false },
	     			11: {lineWidth: 1, visibleInLegend: false },
	     			12: {lineWidth: 1, visibleInLegend: false },
	     			13: {lineWidth: 1, visibleInLegend: false }
	     		},
	     		chartArea: {height: '75%', width: '85%'},
	     		//tooltipText: 'percentage',
	     		legend: 'bottom'
	     	});
        
                //os-jan-2011-to-dec-2011
                var data = new google.visualization.DataTable();
                data.addColumn('string', 'Month');
                data.addColumn('number', 'Win XP');
                data.addColumn('number', 'Win 7');
                data.addColumn('number', 'Win Vista');
                data.addColumn('number', 'OSX');
                data.addColumn('number', 'Win XP');
                data.addColumn('number', 'Win 7');
                data.addColumn('number', 'Win Vista');
                data.addColumn('number', 'OSX');
                data.addRows(12);
                data.setValue(0, 0, 'Jan');
                data.setValue(0, 1, 48.78);
                data.setValue(0, 2, 27.68);
                data.setValue(0, 3, 15.1);
                data.setValue(0, 4, 6.56);
                data.setValue(1, 0, 'Feb');
                data.setValue(1, 1, 48);
                data.setValue(1, 2, 29.12);
                data.setValue(1, 3, 14.41);
                data.setValue(1, 4, 6.59);
                data.setValue(2, 0, 'Mar');
                data.setValue(2, 1, 47.32);
                data.setValue(2, 2, 30.6);
                data.setValue(2, 3, 13.66);
                data.setValue(2, 4, 6.53);
                data.setValue(3, 0, 'Apr');
                data.setValue(3, 1, 46.57);
                data.setValue(3, 2, 31.91);
                data.setValue(3, 3, 13.11);
                data.setValue(3, 4, 6.47);
                data.setValue(4, 0, 'May');
                data.setValue(4, 1, 45.83);
                data.setValue(4, 2, 33.22);
                data.setValue(4, 3, 12.53);
                data.setValue(4, 4, 6.35);
                data.setValue(5, 0, 'Jun');
                data.setValue(5, 1, 45.04);
                data.setValue(5, 2, 34.54);
                data.setValue(5, 3, 12);
                data.setValue(5, 4, 6.27);
                data.setValue(6, 0, 'Jul');
                data.setValue(6, 1, 44.06);
                data.setValue(6, 2, 35.88);
                data.setValue(6, 3, 11.57);
                data.setValue(6, 4, 6.23);
                data.setValue(6, 5, 44.06);
                data.setValue(6, 6, 35.88);
                data.setValue(6, 7, 11.57);
                data.setValue(6, 8, 6.23);
                data.setValue(7, 0, 'Aug');
                data.setValue(7, 5, 43.4328);
                data.setValue(7, 6, 37.2874);
                data.setValue(7, 7, 10.8344);
                data.setValue(7, 8, 6.1703);
                data.setValue(8, 0, 'Sep');
                data.setValue(8, 5, 42.6624);
                data.setValue(8, 6, 38.6467);
                data.setValue(8, 7, 10.2437);
                data.setValue(8, 8, 6.1057);
                data.setValue(9, 0, 'Oct');
                data.setValue(9, 5, 41.892);
                data.setValue(9, 6, 40.006);
                data.setValue(9, 7, 9.653);
                data.setValue(9, 8, 6.0411);
                data.setValue(10, 0, 'Nov');
                data.setValue(10, 5, 41.1216);
                data.setValue(10, 6, 41.3653);
                data.setValue(10, 7, 9.0623);
                data.setValue(10, 8, 5.9765);
                data.setValue(11, 0, 'Dec');
                data.setValue(11, 5, 40.3512);
                data.setValue(11, 6, 42.7246);
                data.setValue(11, 7, 8.4716);
                data.setValue(11, 8, 5.9119);

                var chart = new google.visualization.LineChart(document.getElementById('os-jan-2011-to-dec-2012'));
                chart.draw(data, {
                        width: 540, height: 300,
                        lineWidth: 3,
                        colors: ['#16365c', '#e26b0a', '#76933c', '#60497a'],
                        series: {
                                4: {lineWidth: 1, visibleInLegend: false },
                                5: {lineWidth: 1, visibleInLegend: false },
                                6: {lineWidth: 1, visibleInLegend: false },
                                7: {lineWidth: 1, visibleInLegend: false }
                        },
                        chartArea: {height: '75%', width: '85%'},
                        //tooltipText: 'percentage',
                        legend: 'bottom'
                });
	}
</script>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Animating With Curves in jQuery]]></title>
<link href="http://heygrady.com/blog/2011/07/20/animating-with-curves-in-jquery/"/>
<updated>2011-07-20T11:48:00-07:00</updated>
<id>http://heygrady.com/blog/2011/07/20/animating-with-curves-in-jquery</id>
<category term="animation" /><category term="js" /><category term="plug-in" />

      <content type="html"><![CDATA[<p>jQuery has a really strong animation library built in that makes it very easy to animate a CSS property with very little JavaScript. However, it's not well suited to animating complex things that are not directly related to CSS. In particular, tweening an element along a curve or animating a <code>canvas</code> &mdash; which doesn't use CSS at all &mdash; is more difficult.</p>
<p>To solve these issues I've created two new jQuery plug-ins: <a href="https://github.com/heygrady/curve">jQuery Tween and jQuery Curve</a>.</p>
<!--more-->
<h2 id="tweening-an-object">Tweening an object.</h2>
<p>Tween simply uses the existing jQuery animation functions to manage the animation frames but leaves the application of the animation to the user. This essentially means that instead of animating a specific CSS property, tween simply fires a callback function. This is very similar to using the step callback option for jQuery animate but it removes some of the calculation overhead. Tween makes it easy to animate something like a <code>canvas</code> element which jQuery animate doesn't handle by default.</p>
<p><iframe width="100%" height="300" frameborder="0" src="http://jsfiddle.net/heygrady/Rx5Wv/embedded/result%2Cjs/"></iframe></p>
<p>In the example above, a sine wave is drawn on a <code>canvas</code> over 3 seconds. The first argument in the tween plug in is a step function while all other arguments match the default jQuery animation function. The step function receives 2 arguments, the current value and the <code>fx</code> object. When using the tween function, the current value passed is always equal to the current animation time. When using jQuery animate the current value is the value of the CSS property being animated. As the example above shows, the tween plug-in makes it much easier to animate something besides a standard CSS property.</p>
<p>Conceptually, the tween plug-in is similar to animating a custom property with jQuery's built-in animate function. The example below shows the exact same behavior as the example above using the native jQuery animate with a custom property instead of using the tween function.</p>
<p><iframe width="100%" height="300" frameborder="0" src="http://jsfiddle.net/heygrady/jMe5K/embedded/result%2Cjs/"></iframe></p>
<p>While using animate directly is similar to tween, animate causes jQuery to perform a series of property lookups and calculations on initialization that are skipped with tween. Additionally, tween adds a special step function to the <code>fx</code> object that overrides jQuery's default behavior to avoid any additional calculations on each step of the animation.</p>
<p>It's also worth noting that the normal jQuery animate calls the step function once for each property being animated. So if you're animating five properties (height, width, etc.) with the native jQuery animate function, a step function is called five times for each step of the animation. The tween plug-in avoids these extra function calls.</p>
<h2 id="using-curves">Using Curves</h2>
<p>The curve plug-in contains a handful of useful functions for plotting curves as a function of time and works well with the tween plug-in. The curves supported natively are circle, ellipse, sine, and bezier curves. It would be possible to define additional curves quite easily by extending the curve object. Each function takes a similar set of options and returns x and y coordinates.</p>
<p><iframe width="100%" height="300" frameborder="0" src="http://jsfiddle.net/heygrady/eFDe5/embedded/result%2Cjs/"></iframe></p>
<p>The example above uses a curve function to draw a sine wave. The curve function actually returns 3 values in the array: x, y and the angle of the tangent line. The tangent angle can be used to rotate an object to follow the curve. As you can see, the curve function makes it easier to calculate a sine wave as a function of time.</p>
<h3 id="a-curve-as-a-function-of-time">A curve as a function of time</h3>
<p>jQuery animate is using a simple concept of percentage of completion to perform animations. In a simple 1 second animation &mdash; let's animate the height property &mdash; jQuery will look at the current height value and the final height and calculate the difference. Next jQuery will calculate the current time and the duration &mdash; again, 1 second in this example &mdash; and start an interval timer. At each interval the percentage of the duration is calculated. That percentage is essentially the current time divided by the final time. The percentage is then altered by the easing function to speed up or slow down time before it is applied to the value in question.</p>
<p>Consider animating the height from 0px to 10px over 1 second. At 500ms the animation is 50% completed. In a step function the <code>fx</code> object reflects this as an <code>fx.state</code> of 0.5. The <code>fx.pos</code> will be slightly different based on the easing function; but with the default easing it is 0.4999. The current height is the start value plus the difference multiplied by the current position. This means 0px + 10px * 0.4999 which is 4.999px. Of course the differences between <code>fx.state</code> and <code>fx.pos</code> can be more dramatic depending on the <code>fx.state</code>. For instance, an <code>fx.state</code> of 0.25 corresponds to an <code>fx.pos</code> of 0.1464 using the default easing.</p>
<p>The value of <code>fx.pos</code> is essentially a percentage of completion and is important for plotting curves. Any curve, like a circle, has a start and an end point. Simple trigonometry can be used to calculate any point on a circle at a certain time. This makes it trivial to use such a function for drawing a curves as the example below shows.</p>
<p><iframe width="100%" height="300" frameborder="0" src="http://jsfiddle.net/heygrady/X5fw4/embedded/result%2Cjs/"></iframe></p>
<p>The example above isn't animating the circle, it's drawing it as a series of line segments using a loop. The current position on the circle is calculated for each iteration of the loop. Even though it isn't animated, the circle is still drawn as a function of time. <strong>NOTE:</strong> if all you want to do is <a href="https://developer.mozilla.org/en/Canvas_tutorial/Drawing_shapes">draw a circle on a <code>canvas</code></a> there's easier ways.</p>
<h3 id="using-the-tangent-angle">Using the tangent angle</h3>
<p>In addition to the x and y coordinates, the curve functions can also return a tangent angle which can be used to rotate the element in order for it to follow the curve. The tangent is returned in radians. In the example below, the angle of the rocket ship angle is set to the tangent angle so it will appear to follow the sine wave as it moves.</p>
<p><iframe width="100%" height="300" frameborder="0" src="http://jsfiddle.net/heygrady/BLMLu/embedded/result%2Cjs/"></iframe></p>
<h2 id="putting-it-all-together">Putting it all together</h2>
<p>The example below shows each of the supported curves in action. The tween plug-in is used to animate and rotate a rocket ship along a curve while simultaneously drawing the exact same curve on a <code>canvas</code>. This demonstrates the utility of separating the jQuery animate functionality from straight CSS operations &mdash; animating a <code>div</code> and drawing on a <code>canvas</code> at the same time.</p>
<p><iframe width="100%" height="310" frameborder="0" src="http://jsfiddle.net/heygrady/j5tHC/embedded/result%2Cjs/"></iframe></p>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[CSS Text Shadows in Internet Explorer]]></title>
<link href="http://heygrady.com/blog/2011/03/10/css-text-shadows-in-internet-explorer/"/>
<updated>2011-03-10T11:50:00-08:00</updated>
<id>http://heygrady.com/blog/2011/03/10/css-text-shadows-in-internet-explorer</id>
<category term="css" /><category term="ie" /><category term="plug-in" /><category term="polyfill" />

      <content type="html"><![CDATA[<p>CSS3 introduced a new <a href="http://www.w3.org/TR/css3-text/#text-shadow"><code>text-shadow</code> property</a> that allows for, well, shadows to be placed on text. As of February 2011, <a href="http://caniuse.com/css-textshadow"><code>text-shadow</code> is only supported in 48% of browsers</a> in use. Internet Explorer 8 and below do not support <code>text-shadow</code>; surprisingly Internet Explorer 9 doesn't either. Because the majority (90%) of non-IE browsers already supports <code>text-shadow</code>s natively, it's most interesting to try and <a href="http://remysharp.com/2010/10/08/what-is-a-polyfill/">polyfill</a> IE. I've created a <a href="https://github.com/heygrady/textshadow">Textshadow jQuery plug-in</a> for just this purpose. Read below for an overly thorough explanation of hacking IE filters to get a convincing text shadow.</p>

<!--more-->

<h3 id="goals">Goals</h3>
<p>The goal is to create a <code>text-shadow</code> polyfill for IE 9 and below and other <a href="https://developer.mozilla.org/en/CSS/text-shadow#Browser_compatibility">browsers that lack support</a>. It must look similar to the implementation in supported browsers and follow the W3C specification as closely as possible.</p>
<ul>
	<li>Shouldn't affect content layout</li>
	<li>Should flow with content</li>
	<li>Should follow W3C specification</li>
</ul>

<h2 id="text-shadow">Text Shadow</h2>
<p>Below is the example of the goal: the native text-shadow as rendered in Chrome 9. The shadow is red to add the greatest contrast between the black text and the white background.</p>
<figure>
	<img src="http://assets.heygrady.com/shadow/textshadow-chrome-9.png" alt="text-shadow Image" />
	<figcaption><code>text-shadow</code> in Chrome 9<br />
	(<a href="http://assets.heygrady.com/shadow/textshadow.html" target="_blank">view live example</a>)</figcaption>
</figure>
<figure class='code'><figcaption>textshadow.html<a href='https://gist.github.com/863419'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'>...
</div><div class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;box&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;h1&gt;</span>Some text that wraps and has a <span class="nt">&lt;b&gt;</span>s<span class="nt">&lt;i&gt;</span>h<span class="nt">&lt;b&gt;</span>a<span class="nt">&lt;/b&gt;</span>d<span class="nt">&lt;/i&gt;</span>ow.<span class="nt">&lt;/b&gt;&lt;/h1&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div><div class='line'>...
</div></pre></td></tr></table></div></figure>
<p>For these examples the simple HTML above is used. The <code>.box</code> is used for forcing the text to wrap and the funky <code>b</code> and <code>i</code> elements in the word "shadow" are for testing how shadows are applied to child content.</p>
<figure class='code'><figcaption>textshadow.css<a href='https://gist.github.com/863419'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nt">h1</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">text-shadow</span><span class="o">:</span> <span class="m">2px</span> <span class="m">2px</span> <span class="m">2px</span> <span class="m">#ff0000</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>None of the browsers that support <code>text-shadow</code> require a vendor prefix, making <a href="http://www.css3.info/preview/text-shadow/"><code>text-shadow</code> extremely easy to implement</a>. As noted above, this will not work in IE including version 9.</p>

<h2 id="using-ie-filters">Using IE Filters</h2>
<p>While IE doesn't directly support the CSS3 <code>text-shadow</code> property, it does support proprietary filters. Of course these filters have drawbacks; namely, IE 8 and below <a href="http://developer.yahoo.com/performance/rules.html#no_filters">apply them very slowly</a> and they have poorly documented features. For instance, the IE filters will apply to text unless the element has a background applied; the filters will also apply to borders if they are present. Another issue that will become clear later is that IE renders the text with alpha-transparent artifacts that make the text harder to read.</p>
<p>There are a few IE filters that seem promising. Most often the shadow filter is proposed as an alternative to native <code>text-shadow</code> although the most compelling articles use a <a href="http://kilianvalkhof.com/2008/design/almost-cross-browser-text-shadow/">combination of blur and glow</a> to achieve a <code>text-shadow</code> effect (<a href="http://placenamehere.com/article/384/css3boxshadowininternetexplorerblurshadow/">another great example only uses blur</a>).</p>
<ul>
	<li><a href="http://msdn.microsoft.com/en-us/library/ms533086(v=vs.85).aspx">Shadow Filter</a></li>
	<li><a href="http://msdn.microsoft.com/en-us/library/ms532985(v=vs.85).aspx">DropShadow Filter</a></li>
	<li><a href="http://msdn.microsoft.com/en-us/library/ms532995(v=vs.85).aspx">Glow Filter</a></li>
	<li><a href="http://msdn.microsoft.com/en-us/library/ms532979(v=vs.85).aspx">Blur Filter</a></li>
</ul>

<h3 id="shadow">Shadow</h3>
<figure>
	<img src="http://assets.heygrady.com/shadow/shadow-ie8.png" alt="Shadow Filter Image" />
	<figcaption>Shadow Filter in IE 8
	<br />
	(<a href="http://assets.heygrady.com/shadow/shadow.html" target="_blank">view live example</a>)</figcaption>
</figure>
<p>The example above is the proprietary shadow filter in Internet Explorer. This filter takes the original color and fades it to transparent. The filter takes three arguments for <code>color</code>, <code>direction</code> and <code>strength</code>. Direction is taken as an angle. To approximate a 2px X and 2px Y offset, a direction of 135 degrees (135 degrees is 90 degrees plus 45 degrees (duh?)) and strength of 2 is chosen.</p>
<ul>
	<li><code>color</code>- hex color without leading hash (#) character.</li>
	<li><code>direction</code>- angle in degrees. Zero degrees is straight up.</li>
	<li><code>strength</code>- length in pixels without any units.</li>
</ul>
<figure class='code'><figcaption>shadow.css<a href='https://gist.github.com/863419'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nt">h1</span> <span class="p">{</span>
</div><div class='line'>  <span class="n">filter</span><span class="o">:</span> <span class="n">progid</span><span class="o">:</span><span class="n">DXImageTransform</span><span class="o">.</span><span class="n">Microsoft</span><span class="o">.</span><span class="n">Shadow</span><span class="p">(</span><span class="k">direction</span><span class="o">=</span><span class="m">135</span><span class="o">,</span><span class="n">strength</span><span class="o">=</span><span class="m">2</span><span class="o">,</span><span class="k">color</span><span class="o">=</span><span class="n">ff0000</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<figure>
	<img src="http://assets.heygrady.com/shadow/shadow-ie8-white.png" alt="Shadow Filter with White Text Image" />
	<figcaption>Shadow Filter in IE 8 with White Text
	<br />
	(<a href="http://assets.heygrady.com/shadow/shadow-white.html" target="_blank">view live example</a>)</figcaption>
</figure>
<p>Changing the text to white will reveal some of the artifacting issues mentioned above. There are partially black pixels dotted around the perimeter of the text. This is the result of IE using a black matte behind the alpha transparent pixels in the text. I haven't fully experimented with how to remove this artifacting but it will likely involve turning off font smoothing in IE if it's possible.</p>
<h4>Results</h4>
<ul>
	<li>The shadow gradient produced is not a blur.</li>
	<li>The gradient treatment causes the shadow to appear pink instead of red.</li>
	<li>Shadow does not follow W3C Spec. With a small <code>strength</code>(like 2px) the shadow looks similar to the native <code>text-shadow</code>. With a higher <code>strength</code> it becomes apparent that the shadow strength is not an offset.</li>
	<li>The artifacting is distracting and makes the text harder to read.</li>
</ul>

<h3 id="dropshadow">DropShadow</h3>
<figure>
	<img src="http://assets.heygrady.com/shadow/dropshadow-ie8.png" alt="Dropshadow Filter Image" />
	<figcaption>Dropshadow Filter in IE 8
	<br />
	(<a href="http://assets.heygrady.com/shadow/dropshadow.html" target="_blank">view live example</a>)</figcaption>
</figure>
<p>Dropshadow will make a copy of the text and offset it behind the original text. This is very similar to the W3C spec for <code>text-shadow</code> with the exception of blur being unsupported. As shown above, the shadow is not anti-aliased.</p>
<ul>
	<li><code>color</code>- hex color without leading hash (#) character.</li>
	<li><code>offX</code>- length in pixels without units for the offset along the X axis.</li>
	<li><code>offY</code>- length in pixels without units for the offset along the Y axis.</li>
</ul>
<figure class='code'><figcaption>dropshadow.css<a href='https://gist.github.com/863419'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nt">h1</span> <span class="p">{</span>
</div><div class='line'>  <span class="n">filter</span><span class="o">:</span> <span class="n">progid</span><span class="o">:</span><span class="n">DXImageTransform</span><span class="o">.</span><span class="n">Microsoft</span><span class="o">.</span><span class="n">DropShadow</span><span class="p">(</span><span class="n">offX</span><span class="o">=</span><span class="m">2</span><span class="o">,</span><span class="n">offY</span><span class="o">=</span><span class="m">2</span><span class="o">,</span><span class="k">color</span><span class="o">=</span><span class="n">ff0000</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<figure>
	<img src="http://assets.heygrady.com/shadow/dropshadow-ie8-white.png" alt="Dropshadow Filter with White Text Image" />
	<figcaption>Dropshadow Filter in IE 8 with White Text
	<br />
	(<a href="http://assets.heygrady.com/shadow/dropshadow-white.html" target="_blank">view live example</a>)</figcaption>
</figure>
<p>With white text it is evident that dropshadow suffers from the same black pixel artifacting as shadow.</p>
<h4>Results</h4>
<ul>
	<li>Blur isn't supported in dropshadow.</li>
	<li>Dropshadow otherwise follows the W3C spec for dropshadows by creating a copy of the text.</li>
	<li>The artifacting is distracting and makes the text harder to read.</li>
</ul>

<h3 id="glow">Glow</h3>
<figure>
	<img src="http://assets.heygrady.com/shadow/glow-ie8.png" alt="Glow Filter Image" />
	<figcaption>Glow in IE 8
	<br />
	(<a href="http://assets.heygrady.com/shadow/glow.html" target="_blank">view live example</a>)<figcaption>
</figure>
<p>Glow is yet another filter that could be used to replace <code>text-shadow</code>; however, it's obvious that glow isn't very much like <code>text-shadow</code> at all. But it could be used to make text stand out from a background, which is essentially what <code>text-shadow</code> is used for. The color gradient effect is similar to the shadow filter but for glow, the color is omni-directional.</p>
<p>It should be noted that the glow affects the positioning of the text. A 2px glow pushes the text down 2px and to the right 2px. A 20px glow pronounces the issue, predictably pushing the text 20px down and to the right. The other filters, shadow and dropshadow, exhibit the same behavior when the shadow is projected up or to the left. This can cause unexpected cross-browser display issues.</p>
<ul>
	<li><code>color</code>- hex color without leading hash (#) character.</li>
	<li><code>strength</code>- length in pixels without any units.</li>
</ul>
<figure class='code'><figcaption>glow.css<a href='https://gist.github.com/863419'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nt">h1</span> <span class="p">{</span>
</div><div class='line'>  <span class="n">filter</span><span class="o">:</span> <span class="n">progid</span><span class="o">:</span><span class="n">DXImageTransform</span><span class="o">.</span><span class="n">Microsoft</span><span class="o">.</span><span class="n">Glow</span><span class="p">(</span><span class="k">color</span><span class="o">=</span><span class="n">ff0000</span><span class="o">,</span><span class="n">strength</span><span class="o">=</span><span class="m">2</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<figure>
	<img src="http://assets.heygrady.com/shadow/glow-ie8-white.png" alt="Glow Filter with White Text Image" />
	<figcaption>Glow Filter in IE 8 with White Text
	<br />
	(<a href="http://assets.heygrady.com/shadow/glow-white.html" target="_blank">view live example</a>)</figcaption>
</figure>
<p>Again, white text reveals the same distracting artifacting as shadow and dropshadow.</p>
<h4>Results</h4>
<ul>
	<li>Glow isn't at all like the W3C specification for <code>text-shadow</code>.</li>
	<li>The gradient treatment causes the glow to appear pink instead of red.</li>
	<li>Unexpected text offset will cause cross-browser display issues.</li>
	<li>The artifacting is distracting and makes the text harder to read.</li>
</ul>

<h3 id="blur">Blur</h3>
<figure>
	<img src="http://assets.heygrady.com/shadow/blur-ie8.png" alt="Blur Filter Image" />
	<figcaption>Blur in IE 8
	<br />
	(<a href="http://assets.heygrady.com/shadow/blur.html" target="_blank">view live example</a>)</figcaption>
</figure>
<p>Blur is perhaps the most frustrating filter because it is both exactly what is needed and not at all appropriate. The blur effect is very similar to the blur other browsers use for <code>text-shadow</code>. But of course, the text is rendered unreadable. It should also be noted that the blur offsets the text the same way glow does. For this example the text is shifted 2 pixels down and to the right by the blur. The larger the <code>pixelRadius</code> is, the larger the unintended offset will be, similar to the glow filter.</p>
<ul>
	<li><code>pixelRadius</code>- length in pixels without any units. This is equivalent to the blur-radius argument for <code>text-shadow</code>.</li>
	<li><code>makeShadow</code>- turns the text black no matter what color it was originally. Never use this.</li>
	<li><code>shadowOpacity</code>- only applies when makeShadow is set to true. Sets opacity and expects a value between 0 and 1. Never use this.</li>
</ul>
<figure class='code'><figcaption>blur.css<a href='https://gist.github.com/863419'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nt">h1</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">color</span><span class="o">:</span> <span class="m">#00ff00</span><span class="p">;</span>
</div><div class='line'>  <span class="n">filter</span><span class="o">:</span> <span class="n">progid</span><span class="o">:</span><span class="n">DXImageTransform</span><span class="o">.</span><span class="n">Microsoft</span><span class="o">.</span><span class="n">Blur</span><span class="p">(</span><span class="n">pixelradius</span><span class="o">=</span><span class="m">2</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<h4>Results</h4>
<ul>
	<li>Blur creates the desired blur effect.</li>
	<li>Blur obscures the original text which isn't exactly desirable.</li>
	<li>Blur doesn't allow for color to be set directly, although it does have a useless setting that will turn the text black.</li>
</ul>

<h2 id="making-blur-work">Making Blur Work</h2>
<figure>
	<img src="http://assets.heygrady.com/shadow/blur-span-ie8.png" alt="Blur Filter with SPAN Image" />
	<figcaption>Blur Filter in IE 8 with SPAN
	<br />
	(<a href="http://assets.heygrady.com/shadow/blur-span.html" target="_blank">view live example</a>)</figcaption>
</figure>
<p>Using a few <code>span</code> tags and duplicating the text allows for the blurred text to be placed behind the original text. By wrapping the original text in a <code>span</code>, duplicating the original text and adding it as a second <code>span</code>, and wrapping both in a third <code>span</code>, it becomes simple to position the blurred text as a shadow. As is shown above, using absolute positioning for the shadow can have undesired results. The absolute positioned <code>span</code> is collapsed to be as wide as the longest word. However, it is clear that the word "Some" has an appropriate text shadow. It is possible to support shadow color simply by setting the <code>color</code> property on the blurred text.</p>
<figure class='code'><figcaption>blurspan.html<a href='https://gist.github.com/863419'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'>...
</div><div class='line'><span class="nt">&lt;h1&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;shadow&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;shadow-orig&quot;</span><span class="nt">&gt;</span>Some text<span class="ni">&amp;hellip;</span><span class="nt">&lt;/span&gt;</span>
</div><div class='line'>    <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;shadow-copy&quot;</span><span class="nt">&gt;</span>Some text<span class="ni">&amp;hellip;</span><span class="nt">&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/span&gt;</span>
</div><div class='line'><span class="nt">&lt;/h1&gt;</span>
</div><div class='line'>...
</div></pre></td></tr></table></div></figure>
<p>The <code>.shadow</code> wrapper is given a <code>position: relative</code> to allow for proper positioning of the <code>.shadow-copy</code>. The <code>.shadow-copy</code> is given absolute positioning and a <code>z-index</code> of 1. The <code>.shadow-orig</code> is given <code>position: relative</code> and a <code>z-index</code> of 2 in order to place it above the <code>.shadow-copy</code>. The <code>top</code> and <code>left</code> properties can be applied to <code>.shadow-copy</code> to approximate the X and Y <code>text-shadow</code> offsets. In this case, <code>top</code> and <code>left</code> are set to zero because the blur filter already shifts the shadow by 2px as described above.</p>
<h3 id="fixing-the-wrapping-issues">Fixing the Wrapping Issues</h3>
<p>Instead of wrapping a long string of text in the <code>span</code> elements, it is more reliable to wrap individual words. This ensures that the <code>.shadow-copy</code> is always an appropriate width without having to set a hard <code>width</code> property in the CSS. Setting a hard width on the <code>span</code> would cause issues if the <code>text-size</code> were to change or the containing block changed size dynamically.</p>
<figure class='code'><figcaption>textshadow-plugin.html<a href='https://gist.github.com/863419'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;box&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;h1&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-original&quot;</span><span class="nt">&gt;</span>Some <span class="nt">&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-copy&quot;</span><span class="nt">&gt;</span>Some <span class="nt">&lt;/span&gt;&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-original&quot;</span><span class="nt">&gt;</span>text <span class="nt">&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-copy&quot;</span><span class="nt">&gt;</span>text <span class="nt">&lt;/span&gt;&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-original&quot;</span><span class="nt">&gt;</span>that <span class="nt">&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-copy&quot;</span><span class="nt">&gt;</span>that <span class="nt">&lt;/span&gt;&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-original&quot;</span><span class="nt">&gt;</span>wraps <span class="nt">&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-copy&quot;</span><span class="nt">&gt;</span>wraps <span class="nt">&lt;/span&gt;&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-original&quot;</span><span class="nt">&gt;</span>and <span class="nt">&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-copy&quot;</span><span class="nt">&gt;</span>and <span class="nt">&lt;/span&gt;&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-original&quot;</span><span class="nt">&gt;</span>has <span class="nt">&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-copy&quot;</span><span class="nt">&gt;</span>has <span class="nt">&lt;/span&gt;&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-original&quot;</span><span class="nt">&gt;</span>a <span class="nt">&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-copy&quot;</span><span class="nt">&gt;</span>a <span class="nt">&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-original&quot;</span><span class="nt">&gt;</span>s<span class="nt">&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-copy&quot;</span><span class="nt">&gt;</span>s<span class="nt">&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-original&quot;</span><span class="nt">&gt;</span>h<span class="nt">&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-copy&quot;</span><span class="nt">&gt;</span>h<span class="nt">&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-original&quot;</span><span class="nt">&gt;</span>a<span class="nt">&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-copy&quot;</span><span class="nt">&gt;</span>a<span class="nt">&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-original&quot;</span><span class="nt">&gt;</span>d<span class="nt">&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-copy&quot;</span><span class="nt">&gt;</span>d<span class="nt">&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow&quot;</span><span class="nt">&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-original&quot;</span><span class="nt">&gt;</span>ow.<span class="nt">&lt;/span&gt;&lt;span</span> <span class="na">class=</span><span class="s">&quot;ui-text-shadow-copy&quot;</span><span class="nt">&gt;</span>ow.<span class="nt">&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div></pre></td></tr></table></div></figure>
<p>The above is an example where the simple threesome of <code>span</code> elements has been applied to every individual word. Note that in the word "shadow", a <code>span</code> is nested inside each <code>b</code> and <code>i</code> element as well.</p>
<h2 id="turning-it-into-a-jquery-plugin">Turning it into a jQuery Plugin</h2>
<figure>
	<img src="http://assets.heygrady.com/shadow/textshadow-plugin-ie-8.png" alt="Textshadow Plugin Image" />
	<figcaption>Textshadow Plugin in IE 8
	<br />
	(<a href="http://assets.heygrady.com/shadow/textshadow-plugin.html" target="_blank">view live example</a>)</figcaption>
</figure>
<p>I have created a simple jQuery plugin called <a href="https://github.com/heygrady/textshadow">jQuery Textshadow</a> that automatically wraps each word in the <code>span</code>s as shown above and applies the appropriate blur filter and positioning for the shadow. It even supports <a href="http://www.css3.info/preview/rgba/">RGBA</a> and <a href="http://www.css3.info/preview/hsla/">HSLA</a> by converting the values to a hex color and applying the alpha filter to the shadow. The plugin requires that a small CSS file also be included on the page in order to set up some base styles for the spans.</p>
<figure class='code'><figcaption>jquery.textshadow.css<a href='https://gist.github.com/863419'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nc">.ui-text-shadow</span> <span class="p">{</span>
</div><div class='line'>	<span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ui-text-shadow-original</span> <span class="p">{</span>
</div><div class='line'>	<span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span> <span class="c">/* above copy */</span>
</div><div class='line'>	<span class="k">z-index</span><span class="o">:</span> <span class="m">2</span><span class="p">;</span>
</div><div class='line'>	<span class="k">text-shadow</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ui-text-shadow-copy</span> <span class="p">{</span>
</div><div class='line'>	<span class="k">position</span><span class="o">:</span> <span class="k">absolute</span><span class="p">;</span>
</div><div class='line'>	<span class="k">z-index</span><span class="o">:</span> <span class="m">1</span><span class="p">;</span> <span class="c">/* below original */</span>
</div><div class='line'> </div><div class='line'>	<span class="c">/* default positioning */</span>
</div><div class='line'>	<span class="k">left</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>	<span class="k">top</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>	<span class="c">/* turn off shadow */</span>
</div><div class='line'>	<span class="k">text-shadow</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'>	<span class="c">/* turn off selection */</span>
</div><div class='line'>	<span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">user</span><span class="o">-</span><span class="n">select</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</div><div class='line'>	<span class="o">-</span><span class="n">khtml</span><span class="o">-</span><span class="n">user</span><span class="o">-</span><span class="n">select</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</div><div class='line'>	<span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">user</span><span class="o">-</span><span class="n">select</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</div><div class='line'>	<span class="o">-</span><span class="n">o</span><span class="o">-</span><span class="n">user</span><span class="o">-</span><span class="n">select</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</div><div class='line'>	<span class="n">user</span><span class="o">-</span><span class="n">select</span><span class="o">:</span> <span class="k">none</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<h3 id="interesting-notes">Interesting Notes</h3>
<p>Currently, the plug-in assumes it is being applied in IE only and doesn't do any feature detection. It should be applied using a tool like <a href="http://www.modernizr.com/">Modernizr</a> or <a href="http://msdn.microsoft.com/en-us/library/ms537512(v=vs.85).aspx">IE conditional comments</a>. It's not particularly speedy, especially if there are dozens of tags that need the shadow applied. The slowest part is actually wrapping the text nodes with the replacement HTML. It's acceptably fast in Internet Explorer 9 and noticeably slow in Internet Explorer 8.</p>
<p>Curiously, Internet Explorer 9 also applies a cleaner shadow that is closer to text shadow in other browsers. The blur in IE 8 is noticeably muddier than the browsers that support <code>text-shadow</code>. See the images below for comparison.</p>
<figure>
	<img src="http://assets.heygrady.com/shadow/textshadow-plugin-ie-8.png" alt="Textshadow Plugin IE 8 Image" />
	<figcaption>Textshadow in IE 8</figcaption>
</figure>
<figure>
	<img src="http://assets.heygrady.com/shadow/textshadow-plugin-ie-9.png" alt="Textshadow Plugin IE 9 Image" />
	<figcaption>Textshadow in IE 9</figcaption>
</figure>
<figure>
	<img src="http://assets.heygrady.com/shadow/textshadow-chrome-9.png" alt="Textshadow Chrome 9 Image" />
	<figcaption>Textshadow in Chrome 9</figcaption>
</figure>
<figure>
	<img src="http://assets.heygrady.com/shadow/textshadow-firefox-3.6.png" alt="Textshadow Firefox 3.6 Image" />
	<figcaption>Textshadow in Firefox 3.6</figcaption>
</figure>
<figure>
	<img src="http://assets.heygrady.com/shadow/textshadow-safari-5.png" alt="Textshadow Safair 5 Image" />
	<figcaption>Textshadow in Safari 5</figcaption>
</figure>
<figure>
	<img src="http://assets.heygrady.com/shadow/textshadow-opera-11.png" alt="Textshadow Opera 11 Image" />
	<figcaption>Textshadow in Opera 11</figcaption>
</figure>
</table>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Cross-Browser Rounded Corners Overview]]></title>
<link href="http://heygrady.com/blog/2011/02/24/cross-browser-rounded-corners-overview/"/>
<updated>2011-02-24T11:51:00-08:00</updated>
<id>http://heygrady.com/blog/2011/02/24/cross-browser-rounded-corners-overview</id>
<category term="css" /><category term="polyfill" />

      <content type="html"><![CDATA[<p>Theres no shortage of techniques for achieving cross-browser rounded corners. Most of the techniques involve taking an otherwise simple box and adding markup and CSS until all browsers (IE 6+, Firefox, Safari, Chrome) agree to round the corners. Of course the great hope today is to use CSS3 techniques such as <code>border-radius</code> or multiple backgrounds and of course those approaches won't work in Internet Explorer 8 or below. Ironically, one of the best places to find some of the old school CSS solutions is on the <a href="http://msdn.microsoft.com/en-us/library/bb250413(v=vs.85).aspx">MSDN page describing <code>border-radius</code> </a>. For modern browsers, the <a href="https://developer.mozilla.org/en/css/-moz-border-radius"><code>border-radius</code> </a> property will do a good job of rounding corners. To support all browsers some clever techniques will need to be used.</p>
<!--more-->
<h4>For the uninitiated</h4>
<ul>
	<li><a href="http://msdn.microsoft.com/en-us/library/bb250413(v=vs.85).aspx">Rounded Corners in Internet Explorer</a></li>
	<li><code><a href="https://developer.mozilla.org/en/css/-moz-border-radius">border-radius</a></code></li>
	<li><code><a href="https://developer.mozilla.org/en/CSS/background">background</a></code></li>
	<li><a href="http://css3pie.com/">CSS3 PIE</a></li>
</ul>
<h3 id="goals">Goals</h3>
<p>To successfully approximate <code>border-radius</code>, the content of the box should appear as it does in a regular box with a border applied.</p>
<figure>
	<iframe width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners/box.html"></iframe>
	<figcaption>Simple Box<br>(<a href="http://assets.heygrady.com/corners/box.html" target="_blank">view live example</a>)</figcaption>
</figure>
<ul>
	<li>Start with a simple box</li>
	<li>The box's content should appear similarly with or without <code>border-radius</code>support</li>
	<li>The solution should work in all browsers (IE6 is a bonus) with or without <code>border-radius</code> support</li>
	<li>The solution should scale with the content and obey the box
		<ul>
			<li>with fluid height/width</li>
			<li>with fixed height/static width</li>
		</ul>
	</li>
	<li>Bonus Points: easy to implement</li>
</ul>
<h2 id="a-simple-box">A Simple Box</h2>
<p>As mentioned above, <a href="http://caniuse.com/border-radius"><code>border-radius</code> is supported in roughly 50% of browsers</a> globally (as of February, 2011). The other 50% of browsers are IE 8 and below.</p>
<figure class='code'><figcaption>box.html<a href='https://gist.github.com/834700'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;box&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;h2&gt;</span>Some Headline<span class="nt">&lt;/h2&gt;</span>
</div><div class='line'>  <span class="nt">&lt;p&gt;</span>My content.<span class="nt">&lt;/p&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div></pre></td></tr></table></div></figure>
<p>Above is the simple box that we want to give rounded corners. The goal is to have it look something like the picture below.</p>
<figure>
	<img id="fig-border-radius-image" src="http://assets.heygrady.com/corners/border-radius-box.png" alt="simple box with a red border" />
	<iframe id="fig-border-radius-iframe" width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners/border-radius-box.html"></iframe>
	<script>
		if (Modernizr.borderradius) {
			document.getElementById("fig-border-radius-image").style.display = "none";
		} else {
			document.getElementById("fig-border-radius-iframe").style.display = "none";
		}
	</script>
	<figcaption>Border Radius<br>(<a href="http://assets.heygrady.com/corners/border-radius-box.html" target="_blank">view live example</a>)</figcaption>
</figure>
<figure class='code'><figcaption>border-radius-box.css<a href='https://gist.github.com/834700'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="c">/* border radius */</span>
</div><div class='line'><span class="c">/* Firefox, Safari, Chrome, IE9 */</span>
</div><div class='line'><span class="nc">.box</span> <span class="p">{</span>
</div><div class='line'>  <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="k">border</span><span class="o">-</span><span class="n">radius</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="k">border</span><span class="o">-</span><span class="n">radius</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">border</span><span class="o">-</span><span class="n">radius</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="nb">red</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>Again, in all browsers (except IE 8 and below) the above CSS will add rounded corners to any <code>.box</code>. According to the <a href="https://developer.mozilla.org/en/css/-moz-border-radius">Mozilla <code>border-radius</code> documentation</a> the <code>-moz-</code> and <code>-webkit-</code> prefixes are for older versions of Firefox and Safari respectively. IE 9, Firefox 4, Safari 5 and Chrome 4+ all support the standard W3C <code>border-radius</code> property without the <a href="http://www.quirksmode.org/blog/archives/2010/03/css_vendor_pref_1.html">vendor prefix</a>.</p>
<h2 id="polyfills">Polyfills</h2>
<p>With the above goals in mind a straight-forward solution might be to force IE 8 and below into line using some creative JavaScript-based technique that won't require any images to be created.</p>
<h3 id="css3-pie">CSS3 PIE</h3>
<p><a href="http://css3pie.com/">CSS3 PIE</a> an extremely clever <a href="http://remysharp.com/2010/10/08/what-is-a-polyfill/">polyfill</a> technique that reads and processes the CSS file using a <a href="http://msdn.microsoft.com/en-us/library/ms531079(v=vs.85).aspx">DHTML behavior</a> in Internet Explorer to find the <code>border-radius</code>rules and then generates a <a href="http://msdn.microsoft.com/en-us/library/bb263898(v=vs.85).aspx">VML object</a>, placing it behind the target element. A tool like CSS3 PIE can be used to support rounded corners in IE 8 and below. The big drawback to CSS3 PIE is that it works best on static content and is slow to render. Because the VML object is placed behind the box, it must remove all of the visible styles from the box including border and background images. Those visible styles are then applied to the VML object.</p>
<figure>
	<iframe width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners/css3-pie-box.html"></iframe>
	<figcaption>CSS3 PIE (IE 8 and below)<br>(<a href="http://assets.heygrady.com/corners/css3-pie-box.html" target="_blank">view live example</a>)</figcaption>
</figure>
<p>View the page above in IE 8 or below and the corners should look correct. Refresh (hit F5) repeatedly and see that the corners do not appear instantly. <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=95e06cbe-4940-4218-b75d-b8856fced535">Inspect the HTML</a> in IE 8 or below (hit F12) and see the VML object. It's worth noting that CSS3 PIE isn't particularly slower than any other similar polyfill.</p>
<h4>Pros:</h4>
<ul>
	<li>Easy to implement</li>
	<li>Targets IE8 and below only</li>
	<li>Closely approximates native CSS3 rounded corners</li>
</ul>
<h4>Cons:</h4>
<ul>
	<li>Slow:
		<ul>
			<li>It's using JavaScript in Internet Explorer 8 and below and <a href="http://blogs.msdn.com/b/ie/archive/2010/11/17/html5-and-real-world-site-performance-seventh-ie9-platform-preview-available-for-developers.aspx">JavaScript is slow in those browsers</a>.</li>
			<li>Performance gets worse for each element where rounded corners are applied.</li>
		</ul>
	</li>
	<li>Fragile:
		<ul>
			<li>If the element visibility is toggled with JavaScript, CSS3 PIE will have issues.</li>
			<li>CSS3 PIE can cause other unexpected display issues, such as visual discrepancies when zooming in IE7.</li>
		</ul>
	</li>
</ul>
<h3 id="jquery-corner">jQuery Corner</h3>
<p>There are also tools like <a href="http://jquery.malsup.com/corner/">jQuery Corner</a> and <a href="http://www.curvycorners.net/">Curvy Corners</a> that will use native <code>border-radius</code> in supported browsers and use a series of 1px tall <code>div</code> elements to polyfill in other browsers. This is a popular solution to the problem that works by adding in extra <code>div</code> elements. Each <code>div</code> is given a right and left border the same color as the page behind the element and the border widths are altered to create appearance of a rounded corner.</p>
<h4>Pros:</h4>
<ul>
	<li>Easy to implement</li>
	<li>Falls back to native CSS3 for rounded corners in supported browsers</li>
</ul>
<h4>Cons:</h4>
<ul>
	<li>Support for borders doesn't work well in IE (oops!)</li>
	<li>The corners cover the content within the box (this could be fixed)</li>
	<li>No anti-aliasing in Internet Explorer. Each pixel of the rounding is a solid color due to the way the rounding effect is achieved</li>
	<li>Over a dozen other virtually useless corner templates included in the package</li>
</ul>
<h2 id="background-images">Background Images</h2>
<p>If native <code>border-radius</code>isn't an option (and polyfills aren't stable enough), then it will take several images to do the trick. In some cases a <a href="http://css-tricks.com/css-sprites/">sprite</a> can be used. For the examples below we'll try to create the same 1px red border with a 12px <code>border-radius</code>from above. Rounded corner images can easily be created at a number of on-line generators. My favorite is the <a href="http://www.generateit.net/rounded-corner/index.htm?r=12&amp;fg=ffffff&amp;bgt=1&amp;fgt=1&amp;f=png&amp;w=200&amp;bg=ffffff&amp;h=200&amp;bc=ff0000&amp;aa=1&amp;bw=1&amp;submit=Generate+It">Rounded Corner Image Generator</a>.</p>
<ul>
	<li><img src="http://assets.heygrady.com/corners/corner-tl.png" alt="" /> corner-tl.png &mdash; top left corner</li>
	<li><img src="http://assets.heygrady.com/corners/corner-t.png" alt="" /> corner-t.png &mdash; top border</li>
	<li><img src="http://assets.heygrady.com/corners/corner-tr.png" alt="" /> corner-tr.png &mdash; top right corner</li>
	<li><img src="http://assets.heygrady.com/corners/corner-r.png" alt="" /> corner-r.png &mdash; right border</li>
	<li><img src="http://assets.heygrady.com/corners/corner-br.png" alt="" /> corner-br.png &mdash; bottom right corner</li>
	<li><img src="http://assets.heygrady.com/corners/corner-b.png" alt="" /> corner-b.png &mdash; bottom border</li>
	<li><img src="http://assets.heygrady.com/corners/corner-bl.png" alt="" /> corner-bl.png &mdash; bottom left corner</li>
	<li><img src="http://assets.heygrady.com/corners/corner-l.png" alt="" /> corner-l.png &mdash; left border</li>
	<li><img src="http://assets.heygrady.com/corners/corners.png" alt="" /> corners.png  &mdash; a rounded corner sprite. All of the corners and borders are combined into one image.</li>
</ul>
<p>As is evident by the top, bottom, left and right images, when the border is a simple 1px solid color, those images may not be necessary and could be replaced by actual borders. For these examples images were used anyway because it's more common that the borders are complex and need to be images &mdash; particularly when shadows are involved.</p>
<h2 id="onion-skinning-and-sliding-doors">Onion Skinning And Sliding Doors</h2>
<p>Most rounded corner techniques are a variation on the classic <a href="http://www.alistapart.com/articles/onionskin/">Onion Skinned Drop Shadow</a> article or the <a href="http://www.alistapart.com/articles/slidingdoors/">Sliding Doors</a> article (<a href="http://www.alistapart.com/articles/slidingdoors2/">part 2</a>). For instance, <a href="http://www.schillmania.com/projects/dialog2/">one of the techniques</a> from the <a href="http://msdn.microsoft.com/en-us/library/bb250413(v=vs.85).aspx">MSDN article</a> uses a variant of the sliding doors technique. These techniques are effective but they're not particularly easy to implement. They're also limited because they try to accommodate IE6 which has a fair share of <a href="http://haslayout.net/css/">documented CSS issues</a>. There is no shortage of <a href="http://www.google.com/search?aq=f&amp;sourceid=chrome&amp;ie=UTF-8&amp;q=cross+browser+rounded+corner">cross browser rounded corner</a> articles. The majority mention either using a method similar to CSS3 PIE or jQuery Corner above or they recommend using an image + HTML + CSS solution like the ones below.</p>
<ul>
	<li>Typing out multiple nesting <code>div</code> tags can be tedious and difficult to replicate across many pages on a large site.</li>
	<li>The most bullet-proof solutions would require as many as 8 wrapping <code>div</code>s (top, bottom, left, right, top-left, top-right, bottom-right, bottom-top) to properly imitate the capabilities of <code>border-radius</code>.</li>
	<li>Specifying complicated HTML and CSS layouts limits the situations in which it can be used.</li>
</ul>
<h3 id="using-onion-skinning">Using Onion Skinning</h3>
<p>Onion skinning is the process of adding multiple wrapping <code>div</code> elements to a <code>.box</code> element and then applying a different background image to each of the layers. This technique was originally developed for creating drop shadows but can easily be adapted to creating rounded corners.</p>
<figure>
	<iframe width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners/onion-box.html"></iframe>
	<figcaption>Onion Skin<br>(<a href="http://assets.heygrady.com/corners/onion-box.html" target="_blank">view live example</a>)</figcaption>
</figure>
<h4>Pros:</h4>
<ul>
	<li>Very flexible and simple CSS</li>
	<li>Can easily be scaled back to not require the top, bottom, left and right <code>div</code> elements</li>
	<li>Easy to understand HTML</li>
	<li>Content is naturally on top of the background images, no need to use relative positioning to avoid content clipping</li>
	<li>Works in all browsers, including IE6</li>
</ul>
<h4>Cons:</h4>
<ul>
	<li>The <code>.content</code> needs to have a height set if it is applied to a fixed-height box</li>
	<li>The corner images cannot be transparent because they need to cover the edges of the box</li>
	<li>Very ugly markup</li>
	<li>Cannot use a CSS sprite for corners or sides because of how CSS backgrounds are specified</li>
</ul>
<figure class='code'><figcaption>onion-box.html<a href='https://gist.github.com/834700'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;box top&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;bottom&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;left&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>      <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;right&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;top-left&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>          <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;top-right&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;bottom-right&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>              <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;content bottom-left&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>                <span class="nt">&lt;h2&gt;</span>Some Headline<span class="nt">&lt;/h2&gt;</span>
</div><div class='line'>                <span class="nt">&lt;p&gt;</span>My content.<span class="nt">&lt;/p&gt;</span>
</div><div class='line'>              <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>            <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>          <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>        <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>      <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/div&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div></pre></td></tr></table></div></figure>
<p>The HTML markup above shows how onion skinning would work on the original simple box from the beginning of the article. Each layer of the onion contains the background image for one of the sides or corners. It's possible to re-use the <code>.box</code> and <code>.content</code> elements which results in only 7 extra wrapping <code>div</code> elements. The sides are wrapped first so that the corners can cover them up later.</p>
<figure class='code'><figcaption>onion-box.css<a href='https://gist.github.com/834700'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="c">/* Onion Skinned */</span>
</div><div class='line'><span class="c">/* All browsers */</span>
</div><div class='line'><span class="nc">.box</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">padding</span><span class="o">:</span> <span class="m">1px</span><span class="p">;</span> <span class="c">/* account for missing border */</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.bottom</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">-1px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.content</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">padding</span><span class="o">:</span> <span class="m">1px</span><span class="p">;</span> <span class="c">/* account for missing border, stretch to fit content */</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">-1px</span> <span class="m">-1px</span> <span class="m">-1px</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">200px</span><span class="p">;</span> <span class="c">/* duplicate box height */</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c">/* background images */</span>
</div><div class='line'><span class="nc">.box.top</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-t.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">repeat-x</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.bottom</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-b.png)</span> <span class="k">left</span> <span class="k">bottom</span> <span class="k">repeat-x</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-l.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">repeat-y</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-r.png)</span> <span class="k">right</span> <span class="k">top</span>  <span class="k">repeat-y</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top-left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner2-tl.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top-right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner2-tr.png)</span> <span class="k">right</span> <span class="k">top</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.bottom-right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner2-br.png)</span> <span class="k">right</span> <span class="k">bottom</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.bottom-left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner2-bl.png)</span> <span class="k">left</span> <span class="k">bottom</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>The accompanying onion skinned CSS is very straightforward. Each layer gets its own background image and it is positioned appropriately. The sides repeat and the corners do not.</p>
<ul>
	<li>For fixed-height boxes, the <code>.box</code> height (200px in this case) should be duplicated on the <code>.content</code></li>
	<li>To replicate the look of a box with a border, padding should be used to space content away from the edges (for a 4px border, user 4px padding, etc.)</li>
	<li>To account for how <a href="http://reference.sitepoint.com/css/collapsingmargins">collapsing margins</a> would interact with a real border, <code>padding-top</code> and <code>padding-bottom</code> need to be set on the <code>.content</code></li>
</ul>

<h3 id="using-sliding-doors">Using Sliding Doors</h3>
<p>The sliding doors technique uses a content area sandwiched between a top and a bottom element. The top and a bottom each contain elements for left and right corners. This technique allows for great flexibility with using image sprites and allows the corners to be fully alpha transparent if desired. The markup appears to be much more sensible but the CSS is much more complicated.</p>
<figure>
	<iframe width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners/sliding-door-box.html"></iframe>
	<figcaption>Sliding Door<br>(<a href="http://assets.heygrady.com/corners/sliding-door-box.html" target="_blank">view live example</a>)</figcaption>
</figure>
<figure>
	<iframe width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners/sliding-door-box-sprite.html"></iframe>
	<figcaption>Sliding Door using a Sprite<br>(<a href="http://assets.heygrady.com/corners/sliding-door-box-sprite.html" target="_blank">view live example</a>)</figcaption>
</figure>
<h4>Pros:</h4>
<ul>
	<li>Allows for image sprites and alpha transparent corners</li>
	<li>Sensible HTML markup</li>
	<li>Works in all browsers, including IE6</li>
</ul>
<h4>Cons:</h4>
<ul>
	<li>More complex CSS</li>
	<li>For fixed height boxes, extra calculations are required to account for padding on the top and bottom of the box</li>
</ul>
<figure class='code'><figcaption>sliding-door-box.html<a href='https://gist.github.com/834700'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;box&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;top&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;top-left&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>    <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;top-right&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;left&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;right&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>      <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;content&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;h2&gt;</span>Some Headline<span class="nt">&lt;/h2&gt;</span>
</div><div class='line'>        <span class="nt">&lt;p&gt;</span>My content.<span class="nt">&lt;/p&gt;</span>
</div><div class='line'>      <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;bottom&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;bottom-left&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>    <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;bottom-right&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/div&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div></pre></td></tr></table></div></figure>
<p>In the sliding doors example, a few extra <code>div</code> elements are added to the top and bottom of the box and the content is wrapped in some left and right <code>div</code> elements. This allows the left and right backgrounds to grow with the height of the content. In a case where the left and right border is a simple solid color these wrappers may be eliminated and the border applied directly to the <code>.content</code>.</p>
<figure class='code'><figcaption>sliding-door-box.css<a href='https://gist.github.com/834700'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div><div data-line='56' class='line-number'></div><div data-line='57' class='line-number'></div><div data-line='58' class='line-number'></div><div data-line='59' class='line-number'></div><div data-line='60' class='line-number'></div><div data-line='61' class='line-number'></div><div data-line='62' class='line-number'></div><div data-line='63' class='line-number'></div><div data-line='64' class='line-number'></div><div data-line='65' class='line-number'></div><div data-line='66' class='line-number'></div><div data-line='67' class='line-number'></div><div data-line='68' class='line-number'></div><div data-line='69' class='line-number'></div><div data-line='70' class='line-number'></div><div data-line='71' class='line-number'></div><div data-line='72' class='line-number'></div><div data-line='73' class='line-number'></div><div data-line='74' class='line-number'></div><div data-line='75' class='line-number'></div><div data-line='76' class='line-number'></div><div data-line='77' class='line-number'></div><div data-line='78' class='line-number'></div><div data-line='79' class='line-number'></div><div data-line='80' class='line-number'></div><div data-line='81' class='line-number'></div><div data-line='82' class='line-number'></div><div data-line='83' class='line-number'></div><div data-line='84' class='line-number'></div><div data-line='85' class='line-number'></div><div data-line='86' class='line-number'></div><div data-line='87' class='line-number'></div><div data-line='88' class='line-number'></div><div data-line='89' class='line-number'></div><div data-line='90' class='line-number'></div><div data-line='91' class='line-number'></div><div data-line='92' class='line-number'></div><div data-line='93' class='line-number'></div><div data-line='94' class='line-number'></div><div data-line='95' class='line-number'></div><div data-line='96' class='line-number'></div><div data-line='97' class='line-number'></div><div data-line='98' class='line-number'></div><div data-line='99' class='line-number'></div><div data-line='100' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="c">/* Sliding Door */</span>
</div><div class='line'><span class="c">/* All browsers */</span>
</div><div class='line'><span class="nc">.box</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span>
</div><div class='line'>  <span class="k">padding</span><span class="o">:</span> <span class="m">13px</span> <span class="m">1px</span><span class="p">;</span> <span class="c">/* account for missing border, doctor 100% height */</span>
</div><div class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">178px</span><span class="p">;</span> <span class="c">/* 202 - 24, account for excess padding */</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ie6</span> <span class="nc">.box</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">178px</span> <span class="cp">!important</span><span class="p">;</span> <span class="c">/* 202 - 24, account for excess padding */</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.content</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span>
</div><div class='line'>  <span class="k">z-index</span><span class="o">:</span> <span class="m">2</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">-12px</span> <span class="m">0</span><span class="p">;</span> <span class="c">/* pull up content */</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.bottom</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span>
</div><div class='line'>  <span class="k">z-index</span><span class="o">:</span> <span class="m">1</span><span class="p">;</span>
</div><div class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">11px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">font-size</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">line-height</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">margin-top</span><span class="o">:</span> <span class="m">-13px</span><span class="p">;</span> <span class="c">/* Pull up top */</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.bottom</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">margin-bottom</span><span class="o">:</span> <span class="m">-15px</span><span class="p">;</span> <span class="c">/* Pull down bottom */</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top-left</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.top-right</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.bottom-left</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.bottom-right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">position</span><span class="o">:</span> <span class="k">absolute</span><span class="p">;</span>
</div><div class='line'>  <span class="k">z-index</span><span class="o">:</span> <span class="m">1</span><span class="p">;</span>
</div><div class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">font-size</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">line-height</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.left</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">padding</span><span class="o">:</span> <span class="m">1px</span> <span class="m">0</span><span class="p">;</span> <span class="c">/* stretches margins */</span>
</div><div class='line'>  <span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="n">box</span><span class="o">-</span><span class="n">sizing</span><span class="o">:</span> <span class="k">border</span><span class="o">-</span><span class="n">box</span><span class="p">;</span>
</div><div class='line'>  <span class="k">padding-right</span><span class="o">:</span> <span class="m">1px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin-right</span><span class="o">:</span> <span class="m">-1px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">padding-left</span><span class="o">:</span> <span class="m">1px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin-left</span><span class="o">:</span> <span class="m">-1px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ie6</span> <span class="nc">.box</span> <span class="nc">.left</span><span class="o">,</span> <span class="nc">.ie7</span> <span class="nc">.box</span> <span class="nc">.left</span><span class="o">,</span> <span class="nc">.ie6</span> <span class="nc">.box</span> <span class="nc">.right</span><span class="o">,</span> <span class="nc">.ie7</span> <span class="nc">.box</span> <span class="nc">.right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span>
</div><div class='line'>  <span class="k">z-index</span><span class="o">:</span> <span class="m">2</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ie6</span> <span class="nc">.box</span> <span class="nc">.right</span><span class="o">,</span> <span class="nc">.ie7</span> <span class="nc">.box</span> <span class="nc">.right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">padding</span><span class="o">:</span> <span class="m">0</span> <span class="m">1px</span> <span class="m">0</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">100</span><span class="o">%</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin-left</span><span class="o">:</span> <span class="m">-1px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">right</span><span class="o">:</span> <span class="m">-2px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ie6</span> <span class="nc">.box</span> <span class="nc">.left</span><span class="o">,</span> <span class="nc">.ie7</span> <span class="nc">.box</span> <span class="nc">.left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">padding</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">margin</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">left</span><span class="o">:</span> <span class="m">-1px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top-left</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.bottom-left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">left</span><span class="o">:</span> <span class="m">-12px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top-right</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.bottom-right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">right</span><span class="o">:</span> <span class="m">-12px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c">/* background images */</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-t.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">repeat-x</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top-left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-tl.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top-right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-tr.png)</span> <span class="k">right</span> <span class="k">top</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.bottom</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-b.png)</span> <span class="k">left</span> <span class="k">bottom</span> <span class="k">repeat-x</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.bottom-left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-bl.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.bottom-right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-br.png)</span> <span class="k">right</span> <span class="k">bottom</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-l.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">repeat-y</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-r.png)</span> <span class="k">right</span> <span class="k">top</span>  <span class="k">repeat-y</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<p>To correctly position all of the pieces, the box is given a top and bottom padding the same height as the corner (12px in this case). For a fixed height box this padding should be subtracted from the original box height. Then the <code>.top</code> and <code>.bottom</code> containers are given a top and bottom margin of -12px respectively (the same as the top and bottom padding on the box). The <code>.top</code> and <code>.bottom</code> containers are also given left and right margins the same as the width of the corners (again, 12px in this case). The corners are then absolutely positioned into the empty space created by giving them a -12px left and right position respectively.</p>
<p>The <code>.left</code> and <code>.right</code> wrappers wrap the <code>.content</code> and operate more like the onion skinning techniques. The right <code>div</code> is given a 1px top and bottom padding to account for <a href="http://reference.sitepoint.com/css/collapsingmargins">collapsing margins</a> and the <code>.content</code> is given a negative margin to pull its edges to the edge of the box. Adding position relative and a z-index ensures that the <code>.content</code> is above the top and bottom <code>div</code> containers to avoid content clipping.</p>
<p>The left and right wrappers are particularly challenging because of the need to apply a 100% height to ensure they are the correct height in conjunction with the 1px top and bottom border applied to prevent collapsing margins from affecting the layout. This isn't an issue in IE 6 and 7 because they collapse the top margin even when there's a border. But for the other browsers the 1px border combined with a 100% height on the <code>.right</code> wrapper makes it 2px too tall. By using an alternate method for spacing in IE 6 and IE 7, the padding can be negated by adjusting the <a href="https://developer.mozilla.org/en/CSS/box-sizing"><code>box-sizing</code></a>.</p>

<h2 id="using-absolute-positioning">Using Absolute Positioning</h2>
<p>A solution that is not often posited is using absolute positioning to place all of the corners and sides on the box. This solution takes advantage of how most browsers (except IE 6) handle conflicting <code>right</code> and <code>left</code> properties on an element. For instance, a rule like <code>.top {position: absolute; left: 12px; right: 12px;}</code> effectively stretches <code>.top</code> across the full width of its nearest positioned parent. IE 6 ignores the conflicting rules which makes it more difficult to support that browser with this technique.</p>
<h4>Pros:</h4>
<ul>
	<li>Very simple CSS</li>
	<li>Very simple HTML</li>
	<li>Supports fluid and fixed height/width boxes automatically</li>
	<li>Supports dynamic content</li>
</ul>
<h4>Cons:</h4>
<ul>
	<li>Doesn't work in IE 6</li>
</ul>
<figure>
	<iframe width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners/position-box.html"></iframe>
	<figcaption>Absolute Position<br>(<a href="http://assets.heygrady.com/corners/position-box.html" target="_blank">view live example</a>)</figcaption>
</figure>
<figure>
	<iframe width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners/position-box-sprite.html"></iframe>
	<figcaption>Absolute Position using a Sprite<br>(<a href="http://assets.heygrady.com/corners/position-box-sprite.html" target="_blank">view live example</a>)</figcaption>
</figure>
<figure class='code'><figcaption>position-box.html<a href='https://gist.github.com/834700'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;box&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;top&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;bottom&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;left&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;right&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;top-left&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;top-right&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;bottom-right&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;bottom-left&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</div><div class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;content&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;h2&gt;</span>Some Headline<span class="nt">&lt;/h2&gt;</span>
</div><div class='line'>    <span class="nt">&lt;p&gt;</span>My content.<span class="nt">&lt;/p&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/div&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div></pre></td></tr></table></div></figure>
<p>In the example above, the 8 corner and side spans are added to the top of the <code>.box</code> and the content of the box is wrapped in a <code>.content</code> <code>div</code>. The <code>.content</code> is to allow for proper layering so that the corners are below the content.</p>
<figure class='code'><figcaption>position-box.css<a href='https://gist.github.com/834700'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div><div data-line='56' class='line-number'></div><div data-line='57' class='line-number'></div><div data-line='58' class='line-number'></div><div data-line='59' class='line-number'></div><div data-line='60' class='line-number'></div><div data-line='61' class='line-number'></div><div data-line='62' class='line-number'></div><div data-line='63' class='line-number'></div><div data-line='64' class='line-number'></div><div data-line='65' class='line-number'></div><div data-line='66' class='line-number'></div><div data-line='67' class='line-number'></div><div data-line='68' class='line-number'></div><div data-line='69' class='line-number'></div><div data-line='70' class='line-number'></div><div data-line='71' class='line-number'></div><div data-line='72' class='line-number'></div><div data-line='73' class='line-number'></div><div data-line='74' class='line-number'></div><div data-line='75' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="c">/* Position */</span>
</div><div class='line'><span class="c">/* Firefox, Safari, Chrome, IE7+ */</span>
</div><div class='line'><span class="nc">.box</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span>
</div><div class='line'>  <span class="k">padding</span><span class="o">:</span> <span class="m">1px</span><span class="p">;</span> <span class="c">/* account for missing border */</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.box</span> <span class="nc">.content</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span>
</div><div class='line'>  <span class="k">z-index</span><span class="o">:</span> <span class="m">2</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="c">/* Corners and Sides */</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top-left</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.top-right</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.bottom-right</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.bottom-left</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.top</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.bottom</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.left</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">position</span><span class="o">:</span> <span class="k">absolute</span><span class="p">;</span>
</div><div class='line'>  <span class="k">z-index</span><span class="o">:</span> <span class="m">1</span><span class="p">;</span>
</div><div class='line'>  <span class="k">font-size</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">line-height</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c">/* Sides */</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.bottom</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">left</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">right</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.left</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">top</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">bottom</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.ie7</span> <span class="nc">.box</span> <span class="nc">.left</span><span class="o">,</span> <span class="nc">.ie7</span> <span class="nc">.box</span> <span class="nc">.right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">bottom</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span> <span class="c">/* Accounts for padding issue in IE 7 */</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">top</span><span class="o">:</span>  <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-t.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">repeat-x</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.bottom</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">bottom</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-b.png)</span> <span class="k">left</span> <span class="k">bottom</span> <span class="k">repeat-x</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">left</span><span class="o">:</span>  <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-l.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">repeat-y</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">right</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-r.png)</span> <span class="k">right</span> <span class="k">top</span>  <span class="k">repeat-y</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c">/* Corners */</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top-left</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.top-right</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.bottom-right</span><span class="o">,</span> <span class="nc">.box</span> <span class="nc">.bottom-left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">height</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'>  <span class="k">width</span><span class="o">:</span> <span class="m">12px</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top-left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">top</span><span class="o">:</span>  <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">left</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-tl.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.top-right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">top</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">right</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-tr.png)</span> <span class="k">right</span> <span class="k">top</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.bottom-right</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">bottom</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">right</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-br.png)</span> <span class="k">right</span> <span class="k">bottom</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="nc">.bottom-left</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">bottom</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">left</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span> <span class="sx">url(corner-bl.png)</span> <span class="k">left</span> <span class="k">bottom</span> <span class="k">no-repeat</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>The CSS for absolute positioning is really straight-forward. The sides and corners are all set to be <code>position: absolute</code> and given <code>z-index: 1</code> while the <code>.box</code> and <code>.content</code> are set to <code>position: relative</code> and the <code>.content</code> is given <code>z-index: 2</code>. The corner <code>span</code>s are positioned in the appropriate corner and the sides are positioned on the appropriate side. The key trick is giving, for instance, the <code>.top</code> a <code>left: 12px</code> and a <code>right: 12px</code>. The apparently conflicting riles actually stretch the <code>span</code> the full width of the <code>.box</code>. The same is done with the <code>.left</code> and <code>.right</code>sides, giving them both <code>top</code> and <code>bottom</code> properties to stretch them the full height of the <code>.box</code>. The 12px is to allow space for the corners to avoid overlap.</p>

<h2 id="ignoring-legacy-browsers">Ignoring Legacy Browsers</h2>
<h3 id="using-border-radius">Using Border Radius</h3>
<p>As mentioned at the start of this article, <code>border-radius</code> can be used to add rounded corners to a <code>.box</code>.</p>

<h3 id="using-multiple-backgrounds">Using Multiple Backgrounds</h3>
<p>It's now possible to use multiple backgrounds in newer browsers including Firefox 3.6+, IE 9, Safari and Chrome. Multiple backgrounds are layered in in the order they are added in the CSS with the first image being the top-most layer. Using this technique for corners might seem slightly silly given the existence of <code>border-radius</code> in every browser that supports multiple backgrounds, however there are times when the native <code>border-radius</code> cannot accomplish the same thing as images.</p>
<figure>
	<iframe width="202" height="202" scrolling="no" frameborder="0" src="http://assets.heygrady.com/corners/background-box.html"></iframe>
	<figcaption>Multiple Backgrounds<br>(<a href="http://assets.heygrady.com/corners/background-box.html" target="_blank">view live example</a>)</figcaption>
</figure>
<h4>Pros:</h4>
<ul>
	<li>No extra markup required</li>
	<li>Easy to understand CSS</li>
	<li>Can be used to create custom graphic borders that <code>border-radius</code> cannot support</li>
	<li>Can be combined with mark-up based solutions and <a href="http://docs.jquery.com/Tutorials:Rounded_Corners">simple JavaScript to support legacy browsers</a></li>
</ul>
<h4>Cons:</h4>
<ul>
	<li>Won't work in IE 8 or below</li>
	<li>Won't work in Firefox 3.5 or below</li>
	<li>Cannot be used with sprites (but <a href="http://css-tricks.com/data-uris/">inline images</a> would work)</li>
</ul>
<figure class='code'><figcaption>background-box.css<a href='https://gist.github.com/834700'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="c">/* multiple backgrounds */</span>
</div><div class='line'><span class="c">/* Firefox 3.6+, Safari, Chrome, IE 9 */</span>
</div><div class='line'><span class="nc">.box</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">background</span><span class="o">:</span>
</div><div class='line'>      <span class="sx">url(corner2-tl.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">no-repeat</span><span class="o">,</span>
</div><div class='line'>      <span class="sx">url(corner2-tr.png)</span> <span class="k">right</span> <span class="k">top</span> <span class="k">no-repeat</span><span class="o">,</span>
</div><div class='line'>      <span class="sx">url(corner2-br.png)</span> <span class="k">right</span> <span class="k">bottom</span> <span class="k">no-repeat</span><span class="o">,</span>
</div><div class='line'>      <span class="sx">url(corner2-bl.png)</span> <span class="k">left</span> <span class="k">bottom</span> <span class="k">no-repeat</span><span class="o">,</span>
</div><div class='line'>      <span class="sx">url(corner-t.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">repeat-x</span><span class="o">,</span>
</div><div class='line'>      <span class="sx">url(corner-b.png)</span> <span class="k">left</span> <span class="k">bottom</span> <span class="k">repeat-x</span><span class="o">,</span>
</div><div class='line'>      <span class="sx">url(corner-l.png)</span> <span class="k">left</span> <span class="k">top</span> <span class="k">repeat-y</span><span class="o">,</span>
</div><div class='line'>      <span class="sx">url(corner-r.png)</span> <span class="k">right</span> <span class="k">top</span>  <span class="k">repeat-y</span><span class="p">;</span>
</div><div class='line'>  <span class="k">padding</span><span class="o">:</span> <span class="m">1px</span><span class="p">;</span> <span class="c">/* account for missing border */</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<h2 id="conclusion">Conclusion</h2>
<p>While CSS3 PIE is promising, it is still difficult to use on large scale sites. The JavaScript-based polyfill techniques don't seem to work very well in IE 8 and below at the moment (this is extremely unfortunate). Most of the techniques for applying backgrounds require ugly markup or intensely difficult CSS to accomplish. I personally prefer the Absolute Positioning technique as it is the easiest to implement and offers some support of Legacy browsers. The fact that IE 6 is not supported is not a huge issue given that IE 6 is no longer necessary to support for most projects (4.6% globally, 2% in the US and Europe as of February 2011).</p>
<p>In the future I intend to create a simple jQuery plug-in that will apply the absolute positioning technique to a <code>.box</code>.</p>
<ul>
	<li><code>border-radius</code> &mdash; <a href="http://caniuse.com/border-radius">Supported in only 50%</a> of browsers as of February 2011</li>
	<li>Multiple Backgrounds &mdash; <a href="http://caniuse.com/multibackgrounds">Supported in only 46% </a>of browsers as of February 2011</li>
	<li>CSS3 PIE - Interesting technique with limitations on large scale sites.</li>
	<li>jQuery Corners - Doesn't work as intended. Could probably be fixed but no one has.</li>
	<li>Onion Skinning - Ugly HTML, easy CSS, works in 100% of browsers</li>
	<li>Sliding Doors - Cleaner HTML, uglier CSS, works in 100% of browsers</li>
	<li>Absolute Positioning - Clean HTML, easy CSS, doesn't work in IE6</li>
</ul>]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Using SASS With the 1KB Grid System]]></title>
<link href="http://heygrady.com/blog/2011/02/17/using-sass-with-the-1kb-grid-system/"/>
<updated>2011-02-17T11:52:00-08:00</updated>
<id>http://heygrady.com/blog/2011/02/17/using-sass-with-the-1kb-grid-system</id>
<category term="compass" /><category term="css" /><category term="grid" /><category term="sass" />

      <content type="html"><![CDATA[<p>The <a href="http://www.1kbgrid.com/">1KB CSS Grid</a> is a simplified grid system and is one of many dozens of different grids available. I started using a personal variant of this grid system recently because it seemed like a very simple code-base to understand. A common complaint about CSS grids is that they require classes in the markup that aren't much different that simply hard-coding widths in a style attribute. Of course SASS can help remove that complaint and makes grids even more flexible. Here's a tour of the 1KB CSS Grid, modified to suit my tastes and rewritten in <a href="http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html">SASS</a>.</p>
<!--more-->
<p><strong>UPDATE:</strong> a Github repo has been created for <a href="https://github.com/heygrady/1KB-SCSS-Grid">the 1KB-SCSS-Grid</a>.</p>
<p><strong>UPDATE:</strong> a follow up article, <a href="http://heygrady.com/blog/2012/04/20/compass-grid-gem-and-new-fluid-grid/">Compass Grid Plugin and A New Fluid Grid Option</a>, has been posted.</p>
<p><strong>UPDATE:</strong> the Github repo has been renamed to <a href="https://github.com/heygrady/compass-grid-plugin">compass-grid-plugin</a> and a <a href="http://rubygems.org/gems/compass-grid-plugin">Ruby Gem</a> has been created.</p>

<h4 id="for-the-uninitiated">For the uninitiated</h4>
<ul>
	<li><a href="http://spyrestudios.com/css-grid-systems/">CSS Grids</a></li>
	<li><a href="http://www.usabilitypost.com/2009/05/29/the-1kb-css-grid-part-1/">1KB CSS Grid</a> (part <a href="http://www.usabilitypost.com/2009/06/06/the-1kb-css-grid-part-2/">2</a> and <a href="http://www.usabilitypost.com/2009/06/19/the-1kb-css-grid-part-3/">3</a>)</li>
	<li><a href="http://sass-lang.com/tutorial.html">SASS</a> and <a href="http://compass-style.org/docs/">Compass</a>.</li>
</ul>
<h2 id="basic-css">Basic CSS</h2>
<figure class='code'><figcaption>grid.css<a href='https://gist.github.com/702760'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nc">.grid-1</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">60px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.grid-2</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">140px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.grid-3</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">220px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.grid-4</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">300px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.grid-5</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">380px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.grid-6</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">460px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.grid-7</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">540px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.grid-8</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">620px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.grid-9</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">700px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.grid-10</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">780px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.grid-11</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">860px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.grid-12</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">940px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.page</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">960px</span><span class="p">;</span> <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="k">auto</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.row</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span> <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">-10px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.page</span> <span class="o">&gt;</span> <span class="nc">.row</span> <span class="p">{</span> <span class="k">margin</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.column</span> <span class="p">{</span> <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">10px</span><span class="p">;</span> <span class="k">float</span><span class="o">:</span> <span class="k">left</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.ie6</span> <span class="nc">.column</span> <span class="p">{</span> <span class="k">display</span><span class="o">:</span> <span class="k">inline</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.box</span> <span class="p">{</span> <span class="k">margin-bottom</span><span class="o">:</span> <span class="m">20px</span><span class="p">;</span> <span class="p">}</span>
</div></pre></td></tr></table></div></figure>
<p>
	The above CSS is very similar to the <a href="http://www.usabilitypost.com/2009/05/29/the-1kb-css-grid-part-1/">original source</a> with a few stylistic differences (dashes instead of underscores) and the removal of the <code>overflow: hidden</code>
	clearfix hack and <a href="http://haslayout.net/css/Double-Margin-Bug">IE6 hacks</a>. My intention is to use the grid with <a href="http://html5boilerplate.com/">HTML5 Boilerplate</a> which has a better clearfix built-in (<a href="http://www.yuiblog.com/blog/2010/09/27/clearfix-reloaded-overflowhidden-demystified/"><code>overflow: hidden</code> isn't appealing</a> as a clearfix hack). I've also chosen to <a href="http://windowsteamblog.com/ie/b/ie/archive/2010/09/01/internet-explorer-usage-share-in-august.aspx">remove IE6</a> from my list of supported browsers for any project that doesn't require it.
</p>
<h4>Differences</h4>
<ul>
	<li>
		Remove IE6 specific hacks
	</li>
	<li>
		Remove <code>overflow: hidden</code>
		clearfix hacks
	</li>
	<li>
		Change <code>.row</code>
		to <code>.page</code>
	</li>
	<li>
		Change <code>.row .row</code>
		to <code>.row</code>
	</li>
	<li>
		Add in a <code>.box</code>
		for containers within columns
	</li>
	<li>
		Rely on <a href="http://paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/">HTML5 Boilerplate</a> and <a href="http://www.modernizr.com/docs/">Modernizr</a> for clearfix and browser targeting
	</li>
</ul>
<h2 id="basic-example-using-only-css">Basic Example Using Only CSS</h2>
<p>
	It's not immediately obvious how to piece this all together but the concepts are pretty simple.
</p>
<ul>
	<li>
		<code>.grid-#</code>
		is for column widths
	</li>
	<li>
		<code>.column</code>
		is for floating columns
	</li>
	<li>
		<code>.row</code>
		is a column container (columns are always nested in a row)
	</li>
	<li>
		<code>.page</code>
		is the main page wrapper with a full width and is horizontally centered.
	</li>
</ul>

<figure class='code'><figcaption>grid.html<a href='https://gist.github.com/702760'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'>  ...
</div><div class='line'>  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;container&quot;</span> <span class="na">class=</span><span class="s">&quot;page&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;header</span> <span class="na">class=</span><span class="s">&quot;row&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>      <span class="nt">&lt;h1&gt;</span>Header<span class="nt">&lt;/h1&gt;</span>
</div><div class='line'>      <span class="nt">&lt;nav&gt;&lt;/nav&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/header&gt;</span>
</div><div class='line'> </div><div class='line'>    <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;main&quot;</span> <span class="na">class=</span><span class="s">&quot;row&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>      <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;left-column&quot;</span> <span class="na">class=</span><span class="s">&quot;column grid-3&quot;</span><span class="nt">&gt;</span>Left Column<span class="nt">&lt;/div&gt;</span>
</div><div class='line'>      <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;main-column&quot;</span> <span class="na">class=</span><span class="s">&quot;column grid-9&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;section</span> <span class="na">class=</span><span class="s">&quot;hero row&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>          Hero Space
</div><div class='line'>        <span class="nt">&lt;/section&gt;</span>
</div><div class='line'>        <span class="nt">&lt;section</span> <span class="na">class=</span><span class="s">&quot;row&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>          <span class="nt">&lt;article</span> <span class="na">id=</span><span class="s">&quot;content&quot;</span> <span class="na">class=</span><span class="s">&quot;column grid-6&quot;</span><span class="nt">&gt;</span>Actual Content<span class="nt">&lt;/article&gt;</span>
</div><div class='line'>          <span class="nt">&lt;aside</span> <span class="na">id=</span><span class="s">&quot;right-column&quot;</span> <span class="na">class=</span><span class="s">&quot;column grid-3&quot;</span><span class="nt">&gt;</span>Right Column<span class="nt">&lt;/aside&gt;</span>
</div><div class='line'>        <span class="nt">&lt;/section&gt;</span>
</div><div class='line'>      <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/div&gt;</span>
</div><div class='line'> </div><div class='line'>    <span class="nt">&lt;footer</span> <span class="na">class=</span><span class="s">&quot;row&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>      <span class="nt">&lt;p&gt;</span><span class="ni">&amp;copy;</span> Copyright 2010<span class="nt">&lt;/p&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/footer&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>  ...
</div></pre></td></tr></table></div></figure>
<p>
	Above is a typical page using the new HTML5 container tags and based on the <a href="https://github.com/paulirish/html5-boilerplate/blob/master/index.html">example HTML5 Boilerplate markup</a>. This example is shown with hard-coded class names in the HTML. As expected, there's a page wrapper (<code>#container</code>
	), <code>header</code>
	, <code>#main</code>
	and <code>footer</code>
	containers, and some columns in the main area. This page would create a typical 2 column layout (<code>#left-column</code>
	and <code>#main-column</code>
	). The <code>#main-column</code>
	, as shown, has a <code>.hero</code>
	area that spans the full width and a content area is further sub-divided into 2 columns (<code>#content</code>
	and <code>#right-column</code>
	).
</p>
<p>
	On a typical site, the <code>header</code>
	and <code>footer</code>
	would probably contain their own columns and rows. The <code>.hero</code>
	is used for promotional space at the top of content. This is a typical design choice and might contain a banner or a slideshow or some introductory copy.
</p>
<p>
	Personally I find the inclusion of the class names in the markup to be a little ugly. The most offensive part is the <code>grid-3</code>
	and <code>grid-6</code>
	, etc. This is barely different than hard-coding the width with an inline style. I prefer to use SASS mixins to remove those class names from the markup altogether and control it directly from the CSS.
</p>
<h2 id="rewritten-in-sass">Rewritten in SASS</h2>
<figure class='code'><figcaption>grid.scss<a href='https://gist.github.com/702760'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div><div data-line='49' class='line-number'></div><div data-line='50' class='line-number'></div><div data-line='51' class='line-number'></div><div data-line='52' class='line-number'></div><div data-line='53' class='line-number'></div><div data-line='54' class='line-number'></div><div data-line='55' class='line-number'></div><div data-line='56' class='line-number'></div><div data-line='57' class='line-number'></div><div data-line='58' class='line-number'></div><div data-line='59' class='line-number'></div><div data-line='60' class='line-number'></div><div data-line='61' class='line-number'></div><div data-line='62' class='line-number'></div><div data-line='63' class='line-number'></div><div data-line='64' class='line-number'></div><div data-line='65' class='line-number'></div><div data-line='66' class='line-number'></div><div data-line='67' class='line-number'></div><div data-line='68' class='line-number'></div><div data-line='69' class='line-number'></div></pre></td><td class='main  scss'><pre><div class='line'><span class="c1">// Configuration</span>
</div><div class='line'><span class="nv">$column-width</span><span class="o">:</span> <span class="mi">60</span><span class="kt">px</span><span class="p">;</span>
</div><div class='line'><span class="nv">$gutter-width</span><span class="o">:</span> <span class="mi">20</span><span class="kt">px</span><span class="p">;</span>
</div><div class='line'><span class="nv">$columns</span><span class="o">:</span> <span class="mi">12</span><span class="p">;</span>
</div><div class='line'> </div><div class='line'><span class="c1">// Column Widths</span>
</div><div class='line'><span class="k">@mixin</span><span class="nf"> grid</span><span class="p">(</span><span class="nv">$i</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>   <span class="na">width</span><span class="o">:</span> <span class="nv">$column-width</span> <span class="o">*</span> <span class="nv">$i</span> <span class="o">+</span> <span class="nv">$gutter-width</span> <span class="o">*</span> <span class="p">(</span><span class="nv">$i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="k">@mixin</span><span class="nf"> grid-plus</span><span class="p">(</span><span class="nv">$i</span><span class="o">,</span> <span class="nv">$plus</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>   <span class="na">width</span><span class="o">:</span> <span class="nv">$column-width</span> <span class="o">*</span> <span class="nv">$i</span> <span class="o">+</span> <span class="nv">$gutter-width</span> <span class="o">*</span> <span class="p">(</span><span class="nv">$i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nv">$plus</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="k">@for</span> <span class="nv">$i</span> <span class="ow">from</span> <span class="mi">1</span> <span class="ow">through</span> <span class="nv">$columns</span> <span class="p">{</span>
</div><div class='line'>  <span class="nc">.grid-</span><span class="si">#{</span><span class="nv">$i</span><span class="si">}</span> <span class="p">{</span> <span class="k">@include</span><span class="nd"> grid</span><span class="p">(</span><span class="nv">$i</span><span class="p">);</span> <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// Page, Row, Column</span>
</div><div class='line'><span class="k">@mixin</span><span class="nf"> grid-page</span><span class="p">(</span><span class="nv">$i</span><span class="o">:</span> <span class="nv">$columns</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@extend</span> <span class="nc">.clearfix</span><span class="o">;</span>
</div><div class='line'>   <span class="nt">width</span><span class="nd">:</span> <span class="err">$</span><span class="nt">column-width</span> <span class="o">*</span> <span class="err">$</span><span class="nt">i</span> <span class="o">+</span> <span class="err">$</span><span class="nt">gutter-width</span> <span class="o">*</span> <span class="err">$</span><span class="nt">i</span><span class="o">;</span>
</div><div class='line'>  <span class="nt">margin</span><span class="nd">:</span> <span class="nt">0</span> <span class="nt">auto</span><span class="o">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="k">@mixin</span><span class="nf"> grid-row</span><span class="p">(</span><span class="nv">$page</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@extend</span> <span class="nc">.clearfix</span><span class="o">;</span>
</div><div class='line'>  <span class="nt">width</span><span class="nd">:</span> <span class="nt">auto</span><span class="o">;</span>
</div><div class='line'> </div><div class='line'>  <span class="o">//</span> <span class="nt">rows</span> <span class="nt">directly</span> <span class="nt">inside</span> <span class="nt">a</span> <span class="nt">page</span> <span class="nt">don</span><span class="s1">&#39;</span><span class="s2">t need the negative margin</span>
</div><div class='line'>  <span class="k">@if</span> <span class="nv">$page</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">margin</span><span class="o">:</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'>  <span class="p">}</span> <span class="k">@else</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">margin</span><span class="o">:</span> <span class="mi">0</span> <span class="p">(</span><span class="o">-</span><span class="nv">$gutter-width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="k">@mixin</span><span class="nf"> grid-column</span><span class="p">(</span><span class="nv">$i</span><span class="o">:</span> <span class="n-Pseudo">false</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="na">margin</span><span class="o">:</span> <span class="mi">0</span> <span class="p">(</span><span class="nv">$gutter-width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
</div><div class='line'>  <span class="na">float</span><span class="o">:</span> <span class="no">left</span><span class="p">;</span>
</div><div class='line'>  <span class="nc">.ie6</span> <span class="k">&amp;</span> <span class="p">{</span> <span class="na">display</span><span class="o">:</span> <span class="no">inline</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'>  <span class="k">@if</span> <span class="nv">$i</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">@include</span><span class="nd"> grid</span><span class="p">(</span><span class="nv">$i</span><span class="p">);</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="k">@mixin</span><span class="nf"> grid-column-empty</span><span class="p">(</span><span class="nv">$i</span><span class="o">:</span> <span class="mi">1</span><span class="o">,</span> <span class="nv">$position</span><span class="o">:</span> <span class="n">after</span><span class="p">)</span> <span class="p">{</span>
</div><div class='line'>  <span class="nv">$margin</span><span class="o">:</span> <span class="nv">$column-width</span> <span class="o">*</span> <span class="nv">$i</span> <span class="o">+</span> <span class="nv">$gutter-width</span> <span class="o">*</span> <span class="nv">$i</span> <span class="o">+</span> <span class="p">(</span><span class="nv">$gutter-width</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
</div><div class='line'> </div><div class='line'>  <span class="k">@if</span> <span class="nv">$position</span> <span class="o">==</span> <span class="n">after</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">margin-right</span><span class="o">:</span> <span class="nv">$margin</span><span class="p">;</span>
</div><div class='line'>  <span class="p">}</span> <span class="k">@else</span> <span class="p">{</span>
</div><div class='line'>    <span class="na">margin-left</span><span class="o">:</span> <span class="nv">$margin</span><span class="p">;</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.page</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-page</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.row</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-row</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.page</span> <span class="o">&gt;</span> <span class="nc">.row</span> <span class="p">{</span>
</div><div class='line'>  <span class="na">margin</span><span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nc">.column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-column</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// Box</span>
</div><div class='line'><span class="nc">.box</span> <span class="p">{</span>
</div><div class='line'>  <span class="na">margin-bottom</span><span class="o">:</span> <span class="nv">$gutter-width</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<p>
	Writing the same thing in SASS opens up a world of possibilities. Using <a href="http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#defining_a_mixin">mixins</a> allows the column measurements to be easily changed and opens up the possibility of removing the extra class names from the markup. This SASS file was used to generate the CSS at the top of the article.
</p>
<h3 id="default-variables">Default Variables</h3>
<ul>
	<li>
		<code>$column-width: 60px;</code>
		is the width of a sinlge column
	</li>
	<li>
		<code>$gutter-width: 20px;</code>
		is the space between two columns
	</li>
	<li>
		<code>$columns: 12;</code>
		is the total number of columns
	</li>
	<li>
		(60px + 20px) * 12 = 960px
	</li>
</ul>
<h3 id="grid-mixins">Grid Mixins</h3>
<p>
	<code>grid</code>
	and <code>grid-plus</code>
	are simply used for setting a width on a column. <code>grid-plus</code>
	can be used to account for padding or otherwise arbitrarily altering the standard column width. This is especially useful when dealing with designers that like grids but like violating them even more.
</p>

<figure class='code'><figcaption>example1.scss<a href='https://gist.github.com/702760'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div></pre></td><td class='main  scss'><pre><div class='line'><span class="nn">#column-a</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-column</span><span class="p">;</span> <span class="c1">// make it a column</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid</span><span class="p">(</span><span class="mi">6</span><span class="p">);</span> <span class="c1">// make it 6 columns wide</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nn">#column-b</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-column</span><span class="p">(</span><span class="mi">6</span><span class="p">);</span> <span class="c1">// make it a column, 6 columns wide</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nn">#column-c</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-column</span><span class="p">;</span> <span class="c1">// make it a column</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-plus</span><span class="p">(</span><span class="mi">6</span><span class="o">,</span> <span class="mi">-10</span><span class="kt">px</span><span class="p">);</span> <span class="c1">// make it 6 columns wide, minus padding</span>
</div><div class='line'>  <span class="na">padding</span><span class="o">:</span> <span class="mi">0</span> <span class="mi">5</span><span class="kt">px</span><span class="p">;</span> <span class="c1">// mean designer broke the grid</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<p>
	The example above shows 3 equivalent ways to specify a 6-column-wide column. The shortcut <code>grid-column</code>
	mixin makes it easy to create a standard column. But in the case where a column might require <code>border</code>
	or <code>padding</code>
	, the <code>grid-plus</code>
	mixin can be used to account for the difference.
</p>
<ul>
	<li>
		<code>@include grid(&lt;number&gt;);</code>
		is for column widths
		<ul>
			<li>
				<code>@include grid-plus(&lt;number&gt;, &lt;length&gt;);</code>
				is for columns that need a non-standard width
			</li>
		</ul>
	</li>
	<li>
		<code>@include grid-column;</code>
		is for floating columns
		<ul>
			<li>
				<code>@include grid-column(&lt;number&gt;);</code>
				is a shortcut, the same as calling <code>grid(&lt;number&gt;)</code>
				and <code>grid-column</code>
				consecutively
			</li>
			<li>
				<code>@include grid-column-empty(&lt;number&gt;, &lt;position&gt;);</code>
				adds margin to create empty space either before or after the column
			</li>
		</ul>
	</li>
	<li>
		<code>@include grid-row;</code>
		is a column container
	</li>
	<li>
		<code>@include grid-page;</code>
		is the main page wrapper with a full width and is horizontally centered
		<ul>
			<li>
				<code>@include grid-page(&lt;number&gt;);</code>
				creates a page container that is less than the default page width; useful for modal pop-ups
			</li>
		</ul>
	</li>
</ul>
<h2 id="basic-example-using-sass">Basic Example Using SASS</h2>
<p>
	Using the ID's and class names already in the markup, it's possible to utilize the mixins that were created earlier to achieve the exact same effect. I typically do this in a layout file that contains all of the column layouts for the various templates in the site.
</p>

<figure class='code'><figcaption>layout.scss<a href='https://gist.github.com/702760'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div></pre></td><td class='main  scss'><pre><div class='line'><span class="c1">// establishes page width and centers</span>
</div><div class='line'><span class="nn">#container</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-page</span><span class="p">;</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="c1">// main page sections</span>
</div><div class='line'><span class="nn">#container</span> <span class="o">&gt;</span> <span class="nt">header</span><span class="o">,</span> <span class="nn">#main</span><span class="o">,</span> <span class="nn">#container</span> <span class="o">&gt;</span> <span class="nt">footer</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-row</span><span class="p">(</span><span class="n-Pseudo">true</span><span class="p">);</span> <span class="c1">//true indicates a row is directly inside a page</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nn">#left-column</span><span class="o">,</span> <span class="nn">#right-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-column</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span> <span class="c1">//3 columns wide</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nn">#main-column</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-column</span><span class="p">(</span><span class="mi">9</span><span class="p">);</span> <span class="c1">//9 columns wide</span>
</div><div class='line'> </div><div class='line'>  <span class="c1">// sections in the main column are rows</span>
</div><div class='line'>  <span class="o">&gt;</span> <span class="nt">section</span> <span class="p">{</span>
</div><div class='line'>    <span class="k">@include</span><span class="nd"> grid-row</span><span class="p">;</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div><div class='line'><span class="nn">#content</span> <span class="p">{</span>
</div><div class='line'>  <span class="k">@include</span><span class="nd"> grid-column</span><span class="p">(</span><span class="mi">6</span><span class="p">);</span> <span class="c1">//6 columns wide</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<h4>To Be Clear</h4>
<ul>
	<li>
		<code>#container</code>
		is specified as a <code>grid-page</code>
	</li>
	<li>
		<code>header</code>
		, <code>#main</code>
		and <code>footer</code>
		are set up as <code>grid-row(true)</code>
		<ul>
			<li>
				This essentially applies <code>.clearfix</code>
				to those container
			</li>
			<li>
				<code>grid-row(true)</code>
				is used for rows contained directly within a <code>grid-page</code>
				which ommits the negative margins that would otherwise be applied.
			</li>
		</ul>
	</li>
	<li>
		<code>#left-column</code>
		and <code>#right column</code>
		are specified as 3-columns wide
	</li>
	<li>
		The <code>#main-column</code>
		is 9 columns wide. More importantly, all <code>section</code>
		tags are specified as <code>grid-row</code>
		, allowing them to contain columns.
	</li>
	<li>
		The <code>#content</code>
		column is 6 columns wide.
	</li>
</ul>
<p>
	From the above example it should be clear how to use mixins to apply the grid styles directly through CSS without needing to hard-code the grid related class names into the markup.
</p>
<h3 id="compiled-to-css">Compiled to CSS</h3>
<p>
	Because SASS must be compiled to CSS for it to work in a browser, it's useful to see what CSS is being generated. The file below is what the layout.scss example file generated.
</p>

<figure class='code'><figcaption>layout.css<a href='https://gist.github.com/702760'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div></pre></td><td class='main  css'><pre><div class='line'><span class="nf">#container</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="m">960px</span><span class="p">;</span> <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="k">auto</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nf">#container</span> <span class="o">&gt;</span> <span class="nt">header</span><span class="o">,</span> <span class="nf">#main</span><span class="o">,</span> <span class="nf">#container</span> <span class="o">&gt;</span> <span class="nt">footer</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span> <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nf">#left-column</span><span class="o">,</span> <span class="nf">#right-column</span> <span class="p">{</span> <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">10px</span><span class="p">;</span> <span class="k">float</span><span class="o">:</span> <span class="k">left</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">220px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.ie6</span> <span class="nf">#left-column</span><span class="o">,</span> <span class="nc">.ie6</span> <span class="nf">#right-column</span> <span class="p">{</span> <span class="k">display</span><span class="o">:</span> <span class="k">inline</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nf">#main-column</span> <span class="p">{</span> <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">10px</span><span class="p">;</span> <span class="k">float</span><span class="o">:</span> <span class="k">left</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">700px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.ie6</span> <span class="nf">#main-column</span> <span class="p">{</span> <span class="k">display</span><span class="o">:</span> <span class="k">inline</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nf">#main-column</span> <span class="o">&gt;</span> <span class="nt">section</span> <span class="p">{</span> <span class="k">width</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span> <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">-10px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nf">#content</span> <span class="p">{</span> <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">10px</span><span class="p">;</span> <span class="k">float</span><span class="o">:</span> <span class="k">left</span><span class="p">;</span> <span class="k">width</span><span class="o">:</span> <span class="m">460px</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.ie6</span> <span class="nf">#content</span> <span class="p">{</span> <span class="k">display</span><span class="o">:</span> <span class="k">inline</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'> </div><div class='line'><span class="nc">.clearfix</span><span class="o">,</span> <span class="nc">.page</span><span class="o">,</span> <span class="nc">.row</span><span class="o">,</span> <span class="nf">#container</span><span class="o">,</span> <span class="nf">#container</span> <span class="o">&gt;</span> <span class="nt">header</span><span class="o">,</span> <span class="nf">#main</span><span class="o">,</span> <span class="nf">#container</span> <span class="o">&gt;</span> <span class="nt">footer</span><span class="o">,</span> <span class="nf">#main</span> <span class="o">&gt;</span> <span class="nt">section</span> <span class="p">{</span> <span class="o">*</span><span class="n">zoom</span><span class="o">:</span> <span class="m">1</span><span class="p">;</span> <span class="p">}</span>
</div><div class='line'><span class="nc">.clearfix</span><span class="nd">:after</span><span class="o">,</span> <span class="nc">.page</span><span class="nd">:after</span><span class="o">,</span> <span class="nc">.row</span><span class="nd">:after</span><span class="o">,</span> <span class="nf">#container</span><span class="nd">:after</span><span class="o">,</span> <span class="nf">#container</span> <span class="o">&gt;</span> <span class="nt">header</span><span class="nd">:after</span><span class="o">,</span> <span class="nf">#main</span><span class="nd">:after</span><span class="o">,</span> <span class="nf">#container</span> <span class="o">&gt;</span> <span class="nt">footer</span><span class="nd">:after</span><span class="o">,</span> <span class="nf">#main</span> <span class="o">&gt;</span> <span class="nt">section</span><span class="nd">:after</span> <span class="p">{</span> <span class="k">content</span><span class="o">:</span> <span class="s2">&quot;\0020&quot;</span><span class="p">;</span> <span class="k">display</span><span class="o">:</span> <span class="k">block</span><span class="p">;</span> <span class="k">height</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span> <span class="k">clear</span><span class="o">:</span> <span class="k">both</span><span class="p">;</span> <span class="k">overflow</span><span class="o">:</span> <span class="k">hidden</span><span class="p">;</span> <span class="k">visibility</span><span class="o">:</span> <span class="k">hidden</span><span class="p">;</span> <span class="p">}</span>
</div></pre></td></tr></table></div></figure>

<h3 id="html-without-the-hard-coded-class-names">HTML Without the Hard-coded Class Names</h3>

<figure class='code'><figcaption>grid-layout.html<a href='https://gist.github.com/702760'>Gist page</a></figcaption><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'>  ...
</div><div class='line'>  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;container&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;header&gt;</span>
</div><div class='line'>      <span class="nt">&lt;h1&gt;</span>Header<span class="nt">&lt;/h1&gt;</span>
</div><div class='line'>      <span class="nt">&lt;nav&gt;&lt;/nav&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/header&gt;</span>
</div><div class='line'> </div><div class='line'>    <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;main&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>      <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;left-column&quot;</span><span class="nt">&gt;</span>Left Column<span class="nt">&lt;/div&gt;</span>
</div><div class='line'>      <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;main-column&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;section</span> <span class="na">class=</span><span class="s">&quot;hero&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>          Hero Space
</div><div class='line'>        <span class="nt">&lt;/section&gt;</span>
</div><div class='line'>        <span class="nt">&lt;section&gt;</span>
</div><div class='line'>          <span class="nt">&lt;article</span> <span class="na">id=</span><span class="s">&quot;content&quot;</span><span class="nt">&gt;</span>Actual Content<span class="nt">&lt;/article&gt;</span>
</div><div class='line'>          <span class="nt">&lt;aside</span> <span class="na">id=</span><span class="s">&quot;right-column&quot;</span><span class="nt">&gt;</span>Right Column<span class="nt">&lt;/aside&gt;</span>
</div><div class='line'>        <span class="nt">&lt;/section&gt;</span>
</div><div class='line'>      <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/div&gt;</span>
</div><div class='line'> </div><div class='line'>    <span class="nt">&lt;footer&gt;</span>
</div><div class='line'>      <span class="nt">&lt;p&gt;</span><span class="ni">&amp;copy;</span> Copyright 2010<span class="nt">&lt;/p&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/footer&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>  ...
</div></pre></td></tr></table></div></figure>

<p>
	SASS makes it possible to clean up the HTML and remove the extra classes.
</p>]]></content>
    </entry>
  
</feed>
