<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Cloud Four Blog</title>
	
	<link>http://blog.cloudfour.com</link>
	<description>Just another WordPress site</description>
	<lastBuildDate>Thu, 09 May 2013 16:26:52 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/cloudfour" /><feedburner:info uri="cloudfour" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>45.51379</geo:lat><geo:long>-122.645805</geo:long><image><link>http://www.cloudfour.com/blog/</link><url>http://www.cloudfour.com/wp-content/themes/cloudfour/images/logo_cloudfour.gif</url><title>Cloud Four</title></image><feedburner:emailServiceId>cloudfour</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Behavioral Breakpoints: Beyond Media Queries</title>
		<link>http://feedproxy.google.com/~r/cloudfour/~3/TsTpy0JO6VA/</link>
		<comments>http://blog.cloudfour.com/behavioral-breakpoints/#comments</comments>
		<pubDate>Thu, 09 May 2013 16:26:52 +0000</pubDate>
		<dc:creator>Lyza Gardner</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.cloudfour.com/?p=3385</guid>
		<description><![CDATA[Recently, Cloud Four dev Matt Gifford built a slick, responsive off-canvas navigation enhancement for a project (we&#8217;ll be releasing the core code shortly, so keep an eye out for Matt&#8217;s post about that!). The project followed the off-canvas menu metaphor for handling navigation on narrow screens. The baseline, mobile-first layout keeps the navigation out of [...]]]></description>
				<content:encoded><![CDATA[<p>Recently, Cloud Four dev Matt Gifford built a slick, responsive <a href="http://www.lukew.com/ff/entry.asp?1569">off-canvas</a> navigation enhancement for a project (we&#8217;ll be releasing the core code shortly, so keep an eye out for Matt&#8217;s post about that!).</p>
<p>The project followed the off-canvas menu metaphor for handling navigation on narrow screens. The baseline, mobile-first layout keeps the navigation out of the way—initially as footer nav with a button-ish jump link, then progressively enhanced to convert the link into a trigger element for the off-canvas menu—while a media query for wider screens formats the navigation on-screen.</p>
<p>A sketch of this layout adaptation:</p>
<p><a href="http://blog.cloudfour.com/wp-content/uploads/2013/05/offcanvasmenu-states.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/05/offcanvasmenu-states.png" alt="offcanvasmenu-states" width="396" height="170" class="alignnone size-full wp-image-3417" /></a></p>
<p>In the past we&#8217;ve approached implementation of this as:</p>
<ol>
<li>Implement a baseline CSS layout that has a menu button.</li>
<li>Use a CSS media query to adapt the layout for wider screens, hide the button, reflow the nav.</li>
<li>Use JavaScript, often bound on window.resize, to check media query applicability and adapt behavior accordingly (sometimes alternately handled by looking at the width of the viewport and comparing it to media-query-defined widths).</li>
</ol>
<h4>Bolting on Behavior</h4>
<p>Often by the time we get to the behavior implementation of our sites and apps, the process involves bolting on JavaScript as a follower of the CSS-based breakpoints that we&#8217;ve generated during the design process. We define the <em>visual</em> breakpoints of our stuff and the JavaScript is expected to use those to indicate how it should behave.</p>
<p>So we bump into things. We want the JavaScript to &#8220;know&#8221; about the breakpoints defined in CSS, and which media queries are presently active. This leads to heartache, and also some pretty clever hacks. We use matchMedia (or a polyfill to support same) to determine whether a particular, specific media query is active.</p>
<p>Thus: duplicating media queries in two places (CSS and JavaScript), a situation that makes a whole lot of us twitchy. I have definitely fantasized about future CSS module spec revisions that allow for naming and scoping of media queries, to make stuff like this better.</p>
<p>But hold on a minute. What are we trying to accomplish here? Does CSS really hold a monopoly on breakpoints? Should our behavioral components be entirely beholden to the specific formulae of our visual layouts?</p>
<h4>(Re-)Defining Breakpoints</h4>
<p>But why is the breakpoint for menu/navigation behavioral adaptation entirely linked to a CSS concern? Could there be better  indications in the browser that the behavior change is appropriate, beyond a CSS media query or screen width? And, in that case, what <em>does</em> define the breakpoint?</p>
<p>This sort of thing was already on my mind when I started reading <strong>Stephen Hay&#8217;s</strong> excellent new book, <strong><em><a href="http://www.amazon.com/Responsive-Design-Workflow-Stephen-Hay/dp/0321887867" title="Responsive Design Workflow on Amazon">Responsive Design Workflow</a></em></strong>. And Stephen is thinking about these things, too—except he&#8217;s already a lot further along!</p>
<div class="alignleft"><a href="http://www.amazon.com/gp/product/0321887867/ref=as_li_ss_il?ie=UTF8&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0321887867&#038;linkCode=as2&#038;tag=lyzdangar-20"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&#038;ASIN=0321887867&#038;Format=_SL110_&#038;ID=AsinImage&#038;MarketPlace=US&#038;ServiceVersion=20070822&#038;WS=1&#038;tag=lyzdangar-20" ></a></div>
<p>Stephen&#8217;s way of defining a breakpoint is: &#8220;<strong>the points where certain aspects of a website or web application change depending on specified conditions</strong>.&#8221;</p>
<p>No mention of CSS there—because the picture is bigger than that. As Stephen continues on to say, &#8220;[a]nother reason to consider a more full definition of breakpoints is that CSS is not the only method used to implement changes when a breakpoint has been reached.&#8221;</p>
<p>Exactly!</p>
<h4>Breakpoint Graphs</h4>
<p>To express and plan breakpoints, Stephen advocates the use of breakpoint graphs, an adaptation on bullet graphs he&#8217;s invented to communicate both visual and behavioral aspects of breakpoints. </p>
<p>Along the &#8220;qualitative&#8221; axis (horizontal in these examples), one charts a scale. Often, this is a range of screen width resolutions—the way we tend to think about responsive design and breakpoints. </p>
<p>Using the process from above, we might have a breakpoint graph that looks like this:</p>
<p><a href="http://blog.cloudfour.com/wp-content/uploads/2013/05/first-graph.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/05/first-graph.png" alt="first-graph"  class="alignnone size-full wp-image-3386" /></a></p>
<p>Thus, we&#8217;ve expressed that we have a breakpoint at 40em that alters the page layout.</p>
<p>But Stephen&#8217;s graphs go further than this visual design element. Using qualitative &#8220;bands,&#8221; Stephen&#8217;s graphs can communicate behavior or other aspects, like so:</p>
<p><a href="http://blog.cloudfour.com/wp-content/uploads/2013/05/graph-2.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/05/graph-2.png" alt="graph-2"  class="alignnone size-full wp-image-3387" /></a></p>
<p>This is starting to move toward thinking about behavioral changes as well as visual ones, expressing explicitly that we want to adapt navigation behavior, but the breakpoint is still owned and defined in terms of the CSS breakpoint: 40em. So it&#8217;s natural that we&#8217;ve been creating media queries:</p>
<p><code><br />
@screen only and (min-width: 40em) {}</code></p>
<p>and the JavaScript corollary</p>
<p><code>if (window.matchMedia( "screen and (min-width:40em)" )) { }</code></p>
<h4>Behavioral Breakpoints</h4>
<p>Looking at breakpoints in such a clear way inspired me. I&#8217;d seen the screen-width-resolution-style graphs before, but the qualitative dimension was new and exciting. In fact, it frees us from tying our breakpoints to a visual or CSS source at all.</p>
<p>What is the breakpoint, in the case of the navigation menu example here?</p>
<p>When implementing the navigation behavior, Matt chose to use the state of the triggering button as the indicator for which kind of menu behavior to apply. Button extant and visible? Convert the navigation behavior to the corresponding off-canvas menu. Button gone? Deactivate the off-canvas menu and use on-page navigation. Matt does this by observing the state of that button and reacting accordingly, not by duplicating or checking on the status of the CSS media query that put it there in the first place.</p>
<h4>Building Behavior into the Process</h4>
<p>A behavior-centric breakpoint graph for this could look something like this:</p>
<p><a href="http://blog.cloudfour.com/wp-content/uploads/2013/05/graph-3.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/05/graph-3.png" alt="graph-3" class="alignnone size-full wp-image-3388" /></a></p>
<p>where <strong>the breakpoint is the state of the trigger button</strong>. Yes, the state changes at 40em as a result of a CSS media query, but <strong>it&#8217;s the state we care about, not the media query</strong> (or window width) that did it.</p>
<p>Stephen&#8217;s book does an excellent job of pushing the notion that behavior needs to be a part of our responsive design processes, integrated and partnered with visual design, not just adjunct to or beholden to it. Breakpoints span various aspects of the overall experience, and I&#8217;m glad Stephen helped me really understand this.</p>
<p>Thanks!: <em>my gratitude to <a href="https://twitter.com/stephenhay" title="Stephen Hay on Twitter">Stephen Hay</a> for his personalized help in making breakpoint graphs, <a href="https://twitter.com/mattg" title="Matt Gifford on Twitter">Matt Gifford</a> for the off-canvas menu idea that got me thinking and <a href="https://www.twitter.com/tylersticka">Tyler Sticka</a> for a bit of sketching help and proofreading.</em></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cloudfour?a=TsTpy0JO6VA:LFH_kqnjQrw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=TsTpy0JO6VA:LFH_kqnjQrw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=TsTpy0JO6VA:LFH_kqnjQrw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=TsTpy0JO6VA:LFH_kqnjQrw:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=TsTpy0JO6VA:LFH_kqnjQrw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=TsTpy0JO6VA:LFH_kqnjQrw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=TsTpy0JO6VA:LFH_kqnjQrw:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cloudfour/~4/TsTpy0JO6VA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.cloudfour.com/behavioral-breakpoints/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://blog.cloudfour.com/behavioral-breakpoints/</feedburner:origLink></item>
		<item>
		<title>Common Patterns in Styleguides, Boilerplates and Pattern Libraries</title>
		<link>http://feedproxy.google.com/~r/cloudfour/~3/wIr4BCqWUUI/</link>
		<comments>http://blog.cloudfour.com/common-patterns/#comments</comments>
		<pubDate>Wed, 08 May 2013 21:18:16 +0000</pubDate>
		<dc:creator>Tyler Sticka</dc:creator>
				<category><![CDATA[Emerging Technology]]></category>
		<category><![CDATA[Mobile Web and Services]]></category>
		<category><![CDATA[Standards]]></category>

		<guid isPermaLink="false">http://blog.cloudfour.com/?p=3268</guid>
		<description><![CDATA[It&#8217;s hard to believe it&#8217;s been almost three years since the publication of Ethan Marcotte&#8217;s seminal Responsive Web Design article on A List Apart.  The ideas and techniques described therein blew our minds while forcing us to drastically reconsider our design processes. Even today, the struggle continues to determine which design deliverables make sense in a post-PSD era. [...]]]></description>
				<content:encoded><![CDATA[<p>It&#8217;s hard to believe it&#8217;s been almost three years since the publication of Ethan Marcotte&#8217;s seminal <a href="http://alistapart.com/article/responsive-web-design">Responsive Web Design</a> article on A List Apart.  The ideas and techniques described therein blew our minds while forcing us to drastically reconsider our design processes. Even today, the struggle continues to determine which design deliverables make sense in <a href="http://bradfrostweb.com/blog/post/the-post-psd-era/">a post-PSD era</a>.</p>
<p>Personally, I dig <a href="http://daverupert.com/2013/04/responsive-deliverables/">Dave Rupert&#8217;s idea</a> of &#8220;Tiny Bootstraps, for Every Client&#8221;:</p>
<blockquote><p>Responsive deliverables should look a lot like fully-functioning Twitter Bootstrap-style systems custom tailored for your clients’ needs. These living code samples are self-documenting style guides that extend to accommodate a client’s needs as well as the needs of the ever-evolving multi-device web.</p></blockquote>
<p>The whole post is great, and it got me thinking&#8230; along with solid content strategy, design and engineering processes, what steps can we take to insure our &#8220;tiny bootstraps&#8221; are comprehensive enough to remain relevant and useful long after launch?</p>
<p>Cue <a href="http://blog.cloudfour.com/author/jason-grigsby/">Jason</a> with a cool idea: We could document patterns in existing frameworks. A list of what&#8217;s <em>typically</em> included might serve as a good starting point, something to measure our client deliverables against to make sure we haven&#8217;t overlooked anything obvious.</p>
<h3>In which I willingly make a spreadsheet</h3>
<p><a href="https://docs.google.com/spreadsheet/ccc?key=0AiN0QfBTPpOCdDFjWlM0eU1ra21XanZkekxGbjA2WWc"><img class="alignright size-full wp-image-3372" alt=" " src="http://blog.cloudfour.com/wp-content/uploads/2013/05/google-spreadsheet-icon.png" style="border:0;margin-left:1.5em;margin-bottom:1.5em;max-width:25%" /></a>I combed through a (non-exhaustive) collection of suitably broad or noteworthy links from <a href="http://maban.co.uk/66">Anna Debenham</a>&#8216;s list of <a href="https://gimmebar.com/collection/4ecd439c2f0aaad734000022/front-end-styleguides">front end styleguides and pattern libraries</a>, recording instances of observed patterns and adding new ones as necessary. I skipped over anything that seemed too idiosyncratic, and grouped elements of similar intent even if their description or implementation differed.</p>
<p>The results are contained in <a href="https://docs.google.com/spreadsheet/ccc?key=0AiN0QfBTPpOCdDFjWlM0eU1ra21XanZkekxGbjA2WWc"><strong>this handy Google Doc</strong></a>.</p>
<h3>Lessons learned</h3>
<p>I found this to be a worthwhile exercise. It helped me wrap my head around the elastic scope of a &#8220;tiny bootstrap.&#8221;</p>
<p>I thought there&#8217;d be more overlap between frameworks than there is. I recorded over 160 distinct patterns, none of them ubiquitous. Some came pretty close, especially headings 2 through 4, typographic elements and pre-HTML5 form elements. No single framework included even half of the total recorded patterns (<a href="http://twitter.github.io/bootstrap/">Bootstrap</a> had the most).</p>
<p>Sometimes the most infrequent elements surprised me with how obvious they seemed in retrospect. For example, color guides and font stacks only occur in a couple of places.</p>
<p>The thought of maintaining the document indefinitely makes me queasy, but I&#8217;ve already started referring to it frequently. I&#8217;d love to know if anyone finds it as interesting or useful as I have.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cloudfour?a=wIr4BCqWUUI:d1zrJctRYYo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=wIr4BCqWUUI:d1zrJctRYYo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=wIr4BCqWUUI:d1zrJctRYYo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=wIr4BCqWUUI:d1zrJctRYYo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=wIr4BCqWUUI:d1zrJctRYYo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=wIr4BCqWUUI:d1zrJctRYYo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=wIr4BCqWUUI:d1zrJctRYYo:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cloudfour/~4/wIr4BCqWUUI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.cloudfour.com/common-patterns/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		<feedburner:origLink>http://blog.cloudfour.com/common-patterns/</feedburner:origLink></item>
		<item>
		<title>Sensible jumps in responsive image file sizes</title>
		<link>http://feedproxy.google.com/~r/cloudfour/~3/sAIVD07-X9E/</link>
		<comments>http://blog.cloudfour.com/sensible-jumps-in-responsive-image-file-sizes/#comments</comments>
		<pubDate>Fri, 03 May 2013 19:34:59 +0000</pubDate>
		<dc:creator>Jason Grigsby</dc:creator>
				<category><![CDATA[Emerging Technology]]></category>
		<category><![CDATA[Mobile Web and Services]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blog.cloudfour.com/?p=3182</guid>
		<description><![CDATA[Last year, I wrote about the challenges of picking responsive images breakpoints and how I found it a nearly unsolvable problem. It has vexed me since. But I have a new idea on how we might be able to define responsive image breakpoints that is based on a performance budget. Before I begin, I should [...]]]></description>
				<content:encoded><![CDATA[<p>Last year, I wrote about the <a href="http://blog.cloudfour.com/how-do-you-pick-responsive-images-breakpoints/">challenges of picking responsive images breakpoints</a> and how I found it a nearly unsolvable problem. It has vexed me since.</p>
<p>But I have a new idea on how we might be able to define responsive image breakpoints that is based on a performance budget.</p>
<p>Before I begin, I should note that a lot of this is a thought experiment. I don’t yet know how practical this approach would be.</p>
<h3>Brief refresher on responsive image breakpoints</h3>
<p>Without going into all of the <a href="http://blog.cloudfour.com/how-do-you-pick-responsive-images-breakpoints/">details about responsive image breakpoints</a>, the short version is that most people are picking the breakpoints for responsive images based on one of two criteria:</p>
<ol>
<li>Based on what <a href="http://scottjehl.com">Scott Jehl</a> referred to as “<a href="http://lists.w3.org/Archives/Public/public-whatwg-archive/2012May/0613.html">sensible jumps in file size to match screen dimension and/or density</a>” OR</li>
<li>Simply matching the image breakpoints to the major breakpoints being used for the design.</li>
</ol>
<p>While the first method is more efficient and will probably result in better image sizes, my suspicion is that defining “sensible jumps in file size” is so nebulous that most web developers are going to choose to do the second, easier option.</p>
<p>That is unless we can find a formula to calculate what constitutes a sensible jump in file size and that’s what got me thinking about performance budgets.</p>
<h3>What is a performance budget?</h3>
<p>I’m not sure how long the idea of a performance budget has been around, but I first became cognizant of the idea when <a href="http://stevesouders.com">Steve Souders</a> talked about creating a culture of performance on the <a href="http://fsm.bdconf.com/podcast/web-performance">Breaking Development podcast</a>.</p>
<p><a href="http://twitter.com/tkadlec">Tim Kadlec</a> expanded on the idea in a <a href="http://timkadlec.com/2013/01/setting-a-performance-budget/">recent blog post</a>. He <a href="https://speakerdeck.com/tmaslen/moving-swiftly-the-story-of-how-bbc-news-fell-in-love-with-responsive-web-design#63">cites the BBC</a> which determined that “<a href="http://timkadlec.com/2013/01/setting-a-performance-budget/">each page to be usable within 10 seconds on a GPRS connection and then based their goals for page weight and request count on that.</a>”</p>
<p>So that’s the basic idea. Establish a performance budget and stick to it. If you add a new feature to the page and you go over budget, then you have a three options according to Steve (and <a href="http://timkadlec.com/2013/01/setting-a-performance-budget/">transcribed by Tim</a>):</p>
<blockquote>
<ol>
<li>Optimize an existing feature or asset on the page.</li>
<li>Remove an existing feature or asset from the page.</li>
<li>Don’t add the new feature or asset.</li>
</ol>
</blockquote>
<h3>What is the performance budget for flexible images?</h3>
<p>Let’s apply this idea of a performance budget to responsive design. In particular, let’s treat the idea of flexible images as a feature. Because flexible images are a feature, we need a budget for that feature.</p>
<p>And as long as we’re making up the rules, let’s establish a few more hypotheticals:</p>
<ul>
<li>The page we’re working with has 10 images on it of varying formats and visual content.</li>
<li>We haven’t reached our performance budget yet so we don’t have to remove other features, but we still need to make sure that flexible images do not add too much to the page weight.</li>
<li>We&#8217;ve concluded that flexible images can add up to 200k to the page above what the size of the page would be if we provided fixed width images. We picked 200k because it is ~1 second at HSDPA (recent mobile) speeds. And well, 200k is a nice even number for this thought experiment.</li>
<li>Because this page has 10 images on it, each image has a 20k budget for flexible images.</li>
</ul>
<p>One thing to keep in mind, 200k isn’t the cap for the file size of all ten images combined. Instead, it is the price we’re willing to pay for using flexible images instead of images that are perfectly sized for the size they are used in the page.</p>
<p>For example, say you had a responsive web page with the following image on it:</p>
<p style="text-align:center;"><a href="http://www.flickr.com/photos/lyza/8418483033/in/photostream"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/05/fish-and-chips-500.jpg" alt="fish-and-chips" /></a></p>
<p>That image is 500&#215;333 pixels and 58K in file size.</p>
<p>Now imagine a visitor views that web page and based on the size of their viewport, the image is displayed at 300&#215;200 pixels, but the source image is still the same. The cost of using flexible images is the difference in file size between what the image would be saved and optimized at 300&#215;200 versus the file size of the image downloaded at 500&#215;333.</p>
<p>In this case, I’ve taken that example image and resized it to 300&#215;200 and saved it with the same compression level as the 500&#215;333 image to see what the file size cost is of using that flexible image.</p>
<style>
.data-table {width: auto;overflow:scroll;border-collapse:collapse;border-spacing:0;}
.data-table td, .data-table th  {text-align:center;padding:5px;background:#fff;border:1px solid #ccc;width:25%;}
</style>
<table class="data-table">
<thead>
<tr>
<th>Source</th>
<th>Width</th>
<th>Height</th>
<th>File Size</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><a href="http://blog.cloudfour.com/wp-content/uploads/2013/05/fish-and-chips-500.jpg">Flexible image</a></td>
<td>500</td>
<td>333</td>
<td>58k</td>
</tr>
<tr>
<td style="text-align:left"><a href="http://blog.cloudfour.com/wp-content/uploads/2013/05/fish-and-chips-300.jpg">Image matching size used in page</a></td>
<td>300</td>
<td>200</td>
<td>24K</td>
</tr>
<tr>
<td style="text-align:left"><strong>Total extra download</strong></td>
<td>-</td>
<td>-</td>
<td><strong>34K</strong></td>
</tbody>
</table>
<p>In this example, the visitor is downloading an extra 34k of image data because they are downloading a flexible image instead of downloading one that had been resized to the exact size being used in the page.</p>
<h3>Translating the budget into breakpoints</h3>
<p>Let’s go back to the page we want to optimize—the one with ten images on it and a total performance budget of 200k for flexible images. How do we translate that into image breakpoints?</p>
<p>Thinking back to the example above, the price for using flexible images is the difference between the size of the file that is downloaded and the size the file would have been if perfectly sized for its use in the page.</p>
<p>Our budget says that we can only download up to an extra 20K per image. Therefore, we need to make sure that we have a new image breakpoint every time the size of the image increases 20K.</p>
<p>We now have a methodology for picking sensible jumps in image file size that is tied to user experience instead of picking them arbitrarily.</p>
<h3>Finding the breakpoints</h3>
<p>How would this translate into a heuristic that could be used to find the breakpoints? You would need the following:</p>
<ul>
<li>What is the minimum size this image will be used at? (In our example, let&#8217;s say 320&#215;213)</li>
<li>What is the file size between breakpoints? In other words, what is your per image budget? (20k for our example)</li>
<li>A high quality source file to use for resizing.</li>
<li>Optionally, the largest size the image will be used at. (990&#215;660 for this example).</li>
</ul>
<p>Once you have this information, the basic logic looks like this:</p>
<ol>
<li>Take the source image and resize it to the smallest size the image will be used at.</li>
<li>Keep the file size of that image handy.</li>
<li>Start a series of tests that create new image files from the source that are gradually getting bigger.</li>
<li>Check each image created. If the difference between the file size of the new image and the image file size you stored is less than your budget, discard the new image.</li>
<li>When you find an image that hits your budget, save that image and replace the previous file size that you stored with the new file size.</li>
<li>Repeat steps 2 through 5 until you reach either the maximum resolution of the source image or the largest size the image will be used at.</li>
</ol>
<p>I’m tickled to say that my co-founder John Keith got excited by this idea and <a href="https://github.com/cloudfour/image-breakpoints">built a rough prototype</a> of how this might work.</p>
<h3>Sample Page</h3>
<p>Using the script that John built, I created a <a href="http://cloudfour.com/examples/image-breakpoints/">demo page</a> containing ten images. The source images were 990 by 660 pixels and all but one of them were saved as JPEGs at 50% quality. The one exception is a PNG8 image with an optimized color palette.</p>
<p>I tried to pick a variety of images so we can see how each image might have different breakpoints using our budget. Let’s take a look at three sample images.</p>
<h4>Time Square &#8212; 8 Image Breakpoints</h4>
<p>	<a href="http://www.flickr.com/photos/lyza/6733380533/in/photostream"></p>
<div data-picture data-alt="Times Square">
<div data-src="http://cloudfour.com/examples/image-breakpoints/images/times-square-320x213.jpg"></div>
<div data-src="http://cloudfour.com/examples/image-breakpoints/images/times-square-453x302.jpg" data-media="(min-width: 321px) and (max-width: 453px)"></div>
<div data-src="http://cloudfour.com/examples/image-breakpoints/images/times-square-579x386.jpg" data-media="(min-width: 454px) and (max-width: 579px)"></div>
<div data-src="http://cloudfour.com/examples/image-breakpoints/images/times-square-687x458.jpg" data-media="(min-width: 580px) and (max-width: 687px)"></div>
<div data-src="http://cloudfour.com/examples/image-breakpoints/images/times-square-786x524.jpg" data-media="(min-width: 688px) and (max-width: 786px)"></div>
<div data-src="http://cloudfour.com/examples/image-breakpoints/images/times-square-885x590.jpg" data-media="(min-width: 787px) and (max-width: 885px)"></div>
<div data-src="http://cloudfour.com/examples/image-breakpoints/images/times-square-975x650.jpg" data-media="(min-width: 886px) and (max-width: 975px)"></div>
<div data-src="http://cloudfour.com/examples/image-breakpoints/images/times-square.jpg" data-media="(min-width: 976px)"></div>
<p>        <!-- Fallback content for non-JS browsers. Same img src as the initial, unqualified source element. --></p>
<noscript>
            <img src="http://cloudfour.com/examples/image-breakpoints/images/times-square-320x213.jpg" alt="Times Square"><br />
        </noscript>
</p></div>
<p>	</a></p>
<p>This image has a lot of visual diversity. The variations in colors and textures means that JPEG&#8217;s lossy compression cannot do as much without damaging the image quality.</p>
<p>Because of this, there are eight image breakpoints&#8212;set at 20k intervals&#8212;between the smallest size of the image (320&#215;213) and the largest size of the image (990&#215;660).</p>
<table class="data-table">
<tr>
<th>Breakpoint #</th>
<th>Width</th>
<th>Height</th>
<th>File Size</th>
</tr>
<tr>
<td><a href="http://cloudfour.com/examples/image-breakpoints/images/times-square-320x213.jpg">1</a></td>
<td>320</td>
<td>213</td>
<td> 25K</td>
</tr>
<tr>
<td><a href="http://cloudfour.com/examples/image-breakpoints/images/times-square-453x302.jpg">2</a></td>
<td>453</td>
<td>302</td>
<td> 44K</td>
</tr>
<tr>
<td><a href="http://cloudfour.com/examples/image-breakpoints/images/times-square-579x386.jpg">3</a></td>
<td>579</td>
<td>386</td>
<td> 65K</td>
</tr>
<tr>
<td><a href="http://cloudfour.com/examples/image-breakpoints/images/times-square-687x458.jpg">4</a></td>
<td>687</td>
<td>458</td>
<td> 85K</td>
</tr>
<tr>
<td><a href="http://cloudfour.com/examples/image-breakpoints/images/times-square-786x524.jpg">5</a></td>
<td>786</td>
<td>524</td>
<td>104K</td>
</tr>
<tr>
<td><a href="http://cloudfour.com/examples/image-breakpoints/images/times-square-885x590.jpg">6</a></td>
<td>885</td>
<td>590</td>
<td>124K</td>
</tr>
<tr>
<td><a href="http://cloudfour.com/examples/image-breakpoints/images/times-square-975x650.jpg">7</a></td>
<td>975</td>
<td>650</td>
<td>142K</td>
</tr>
<tr>
<td><a href="http://cloudfour.com/examples/image-breakpoints/images/times-square.jpg">8</a></td>
<td>990</td>
<td>660</td>
<td>151K</td>
</tr>
</table>
<h4>Morning in Kettering &#8212; 3 Image Breakpoints</h4>
<p>	<a href="http://www.flickr.com/photos/lyza/6210160407/in/photostream"></p>
<div data-picture data-alt="Morning in Kettering">
<div data-src="http://cloudfour.com/examples/image-breakpoints/images/kettering-sky-320x213.jpg"></div>
<div data-src="http://cloudfour.com/examples/image-breakpoints/images/kettering-sky-731x487.jpg" data-media="(min-width: 321px) and (max-width: 731px)"></div>
<div data-src="http://cloudfour.com/examples/image-breakpoints/images/kettering-sky.jpg" data-media="(min-width: 732px)"></div>
<p>        <!-- Fallback content for non-JS browsers. Same img src as the initial, unqualified source element. --></p>
<noscript>
            <img src="images/kettering-sky-320x213.jpg" alt="Morning in Kettering"><br />
        </noscript>
</p></div>
<p>	</a></p>
<p>Unlike the Times Square image, this image has a lot of areas with very similar colors and little variation. Because of this, JPEG can compress the image better.</p>
<p>On an image that can be compressed better, our 20K budget goes farther. For this image, we only need three image breakpoints to cover the full range of sizes that the image will be used at.</p>
<table class="data-table">
<thead>
<tr>
<th>Breakpoint #</th>
<th>Width</th>
<th>Height</th>
<th>File Size</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://cloudfour.com/examples/image-breakpoints/images/kettering-sky-320x213.jpg">1</a></td>
<td>320</td>
<td>213</td>
<td>9.0K</td>
</tr>
<tr>
<td><a href="http://cloudfour.com/examples/image-breakpoints/images/kettering-sky-731x487.jpg">2</a></td>
<td>731</td>
<td>487</td>
<td> 29K</td>
</tr>
<tr>
<td><a href="http://cloudfour.com/examples/image-breakpoints/images/kettering-sky.jpg">3</a></td>
<td>990</td>
<td>660</td>
<td> 40K</td>
</tr>
</tbody>
</table>
<h4>Microsoft Logo &#8212; 1 Image Breakpoint</h4>
<p>
		<a href="http://upload.wikimedia.org/wikipedia/commons/e/e6/Microsoft_Logo.png"><br />
		<img src="http://cloudfour.com/examples/image-breakpoints/images/Microsoft_Logo.png" alt="Microsoft Logo" /><br />
		</a>
	</p>
<p>This is a simple PNG8 file. At its largest size (990&#215;660), it is only 13K. Because of this, it fits into our 20K budget without any modifications.</p>
<p>On a recent consulting project with a company that has over 800,000 images on its site, we identified a class of images&#8212;some icons, little badges, etc.&#8212;where the size of the image on desktop retina was not much different than the size used on mobile either because the image resolution doesn’t vary much or because the image compresses well. For those images, we decided to deliver the same size image to all screen sizes.</p>
<table class="data-table">
<thead>
<tr>
<th>Breakpoint #</th>
<th>Width</th>
<th>Height</th>
<th>File Size</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://cloudfour.com/examples/image-breakpoints/images/Microsoft_Logo.png">1</a></td>
<td>990</td>
<td>660</td>
<td>13K</td>
</tr>
</tbody>
</table>
<h3>Every image is different in the way it compresses</h3>
<p>Take a look at the other images on the <a href="http://cloudfour.com/examples/image-breakpoints/">sample page</a> we created. See how the number of breakpoints vary even through all the images start with the same resolution end points.</p>
<p>This diversity exists despite the fact that with the exception of the Microsoft logo, all of the images start at the same size with the same compression settings. On a real site, we would see even more diversity with varying levels of JPEG quality, PNG8 with gradients going horizontally instead of vertically, and PNG32 images in the mix.</p>
<p>But what intrigues me about this approach to setting breakpoints is that it we wouldn’t be setting one-size-fits-all image breakpoints. Instead, we would make decisions about where the breakpoints should exist based on the our goals for user experience&#8212;the performance budget&#8212;and the unique characteristics of the image and how will it can be compressed.</p>
<h3>What conclusions can we draw from this thought experiment?</h3>
<p>The point of this thought experiment wasn’t to provide a complete methodology to set responsive image breakpoints. I started by simply asking the question about whether we might be able to use performance budgets to come up with a way to calculate what are sensible jumps in image sizes.</p>
<p>But the outcome of this exercise has caused me to draw some interesting conclusions as well as sparking more questions about responsive images:</p>
<ul>
<li><strong>Images do contain clues that can tell us where the breakpoints should be.</strong> <br /> Last year I <a href="http://blog.cloudfour.com/the-real-conflict-behind-picture-and-srcset/">wrote</a> that “the problem is there is nothing intrinsic to the image that would guide you in deciding where you should switch from one size of the image to another.” But this experiment shows that images do have intrinsic information&#8212;how well the image compresses, what type of compression is being used, the range in size between the smallest and largest use of an image&#8212;that can be used to decide when you should switch from one source file to another.</li>
<li><strong>We can set a performance budget for flexible images.</strong><br />There’s no reason why we can’t treat the use of flexible images like any other feature that we add to a page and define a performance budget for its use. In fact, setting a performance budget for flexible images could be the key to making informed decisions about where image breakpoints should be set.</li>
<li><strong>Automated image resizing and compression is a must.</strong><br />I have already written about <a href="http://blog.cloudfour.com/8-guidelines-and-1-rule-for-responsive-images/">how automated image services will likely be a must for sites</a> in the future. If a company wanted to use a technique like this to set their breakpoints, they will need an automated way to do it.</li>
<li><strong>Can we set a performance budget for flexible images across an entire site?</strong><br />For our sample page, setting the performance budget to 200K for the whole page worked well. But in the real world, we often don’t know how many images are going to be on a given page. Similarly, we may not know what pages a given image is going to be added to. It seems like it would be useful to be able to say that for any given flexible image on the site, we’ve established a 20K budget. It would be less precise than a per page limit, but it may be the only practical way to translate this thought experiment into a production environment.</li>
<li><strong>An image and its breakpoints could be stored as a bundle.</strong><br />The outcome of this approach to image breakpoints is that the breakpoints could be specific to the image no matter what context the image is used in. You could store the calculated breakpoints with the image and whenever the image is displayed on a page, no matter what size the image is used at within the page, the same breakpoints could be used.</li>
<li><strong>An image and breakpoint bundle would be difficult to use with the proposed <a href="http://picture.responsiveimages.org/">picture</a> and <a href="http://dev.w3.org/html5/srcset/">srcset</a> standards</strong><br />Image breakpoints calculated this way depend on knowing the size of the element in the page. Both picture and srcset make the switching of image sources contingent on the size of the viewport instead of the element. This means that you&#8217;d have to find a way to translate your image breakpoints to viewport sizes which would undermine a lot of the utility of storing breakpoints with the image.</li>
</ul>
<h3>Crazy? Or crazy like a fox?</h3>
<p>Phew, you made it to the end. So what do you think? Is there merit in using performance budgets for flexible images to determine responsive image breakpoints?</p>
<hr />
<p>Thanks to <a href="http://twitter.com/jtkeith2">John</a> for creating the sample script and for being my partner in crime on this crazy idea and to <a href="http://twitter.com/lyzadanger">Lyza</a> for being an amazing photographer and publishing her photos under creative commons.</p>
<p><script src="http://cloudfour.com/examples/image-breakpoints/picturefill-min.js" type="text/javascript"></script></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cloudfour?a=sAIVD07-X9E:Yg3UsxL0suA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=sAIVD07-X9E:Yg3UsxL0suA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=sAIVD07-X9E:Yg3UsxL0suA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=sAIVD07-X9E:Yg3UsxL0suA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=sAIVD07-X9E:Yg3UsxL0suA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=sAIVD07-X9E:Yg3UsxL0suA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=sAIVD07-X9E:Yg3UsxL0suA:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cloudfour/~4/sAIVD07-X9E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.cloudfour.com/sensible-jumps-in-responsive-image-file-sizes/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		<feedburner:origLink>http://blog.cloudfour.com/sensible-jumps-in-responsive-image-file-sizes/</feedburner:origLink></item>
		<item>
		<title>Android Browser Countdown</title>
		<link>http://feedproxy.google.com/~r/cloudfour/~3/OPFRRP7kZKs/</link>
		<comments>http://blog.cloudfour.com/android-browser-countdown/#comments</comments>
		<pubDate>Thu, 02 May 2013 17:23:36 +0000</pubDate>
		<dc:creator>Jason Grigsby</dc:creator>
				<category><![CDATA[Mobile Web and Services]]></category>
		<category><![CDATA[Standards]]></category>

		<guid isPermaLink="false">http://blog.cloudfour.com/?p=3194</guid>
		<description><![CDATA[Android&#8217;s poor browser has been the thorn in side of mobile web developers for quite some time. Dion Almaer once said that “Android WebKit is the closest thing to being the IE6 of mobile development”. I agree. Back in 2011, I wrote that Google needed to step up. Thankfully, they have. Chrome for Mobile is [...]]]></description>
				<content:encoded><![CDATA[<p>Android&#8217;s poor browser has been the thorn in side of mobile web developers for quite some time. <a href="http://almaer.com/">Dion Almaer</a> once said that “<a href="http://functionsource.com/post/a-day-in-the-life-of-android-webkit-dealings">Android WebKit is the closest thing to being the IE6 of mobile development</a>”.</p>
<p>I agree. Back in 2011, I wrote that <a href="http://blog.cloudfour.com/we-need-more-mobile-first-browsers-google-needs-to-step-up/">Google needed to step up</a>. Thankfully, they have. Chrome for Mobile is a great browser.</p>
<p>But Chrome for Mobile is still a small percentage of what people on Android devices are using. A lot of this has to do with the fact that older versions of Android that cannot run Chrome still account for 44.1% of Android&#8217;s installed base.</p>
<p style="text-align:center;"><a href="http://developer.android.com/about/dashboards/index.html"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/05/android-versions.png" alt="Pie chart of Android versions. Versions below 4.0 are 44.1%" style="border:none;" /></a></p>
<p>Last month at the <a href="http://bdconf.com">Breaking Development</a> conference, many of the speakers talked about large installed base of Android browsers as being an impediment to pushing the web forward on mobile. The discussion reminded me of the efforts that the web community undertook to convince users to move off of IE6.</p>
<p>Web developers started encouraging users to upgrade to a newer version. Microsoft helped out by creating the <a href="http://ie6countdown.com">IE6 Countdown</a> web site which helped web developers figure out when IE6’s market share had gotten low enough that they no longer had to worry about it.</p>
<p>Microsoft and others <a href="http://www.ie6countdown.com/join-us.aspx">created banners and warnings</a> that encouraged people to <a href="http://browser-update.org/">install newer, more standards-compliant browsers</a>.</p>
<p><a href="http://www.ie6countdown.com/join-us.aspx"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/05/warning_bar_0000_us.jpg" alt="Microsoft supplied warning bar for an out of date version of IE" style="border:none;" /></a></p>
<p>I’ve thought a few times about how we should encourage Android users to upgrade their browsers, but in this case, there is no way for them to update to a new version of the Android browser and they can’t install Chrome on any device not running Android 4.x.</p>
<p>But while discussing this at Breaking Development, it was pointed out to me that even if people cannot update their browser to Chrome, many do have other options. They can install <a href="http://www.opera.com/mobile/android">Opera Mobile</a> or <a href="http://www.mozilla.org/en-US/firefox/mobile/platforms/">Firefox</a>.</p>
<p>Maybe it is time to change our mindset towards the Android 2.x Browsers and instead of working around its many limitations, perhaps we should actively encourage people to switch to a better browser.</p>
<p>What do you think?</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cloudfour?a=OPFRRP7kZKs:S_F_528I6bg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=OPFRRP7kZKs:S_F_528I6bg:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=OPFRRP7kZKs:S_F_528I6bg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=OPFRRP7kZKs:S_F_528I6bg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=OPFRRP7kZKs:S_F_528I6bg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=OPFRRP7kZKs:S_F_528I6bg:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=OPFRRP7kZKs:S_F_528I6bg:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cloudfour/~4/OPFRRP7kZKs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.cloudfour.com/android-browser-countdown/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://blog.cloudfour.com/android-browser-countdown/</feedburner:origLink></item>
		<item>
		<title>We’re Hiring! JavaScript Developer</title>
		<link>http://feedproxy.google.com/~r/cloudfour/~3/PZOQisdmyX8/</link>
		<comments>http://blog.cloudfour.com/hiring-js-developer/#comments</comments>
		<pubDate>Tue, 30 Apr 2013 21:24:11 +0000</pubDate>
		<dc:creator>Lyza Gardner</dc:creator>
				<category><![CDATA[Top Stories]]></category>

		<guid isPermaLink="false">http://blog.cloudfour.com/?p=3188</guid>
		<description><![CDATA[We’re growing! We’re searching for an enthusiastic and talented JavaScript and front-end developer to join our team. We’re looking for someone who is crackerjack at JavaScript and the other building blocks of complex HTML5 apps—of course!—but who isn’t scared of putting things together on the back end or tackling other technical tasks needed to bring [...]]]></description>
				<content:encoded><![CDATA[<p>We’re growing! We’re searching for an enthusiastic and talented JavaScript and front-end developer to join our team.<br />
We’re looking for someone who is crackerjack at JavaScript and the other building blocks of complex HTML5 apps—of course!—but who isn’t scared of putting things together on the back end or tackling other technical tasks needed to bring a web-based or hybrid native mobile application to bear.</p>
<p>Mobile is fast-paced and constantly changing, and we’re changing constantly along with it. Our team is built of flexible, smart folks who enjoy learning new stuff all the time and see opportunity in the challenges presented by all of those mobile devices out there (and their sometimes-finicky, inconsistent behavior). </p>
<p>We’re a small agency with big aspirations, focused on building mobile and web solutions for our customers. We believe in cross-platform solutions and advocate a mixture of mobile web, native, and hybrid approaches to mobile development depending on the project objectives.</p>
<p>Cloud Four was founded in November, 2007 by four mobile and Web enthusiasts. Our mission is to create usable, inspired mobile and web applications using standards-based technologies. Our clients range from Fortune 500 companies to local businesses, and our projects vary in audience and scope accordingly. </p>
<p>This is a full time position on-site in lovely, lively Portland, Ore. We offer benefits including medical, dental, vision, and IRA.</p>
<h3>Job Description</h3>
<ul>
<li>Research, identify and document client technical requirements.</li>
<li>Determine and identify appropriate technologies to be used.</li>
<li>Assist with developing technical project schedules, plans, task assignments and time estimates. </li>
<li>Assist in strategic planning and requirements gathering.</li>
<li>Program mobile applications and build mobile web sites.</li>
<li>Be a positive and enthusiastic contributor to our team.</li>
</ul>
<h3>Our ideal candidate is:</h3>
<ul>
<li>Able to create a concise, clear plan of action from multiple input sources and stakeholders; flexible and responsive to changes in requirements and scope.</li>
<li>Self-directed and takes an ownership role of complex projects.</li>
<li>Strategy-focused and creative; excited to face new challenges and learn new skills.</li>
<li>Deadline-driven and steadfast about meeting commitments to customers.</li>
<li>Excellent communicator, ability to comprehend and articulate technical concepts both internally and to customers.</li>
<li>Able to learn and be productive quickly.</li>
<li>Passionate about the job and enjoys solving customer needs.</li>
<li>Straightforward, honest, team player.</li>
<li>Able to effectively prioritize multiple tasks.</li>
<li>Comfortable and enthusiastic in a small, start-up environment. </li>
</ul>
<h3>Experience and skills we’re seeking</h3>
<ul>
<li><strong>3-5+ years of relevant technical experience or related background.</strong></li>
<li>Keen focus on JavaScript, with a firm expertise in application design, architecture, performance, testing and security.</li>
<li>Extensive experience with additional core front-end technologies (HTML5, HTML5 APIs, CSS), tools and components.</li>
<li>Some programming experience in at least one additional web language: PHP and/or Ruby are ideal.</li>
<li>A background of mobile web application implementation and/or experience with PhoneGap or other hybrid-native<br />
technologies strongly preferred.</li>
<li>Strong problem solving and analysis skills.</li>
<li>BA/BS or equivalent.</li>
<li>Not required, but excellent:
<ul>
<li>Native iOS or Android development</li>
<li>Node.js experience</li>
<li>Back-end web development experience</li>
</ul>
</li>
</ul>
<h3>Drop us a line</h3>
<p>Interested? <strong>Send us a resume and cover letter at <a href="mailto:jobs@cloudfour.com">jobs@cloudfour.com</a>.</strong></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cloudfour?a=PZOQisdmyX8:BVyYdNXXahE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=PZOQisdmyX8:BVyYdNXXahE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=PZOQisdmyX8:BVyYdNXXahE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=PZOQisdmyX8:BVyYdNXXahE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=PZOQisdmyX8:BVyYdNXXahE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=PZOQisdmyX8:BVyYdNXXahE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=PZOQisdmyX8:BVyYdNXXahE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cloudfour/~4/PZOQisdmyX8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.cloudfour.com/hiring-js-developer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.cloudfour.com/hiring-js-developer/</feedburner:origLink></item>
		<item>
		<title>Media Queries in SVG images</title>
		<link>http://feedproxy.google.com/~r/cloudfour/~3/a3MKweVb484/</link>
		<comments>http://blog.cloudfour.com/media-queries-in-svg-images/#comments</comments>
		<pubDate>Wed, 03 Apr 2013 19:51:22 +0000</pubDate>
		<dc:creator>Jason Grigsby</dc:creator>
				<category><![CDATA[Mobile Web and Services]]></category>
		<category><![CDATA[Standards]]></category>

		<guid isPermaLink="false">http://blog.cloudfour.com/?p=3166</guid>
		<description><![CDATA[“Wait? What was that Bruce Lawson just said?” That was my reaction last week as I listened to the audio from Bruce’s presentation at Responsive Day Out conference. What had Bruce said that blew my mind? It was the fact that you can embed media queries inside SVG images. Maybe this is common knowledge for [...]]]></description>
				<content:encoded><![CDATA[<p>“Wait? What was that <a href="http://www.brucelawson.co.uk/">Bruce Lawson</a> just said?”</p>
<p>That was my reaction last week as I listened to the <a href="http://huffduffer.com/adactio/103321">audio from Bruce’s presentation at <a href="http://responsiveconf.com/">Responsive Day Out</a> conference. </p>
<p>What had Bruce said that blew my mind? It was the fact that <em>you can embed media queries inside SVG images</em>.</p>
<p>Maybe this is common knowledge for everyone else, but I was stunned by the news. Today I finally got a moment to research this further and found this fantastic video from <a href="https://twitter.com/andreasbovens">Andreas Bovens</a> showing off media queries in SVG.</p>
<p><iframe src="http://www.youtube.com/embed/YAK5el8Uvrg?rel=0" frameborder="0" allowfullscreen></iframe></p>
<p>I recommend starting the video at the 3 minute 25 second mark.</p>
<p>The really cool thing about the way media queries work inside SVG is that they react to the <em>viewport of the image itself, not the viewport of the browser</em>. This means you can make decisions about how an image should look at different sizes without needing to know how that image will be used in a given page.</p>
<p>Here is the source from one of the <a href="http://people.opera.com/andreasb/demos/demos_svgopen2009/update/circle.svg">example images</a> that Andreas uses:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html5" style="font-family:monospace;">&nbsp;
<span style="color: #009900;">&lt;svg xmlns<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/2000/svg&quot;</span> xmlns:xlink<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/1999/xlink&quot;</span> <span style="color: #000066;">width</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;400&quot;</span> <span style="color: #000066;">height</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;400&quot;</span>&gt;</span>
 <span style="color: #009900;">&lt;g&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span>Simple SVG + mediaqueries<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span>
  <span style="color: #009900;">&lt;defs&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">style</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span>&gt;</span>
	#circle {
		fill: #fce57e;
		stroke: #fff;
		stroke-width: 100px;
		stroke-opacity: 0.5;
		fill-opacity: 1;
	}
	@media screen and (max-width: 350px) {
	#circle {
		fill:  #879758;
	}
	}
	@media screen and (max-width: 200px) {
	#circle {
		fill: #3b9557;
	}
	}
	@media screen and (max-width: 100px) {
	#circle {
		fill: #d8f935;
	}
	}
	@media screen and (max-width: 50px) {
	#circle {
		fill: #a8c45f;
	}
	}
	@media screen and (max-width: 25px) {
	#circle {
		fill: #2c3c0c;
	}
	}
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">style</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>defs&gt;</span>
  <span style="color: #009900;">&lt;circle cx<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;200&quot;</span> cy<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;200&quot;</span> r<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;150&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;circle&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
 <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>g&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>svg&gt;</span></pre></td></tr></table></div>

<p>SVG images with media queries embedded in them seem perfect for the <a href="http://blog.cloudfour.com/a-framework-for-discussing-responsive-images-solutions/#artdirection">responsive images art direction use case</a>.</p>
<p>The examples that Andreas shows in the video can be found at:</p>
<ul>
<li><a href="http://people.opera.com/andreasb/demos/demos_svgopen2009/update/svgscalebasic.html" rel="nofollow">Colored Circle</a></li>
<li><a href="http://people.opera.com/andreasb/demos/demos_svgopen2009/circles.html" rel="nofollow">One SVG image, with media queries triggering different colors</a></li>
<li><a href="http://people.opera.com/andreasb/demos/demos_svgopen2009/update/svgscalelogo.html" rel="nofollow">Logo, turning into a simplified logo when smaller</a></li>
<li><a href="http://people.opera.com/andreasb/demos/demos_svgopen2009/update/svgscalegold.html" rel="nofollow">Gold trend chart, turning into a sparkline when smaller</a></li>
</ul>
<p>And I would be remiss if I didn’t also share <a href="http://my.opera.com/ODIN/blog/2009/10/12/how-media-queries-allow-you-to-optimize-svg-icons-for-several-sizes">his post from 2009(!)</a> where I found the examples and the video. Andreas was so far ahead of us on this.</p>
<p>Finally, I highly recommend listening to all of the <a href="http://adactio.com/journal/6091/">audio from Responsive Day Out</a>. There’s a ton of good stuff in there.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cloudfour?a=a3MKweVb484:qMYnJ9xD8JI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=a3MKweVb484:qMYnJ9xD8JI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=a3MKweVb484:qMYnJ9xD8JI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=a3MKweVb484:qMYnJ9xD8JI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=a3MKweVb484:qMYnJ9xD8JI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=a3MKweVb484:qMYnJ9xD8JI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=a3MKweVb484:qMYnJ9xD8JI:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cloudfour/~4/a3MKweVb484" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.cloudfour.com/media-queries-in-svg-images/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://blog.cloudfour.com/media-queries-in-svg-images/</feedburner:origLink></item>
		<item>
		<title>8 Guidelines and 1 Rule for Responsive Images</title>
		<link>http://feedproxy.google.com/~r/cloudfour/~3/ALmIDJLwFXs/</link>
		<comments>http://blog.cloudfour.com/8-guidelines-and-1-rule-for-responsive-images/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 21:58:34 +0000</pubDate>
		<dc:creator>Jason Grigsby</dc:creator>
				<category><![CDATA[Mobile Web and Services]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blog.cloudfour.com/?p=3135</guid>
		<description><![CDATA[I recently had the opportunity to work with a company that is moving to a responsive design and has over 800,000 images on their site. These images come from all over the world. I learned a lot about what it means to tackle images in a responsive design on a large scale. One of the [...]]]></description>
				<content:encoded><![CDATA[<p>I recently had the opportunity to work with a company that is moving to a responsive design and has over 800,000 images on their site. These images come from all over the world. I learned a lot about what it means to tackle images in a responsive design on a large scale.</p>
<p>One of the big lessons is that we spend a lot of time discussing what the frontend solutions for responsive images should be&#8212;the new <a href="http://picture.responsiveimages.org/">picture element</a> or <a href="http://dev.w3.org/html5/srcset/">srcset</a> or a magical new image format&#8212;and little time discussing how backend systems and human processes might need to change.</p>
<p>The company I consulted has procedures in place for images. These processes include having the images enhanced if necessary, cropped to fit, resized, and then saved in a web optimized format to fit exactly how the image is used on the page. That process makes a lot of sense for the current fixed width site, but will break down when the site becomes responsive.</p>
<p>These conversations led me to document my ideal scenario. If I could wave a magic wand for organizations, what would I put in place for their responsive images processes and tools? </p>
<p>The result was eight guidelines and one rule for responsive images.</p>
<h3>8 Guidelines for Responsive Images</h3>
<h4>1. Use vector-based images or font icons whenever you can</h4>
<p><img src="http://www.w3.org/Icons/SVG/svg-logo-v.svg" style="float:left;width:25%;border:none;margin:0 10px 10px 0" alt="SVG logo" /> Wherever possible, avoid the problems of pixel-based images by using vector alternatives. </p>
<p>SVG has decent <a href="http://caniuse.com/svg">browser support</a>. The Filament Group has a project called <a href="http://filamentgroup.com/lab/grunticon/">Grunticon</a> that will generate SVG and fallback PNGs along with the CSS necessary for you.</p>
<p>Icon fonts are also a big win with <a href="http://caniuse.com/fontface">fairly wide support</a>. You can create your own fonts with just the icons you need. A bunch of images can be contained in a single HTTP Request which means icon fonts provide similar performance benefits as CSS sprites used to.</p>
<p>Just make sure you use progressive enhancement for your icon fonts and use them in an <a href="http://icomoon.io/#docs/screenreaders">accessible manner</a>.</p>
<h5>Resources</h5>
<ul>
<li><a href="http://caniuse.com/svg">Can I Use: SVG</a></li>
<li><a href="http://caniuse.com/fontface">Can I Use: Web Fonts</a></li>
<li><a href="http://filamentgroup.com/lab/grunticon/">Grunticon</a></li>
<li><a href="http://alistapart.com/article/the-era-of-symbol-fonts">A List Apart: The Era of Symbol Fonts</a></li>
<li><a href="http://icomoon.io/">IcoMoon</a></li>
<li><a href="http://pictos.cc/">Pictos</a></li>
<li><a href="http://fontforge.org/">FontForge</a></li>
</ul>
<h4>2. Encourage people to upload the highest quality source possible</h4>
<p>As prices for high-density screens go down, they are starting to show up in more devices and at larger sizes. It isn’t hard to imagine Apple releasing Retina Cinema Displays in the not so distant future.</p>
<p>Having content authors upload the highest quality image they have into whatever system you use to manage content means that you’ll be ready for whatever resolutions are needed in the future. Managing and keeping track of these assets will make life easier if you redesign the site in the future.</p>
<p>Storing the highest quality source files will likely mean an increase in storage requirements, but storage is cheap these days.</p>
<h4>3. Provide an automatic image resizing and compression service</h4>
<p>If you have a lot of images on your site, it will no longer make sense to resize them and optimize them for the web by hand.</p>
<p><a href="http://www.flickr.com/photos/whitehouse/8491445521/"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/04/michelle-obama.jpg" style="border:none" alt="White House Official Portrait of Michelle Obama resized at three different sizes" /></a></p>
<p>For example, if the client I was consulting with had decided that they needed three <a href="http://blog.cloudfour.com/how-do-you-pick-responsive-images-breakpoints/">responsive image breakpoints</a>, that would mean three times their current 800,000 images. And that is just standard definition. Multiple the number of images by two if you want to support retina displays. The end result would be 4.8 million images.</p>
<p>Now they wouldn’t have to do all the images at one time, but it still a lot of work. So instead, companies need to build or buy centralized systems that will resize and compress images.</p>
<h4>4. Images can be resized to any size with URL parameters</h4>
<p>That image resizing service? It should be able to take information that identifies a source image as well as the measurements that the image is needed at and resize the image on the fly. </p>
<p>A good example of a service like this is <a href="http://www.sencha.com/learn/how-to-use-src-sencha-io/">Sencha SRC</a>. See how you can declare in the URL just the width or the height and the service will resize the image proportionately. That’s what you want.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html5" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">img</span></span>
<span style="color: #009900;">  <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://src.sencha.io/320/http://sencha.com/files/u.jpg&quot;</span></span>
<span style="color: #009900;">  <span style="color: #000066;">alt</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;My constrained image&quot;</span></span>
<span style="color: #009900;"><span style="color: #66cc66;">/</span>&gt;</span></pre></td></tr></table></div>

<p>If you’re an Akamai customer, the Akamai Edge Image Manipulation service might do the trick for you. It is currently in beta and offers a ton of useful functionality.</p>
<p>Whatever you do, you’ll want to make sure you’re providing smart caching and not breaking external caches.</p>
<h4>5. Provide automated output of your image markup</h4>
<p>It doesn’t really matter what solution you decide to use in your markup for responsive images. My personal preference is the <a href="https://github.com/scottjehl/picturefill">PictureFill</a> solution, but there are <a href="http://blog.cloudfour.com/responsive-imgs-part-2/">many options</a> to choose from.</p>
<p>But no matter what solution you pick, you should centralize the markup so that it will be easier to change in the future.</p>
<p>For example, in your templates, you might not put any direct HTML, but instead define a series of source images and breakpoints like so:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
<span style="color: #3366CC;">&quot;source&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;/source.jpg&quot;</span><span style="color: #339933;">,</span>
<span style="color: #3366CC;">&quot;breakpoints&quot;</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
<span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;max-width&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;30em&quot;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;pixel-density&quot;</span><span style="color: #339933;">:</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;width&quot;</span><span style="color: #339933;">:</span>360px<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> 
<span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;max-width&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;30em&quot;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;pixel-density&quot;</span><span style="color: #339933;">:</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;width&quot;</span><span style="color: #339933;">:</span>720px<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;max-width&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;30em&quot;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;pixel-density&quot;</span><span style="color: #339933;">:</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;width&quot;</span><span style="color: #339933;">:</span>800px<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;max-width&quot;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;30em&quot;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;pixel-density&quot;</span><span style="color: #339933;">:</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;width&quot;</span><span style="color: #339933;">:</span>1600px<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;pixel-density&quot;</span><span style="color: #339933;">:</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;width&quot;</span><span style="color: #339933;">:</span>800px<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#123;</span> <span style="color: #3366CC;">&quot;pixel-density&quot;</span><span style="color: #339933;">:</span><span style="color: #CC0000;">2</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;width&quot;</span><span style="color: #339933;">:</span>1600px<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>And then pass that to a central function that would output the correct PictureFill markup or whatever markup you’re going to use.</p>
<p>Don’t get hung up on the syntax or the data contained in the example. The key is that by centralizing image markup in a function, you can change it quickly when the standards evolve.</p>
<h4>6. Provide a way to override resized images for art direction needs</h4>
<p>For most sites, the most important use of responsive images will be to provide different resolutions of images based on the size that the image is used on the page at a particular viewport size. That is what we call the <a href="http://usecases.responsiveimages.org/#resolution-switching">resolution switching use case</a>.</p>
<p>Occasionally you will find that simply resizing an image isn’t sufficient. A smaller version of the same image becomes unrecognizable.</p>
<p><a href="http://www.flickr.com/photos/barackobamadotcom/5795228030/"><img src="http://blog.cloudfour.com/wp-content/uploads/2012/05/obama-500.jpg" alt="Obama speaking at an auto factory. At the large size, Obama is easily recognizable." style="border:none" /></a></p>
<p>But at a smaller size, the image can be hard to discern.</p>
<p style="text-align:center"><a href="http://www.flickr.com/photos/barackobamadotcom/5795228030/"><img src="http://blog.cloudfour.com/wp-content/uploads/2012/05/obama-100.jpg" alt="The same image of Obama, but this time it is so small that you can barely make out who he is" style="border:none;" /></a></p>
<p>If you make changes to the image source at smaller sizes, the image can be easier to see.</p>
<p style="text-align:center"><a href="http://www.flickr.com/photos/barackobamadotcom/5795228030/"><img src="http://blog.cloudfour.com/wp-content/uploads/2012/05/obama-100-art.jpg" alt="The photo has been cropped so that Obama is easier to see at the small size" style="border:none" /></a></p>
<p>This is what we call the <a href="http://blog.cloudfour.com/a-framework-for-discussing-responsive-images-solutions/#artdirection">art direction use case</a>.</p>
<p>Another place where you may need art direction is for images that contain a combination of text and photography. Ideally, you can separate the photography from the text, but sometimes you can’t get the control you need and when you shrink the image, the text becomes unreadable.</p>
<p>For this recent project, we were able to identify a handful of templates where the need for art direction might be necessary. For those templates, the CMS will be modified to allow authors to upload different sources and define at what breakpoints those sources should be used.</p>
<h4>7. Integrate image compression best practices</h4>
<p>If you’re going to centralize your image resizing as a service, this is the perfect opportunity to incorporate the best tools in image compression.</p>
<p>Google has some great information on ways to <a href="https://developers.google.com/speed/docs/best-practices/payload#CompressImages">optimize images</a>. It should also go without saying that you need to set far future expires headers for your images.</p>
<h4>8. Bonus: Detect support for WebP image format and use it</h4>
<p>As long as you’re centralizing image delivery, why not look into supporting WebP? </p>
<p>The average WebP file size is <a href="https://developers.google.com/speed/webp/docs/webp_study">25% &#8211; 34% smaller</a> compared to JPEG file size. WebP compresses <a href="https://developers.google.com/speed/webp/docs/webp_lossless_alpha_study#results">34% better than libpng</a>, and 26% better than pngout for loseless images.</p>
<p>Google wrote recently about how <a href="http://blog.chromium.org/2013/02/using-webp-to-improve-speed.html">they’re checking for WebP support</a> when an image is requested and automatically serving up the WebP alternative if the browser is capable of displaying that image. </p>
<p>Ideally, browsers would simply support WebP, but in the meantime, there are some performance gains that could be had and it might not add too much to your image resizing service to support it.</p>
<h4>The one and only rule for responsive images:</h4>
<h3>Plan for the fact that whatever you implement will be deprecated</h3>
<p>No one knows what the future of responsive images holds. A few years from now, we will probably look back on the hacks we’re using and laugh at our naivety.</p>
<p>The one thing we can be certain about is that we’re going to need to replace what we implement now when standards catch up with responsive images.</p>
<p>So whatever you build, make sure it is flexible and can be changed easily when the ultimate solution for responsive images becomes apparent.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cloudfour?a=ALmIDJLwFXs:nLuYTb1vGu0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=ALmIDJLwFXs:nLuYTb1vGu0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=ALmIDJLwFXs:nLuYTb1vGu0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=ALmIDJLwFXs:nLuYTb1vGu0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=ALmIDJLwFXs:nLuYTb1vGu0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=ALmIDJLwFXs:nLuYTb1vGu0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=ALmIDJLwFXs:nLuYTb1vGu0:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cloudfour/~4/ALmIDJLwFXs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.cloudfour.com/8-guidelines-and-1-rule-for-responsive-images/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		<feedburner:origLink>http://blog.cloudfour.com/8-guidelines-and-1-rule-for-responsive-images/</feedburner:origLink></item>
		<item>
		<title>Responsive Design for Apps — Part 3</title>
		<link>http://feedproxy.google.com/~r/cloudfour/~3/0m5P3Ztxbzk/</link>
		<comments>http://blog.cloudfour.com/responsive-design-for-apps-part-3/#comments</comments>
		<pubDate>Thu, 28 Mar 2013 22:25:45 +0000</pubDate>
		<dc:creator>Jason Grigsby</dc:creator>
				<category><![CDATA[Mobile Web and Services]]></category>

		<guid isPermaLink="false">http://blog.cloudfour.com/?p=3102</guid>
		<description><![CDATA[This is Part 3 in a series about Responsive Design for Apps. Part 1 talks about why responsive design for apps is inevitable. Part 2 presents a case study in redesigning a desktop app to be responsive and the interfaces in Part 2 are instructive when comparing them to the screenshots in this post. After [...]]]></description>
				<content:encoded><![CDATA[<p>This is Part 3 in a series about Responsive Design for Apps. <a href="http://blog.cloudfour.com/responsive-design-for-apps-part-1/">Part 1</a> talks about why responsive design for apps is inevitable. <a href="http://blog.cloudfour.com/responsive-design-for-apps-part-2/">Part 2</a> presents a case study in redesigning a desktop app to be responsive and the interfaces in Part 2 are instructive when comparing them to the screenshots in this post.</p>
<p>After working on the <a href="http://blog.cloudfour.com/responsive-design-for-apps-part-2/">expense reimbursement form app</a>, I realized that the end result was very similar to what Apple and Microsoft are doing in trying to provide a cohesive experience across devices.</p>
<h3>Desktop operating systems are leading the way</h3>
<p>One of the big shifts that both Apple and Microsoft have undertaken has been to incorporate the lessons that they’ve learned from mobile and start to apply them to their desktop operating systems. </p>
<p>The features of OS X Lion centered on innovation from iOS being taken “<a href="http://www.engadget.com/2010/10/20/live-from-apples-back-to-the-mac-event/">Back to the Mac</a>” and Mountain Lion <a href="http://www.macstories.net/stories/os-x-mountain-lion-the-ios-ification-continues-this-summer/">continued that trend</a>.</p>
<p>While Apple has taken a gradual approach, Microsoft has made a radical shift by taking the design developed for Windows Phone 7, formerly called the <a href="http://en.wikipedia.org/wiki/Metro_(design_language)">Metro UI</a>, and applying it to all devices.</p>
<p>We’re seeing how both Apple and Microsoft are reusing patterns across all their devices and how those patterns have their roots in the mobile design. As I mentioned in <a href="http://blog.cloudfour.com/responsive-design-for-apps-part-1/">Responsive Design for Apps — Part 1</a>, it is much easier to go from something designed for small screens and touch and adapt it to large screens with keyboard and mouse than it is to go in the opposite direction. </p>
<p>Let’s take a look at Apple’s Mail App as an example.</p>
<h4>iPhone Mail App: Nested Doll Design Pattern</h4>
<p>The iPhone’s Mail App uses what <a href="http://rachelhinman.com/">Rachel Hinman</a> described as the nested doll design pattern in her book <i><a href="http://rosenfeldmedia.com/books/the-mobile-frontier/">The Mobile Frontier: A Guide for Designing Mobile Experiences</a></i>.</p>
<p>Rachel writes:</p>
<blockquote><p>Mobile experiences that employ the nested doll pattern are all about funneling users to detailed content…It’s a pattern that has a strong sense of forward/back movement.</p></blockquote>
<p>You can see pattern in action in this screenshot of the iPhone’s Mail App:</p>
<p style="text-align:center"><a href="http://blog.cloudfour.com/wp-content/uploads/2013/02/iphone-mail-app-large.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/02/iphone-mail-app-sml.png" alt="Multiple screens of the iPhone’s Mail App showing the funneling nature of the user interaction" style="border:none" /></a></p>
<p>There are thousands of apps that use this same design pattern.</p>
<h4>iPad Mail App: Bento Box</h4>
<p>The Mail App on iPad uses a different design pattern—one that Rachel describes as the Bento Box pattern:</p>
<blockquote><p>Just like a bento box from a Japanese restaurant, this pattern carves up the surface area of a mobile device’s screen into small compartments, each portion contributing to the overall experience. This pattern is a good way to express sets of information that are strongly related to each other, and it is more commonly used on tablets than smartphone experiences.</p></blockquote>
<p>You can see how the selection of information on the left side of the screen affects what is visible on the right side in the example below:</p>
<p style="text-align:center"><a href="http://blog.cloudfour.com/wp-content/uploads/2013/02/ipad-mail-app-lrg.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/02/ipad-mail-app-sml.png" alt="iPad Mail App" style="border:none" /></a></p>
<p>One of the things to notice in the screenshot above is that the panel on the left is still acting like the nested doll pattern until an individual email is selected. Once a single email is selected, the details of the email show up on the right.</p>
<p>In fact, the left panel is almost exactly the same both in look and experience as the iPhone version of the app. The panel is even the <em>same width</em> as the iPhone screens. The only difference is that the panel has become taller to fit the size of the screen.</p>
<p>Looking at the Mail App in portrait orientation on the iPad finds a similar pattern:</p>
<p style="text-align:center"><a href="http://blog.cloudfour.com/wp-content/uploads/2013/02/ipad-portrait-mailboxes-large.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/02/ipad-portrait-mailboxes-sml.png" alt="Mail App in Portrait on iPad" style="border:none;"></a></p>
<p>Again, the nested dolls pattern exists, but is now operating inside a pull down menu instead of in a left panel. And again, the size of the panel is consistent with the width utilized on the iPhone, but the height has been adjusted to take advantage of the larger screen.</p>
<h4>Mail App on Mac</h4>
<p>I’m not sure what to call the design pattern on the Mac version of the Mail App. We can see the same patterns that we saw on iPhone and iPad have been extended to take advantage of the fact that there is more available screen real estate.</p>
<p style="text-align:center;"><a href="http://blog.cloudfour.com/wp-content/uploads/2013/02/desktop-mail-app-lrg.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/02/desktop-mail-app-sml.png" alt="Mail App on Mountain Lion" style="border:none;" /></a></p>
<p>The mail accounts and folder screens have be combined into a single view on this screen. The nested doll pattern is gone. But the email list and view an email screens are almost exactly the same as what we saw on the iOS devices.</p>
<p>The similarities between all three versions of the apps are striking.</p>
<h3>How different is the Mail App from a Responsive Design?</h3>
<p>When I look at the way Apple’s Mail App uses the same elements across the different screen sizes, I see many similarities to responsive design. While the design is probably more accurately described as an <a href="http://uxdesign.smashingmagazine.com/2012/11/08/ux-design-qa-with-christian-holst/">adaptive layout</a> because of the multiple fixed sizes, it seems pretty clear how the Mail App design could easily become responsive if necessary.</p>
<p>Were I to rebuild Apple’s Mail App as a responsive design, I would start with the mobile screens as modules. Then as the screen got bigger, I’d use something akin to the <a href="http://filamentgroup.com/lab/ajax_includes_modular_content/">AJAX include pattern</a> to bring more modules into view.</p>
<p>And in fact, this is what we have in mind for the expense reimbursement form that I discussed in <a href="http://blog.cloudfour.com/responsive-design-for-apps-part-2/">Part 2</a>. It starts with a nested doll pattern design pattern that shifts to a bento box pattern as the screen gets bigger.</p>
<h3>The future of web design</h3>
<p>I believe this is where we will be heading not only for apps, but also for web pages as well. We’re going to evolve beyond designing pages to building discrete building blocks (or modules) that are inherently responsive unto themselves. Then we’ll build systems and rules that define when and where those modules are pulled into the page and displayed.</p>
<p>This is one of the reasons why I think JavaScript UI frameworks will follow the lead of Apple and Microsoft and start to seek consistency between their mobile and desktop frameworks. If the widgets in these frameworks were designed to be responsive and accomodate different inputs, then they would be ideal building blocks for a responsive app.</p>
<p>How we build the systems to pull in the necessary building blocks will shift from project to project. I suspect many will use solutions like the aforementioned AJAX Include pattern to dynamically add modules to a page based on screen size and capabilities. But some may require <a href="http://www.lukew.com/ff/entry.asp?1509">device experiences</a> or <a href="http://www.lukew.com/ff/entry.asp?1392">RESS</a>-based solutions.</p>
<p>But regardless of the techniques used, I firmly believe we will be building apps that are responsive in nature. As Stephanie Rieger said, “<a href="http://stephanierieger.com/responsiveness-is-a-characteristic/">choosing responsiveness, as a characteristic shouldn’t necessarily define the wider implementation approach</a>”.</p>
<h3>Responsiveness for apps is inevitable</h3>
<p>When I look at the <a href="http://blog.cloudfour.com/responsive-design-for-apps-part-1/">landscape of devices and the diversity within form factors</a>, I find it inconceivable that even solutions built around delivering different code to different form factors won’t also find it important to be responsive. </p>
<p>The lines are blurring so quickly now that when we design web apps, we need to take into consideration how that app will respond to different screen sizes and inputs even if the app isn’t built exclusively using the three main technical pieces of responsive design (media queries, fluid grids and flexible images).</p>
<p>So it’s time to give up our collective hallucination and embrace the inherent nature of the web for apps as well as for pages. </p>
<p>These aren’t easy problems to solve and the implementation may require more than “pure” responsive design, but when we do take the time to think about our apps in a responsive manner, we build better, more <a href="http://futurefriend.ly">future-friendly</a> solutions for everyone.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cloudfour?a=0m5P3Ztxbzk:JFaOMYw_A6A:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=0m5P3Ztxbzk:JFaOMYw_A6A:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=0m5P3Ztxbzk:JFaOMYw_A6A:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=0m5P3Ztxbzk:JFaOMYw_A6A:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=0m5P3Ztxbzk:JFaOMYw_A6A:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=0m5P3Ztxbzk:JFaOMYw_A6A:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=0m5P3Ztxbzk:JFaOMYw_A6A:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cloudfour/~4/0m5P3Ztxbzk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.cloudfour.com/responsive-design-for-apps-part-3/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://blog.cloudfour.com/responsive-design-for-apps-part-3/</feedburner:origLink></item>
		<item>
		<title>Responsive Design for Apps — Part 2</title>
		<link>http://feedproxy.google.com/~r/cloudfour/~3/KYoMJ_xv_3A/</link>
		<comments>http://blog.cloudfour.com/responsive-design-for-apps-part-2/#comments</comments>
		<pubDate>Thu, 28 Mar 2013 21:18:40 +0000</pubDate>
		<dc:creator>Jason Grigsby</dc:creator>
				<category><![CDATA[Mobile Web and Services]]></category>

		<guid isPermaLink="false">http://blog.cloudfour.com/?p=2989</guid>
		<description><![CDATA[Recently, I was tasked with helping a client determine if they could convert both their site and web apps to responsive design. In my Part 1 of this series, I outlined why it seems inevitable that the sorts of JavaScript UI frameworks that our client was using will eventually be responsive. But it is one [...]]]></description>
				<content:encoded><![CDATA[<p>Recently, I was tasked with helping a client determine if they could convert both their site and web apps to responsive design. In my <a href="http://blog.cloudfour.com/responsive-design-for-apps-part-1">Part 1 of this series</a>, I outlined why it seems inevitable that the sorts of JavaScript UI frameworks that our client was using will eventually be responsive.</p>
<p>But it is one thing to say that you believe that JavaScript UI frameworks will eventually be responsive. It is another thing altogether to figure out what should be done with an existing app built to desktop UI conventions that would need to be made responsive.</p>
<p>Basically, it wouldn’t make sense for our client to bet their future on responsive design unless it could be demonstrated that the types of things they are building with these JavaScript UI frameworks could also be built in a responsive manner.</p>
<p>So I picked a web app that was representative of the way in which they’ve been using the <a href="http://www.telerik.com/">Telerik widgets</a> and decided to figure out how I would make it responsive.</p>
<h3>Expense Reimbursement Form</h3>
<p>The app that I chose is one that you might find on any large company’s intranet: a reimbursement form. Because this was an existing app, my goal was to find a way to keep the app as close to its original form as possible. If we were starting from scratch, we might find a different solution.</p>
<p>It’s also important to note that this isn’t the most complex application you’ll ever see. But it does represent the types of things they’re using the UI widgets for.</p>
<h3>The Existing App</h3>
<p>The existing app is designed around a couple of Telerik’s widgets: the <a href="http://demos.telerik.com/aspnet-ajax/tabstrip/examples/overview/defaultcs.aspx">TabStrip</a> and <a href="http://demos.telerik.com/aspnet-ajax/grid/examples/overview/defaultcs.aspx">Grid</a> tools.</p>
<p>The app starts with a screen containing some instructions, tabs to switch to different areas of the expense report, and a total of the current report at the bottom.</p>
<p><a href="http://blog.cloudfour.com/wp-content/uploads/2013/01/reimbursement-form1.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/01/reimbursement-form1.png" alt="Home screen of the reimbursement form app" /></a></p>
<p>Clicking on each individual tab takes you to a screen for that type of expense. The information collected for a mileage expense is different than the information that is collected for lodging. Each tab has a table showing the current list of expenses.</p>
<p><a href="http://blog.cloudfour.com/wp-content/uploads/2013/01/reimbursement-form2.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/01/reimbursement-form2.png" alt="Mileage tab in the reimbursement form. Contains a table of current mileage expenses." /></a></p>
<p>On this screen, you can begin to see the benefits that the developers are getting from the widgets. The <a href="http://demos.telerik.com/aspnet-ajax/grid/examples/overview/defaultcs.aspx">grid widget</a> is used to layout the table. It also makes the table sortable and selectable. Each row can be selected and then edited, copied or deleted. Behind the scenes, the grid widget is allowing the developers to retrieve JSON results and populate the table automatically.</p>
<p>If you select a row to edit or add a new expense, you get a modal with a web form. There is nothing terribly special about the form other than their use of some handy widgets for things like the date picker.</p>
<p><a href="http://blog.cloudfour.com/wp-content/uploads/2013/01/reimbursement-form3.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/01/reimbursement-form3.png" alt="A web form used to edit a mileage expense entry." /></a></p>
<p>There are other screens for the app, but this is the core of the interaction. And while it may seem simple up front, the backend systems that this app integrates with are terribly complex so building it was no small feat.</p>
<h3>How to convert this to a responsive design?</h3>
<p>After finding that the <a href="http://blog.cloudfour.com/responsive-design-for-apps-part-1/">majority of the JavaScript UI frameworks were not designed to support responsive design</a>, I decided to try to figure out what they might do with something like the grid widget if it were built responsively.</p>
<p>I looked at the tabs and the tables and tried to figure out how to shrink them to fit on mobile.</p>
<p>And I got stuck. Gloriously stuck. Banging my head on the desk stuck.</p>
<h3>Mobile first design</h3>
<p>After a couple of hours of struggle to envision the app as responsive, I decided to give up on making the desktop app responsive. I was beginning to think that the people who say that web apps can’t be responsive were right.</p>
<p>I figured if I can’t make it responsive, I better figure out what the mobile version of the app should look like because that will be the next step.</p>
<p>Now I’ve seen a lot of people argue against mobile first design. Most recently, Henry Blodget called <a href="http://www.businessinsider.com/survey-mobile-first-bad-strategy-2012-12?comments_page=1&amp;pundits_only=0#comment-50d65c7aeab8ea5623000035">mobile first a dumb strategy</a>. He wrote:</p>
<blockquote><p>As a result, the prevailing wisdom is that companies should become:</p>
<ul>
<li>&#8220;<strong>Mobile Only</strong>&#8221; (just forget big screens, keyboards, and mice&#8211;they&#8217;re dead)</li>
</ul>
<p>Or, at least,</p>
<ul>
<li>&#8220;<strong>Mobile First</strong>&#8221; (design everything for smartphones first and big screens as an afterthought)</li>
</ul>
</blockquote>
<p>Frankly, the only people who have ever argued that mobile first means that other form factors are an afterthought are people building straw man arguments and ignoring what mobile first actually says.</p>
<p>Luke Wroblewski’s <a href="http://www.lukew.com/ff/entry.asp?933">mobile first arguments</a> can be summarized simply as mobile is a huge opportunity, mobile has some capabilities that aren’t practical on other platforms, and the constraints of mobile cause you to focus and build better designs.</p>
<p><a title="Luke’s Mobile First book is a great read and well-worth the time." href="http://www.abookapart.com/products/mobile-first"><img style="border: none;" src="http://blog.cloudfour.com/wp-content/uploads/2013/01/ABA-hero-6.jpg" alt="Luke Wroblewski’s Mobile First Book" /></a></p>
<p>From my perspective, the opportunity on mobile should be obvious. Using the capabilities of mobile (like geolocation) are great enhancements. But the real power comes from designing the mobile interface first.</p>
<p>Every time I design the mobile interface first, I find that I learn things that make the wide screen version better. <a href="http://gettingreal.37signals.com/ch03_Embrace_Constraints.php">Embracing constraints</a>, particularly in design, is tremendously powerful.</p>
<h3>How do you apply mobile first design to a desktop app?</h3>
<p>The most common complaint I’ve heard about mobile first design is that it sounds great if you don’t already have a desktop site or app, but not everyone has that luxury.</p>
<p>But even if you have an existing desktop design, mobile first thinking can be useful. That mindset is what helped me see how the reimbursement form could be retooled to be a responsive design.</p>
<p>After I got stuck, I decided to set aside the desktop app entirely and design the app for mobile. I wasn’t convinced that responsive design was going to work so I decided to assume that the mobile app would be a separate application. What would make a great experience for mobile?</p>
<p><a href="http://www.appcooker.com"><img style="float: left; margin: 0 10px 10px 0; border: none;" src="http://blog.cloudfour.com/wp-content/uploads/2013/01/AppCooker.jpg" alt="" /></a>To aid me, I used an iPad application called <a href="http://www.appcooker.com">AppCooker</a> to build mobile wireframes. I’ve become a big fan of this application because I can quickly build wireframes and simple prototypes of interactions. Plus, it is nice to get away from the keyboard and mouse and do actual work on an iPad.</p>
<p>While AppCooker works for me, it doesn’t matter what tool you use. A pencil and paper would work just as well. The point is to use the mobile design as a forcing function to make you think through what really matters.</p>
<h3>A mobile reimbursement form</h3>
<p>So I started designing a mobile app version of the reimbursement form. As I thought about the form, I realized that the desktop app didn’t feel much like a form. I wanted to put make it clear that this was something you are filling out and submitting.</p>
<p style="text-align: center;"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/01/Home-Screen.png" alt="Mobile reimbursement form home screen" /></p>
<p>I realized that the little summary table at the bottom of the desktop app was the core of the form. You add a bunch of expenses in each category, it totals it for you, and then you hit submit.</p>
<p>Designing it this way meant that another tenet of mobile design was being used. The content itself was the interface. Instead of using tabs to navigate, each row in the form both served to summarize the amount for that category as well as a link to go edit the expenses in that category.</p>
<p>With the home screen done, I had to figure out what someone would see when they went to edit an expense category. On desktop, each row in the grid had multiple columns of information. There wasn’t enough room for that level of detail on the smaller screen.</p>
<p style="text-align: center;"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/01/Mileage.png" alt="Mileage expenses" /></p>
<p>I had to think through what really mattered for these expenses. While all of the data being collected is important, what information would make it possible for someone using the app to quickly identify which expense was which and also determine how much they were being compensated.</p>
<p>In this case, the title of the expense, date of expense, miles traveled, and cost seemed like the most important things.</p>
<p>Again, seeing the details, editing or deleting each expense became easy. Tap on the expense to get to the details of that expense and act on them.</p>
<p style="text-align: center;"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/01/Mileage-Details.png" alt="Mileage expense form" /></p>
<p>Now, these wireframes aren’t perfect. Looking at them a few months later, I can see things that I would love to change. But they serve their purpose. They describe how the reimbursement form could be done on mobile in an efficient manner.</p>
<h3>Mobile interfaces map well to the desktop app</h3>
<p>When I had finished with these wireframes, I woke my computer from sleep and decided to compare what I had done to the original application. I was surprised at how well the mobile app mapped to the original application.</p>
<p><a href="http://blog.cloudfour.com/wp-content/uploads/2013/01/home-mobile-desktop-map.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/01/home-mobile-desktop-map.png" alt="The mobile home screen maps to the form’s total and the tabs across the top of the interface." style="border:none" /></a></p>
<p>The widget at the bottom of the screen that tracked the expense total had become the home screen of the mobile app. The tabs had been replaced by each row in the form.</p>
<p><a href="http://blog.cloudfour.com/wp-content/uploads/2013/01/mileage-mobile-desktop-map.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/01/mileage-mobile-desktop-map.png" alt="Mileage screen on mobile mapped to desktop" style="border:none" /></a></p>
<p>The mileage screen was almost a direct comparison except with less information in each row. Also, instead of the less intuitive select a row and then hit buttons. Selecting a row took you to the detail page.</p>
<p><a href="http://blog.cloudfour.com/wp-content/uploads/2013/01/mileage-details-mobile-desktop-map.png"><img src="http://blog.cloudfour.com/wp-content/uploads/2013/01/mileage-details-mobile-desktop-map.png" alt="Mobile mileage detail page mapped to the desktop screen" style="border:none" /></a></p>
<p>And of course the detail screen mapped almost directly to the expense modal on desktop. It also made it see the current values and edit them.</p>
<p>Once I saw how well mobile was mapping to desktop, I began to think that responsive design might be possible. Not only that, but I was beginning to believe the mobile interface was superior to the desktop one.</p>
<h3>Rethinking the desktop version</h3>
<p>At this point, I decided to take a look at what the desktop version might look like if it was influenced by the mobile version. My goal was to keep the grid widget in the design and minimize changes to the desktop functionality as much as possible.</p>
<p><img src="http://blog.cloudfour.com/wp-content/uploads/2013/01/wide-screen-layout.png" alt="Widescreen mockup" /></p>
<p>I would be the first to admit that this interface feels off. It is because we’re mixing widgets that are part of the mobile UI framework with ones that are designed for the desktop framework. I think the app would feel more cohesive if we ditched the desktop widgets and focused on using the mobile widgets for all screen resolutions.</p>
<p>But for our purposes, the wireframe proved what we needed to see. It was possible for us to envision a design that could start with mobile screens and add functionality as the screen got larger. It was now possible for us to see how we might make apps responsive even if we weren’t exactly certain how we would handle converting the current application to a responsive design.</p>
<h3>So how did the app turn out?</h3>
<p>On the one hand, the exercise accomplished our goal. It was clear how responsive design could be applied to their applications. More importantly, we identified the process by which designers should think through how to convert existing apps.</p>
<p>For this particular app, the assessment was that it wouldn’t be worth making the current code base responsive. While we might be able to convert the Telerik-based app to be responsive, we know that Telerik’s framework has been declared end-of-life so it doesn’t make sense to invest time and money into a system that is deprecated.</p>
<p>Instead, the device detection will be used to route people on mobile devices to a mobile app. The mobile app will be built responsively. And when they are confident that the app works as expected, it will replace the desktop version.</p>
<p>In <a href="http://blog.cloudfour.com/responsive-design-for-apps-part-3/">Part 3</a>, I look at similar changes that are happening with native desktop apps and what we might learn from them.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cloudfour?a=KYoMJ_xv_3A:8NvngKHjEfM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=KYoMJ_xv_3A:8NvngKHjEfM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=KYoMJ_xv_3A:8NvngKHjEfM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=KYoMJ_xv_3A:8NvngKHjEfM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=KYoMJ_xv_3A:8NvngKHjEfM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=KYoMJ_xv_3A:8NvngKHjEfM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=KYoMJ_xv_3A:8NvngKHjEfM:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cloudfour/~4/KYoMJ_xv_3A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.cloudfour.com/responsive-design-for-apps-part-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.cloudfour.com/responsive-design-for-apps-part-2/</feedburner:origLink></item>
		<item>
		<title>Welcoming Tyler Sticka to Cloud Four</title>
		<link>http://feedproxy.google.com/~r/cloudfour/~3/8xlO-Zjj29w/</link>
		<comments>http://blog.cloudfour.com/welcoming-tyler-sticka-to-cloud-four/#comments</comments>
		<pubDate>Mon, 25 Mar 2013 16:23:20 +0000</pubDate>
		<dc:creator>Jason Grigsby</dc:creator>
				<category><![CDATA[Mobile Web and Services]]></category>
		<category><![CDATA[Portland]]></category>

		<guid isPermaLink="false">http://blog.cloudfour.com/?p=3073</guid>
		<description><![CDATA[We’re pleased to announce that Tyler Sticka is joining Cloud Four today. Tyler is someone whose work I have long admired. His portfolio speaks for itself. He has designed games, created illustrations, guided projects, and teaches a course on web standards. Most importantly, he is passionate about the web and pushing the boundaries of what [...]]]></description>
				<content:encoded><![CDATA[<p>We’re pleased to announce that <a href="http://tylersticka.com">Tyler Sticka</a> is joining Cloud Four today.</p>
<p>Tyler is someone whose work I have long admired. His <a href="http://tylersticka.com/portfolio/">portfolio</a> speaks for itself. He has designed games, created illustrations, guided projects, and teaches a course on web standards.</p>
<p>Most importantly, he is passionate about the web and pushing the boundaries of what it can do. I think he will fit in nicely. :-)</p>
<p>On an unrelated note, when I started to write this post, I searched to see what I had written when <a href="http://www.matthewgifford.com/">Matt Gifford</a> joined Cloud Four back in 2011. I realized that we had been remiss and had forgotten to write something back then.</p>
<p>So in hopes that it is not too late to remedy that oversight, I wanted to belatedly say that like Tyler, Matt was someone we knew and admired from his role in the tech community. Not only has he become a critical member of our team building complex JavaScript applications, but he has stepped up as the primary organizer of <a href="http://mobileportland.com">Mobile Portland</a>’s monthly meetings.</p>
<p>The best thing about starting Cloud Four has been the opportunity to work with an amazing team. I feel truly privileged to get to work with some of the smartest people I know. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/cloudfour?a=8xlO-Zjj29w:oxbKIgniAPQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=8xlO-Zjj29w:oxbKIgniAPQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=8xlO-Zjj29w:oxbKIgniAPQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=8xlO-Zjj29w:oxbKIgniAPQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=8xlO-Zjj29w:oxbKIgniAPQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/cloudfour?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/cloudfour?a=8xlO-Zjj29w:oxbKIgniAPQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/cloudfour?i=8xlO-Zjj29w:oxbKIgniAPQ:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/cloudfour/~4/8xlO-Zjj29w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.cloudfour.com/welcoming-tyler-sticka-to-cloud-four/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.cloudfour.com/welcoming-tyler-sticka-to-cloud-four/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.416 seconds. --><!-- Cached page generated by WP-Super-Cache on 2013-05-15 19:59:31 -->
