{"id":3064,"date":"2020-01-16T19:09:52","date_gmt":"2020-01-16T19:09:52","guid":{"rendered":"https:\/\/ionicframework.com\/blog\/?p=3064"},"modified":"2020-10-15T22:16:35","modified_gmt":"2020-10-15T22:16:35","slug":"introducing-ionic-animations","status":"publish","type":"post","link":"https:\/\/ionic.io\/blog\/introducing-ionic-animations","title":{"rendered":"Introducing Ionic Animations"},"content":{"rendered":"<p>Building efficient animations has traditionally been hard. Developers are often limited by the libraries available to them as well as the hardware that their apps run on. On top of that, many of these animation libraries use a JavaScript-driven approach to running animations where they handle the calculation of your animation\u2019s values at every step in a <code>requestAnimationFrame<\/code> event loop.<\/p>\n<p>To combat these issues we have created Ionic Animations. Ionic Animations is an open source animations utility that provides the tools developers need to build highly performant animations regardless of the framework they are using. Ionic Animations is more performant than leading animation libraries, which is why we are especially excited about its release. Officially part of our upcoming 5.0 release, we wanted to take some time to dig into what Ionic Animations is and why it is different than other animation libraries.<\/p>\n<p><!--more--><\/p>\n<h2>Why Ionic Animations?<\/h2>\n<p>As mentioned previously, many animation libraries use a JavaScript-driven approach to running your animations. This approach is problematic as not only is the browser rendering your animation, it is also executing your animation event loop code at every single frame in the same thread as the rest of your application\u2019s logic. By forcing the browser to execute your code on every frame, valuable CPU time is being used that will ultimately impact overall frame rate and energy consumption. While overall frames per second (FPS) is important, it is also crucial to understand the impact your animation is having on the device\u2019s resources.<\/p>\n<p>Ionic Animations uses the Web Animations API to build and run all of your animations. By doing this, we can offload all of the work required to run your animations to the browser. As a result, the browser is able to schedule and make any optimizations to your animations that it needs, allowing your animations to run as smoothly as possible. This leads to high FPS while maintaining low CPU usage and therefore a lower energy impact. While most modern browsers support Web Animations, we fallback to CSS Animations for browsers that do not. In these instances, the performance difference in switching between the two should typically be negligible.<\/p>\n<h2>Ionic Animations<\/h2>\n<p>The Ionic Animations API is straight forward and allows developers to create grouped animations, gesture animations, and much more. It currently powers all animations in Ionic Framework including the gesture animations for the menu and swipe to go back.<\/p>\n<p>Since we are using native web APIs, all animations created naturally have a low CPU and battery usage overhead, allowing your animations to take full advantage of the processing resources available to them.<\/p>\n<p>Let\u2019s take a look at some examples.<\/p>\n<p>Ionic Animations provides a chainable API that lets you declare your animation properties with ease. In the example below we\u2019ve created a pulsating effect by animating the scale and changing the direction of the animation on each iteration via the <code>direction<\/code> method.<\/p>\n<p><iframe\n     data-src=\"https:\/\/codesandbox.io\/embed\/bitter-firefly-4sjrn?autoresize=1&#038;codemirror=1&#038;fontsize=14&#038;hidenavigation=1&#038;module=%2Fsrc%2Findex.ts&#038;theme=dark\"\n     style=\"width:100%; height:500px; border:0; border-radius: 4px; overflow:hidden;\"\n     title=\"bitter-firefly-4sjrn\"\n     allow=\"geolocation; microphone; camera; midi; vr; accelerometer; gyroscope; payment; ambient-light-sensor; encrypted-media; usb\"\n     sandbox=\"allow-modals allow-forms allow-popups allow-scripts allow-same-origin\"\n    src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" class=\"lazyload\" data-load-mode=\"1\"><\/iframe><\/p>\n<pre><code class=\"language-javascript\">const animation = createAnimation()\n  .addElement(document.querySelector(&#039;.square&#039;))\n  .duration(1000)\n  .direction(&#039;alternate&#039;)\n  .iterations(Infinity)\n  .keyframes([\n    { offset: 0, transform: &#039;scale(1)&#039;, opacity: &#039;1&#039; },\n    { offset: 1, transform: &#039;scale(1.5)&#039;, opacity: &#039;0.5&#039;\n }\n  ]);\n\nanimation.play();\n\n<\/code><\/pre>\n<p>You can also group animations and control them using a single parent animation. This gives you the ability to control complex animations with different durations, easings, and other properties.<\/p>\n<pre><code class=\"language-javascript\">const animationA = createAnimation()\n  .addElement(document.querySelector(&#039;.square-a&#039;))\n  .fromTo(&#039;transform&#039;, &#039;scale(1)&#039;, &#039;scale(1.5)&#039;);\n\nconst animationB = createAnimation()\n  .addElement(document.querySelector(&#039;.square-b&#039;))\n  .fromTo(&#039;transform&#039;, &#039;scale(1)&#039;, &#039;scale(0.5)&#039;);\n\nconst parentAnimation = createAnimation()\n  .duration(1000)\n  .addAnimation([animationA, animationB]);\n\nparentAnimation.play();\n\n<\/code><\/pre>\n<p>Chaining animations is as simple as awaiting a promise!<\/p>\n<pre><code class=\"language-javascript\">const animationA = createAnimation()\n  .addElement(document.querySelector(&#039;.square-a&#039;))\n  .duration(1000)\n  .fromTo(&#039;transform&#039;, &#039;scale(1)&#039;, &#039;scale(1.5)&#039;);\n\nconst animationB = createAnimation()\n  .addElement(document.querySelector(&#039;.square-b&#039;))\n  .duration(2000)\n  .fromTo(&#039;transform&#039;, &#039;scale(1)&#039;, &#039;scale(0.5)&#039;);\n\nawait animationA.play();\nawait animationB.play();\n\n<\/code><\/pre>\n<p>Ionic Animations also gives you the ability to control animation playback and provides hooks to perform DOM reads and writes, as well as add or remove classes and inline styles.<\/p>\n<pre><code class=\"language-javascript\">const animation = createAnimation()\n  .addElement(document.querySelector(&#039;.square&#039;))\n  .duration(1000)\n  .fromTo(&#039;transform&#039;, &#039;scale(1)&#039;, &#039;scale(1.5)&#039;);\n  .afterStyles({\n    &#039;background&#039;: &#039;green&#039;\n  })\n\nawait animation.play();\n\n<\/code><\/pre>\n<h2>Performance Comparisons<\/h2>\n<p>When developing Ionic Animations we performed a number of tests to ensure that it was living up to our expectations in terms of performance and resource consumption. We also looked at other animation libraries such as anime.js, GSAP, and Velocity.js to see how Ionic Animations compares to some of the leading alternatives.<\/p>\n<p>We developed a simple test to see how these different libraries performed when animating a large number of elements. We ran this test on both a desktop device as well as a mobile device to get a sense of performance when dealing with different hardware constraints. The test we built animates a variable number of bubbles floating up the screen at different rates of speed.<\/p>\n<p>We developed the following performance benchmarks to look at:<\/p>\n<ul>\n<li>Average FPS \u2014 This is the average frames per second over the course of the animation test. This is typically the benchmark that end users will notice the most, so it\u2019s important that this is as close to 60fps as possible.<\/p>\n<\/li>\n<li>\n<p>Main Thread Processing \u2014 This is the amount of work that the browser needs to do as a result of your application\u2019s code. This includes things such as layouts, paints, and computing JavaScript. All of this happens in the same thread as the rest of your application\u2019s logic.<\/p>\n<\/li>\n<li>\n<p>Average CPU Usage \u2014 This is the average percentage of the CPU that is actively working during the test as a result of your code. While using the CPU is inevitable, it is important to minimize the overall CPU usage and ensure that the usage goes back to idle as soon as possible.<\/p>\n<\/li>\n<li>\n<p>Energy Impact \u2014 This is the effect the animation has on energy consumption. Animations with a higher energy impact will drain a device\u2019s battery faster than animations with a lower energy impact.<\/p>\n<\/li>\n<\/ul>\n<p>This blog post will show a subset of all data collected. You can view the full report <a href=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/animation-benchmark-results.pdf\">here<\/a>. The desktop test shows Ionic Animations using the Web Animations API in Safari while the mobile test shows Ionic Animations using the CSS Animations fallback. You can also run these tests for yourself on the demo site that we have setup: <a href=\"https:\/\/flamboyant-brattain-9c21f4.netlify.com\" target=\"_blank\" rel=\"noopener\">flamboyant-brattain-9c21f4.netlify.com<\/a><\/p>\n<h2>Desktop Animation Benchmarks<\/h2>\n<p>This first test looks at the Ionic Animations performance relative to other libraries on a desktop machine. <a href=\"#footnote-1\"><sup>[1]<\/sup><\/a><\/p>\n<h3>Frames per Second (FPS)<\/h3>\n<h5>Higher is better<\/h5>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"563\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-mac.png\" alt=\"Animations FPS Results\" class=\"aligncenter size-full wp-image-3076 lazyload\" data-srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-mac.png 1440w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-mac-300x117.png 300w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-mac-768x300.png 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-mac-1024x400.png 1024w\" data-sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 1440px; --smush-placeholder-aspect-ratio: 1440\/563;\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"563\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-mac.png\" alt=\"Animations FPS Results\" class=\"aligncenter size-full wp-image-3076\" srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-mac.png 1440w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-mac-300x117.png 300w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-mac-768x300.png 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-mac-1024x400.png 1024w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/p>\n<h3>Average CPU Usage<\/h3>\n<h5>Lower is better<\/h5>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"563\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-cpu-usage-graph-mac.png\" alt=\"Animations CPU Usage Results\" class=\"aligncenter size-full wp-image-3078 lazyload\" data-srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-cpu-usage-graph-mac.png 1440w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-cpu-usage-graph-mac-300x117.png 300w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-cpu-usage-graph-mac-768x300.png 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-cpu-usage-graph-mac-1024x400.png 1024w\" data-sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 1440px; --smush-placeholder-aspect-ratio: 1440\/563;\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"563\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-cpu-usage-graph-mac.png\" alt=\"Animations CPU Usage Results\" class=\"aligncenter size-full wp-image-3078\" srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-cpu-usage-graph-mac.png 1440w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-cpu-usage-graph-mac-300x117.png 300w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-cpu-usage-graph-mac-768x300.png 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-cpu-usage-graph-mac-1024x400.png 1024w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/p>\n<p>The data above shows Ionic Animations easily achieving 60fps over the course of the test while maintaining a low CPU usage. The other libraries had CPU usages of &gt;100% and high energy impacts while only achieving framerates in the 30s and 40s.<\/p>\n<p>On the desktop test, Ionic Animations shows that it can achieve smooth 60fps animations while minimizing not only the amount of work it has to do in the CPU but also the impact it has on your device\u2019s battery.<\/p>\n<h2>Mobile Animation Benchmarks<\/h2>\n<p>This second test was run on an iPhone 7. We originally wanted to run the same desktop test with 1000 bubbles, but GSAP was unable to run the animation due to a high startup overhead, so we opted to test with 500 bubbles instead. <a href=\"#footnote-2\"><sup>[2]<\/sup><\/a><\/p>\n<h3>Frames per Second (FPS)<\/h3>\n<h5>Higher is better<\/h5>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"563\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-phone.png\" alt=\"\" class=\"aligncenter size-full wp-image-3075 lazyload\" data-srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-phone.png 1440w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-phone-300x117.png 300w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-phone-768x300.png 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-phone-1024x400.png 1024w\" data-sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 1440px; --smush-placeholder-aspect-ratio: 1440\/563;\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"563\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-phone.png\" alt=\"\" class=\"aligncenter size-full wp-image-3075\" srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-phone.png 1440w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-phone-300x117.png 300w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-phone-768x300.png 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-fps-graph-phone-1024x400.png 1024w\" sizes=\"auto, (max-width: 1440px) 100vw, 1440px\" \/><\/noscript><\/p>\n<h3>Average CPU Usage<\/h3>\n<h5>Lower is better<\/h5>\n<p><img decoding=\"async\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-cpu-usage-graph-phone.png\" alt=\"Animations CPU Usage Results\" class=\"aligncenter size-full wp-image-3078 lazyload\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 1440px; --smush-placeholder-aspect-ratio: 1440\/563;\" \/><noscript><img decoding=\"async\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic-cpu-usage-graph-phone.png\" alt=\"Animations CPU Usage Results\" class=\"aligncenter size-full wp-image-3078\" \/><\/noscript><\/p>\n<p>Similar to the desktop results, Ionic Animations easily achieves 60fps while having a low CPU usage relative to other libraries. The only other library that comes close to matching the Ionic Animations FPS is GSAP, but even then GSAP had to use almost 82% of the CPU to do that while Ionic only needed about 11%.<\/p>\n<p>Once Web Animations ships on iOS you can expect to see an even lower CPU usage for Ionic Animations!<\/p>\n<h2>Getting Started and Providing Feedback<\/h2>\n<p>As we\u2019ve seen in the tests above, Ionic Animations brings performant animations with a low energy impact to both desktop and mobile devices. We are very excited to have developers start using it.<\/p>\n<p>To get started with Ionic Animations, check out the <a href=\"https:\/\/ionicframework.com\/docs\/utilities\/animations\">Ionic Animations Documentation<\/a>.<\/p>\n<p>We encourage anyone using Ionic Animations to file bugs or feature requests on our <a href=\"https:\/\/github.com\/ionic-team\/ionic\/issues\">GitHub issue tracker<\/a>.<\/p>\n<p>We hope you enjoy using Ionic Animations!<\/p>\n<div id=\"footnote-1\">\n<small>1: The desktop animation test was conducted on macOS 10.14.6 with Safari Technology Preview 98.<\/small>\n<\/div>\n<div id=\"footnote-2\">\n<small>2: The mobile animation test was conducted on an iPhone 7 running iOS 13.1.<\/small>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Building efficient animations has traditionally been hard. Developers are often limited by the libraries available to them as well as the hardware that their apps run on. On top of that, many of these animation libraries use a JavaScript-driven approach to running animations where they handle the calculation of your animation\u2019s values at every step [&hellip;]<\/p>\n","protected":false},"author":72,"featured_media":3072,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"publish_to_discourse":"","publish_post_category":"","wpdc_auto_publish_overridden":"","wpdc_topic_tags":"","wpdc_pin_topic":"","wpdc_pin_until":"","discourse_post_id":"","discourse_permalink":"","wpdc_publishing_response":"","wpdc_publishing_error":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[120,121],"tags":[166,3,5,79,78],"class_list":["post-3064","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-announcements","category-engineering","tag-animations","tag-ionic","tag-open-source","tag-performance","tag-ux"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v23.0 (Yoast SEO v23.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Introducing Ionic Animations - Ionic Blog<\/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:\/\/ionic.io\/blog\/introducing-ionic-animations\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing Ionic Animations\" \/>\n<meta property=\"og:description\" content=\"Building efficient animations has traditionally been hard. Developers are often limited by the libraries available to them as well as the hardware that their apps run on. On top of that, many of these animation libraries use a JavaScript-driven approach to running animations where they handle the calculation of your animation\u2019s values at every step [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ionic.io\/blog\/introducing-ionic-animations\" \/>\n<meta property=\"og:site_name\" content=\"Ionic Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-16T19:09:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-10-15T22:16:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic_animations.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"880\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Liam DeBeasi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@LiamDeBeasi\" \/>\n<meta name=\"twitter:site\" content=\"@ionicframework\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Liam DeBeasi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ionic.io\/blog\/introducing-ionic-animations#article\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/introducing-ionic-animations\"},\"author\":{\"name\":\"Liam DeBeasi\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/d314e583cf08e7a28c51e8ffc3d621fa\"},\"headline\":\"Introducing Ionic Animations\",\"datePublished\":\"2020-01-16T19:09:52+00:00\",\"dateModified\":\"2020-10-15T22:16:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/introducing-ionic-animations\"},\"wordCount\":1264,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/introducing-ionic-animations#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic_animations.png\",\"keywords\":[\"Animations\",\"Ionic\",\"Open Source\",\"performance\",\"UX\"],\"articleSection\":[\"Announcements\",\"Engineering\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/ionic.io\/blog\/introducing-ionic-animations#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ionic.io\/blog\/introducing-ionic-animations\",\"url\":\"https:\/\/ionic.io\/blog\/introducing-ionic-animations\",\"name\":\"Introducing Ionic Animations - Ionic Blog\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/introducing-ionic-animations#primaryimage\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/introducing-ionic-animations#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic_animations.png\",\"datePublished\":\"2020-01-16T19:09:52+00:00\",\"dateModified\":\"2020-10-15T22:16:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/ionic.io\/blog\/introducing-ionic-animations#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ionic.io\/blog\/introducing-ionic-animations\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/introducing-ionic-animations#primaryimage\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic_animations.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic_animations.png\",\"width\":1600,\"height\":880,\"caption\":\"Ionic Animations Image\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ionic.io\/blog\/introducing-ionic-animations#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ionic.io\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing Ionic Animations\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/ionic.io\/blog\/#website\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"name\":\"ionic.io\/blog\",\"description\":\"Build amazing native and progressive web apps with the web\",\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/ionic.io\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/ionic.io\/blog\/#organization\",\"name\":\"Ionic\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"width\":1920,\"height\":854,\"caption\":\"Ionic\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/ionicframework\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/d314e583cf08e7a28c51e8ffc3d621fa\",\"name\":\"Liam DeBeasi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ZNK4lRAJ_400x400-150x150.jpg\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ZNK4lRAJ_400x400-150x150.jpg\",\"caption\":\"Liam DeBeasi\"},\"sameAs\":[\"https:\/\/x.com\/LiamDeBeasi\"],\"url\":\"https:\/\/ionic.io\/blog\/author\/liam\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introducing Ionic Animations - Ionic Blog","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:\/\/ionic.io\/blog\/introducing-ionic-animations","og_locale":"en_US","og_type":"article","og_title":"Introducing Ionic Animations","og_description":"Building efficient animations has traditionally been hard. Developers are often limited by the libraries available to them as well as the hardware that their apps run on. On top of that, many of these animation libraries use a JavaScript-driven approach to running animations where they handle the calculation of your animation\u2019s values at every step [&hellip;]","og_url":"https:\/\/ionic.io\/blog\/introducing-ionic-animations","og_site_name":"Ionic Blog","article_published_time":"2020-01-16T19:09:52+00:00","article_modified_time":"2020-10-15T22:16:35+00:00","og_image":[{"width":1600,"height":880,"url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic_animations.png","type":"image\/png"}],"author":"Liam DeBeasi","twitter_card":"summary_large_image","twitter_creator":"@LiamDeBeasi","twitter_site":"@ionicframework","twitter_misc":{"Written by":"Liam DeBeasi","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ionic.io\/blog\/introducing-ionic-animations#article","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/introducing-ionic-animations"},"author":{"name":"Liam DeBeasi","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/d314e583cf08e7a28c51e8ffc3d621fa"},"headline":"Introducing Ionic Animations","datePublished":"2020-01-16T19:09:52+00:00","dateModified":"2020-10-15T22:16:35+00:00","mainEntityOfPage":{"@id":"https:\/\/ionic.io\/blog\/introducing-ionic-animations"},"wordCount":1264,"commentCount":0,"publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"image":{"@id":"https:\/\/ionic.io\/blog\/introducing-ionic-animations#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic_animations.png","keywords":["Animations","Ionic","Open Source","performance","UX"],"articleSection":["Announcements","Engineering"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ionic.io\/blog\/introducing-ionic-animations#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ionic.io\/blog\/introducing-ionic-animations","url":"https:\/\/ionic.io\/blog\/introducing-ionic-animations","name":"Introducing Ionic Animations - Ionic Blog","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ionic.io\/blog\/introducing-ionic-animations#primaryimage"},"image":{"@id":"https:\/\/ionic.io\/blog\/introducing-ionic-animations#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic_animations.png","datePublished":"2020-01-16T19:09:52+00:00","dateModified":"2020-10-15T22:16:35+00:00","breadcrumb":{"@id":"https:\/\/ionic.io\/blog\/introducing-ionic-animations#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ionic.io\/blog\/introducing-ionic-animations"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/introducing-ionic-animations#primaryimage","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic_animations.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic_animations.png","width":1600,"height":880,"caption":"Ionic Animations Image"},{"@type":"BreadcrumbList","@id":"https:\/\/ionic.io\/blog\/introducing-ionic-animations#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ionic.io\/blog"},{"@type":"ListItem","position":2,"name":"Introducing Ionic Animations"}]},{"@type":"WebSite","@id":"https:\/\/ionic.io\/blog\/#website","url":"https:\/\/ionic.io\/blog\/","name":"ionic.io\/blog","description":"Build amazing native and progressive web apps with the web","publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ionic.io\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ionic.io\/blog\/#organization","name":"Ionic","url":"https:\/\/ionic.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","width":1920,"height":854,"caption":"Ionic"},"image":{"@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/ionicframework"]},{"@type":"Person","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/d314e583cf08e7a28c51e8ffc3d621fa","name":"Liam DeBeasi","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ZNK4lRAJ_400x400-150x150.jpg","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ZNK4lRAJ_400x400-150x150.jpg","caption":"Liam DeBeasi"},"sameAs":["https:\/\/x.com\/LiamDeBeasi"],"url":"https:\/\/ionic.io\/blog\/author\/liam"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/01\/ionic_animations.png","_links":{"self":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/3064","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/users\/72"}],"replies":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/comments?post=3064"}],"version-history":[{"count":0,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/3064\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media\/3072"}],"wp:attachment":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media?parent=3064"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/categories?post=3064"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/tags?post=3064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}