{"id":3917,"date":"2014-08-14T19:59:08","date_gmt":"2014-08-15T03:59:08","guid":{"rendered":"http:\/\/blog.mozilla.org\/webdev\/?p=3917"},"modified":"2016-01-05T13:58:19","modified_gmt":"2016-01-05T21:58:19","slug":"animating-firefox-desktop","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/","title":{"rendered":"Animating the Firefox Desktop Pages"},"content":{"rendered":"<p>As you may have noticed, Firefox for desktop computers (Windows, Mac, and Linux) got a redesigned interface with the release of <a href=\"https:\/\/www.mozilla.org\/firefox\/29.0\/releasenotes\/\">Firefox 29.0<\/a>. This redesigned browser called for redesigned web pages to showcase the new interface (the tabs, icons, menus, etc., collectively called &#8220;browser chrome&#8221;) and new features (especially the new customization menu)<\/p>\n<p>Naturally, the main audience for these pages are people using browsers that aren&#8217;t Firefox, so we wanted to illustrate the new Firefox design in a fun and compelling way that gives them a real sense of what it looks like, hopefully encouraging folks to download it and see it first hand. Another big target audience are Firefox users who haven&#8217;t yet updated, so we needed to give them an overview of what&#8217;s new.<\/p>\n<p>This also gave us a chance to create some snazzy animations to show off some of the advances in CSS and SVG supported by the current generation of browsers, both on desktop computers and mobile devices. Here&#8217;s how we made it.<\/p>\n<p><a href=\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim1.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-large wp-image-3918\" src=\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim1-600x361.jpg\" alt=\"\" width=\"600\" height=\"361\" srcset=\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim1-600x361.jpg 600w, https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim1-252x151.jpg 252w, https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim1.jpg 1164w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<h2>Browser Chrome Animations<\/h2>\n<p>In order to demonstrate features of Firefox, we needed to simulate the way interface elements respond to user actions; opening and closing tabs, rearranging icons, adding a bookmark, and so on. This called for fairly complicated animation sequences that had to be quick and buttery smooth. The complex interplay of multiple elements moving both sequentially and in tandem really drove home the need for a <a href=\"http:\/\/ffdevtools.uservoice.com\/forums\/246087-firefox-developer-tools-ideas\/suggestions\/5789812-css-animation-editor\">CSS animation editor<\/a> (vote it up!).<\/p>\n<h3>Approach &amp; structure<\/h3>\n<p>Each animation illustrating the browser chrome (<a href=\"https:\/\/www.mozilla.org\/firefox\/desktop\/#customize\">One<\/a>, <a href=\"https:\/\/www.mozilla.org\/firefox\/desktop\/customize\/\">Two<\/a>, <a href=\"https:\/\/www.mozilla.org\/firefox\/desktop\/fast\/#feel\">Three<\/a>) is wrapped in a <code>div<\/code> element with a common class applied (<code>animation-wrapper<\/code>), along with an <code>id<\/code> we can use to target the specific element with JavaScript.<\/p>\n<p>The first element inside the animation wrapper is a composite fallback image for browsers that don&#8217;t support CSS animations. This image has a common classname (<code>fallback<\/code>) for easy CSS targeting. We can conditionally hide this image by leveraging the <code>cssanimations<\/code> class <a href=\"http:\/\/modernizr.com\/\">Modernizr<\/a> applies to the <code>body<\/code>. By first assuming that animation is <em>not<\/em> supported, we ensure a functional degradation for even the oldest and least capable browsers, and we can progressively enhance the page for more advanced browsers that support the more advanced features.<\/p>\n<p>The next element inside the wrapper <code>div<\/code> is the stage for the entire animation \u2013 <code>&lt;div class=\"stage\"&gt;<\/code>, really just an invisible box in which other elements can move around. Using the same <code>cssanimations<\/code> class from Modernizr, we&#8217;ll display the stage for browsers that can handle the animation.<\/p>\n<pre lang=\"css\">\/* for legacy browsers *\/\r\n.fallback {\r\n    display: block;\r\n}\r\n\r\n.stage {\r\n    display: none;\r\n}\r\n\r\n\/* for modern browsers *\/\r\n.cssanimations {\r\n    .fallback {\r\n        display: none;\r\n    }\r\n\r\n    .stage {\r\n        display: block;\r\n    }\r\n}\r\n<\/pre>\n<p>(We use <a href=\"http:\/\/lesscss.org\/\">Less<\/a> to preprocess our CSS, so those nested rules are converted into separate rules with descendant selectors.)<\/p>\n<p>The final task is to trigger the animations only when they come into view, as there&#8217;s no sense running an animation while it&#8217;s off screen. We used <a href=\"http:\/\/imakewebthings.com\/jquery-waypoints\/\">jQuery Waypoints<\/a> to monitor the page&#8217;s scroll position, adding an <code>animate<\/code> class to each wrapper <code>div<\/code> when it comes into view. The addition of that class sets off the CSS animation sequence.<\/p>\n<pre lang=\"css\">.animating-element {\r\n    position: absolute;\r\n    top: 10px;\r\n    right: 40px;\r\n}\r\n\r\n\/* animate class added via JavaScript\/Waypoints based on scroll position *\/\r\n.animate {\r\n    .animating-element {\r\n        animation: moveAround 0.7s ease 0s 1 normal forwards;\r\n    }\r\n}\r\n<\/pre>\n<p>This approach worked well and helped us keep each animation block self-contained and modular. It provided a common and easily customizable HTML &amp; CSS structure for each animation, and less capable browsers still have access to all the content in a well styled page. Within that stage box we can add any other content or elements we need.<\/p>\n<h2>Timing is everything<\/h2>\n<p>The browser chrome animations have multiple elements with multiple animations applied, so getting the timing just right became rather tedious. Because separate animations are completely independent in CSS, there&#8217;s no simple way to tell a browser to &#8220;start animationY 2.1 seconds after animationX completes.&#8221; Instead, you need to do the calculations yourself and hard code them into each animation declared in the CSS, liberally using <code>animation-duration<\/code> and <code>animation-delay<\/code> to fire off each step of the scene in sequence. The mental gymnastics go something like this:<\/p>\n<blockquote><p>Step 1 has a 0.7 second delay and runs for 1.5 seconds. Then Step 2 should start 1.4 seconds after Step 1 completes, so it should have a delay of\u2026 3.6 seconds. Step 2 runs for 2 seconds, and Step 3 needs to begin a quarter of a second before Step 2 completes, so Step 3 needs a delay of 5.35 seconds\u2026<\/p><\/blockquote>\n<p>As you can imagine, the more elements you animate and the more steps you have in the sequence, the harder the math becomes. Adjusting the timing of one step in the chain can mean adjusting all the subsequent steps to compensate.<\/p>\n<p>Designer Ty Flanagan created video mockups in <a href=\"http:\/\/www.adobe.com\/products\/aftereffects\">Adobe After Effects<\/a> to serve as a guide for the CSS animation, which was an enormous help. There was still a fair amount of fine tuning to be done by hand, constantly refreshing the page and tweaking a few milliseconds until it just &#8220;felt right,&#8221; but that process could have taken much longer without the videos for reference.<\/p>\n<p>Another way to do all of this would have been controlling the chained animations in JavaScript, relying on the <code>animationend<\/code> event to fire off the next step in the sequence. However, a bunch of event listeners and <code>setTimeout<\/code> calls in a script probably wouldn&#8217;t have been a faster or better approach.<\/p>\n<h2>Animations in a Circle<\/h2>\n<p>Some of our favorite animations are the <a href=\"https:\/\/www.mozilla.org\/firefox\/desktop\/customize\/#customize\">customize icons<\/a>, mostly because the circular mask effect is so neat in its simplicity.<\/p>\n<p><a href=\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim2.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-large wp-image-3919\" src=\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim2-600x211.jpg\" alt=\"\" width=\"600\" height=\"211\" srcset=\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim2-600x211.jpg 600w, https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim2-252x88.jpg 252w, https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim2.jpg 1164w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p>The key to achieving the circular mask is a bit of absolute positioning and the incredibly versatile <code>border-radius<\/code>. The markup isn&#8217;t too complex \u2013 a stage to contain everything, a <code>div<\/code> for the circular mask, and whatever elements need to be animated.<\/p>\n<pre lang=\"html4strict\"><\/pre>\n<div class=\"stage\">\n<div class=\"circle-mask\"><\/div>\n<p>&nbsp;<\/p>\n<div id=\"animated-block1\" class=\"animated\"><\/div>\n<p>&nbsp;<\/p>\n<div id=\"animated-block2\" class=\"animated\"><\/div>\n<\/div>\n<p>If you&#8217;d like to see an example and play around with the code before reading about the methodology, <a href=\"http:\/\/codepen.io\/jpetto\/pen\/ytrlb\">here&#8217;s a little demo on CodePen<\/a>.<\/p>\n<h3>The stage<\/h3>\n<p>The stage has a set height and width with a hidden overflow and relative positioning. The background color of the stage fills the circular mask.<\/p>\n<pre lang=\"css\">.stage {\r\n    position: relative;\r\n    width: 300px;\r\n    height: 180px;\r\n    overflow: hidden;\r\n    background: #fff;\r\n}\r\n<\/pre>\n<h3>The circular mask<\/h3>\n<p>The circular mask is absolutely positioned at the center of the stage, calculated by <code>(stage width - (mask width + mask border width))\/2<\/code> (this equation could be simpler with <code>box-sizing: border-box<\/code>). The mask has a wide enough border to reach just past the furthest boundary of the stage. The border bumping up against the page background is what completes the illusion of the mask, so the mask&#8217;s border color matches that of the section&#8217;s background color (sadly, this means the technique only works with a solid colored background).<\/p>\n<p>To make sure the mask covers the animated elements, it has a <code>z-index<\/code> at least one higher than the front-most animated element.<\/p>\n<pre lang=\"css\">.circular-mask {\r\n    position: absolute;\r\n    width: 164px;\r\n    height: 164px;\r\n    border: 100px solid #ccc;\r\n    border-radius: 50%;\r\n    top: -100px;\r\n    left: -32px;\r\n    z-index: 2;\r\n}\r\n\r\n\/* animated elements share absolute positioning and \r\n   a z-index lower than .circular-mask *\/\r\n.animated {\r\n    position: absolute;\r\n    z-index: 1;\r\n}\r\n<\/pre>\n<h3>The animated elements<\/h3>\n<p>The only requirement for the animated elements is that they reside inside the stage and have a <code>z-index<\/code> lower than the mask. Otherwise, anything goes.<\/p>\n<p>Though purely flair (as opposed to the feature demonstrations provided by the browser chrome animations), these circular animations were fun to build and we&#8217;re very pleased with the result.<\/p>\n<h2>Drawing Firefox in the browser<\/h2>\n<p>When we first watched a video mockup of the proposed intro animation for the new <a href=\"https:\/\/www.mozilla.org\/firefox\/desktop\/\">Firefox for Desktop<\/a> landing page, we wondered if this was actually possible to pull off in a web browser. The animation involves a series of moving lines which fill in as the outlines fade onto the web page, creating an illustrated image of the Firefox browser. Definitely not a typical animation you see on the web every day!<\/p>\n<p><a href=\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim3.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-large wp-image-3920\" src=\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim3-600x304.jpg\" alt=\"\" width=\"600\" height=\"304\" srcset=\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim3-600x304.jpg 600w, https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim3-252x127.jpg 252w, https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim3.jpg 1164w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p>The first step on the path of discovery was to choose an appropriate image format. SVG seemed like the most obvious choice, given that the images needed to scale. Nobody on the team had any prior experience with SVG animation but it seemed like a fun challenge! Ty came up with a rough demo showing how we might use SVG path strokes for the moving lines, which seemed like a perfect starting point. We could have chosen to use an SVG animation library such <a href=\"http:\/\/raphaeljs.com\/\">Raphael<\/a> or <a href=\"http:\/\/snapsvg.io\/\">SnapSVG<\/a>, but we wanted to try to keep our dependencies as light as possible (we had plenty already; no reason to add any more if we can avoid it). The timing and intricacies of the animation made a strong case for trying to use CSS keyframe animations, and this would also be a good opportunity to show off their potential. It was then we recalled <a href=\"http:\/\/css-tricks.com\/svg-line-animation-works\/\">this really clever technique<\/a> that could pull off the same line-drawn effect using CSS.<\/p>\n<h3>Animating SVG line paths using CSS<\/h3>\n<p>The trick to the line drawing effect is to animate the <code>stroke-dashoffset<\/code> of an SVG image path. The <code>stroke-dasharray<\/code> property allows you to apply a dashed border effect to the outline of an SVG image. The clever part is that if you set the length of the dash equal to the total length of the image path, you can then animate <code>stroke-dashoffset<\/code> to make it appear as if the line is being drawn one segment at a time. Magic!<\/p>\n<p>Here&#8217;s an example of an SVG path:<\/p>\n<pre lang=\"html4strict\">\r\n\r\n<\/pre>\n<p>And some CSS to animate it:<\/p>\n<pre lang=\"css\">.circle {\r\n    stroke-dasharray: 117;\r\n    stroke-dashoffset: 117;\r\n    animation: draw-circle 5s linear forwards;\r\n}\r\n\r\n@keyframes draw-circle {\r\n    100% {\r\n        stroke-dashoffset: 0;\r\n    }\r\n}\r\n<\/pre>\n<p>You can find the required length of a path pretty easily using a bit of JavaScript:<\/p>\n<pre lang=\"javascript\">var circle = document.querySelector('.circle');\r\nvar length = circle.getTotalLength();\r\n<\/pre>\n<p>The animation on the finished page is quite a bit more complicated than this example, but hopefully you can get the idea. We also animated <code>fill-opacity<\/code> and <code>stroke-opacity<\/code> to color in the browser panels and fade out the lines at the end of the animation, leaving a scalable vector drawing of the new Firefox.<\/p>\n<h2>Scaling SVG using CSS transforms<\/h2>\n<p>As well as animating the line drawing, we also needed to scale the image as it zooms onto the page. From there, the icons also zoom into their appropriate places. This was all done using regular CSS transforms via <code>translate<\/code> and <code>scale<\/code>.<\/p>\n<p>There are some notable cross-browser inconsistencies here when it comes to scaling SVG using this method. Both Chrome and Safari render a bitmap of an SVG prior to performing a CSS transform. This is presumably for performance reasons, but it does lead to blurry images when you blow them up. Firefox seems to weigh up performance and image quality a little differently, and renders sharper images when they scale. To get around the resizing issues, the best solution was to render icons at their largest size initially and then scale them down, as opposed to the other way around. It seems browsers still have some work to do in this area in order to improve SVG rendering under these circumstances.<\/p>\n<h2>Putting it all together<\/h2>\n<p>Combining all the separate CSS keyframe animations together was probably the most time consuming task. We can also look forward to the day when we no longer need vendor prefixes for CSS keyframe animations, as the duplication of code required is still a bit undesirable. Aside from this, getting the timing right was once again the trickiest part. For a less-than-5-second animation, having to reload and run through the whole sequence over and over made the process pretty time consuming (here&#8217;s another vote for that <a href=\"http:\/\/ffdevtools.uservoice.com\/forums\/246087-firefox-developer-tools-ideas\/suggestions\/5789812-css-animation-editor\">CSS animation editor<\/a>).<\/p>\n<p><a href=\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim4.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-large wp-image-3921\" src=\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim4-600x304.jpg\" alt=\"\" width=\"600\" height=\"304\" srcset=\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim4-600x304.jpg 600w, https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim4-252x127.jpg 252w, https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim4.jpg 1164w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p>The final result of all this work is a set of pages that beautifully show off what the new desktop Firefox looks like while also showing off what it can do with open web technologies. If you haven&#8217;t yet, please do <a href=\"https:\/\/www.mozilla.org\/firefox\/desktop\/\">check it out<\/a>. It&#8217;s all responsive, mobile-friendly, progressively enhanced, retina-ready, and still pretty light weight all things considered. And without a single byte of Flash.<\/p>\n<h3>The team<\/h3>\n<ul>\n<li>Jon Petto \u2013 Developer<\/li>\n<li>Alex Gibson \u2013 Developer<\/li>\n<li>Holly Habstritt Gaal \u2013 UX Designer<\/li>\n<li>Ty Flanagan \u2013 Graphic Designer<\/li>\n<li>Matej Novak \u2013 Copywriter<\/li>\n<li>Jennifer Bertsch \u2013 mozilla.org Product Manager<\/li>\n<li>Mike Alexis \u2013 Program Manager<\/li>\n<\/ul>\n<p>This article was co-written by Jon Petto and Alex Gibson, with editorial assistance from Craig Cook.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As you may have noticed, Firefox for desktop computers (Windows, Mac, and Linux) got a redesigned interface with the release of Firefox 29.0. This redesigned browser called for redesigned web pages to showcase the new interface (the tabs, icons, menus, &hellip; <a class=\"go\" href=\"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/\">Continue reading<\/a><\/p>\n","protected":false},"author":639,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[422,288,20278,20279],"tags":[],"coauthors":[28314,264785],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Animating the Firefox Desktop Pages - Mozilla Web Development<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alex Gibson, Jon Petto\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/\",\"url\":\"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/\",\"name\":\"Animating the Firefox Desktop Pages - Mozilla Web Development\",\"isPartOf\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim1-600x361.jpg\",\"datePublished\":\"2014-08-15T03:59:08+00:00\",\"dateModified\":\"2016-01-05T21:58:19+00:00\",\"author\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/c619ccfcdf8ba30772bdfbdb215226b6\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/#primaryimage\",\"url\":\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim1.jpg\",\"contentUrl\":\"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim1.jpg\",\"width\":1164,\"height\":701},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.mozilla.org\/webdev\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Animating the Firefox Desktop Pages\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#website\",\"url\":\"https:\/\/blog.mozilla.org\/webdev\/\",\"name\":\"Mozilla Web Development\",\"description\":\"For make benefit of glorious tubes\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.mozilla.org\/webdev\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/c619ccfcdf8ba30772bdfbdb215226b6\",\"name\":\"Alex Gibson\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/image\/fbd4cb2c157665c418ea61b648ecf7f8\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b77e8a4bc11f63583aa3849445211cce?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b77e8a4bc11f63583aa3849445211cce?s=96&d=mm&r=g\",\"caption\":\"Alex Gibson\"},\"sameAs\":[\"https:\/\/alxgbsn.co.uk\",\"https:\/\/x.com\/alex_gibson\"],\"url\":\"https:\/\/blog.mozilla.org\/webdev\/author\/agibsonmozilla-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Animating the Firefox Desktop Pages - Mozilla Web Development","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/","twitter_misc":{"Written by":"Alex Gibson, Jon Petto","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/","url":"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/","name":"Animating the Firefox Desktop Pages - Mozilla Web Development","isPartOf":{"@id":"https:\/\/blog.mozilla.org\/webdev\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/#primaryimage"},"image":{"@id":"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim1-600x361.jpg","datePublished":"2014-08-15T03:59:08+00:00","dateModified":"2016-01-05T21:58:19+00:00","author":{"@id":"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/c619ccfcdf8ba30772bdfbdb215226b6"},"breadcrumb":{"@id":"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/#primaryimage","url":"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim1.jpg","contentUrl":"https:\/\/blog.mozilla.org\/webdev\/files\/2014\/08\/fxdesktop-anim1.jpg","width":1164,"height":701},{"@type":"BreadcrumbList","@id":"https:\/\/blog.mozilla.org\/webdev\/2014\/08\/14\/animating-firefox-desktop\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.mozilla.org\/webdev\/"},{"@type":"ListItem","position":2,"name":"Animating the Firefox Desktop Pages"}]},{"@type":"WebSite","@id":"https:\/\/blog.mozilla.org\/webdev\/#website","url":"https:\/\/blog.mozilla.org\/webdev\/","name":"Mozilla Web Development","description":"For make benefit of glorious tubes","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.mozilla.org\/webdev\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/c619ccfcdf8ba30772bdfbdb215226b6","name":"Alex Gibson","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/image\/fbd4cb2c157665c418ea61b648ecf7f8","url":"https:\/\/secure.gravatar.com\/avatar\/b77e8a4bc11f63583aa3849445211cce?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b77e8a4bc11f63583aa3849445211cce?s=96&d=mm&r=g","caption":"Alex Gibson"},"sameAs":["https:\/\/alxgbsn.co.uk","https:\/\/x.com\/alex_gibson"],"url":"https:\/\/blog.mozilla.org\/webdev\/author\/agibsonmozilla-com\/"}]}},"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/posts\/3917"}],"collection":[{"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/users\/639"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/comments?post=3917"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/posts\/3917\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/media?parent=3917"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/categories?post=3917"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/tags?post=3917"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/coauthors?post=3917"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}