SlideShare ist ein Scribd-Unternehmen logo
1 von 59
Downloaden Sie, um offline zu lesen
RANDOMISING CSS
ANIMATIONS
ADAM BANKIN
Front End Engineer at Shutterstock
14 years experience with HTML, CSS and JS
AUSTRALIAN
(z === "zed"); // true
"ize".replace(/z/, "s");
(r === "ahhhhhh"); // true
$("#shrimp").on("barbie", function () {
console.error("racial stereotype");
console.error("and frankly, I'm offended");
return false;
});
RANDOMISING CSS ANIMATIONS
Why? Is this difficult?
Shutterstock labs home page
THE APPROACH
Respect the separation of concerns
Minimal interaction with the DOM
Keep it "jank"-free
DAFT JANK
Addy Osmani's post on jank busting
SEPARATION OF CONCERNS
Don't write HTML Elements with JavaScript
Use CSS to change appearance
Use JavaScript for the rest
THE APPROACH (AGAIN)
Respect the separation of concerns
Minimal interaction with the DOM
Keep it "jank"-free
Can we achieve randomised CSS animations with this
approach?
HTML
Keep it simple
PREDEFINE YOUR DOM ELEMENTS
<div id="bubble_source">
<div id="bubble_0" class="bubble"></div>
<div id="bubble_1" class="bubble"></div>
<div id="bubble_2" class="bubble"></div>
<div id="bubble_3" class="bubble"></div>
<div id="bubble_4" class="bubble"></div>
<div id="bubble_5" class="bubble"></div>
<div id="bubble_6" class="bubble"></div>


<div id="bubble_15" class="bubble"></div>
</div>
HTML
 Done
CSS
The syntax of CSS Keyframe Animations
AT-RULE AND NAME
@keyframes myAnimationName {...}

 WITH PREFIXES
@-webkit-keyframes myAnimationName {...}
@-moz-keyframes myAnimationName {...}
@keyframes myAnimationName {...}
WITH KEYFRAMES
@keyframes myAnimationName {
from {
background-position: 0 0;
}
to {
background-position: -162px 0;
}
}
MDN has a list of animatable properties
CHOOSE THE RIGHT PROPERTIES TO ANIMATE
top/left | translate
Paul Irish's post on using translate instead of top/left
WITH PERCENTAGE-BASED KEYFRAMES
@keyframes myAnimationName {
0% {
background-position: 0 0;
}
100% {
background-position: -162px 0;
}
}
MIXED VALUES IN KEYFRAMES
@keyframes myAnimationName {
0% {
background-position: 0 0;
}
23% {
opacity: 0;
background-position: -162px 0;
}
100% {
opacity: 1;
}
}
TARGETING PREFIXED PROPERTIES
@-webkit-keyframes myAnimationName {
0% {-webkit-transform-origin: 0 0;}
100% {-webkit-transform-origin: 25px 0;}
}
@-moz-keyframes myAnimationName {
0% {-moz-transform-origin: 0 0;}
100% {-moz-transform-origin: 25px 0;}
}
@keyframes myAnimationName {
0% {transform-origin: 0 0;}
100% {transform-origin: 25px 0;}
}
ATTACHING A DEFINED KEYFRAME ANIMATION
.classWithAnimation {
animation: myAnimationName 1.2s linear 0s infinite;
}
... WITH PREFIXES
.classWithAnimation {
-webkit-animation: myAnimationName 1.2s linear 0s infinite;
-moz-animation: myAnimationName 1.2s linear 0s infinite;
animation: myAnimationName 1.2s linear 0s infinite;
}
SHORTHAND PROPERTIES EXPANDED
/* shorthand */
.bubble {
animation: myAnimationName 1.2s linear 0s infinite;
}
/* expanded */
.bubble {
animation-name: myAnimationName;
animation-duration: 1.2s;
animation-timing-function: linear;
animation-delay: 0s;
animation-iteration-count: infinite;
}
and that's just some of them

 at MDNthere are more
*AHEM*
 PREFIXED
/* let's now call it 'bubble' */
.bubble {
-webkit-animation-name: myAnimationName;
-webkit-animation-duration: 1.2s;
-webkit-animation-timing-function: linear;
-webkit-animation-delay: 0s;
-webkit-animation-iteration-count: infinite;
}
ARE WE THERE YET?
CSS Keyframe Animations, they:
define a start

 the inbetween frames

 and the end?
THE END IS NOT THE END
"omit the to or 100% declaration from the
@keyframe
"
"then you call the animation on the progress
bar
"
"and just like that, the progress bar will
animate itself up to the value set by the inline
style."
Chris Coyer's post on animating to an inline style
"omit the to or 100% declaration from the
@keyframe
"
@keyframes myAnimationName {
0% {background-position: 0 0;}
}
"
then you call the animation on the progress
bar
"
.bubble {
animation: myAnimationName 1.2s linear 0s infinite;
}
"
and just like that, the progress bar will
animate itself up to the value set by the inline
style."
<div id="bubble_0" class="bubble" style="background-position: -162px 0;"></div>
DOES IT NEED TO BE INLINE?
What if the properties were set in a class ruleset?
/* css */
@keyframes myAnimationName {
0% {background-position: 0 0;}
}
.bubble {
animation: myAnimationName 1.2s linear 0s infinite;
}
.background-move {
background-position: -162px 0;
}
Then the class was dynamically applied to the DOM Element?
<!-- html -->
<div id="bubble_0" class="bubble background-move"></div>
RULESET AS INLINE STYLE
/* Keyframe Animation definitions */
@-webkit-keyframes lightBlue {
0% {
color: #2ed0e5;
-webkit-transform: translate(0, 50px) scale(.2, .2);
-webkit-transform-origin: 20px 0;
}
14% {
color: #2ed0e5;
-webkit-transform: translate(0, -100px) scale(.3, .3);
-webkit-transform-origin: 43px 0;
}
}
@-moz-keyframes lightBlue {
0% {
color: #2ed0e5;
-moz-transform: translate(0, 50px) scale(.2, .2);
-moz-transform-origin: 20px 0;
}
14% {
color: #2ed0e5;
-moz-transform: translate(0, -100px) scale(.3, .3);
-moz-transform-origin: 43px 0;
}
}
@keyframes lightBlue {
0% {
color: #2ed0e5;
JAVASCRIPT
Make it work
WHAT DOES JAVASCRIPT GIVE US?
requestAnimationFrame/cancelAnimationFrame methods
Event-type "animationend"

 WITH PREFIXES
requestAnimationFrame, msRequestAnimationFrame,
mozRequestAnimationFrame,
webkitRequestAnimationFrame, oRequestAnimationFrame
animationend, MSAnimationEnd, webkitAnimationEnd,
oAnimationEnd
CLASSY JAVASCRIPT
var ANIMATION_CLASSES = [
// colors
['color_dark_red', 'color_red', 'color_yellow', 'color_green', 'col
// translations
['translateA', 'translateB', 'translateC', 'translateD', 'translate
// origins
['originA', 'originB', 'originC', 'originD', 'originE', 'originF'],
// durations
['time_1500', 'time_1800', 'time_2000', 'time_2500', 'time_2700'],
// easings
['easing_1', 'easing_2', 'easing_3'],
// names
['light_blue', 'mid_blue']
];
GAME ON
When the page loads we:
1. Load custom classes "Bubble" and "BubbleController"
2. BubbleController puts all ".bubble" divs into an Array
3. It then makes two 'object pools'
4. One has "Bubble" instances, the other is ids from each div in
the Array
OBJECT POOLS ON HTML5ROCKS
Colt McAnlis's post on Object Pools in JS
GAME ON

Then:
1. BubbleController runs a loop creating setTimeouts at
+200ms
2. The interval calls BubbleController's 'createBubble' method
3. This method pops a Bubble instance from its pool
4. It also pops an id from the id pool
5. It creates a listener for completion of the Bubble's 'init'
method
6. It creates a listener for completion of the Bubble's 'hide'
method
7. It runs the Bubble's 'init' method, with the id property
OBJECT POOL CODE IN BUBBLECONTROLLER
// `bubbles` is an Array of Dom Elements
// `bubbleClass` is Bubble
function createObjectPools (bubbles, bubbleClass) {
var j = bubbles.length;
var bubbleArgs = { delegateName: NAME };
while (j--) {
// populate the individual bubble's ids into an Array
idPool[j] = bubbles[j].id;
// use an Object Pool to create enough instances to control each bubble
bubblePool[j] = new bubbleClass(bubbleArgs);
}
}
'CREATEBUBBLE' METHOD IN
BUBBLECONTROLLER
function createBubble () {
// get new bubble instance id form the pools
var bubble = bubblePool.pop();
var id = idPool.pop();
// listen for the end of the new bubble's init phase
$.subscribe(NAME + EVENTS.INIT + STATUS.COMPLETE + id, bubbleInitCompleteHandle
// call init on the bubble instance
bubble.init({ id: id });
}
GAME ON
 ALMOST THERE
Finally, the Bubble's 'init' method:
1. The Bubble instance gets the DOM Element via the id
2. Bubble creates a listener for the 'animationend' event
3. It then gets a random class from each sub-Array in
ANIMATION_CLASSES
4. It saves these as a String, but doesn't set its className
5. It fires off its 'init complete' Event
6. BubbleController reacts to this and calls
requestAnimationFrame.
7. requestAnimationFrame calls the Bubble instances 'show'
method
8. The 'show' method attaches the classlist, starting the
animation
'INIT' METHOD IN BUBBLE
Bubble.prototype.init = function (args) {
// add inited variables
this.id = args.id;
this.node = doc.getElementById(args.id);
this.$node = $(this.node);
this.classList = 'bubble on';
// add listeners
addListeners(this);
setClassList(this);
$.publish(this.delegateName + EVENTS.INIT + STATUS.COMPLETE + this.id, [this]);
};
RANDOMISING THROUGH THE
ANIMATION_CLASSES ARRAY
function setClassList (instance) {
var j = ANIMATION_CLASSES.length;
while (j--) {
instance.classList += (' ' + randomValue(ANIMATION_CLASSES[j]));
}
}
function randomValue (arr) {
var length = arr.length;
var idx = (Math.random() * length) | 0;
return arr[idx];
}
CALLING REQUESTANIMATIONFRAME IN
BUBBLECONTROLLER
function bubbleInitCompleteHandler (e, bubble) {
$.unsubscribe(e.type, bubbleInitCompleteHandler);
win.requestAnimationFrame(function () {
bubble.show();
});
}
'SHOW' METHOD IN BUBBLE
Bubble.prototype.show = function () {
// appending the classes makes the bubble appear and the animation run
this.node.className = this.classList;
};
GAME OFF
'animationend' event
1. The Bubble reacts to the DOM Element's 'animationend'
event
2. It changes the className of the DOM Element to "splat"
3. It runs its 'hide' method and fires off 'hide complete'
4. Inside the 'hide complete' Event is the id as a String
5. BubbleController reacts to this
6. It 'pools' the Bubble instance and 'pools' the id
7. It then runs its 'createBubble' method to start all over again
RE-'POOLING' THE BUBBLE AND ID IN
BUBBLECONTROLLER
function bubbleAnimationCompleteHandler (e, bubble, id) {
// add the completed bubble and its id back into the pools
bubblePool.unshift(bubble);
idPool.unshift(id);
createBubble();
}
SO!!!
Did it work?
Labs home page
TIME ESCAPES ME
The bubbles are done with :before and :after
They're webfonts - that's a story in itself
You can pause the bubbles
'animation-timing-function' easing is done with cubic-
beziers
THEY'RE CLICKABLE!
THANKS!
abankin@shutterstock.com
@adambankin
DID I MENTION WE'RE
HIRING?!

Weitere Àhnliche Inhalte

Was ist angesagt?

Introduction to HTML
Introduction to HTMLIntroduction to HTML
Introduction to HTMLAnn Alcid
 
HTML & CSS Masterclass
HTML & CSS MasterclassHTML & CSS Masterclass
HTML & CSS MasterclassBernardo Raposo
 
Bootstrap 4 Tutorial PDF for Beginners - Learn Step by Step
Bootstrap 4 Tutorial PDF for Beginners - Learn Step by StepBootstrap 4 Tutorial PDF for Beginners - Learn Step by Step
Bootstrap 4 Tutorial PDF for Beginners - Learn Step by StepBootstrap Creative
 
Responsive web design ppt
Responsive web design pptResponsive web design ppt
Responsive web design pptNAWAZ KHAN
 
Introducing CSS Grid
Introducing CSS GridIntroducing CSS Grid
Introducing CSS GridJason Yingling
 
An introduction to bootstrap
An introduction to bootstrapAn introduction to bootstrap
An introduction to bootstrapMind IT Systems
 
Presentation of bootstrap
Presentation of bootstrapPresentation of bootstrap
Presentation of bootstrap1amitgupta
 
New Elements & Features in CSS3
New Elements & Features in CSS3New Elements & Features in CSS3
New Elements & Features in CSS3Jamshid Hashimi
 
Tailwind CSS.11.pptx
Tailwind CSS.11.pptxTailwind CSS.11.pptx
Tailwind CSS.11.pptxHarish Verma
 
CSS Basics
CSS BasicsCSS Basics
CSS BasicsNitin Bhide
 
HTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEB
HTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEBHTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEB
HTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEBPeslPinguim
 
Flexbox and Grid Layout
Flexbox and Grid LayoutFlexbox and Grid Layout
Flexbox and Grid LayoutRachel Andrew
 
HTML, CSS and Java Scripts Basics
HTML, CSS and Java Scripts BasicsHTML, CSS and Java Scripts Basics
HTML, CSS and Java Scripts BasicsSun Technlogies
 
Displaying XML Documents Using CSS and XSL
Displaying XML Documents Using CSS and XSLDisplaying XML Documents Using CSS and XSL
Displaying XML Documents Using CSS and XSLBĂŹnh Trọng Án
 
Bootstrap 3
Bootstrap 3Bootstrap 3
Bootstrap 3Lanh Le
 

Was ist angesagt? (20)

Introduction to HTML
Introduction to HTMLIntroduction to HTML
Introduction to HTML
 
Css ppt
Css pptCss ppt
Css ppt
 
HTML & CSS Masterclass
HTML & CSS MasterclassHTML & CSS Masterclass
HTML & CSS Masterclass
 
Bootstrap 4 Tutorial PDF for Beginners - Learn Step by Step
Bootstrap 4 Tutorial PDF for Beginners - Learn Step by StepBootstrap 4 Tutorial PDF for Beginners - Learn Step by Step
Bootstrap 4 Tutorial PDF for Beginners - Learn Step by Step
 
Responsive web design ppt
Responsive web design pptResponsive web design ppt
Responsive web design ppt
 
Introducing CSS Grid
Introducing CSS GridIntroducing CSS Grid
Introducing CSS Grid
 
An introduction to bootstrap
An introduction to bootstrapAn introduction to bootstrap
An introduction to bootstrap
 
Presentation of bootstrap
Presentation of bootstrapPresentation of bootstrap
Presentation of bootstrap
 
New Elements & Features in CSS3
New Elements & Features in CSS3New Elements & Features in CSS3
New Elements & Features in CSS3
 
Tailwind CSS.11.pptx
Tailwind CSS.11.pptxTailwind CSS.11.pptx
Tailwind CSS.11.pptx
 
CSS Basics
CSS BasicsCSS Basics
CSS Basics
 
Css position
Css positionCss position
Css position
 
Html5
Html5 Html5
Html5
 
What is css
What is cssWhat is css
What is css
 
Introduction to css
Introduction to cssIntroduction to css
Introduction to css
 
HTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEB
HTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEBHTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEB
HTML5 - UM GUIA DE REFERÊNCIA PARA DESENVOLVEDORES WEB
 
Flexbox and Grid Layout
Flexbox and Grid LayoutFlexbox and Grid Layout
Flexbox and Grid Layout
 
HTML, CSS and Java Scripts Basics
HTML, CSS and Java Scripts BasicsHTML, CSS and Java Scripts Basics
HTML, CSS and Java Scripts Basics
 
Displaying XML Documents Using CSS and XSL
Displaying XML Documents Using CSS and XSLDisplaying XML Documents Using CSS and XSL
Displaying XML Documents Using CSS and XSL
 
Bootstrap 3
Bootstrap 3Bootstrap 3
Bootstrap 3
 

Ähnlich wie Randomising css animations

Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasminePaulo Ragonha
 
JavaScript Neednt Hurt - JavaBin talk
JavaScript Neednt Hurt - JavaBin talkJavaScript Neednt Hurt - JavaBin talk
JavaScript Neednt Hurt - JavaBin talkThomas Kjeldahl Nilsson
 
JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6Solution4Future
 
Animate The Web With Ember.js - Jessica Jordan
Animate The Web With Ember.js - Jessica JordanAnimate The Web With Ember.js - Jessica Jordan
Animate The Web With Ember.js - Jessica JordanJessica Jordan
 
Effecient javascript
Effecient javascriptEffecient javascript
Effecient javascriptmpnkhan
 
Introduction to HTML5 Canvas
Introduction to HTML5 CanvasIntroduction to HTML5 Canvas
Introduction to HTML5 CanvasMindy McAdams
 
FĂłrum de Software Livre do Serpro RJ 2009
FĂłrum de Software Livre do Serpro RJ 2009FĂłrum de Software Livre do Serpro RJ 2009
FĂłrum de Software Livre do Serpro RJ 2009Fabio Akita
 
ES6: Features + Rails
ES6: Features + RailsES6: Features + Rails
ES6: Features + RailsSantosh Wadghule
 
Creating Beautiful CSS3 Animations - FITC Amsterdam 2016
Creating Beautiful CSS3 Animations - FITC Amsterdam 2016Creating Beautiful CSS3 Animations - FITC Amsterdam 2016
Creating Beautiful CSS3 Animations - FITC Amsterdam 2016Rami Sayar
 
DrupalCon jQuery
DrupalCon jQueryDrupalCon jQuery
DrupalCon jQueryNathan Smith
 
Building mobile web apps with Mobello
Building mobile web apps with MobelloBuilding mobile web apps with Mobello
Building mobile web apps with MobelloJeong-Geun Kim
 
js+ts fullstack typescript with react and express.pdf
js+ts fullstack typescript with react and express.pdfjs+ts fullstack typescript with react and express.pdf
js+ts fullstack typescript with react and express.pdfNuttavutThongjor1
 
fullstack typescript with react and express.pdf
fullstack typescript with react and express.pdffullstack typescript with react and express.pdf
fullstack typescript with react and express.pdfNuttavutThongjor1
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescriptDavid Furber
 
Getting started with ES6
Getting started with ES6Getting started with ES6
Getting started with ES6Nitay Neeman
 
ES6 - Level up your JavaScript Skills
ES6 - Level up your JavaScript SkillsES6 - Level up your JavaScript Skills
ES6 - Level up your JavaScript SkillsStefano Ceschi Berrini
 

Ähnlich wie Randomising css animations (20)

Angular animate
Angular animateAngular animate
Angular animate
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
ES6 Overview
ES6 OverviewES6 Overview
ES6 Overview
 
JavaScript Neednt Hurt - JavaBin talk
JavaScript Neednt Hurt - JavaBin talkJavaScript Neednt Hurt - JavaBin talk
JavaScript Neednt Hurt - JavaBin talk
 
JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6
 
Animate The Web With Ember.js - Jessica Jordan
Animate The Web With Ember.js - Jessica JordanAnimate The Web With Ember.js - Jessica Jordan
Animate The Web With Ember.js - Jessica Jordan
 
Effecient javascript
Effecient javascriptEffecient javascript
Effecient javascript
 
Introduction to HTML5 Canvas
Introduction to HTML5 CanvasIntroduction to HTML5 Canvas
Introduction to HTML5 Canvas
 
FĂłrum de Software Livre do Serpro RJ 2009
FĂłrum de Software Livre do Serpro RJ 2009FĂłrum de Software Livre do Serpro RJ 2009
FĂłrum de Software Livre do Serpro RJ 2009
 
ES6: Features + Rails
ES6: Features + RailsES6: Features + Rails
ES6: Features + Rails
 
Creating Beautiful CSS3 Animations - FITC Amsterdam 2016
Creating Beautiful CSS3 Animations - FITC Amsterdam 2016Creating Beautiful CSS3 Animations - FITC Amsterdam 2016
Creating Beautiful CSS3 Animations - FITC Amsterdam 2016
 
Js hacks
Js hacksJs hacks
Js hacks
 
DrupalCon jQuery
DrupalCon jQueryDrupalCon jQuery
DrupalCon jQuery
 
Building mobile web apps with Mobello
Building mobile web apps with MobelloBuilding mobile web apps with Mobello
Building mobile web apps with Mobello
 
ts+js
ts+jsts+js
ts+js
 
js+ts fullstack typescript with react and express.pdf
js+ts fullstack typescript with react and express.pdfjs+ts fullstack typescript with react and express.pdf
js+ts fullstack typescript with react and express.pdf
 
fullstack typescript with react and express.pdf
fullstack typescript with react and express.pdffullstack typescript with react and express.pdf
fullstack typescript with react and express.pdf
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescript
 
Getting started with ES6
Getting started with ES6Getting started with ES6
Getting started with ES6
 
ES6 - Level up your JavaScript Skills
ES6 - Level up your JavaScript SkillsES6 - Level up your JavaScript Skills
ES6 - Level up your JavaScript Skills
 

KĂŒrzlich hochgeladen

Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024The Digital Insurer
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...apidays
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024The Digital Insurer
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKJago de Vreede
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfOverkill Security
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vĂĄzquez
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...apidays
 

KĂŒrzlich hochgeladen (20)

Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 

Randomising css animations

  • 2. ADAM BANKIN Front End Engineer at Shutterstock 14 years experience with HTML, CSS and JS
  • 3. AUSTRALIAN (z === "zed"); // true "ize".replace(/z/, "s"); (r === "ahhhhhh"); // true $("#shrimp").on("barbie", function () { console.error("racial stereotype"); console.error("and frankly, I'm offended"); return false; });
  • 4. RANDOMISING CSS ANIMATIONS Why? Is this difficult?
  • 5.
  • 7. THE APPROACH Respect the separation of concerns Minimal interaction with the DOM Keep it "jank"-free
  • 8. DAFT JANK Addy Osmani's post on jank busting
  • 9. SEPARATION OF CONCERNS Don't write HTML Elements with JavaScript Use CSS to change appearance Use JavaScript for the rest
  • 10.
  • 11. THE APPROACH (AGAIN) Respect the separation of concerns Minimal interaction with the DOM Keep it "jank"-free Can we achieve randomised CSS animations with this approach?
  • 13. PREDEFINE YOUR DOM ELEMENTS <div id="bubble_source"> <div id="bubble_0" class="bubble"></div> <div id="bubble_1" class="bubble"></div> <div id="bubble_2" class="bubble"></div> <div id="bubble_3" class="bubble"></div> <div id="bubble_4" class="bubble"></div> <div id="bubble_5" class="bubble"></div> <div id="bubble_6" class="bubble"></div> 
 <div id="bubble_15" class="bubble"></div> </div> HTML
 Done
  • 14. CSS The syntax of CSS Keyframe Animations
  • 15. AT-RULE AND NAME @keyframes myAnimationName {...}
  • 16. 
 WITH PREFIXES @-webkit-keyframes myAnimationName {...} @-moz-keyframes myAnimationName {...} @keyframes myAnimationName {...}
  • 17. WITH KEYFRAMES @keyframes myAnimationName { from { background-position: 0 0; } to { background-position: -162px 0; } } MDN has a list of animatable properties
  • 18. CHOOSE THE RIGHT PROPERTIES TO ANIMATE top/left | translate Paul Irish's post on using translate instead of top/left
  • 19. WITH PERCENTAGE-BASED KEYFRAMES @keyframes myAnimationName { 0% { background-position: 0 0; } 100% { background-position: -162px 0; } }
  • 20. MIXED VALUES IN KEYFRAMES @keyframes myAnimationName { 0% { background-position: 0 0; } 23% { opacity: 0; background-position: -162px 0; } 100% { opacity: 1; } }
  • 21. TARGETING PREFIXED PROPERTIES @-webkit-keyframes myAnimationName { 0% {-webkit-transform-origin: 0 0;} 100% {-webkit-transform-origin: 25px 0;} } @-moz-keyframes myAnimationName { 0% {-moz-transform-origin: 0 0;} 100% {-moz-transform-origin: 25px 0;} } @keyframes myAnimationName { 0% {transform-origin: 0 0;} 100% {transform-origin: 25px 0;} }
  • 22. ATTACHING A DEFINED KEYFRAME ANIMATION .classWithAnimation { animation: myAnimationName 1.2s linear 0s infinite; }
  • 23. ... WITH PREFIXES .classWithAnimation { -webkit-animation: myAnimationName 1.2s linear 0s infinite; -moz-animation: myAnimationName 1.2s linear 0s infinite; animation: myAnimationName 1.2s linear 0s infinite; }
  • 24. SHORTHAND PROPERTIES EXPANDED /* shorthand */ .bubble { animation: myAnimationName 1.2s linear 0s infinite; } /* expanded */ .bubble { animation-name: myAnimationName; animation-duration: 1.2s; animation-timing-function: linear; animation-delay: 0s; animation-iteration-count: infinite; } and that's just some of them 
 at MDNthere are more
  • 25. *AHEM*
 PREFIXED /* let's now call it 'bubble' */ .bubble { -webkit-animation-name: myAnimationName; -webkit-animation-duration: 1.2s; -webkit-animation-timing-function: linear; -webkit-animation-delay: 0s; -webkit-animation-iteration-count: infinite; }
  • 26. ARE WE THERE YET? CSS Keyframe Animations, they: define a start 
 the inbetween frames 
 and the end?
  • 27.
  • 28. THE END IS NOT THE END "omit the to or 100% declaration from the @keyframe
" "then you call the animation on the progress bar
" "and just like that, the progress bar will animate itself up to the value set by the inline style." Chris Coyer's post on animating to an inline style
  • 29.
  • 30. "omit the to or 100% declaration from the @keyframe
" @keyframes myAnimationName { 0% {background-position: 0 0;} }
  • 31. "
then you call the animation on the progress bar
" .bubble { animation: myAnimationName 1.2s linear 0s infinite; }
  • 32. "
and just like that, the progress bar will animate itself up to the value set by the inline style." <div id="bubble_0" class="bubble" style="background-position: -162px 0;"></div>
  • 33.
  • 34. DOES IT NEED TO BE INLINE? What if the properties were set in a class ruleset? /* css */ @keyframes myAnimationName { 0% {background-position: 0 0;} } .bubble { animation: myAnimationName 1.2s linear 0s infinite; } .background-move { background-position: -162px 0; } Then the class was dynamically applied to the DOM Element? <!-- html --> <div id="bubble_0" class="bubble background-move"></div>
  • 35.
  • 36. RULESET AS INLINE STYLE /* Keyframe Animation definitions */ @-webkit-keyframes lightBlue { 0% { color: #2ed0e5; -webkit-transform: translate(0, 50px) scale(.2, .2); -webkit-transform-origin: 20px 0; } 14% { color: #2ed0e5; -webkit-transform: translate(0, -100px) scale(.3, .3); -webkit-transform-origin: 43px 0; } } @-moz-keyframes lightBlue { 0% { color: #2ed0e5; -moz-transform: translate(0, 50px) scale(.2, .2); -moz-transform-origin: 20px 0; } 14% { color: #2ed0e5; -moz-transform: translate(0, -100px) scale(.3, .3); -moz-transform-origin: 43px 0; } } @keyframes lightBlue { 0% { color: #2ed0e5;
  • 38. WHAT DOES JAVASCRIPT GIVE US? requestAnimationFrame/cancelAnimationFrame methods Event-type "animationend"
  • 39. 
 WITH PREFIXES requestAnimationFrame, msRequestAnimationFrame, mozRequestAnimationFrame, webkitRequestAnimationFrame, oRequestAnimationFrame animationend, MSAnimationEnd, webkitAnimationEnd, oAnimationEnd
  • 40. CLASSY JAVASCRIPT var ANIMATION_CLASSES = [ // colors ['color_dark_red', 'color_red', 'color_yellow', 'color_green', 'col // translations ['translateA', 'translateB', 'translateC', 'translateD', 'translate // origins ['originA', 'originB', 'originC', 'originD', 'originE', 'originF'], // durations ['time_1500', 'time_1800', 'time_2000', 'time_2500', 'time_2700'], // easings ['easing_1', 'easing_2', 'easing_3'], // names ['light_blue', 'mid_blue'] ];
  • 41. GAME ON When the page loads we: 1. Load custom classes "Bubble" and "BubbleController" 2. BubbleController puts all ".bubble" divs into an Array 3. It then makes two 'object pools' 4. One has "Bubble" instances, the other is ids from each div in the Array
  • 42. OBJECT POOLS ON HTML5ROCKS Colt McAnlis's post on Object Pools in JS
  • 43. GAME ON
 Then: 1. BubbleController runs a loop creating setTimeouts at +200ms 2. The interval calls BubbleController's 'createBubble' method 3. This method pops a Bubble instance from its pool 4. It also pops an id from the id pool 5. It creates a listener for completion of the Bubble's 'init' method 6. It creates a listener for completion of the Bubble's 'hide' method 7. It runs the Bubble's 'init' method, with the id property
  • 44. OBJECT POOL CODE IN BUBBLECONTROLLER // `bubbles` is an Array of Dom Elements // `bubbleClass` is Bubble function createObjectPools (bubbles, bubbleClass) { var j = bubbles.length; var bubbleArgs = { delegateName: NAME }; while (j--) { // populate the individual bubble's ids into an Array idPool[j] = bubbles[j].id; // use an Object Pool to create enough instances to control each bubble bubblePool[j] = new bubbleClass(bubbleArgs); } }
  • 45. 'CREATEBUBBLE' METHOD IN BUBBLECONTROLLER function createBubble () { // get new bubble instance id form the pools var bubble = bubblePool.pop(); var id = idPool.pop(); // listen for the end of the new bubble's init phase $.subscribe(NAME + EVENTS.INIT + STATUS.COMPLETE + id, bubbleInitCompleteHandle // call init on the bubble instance bubble.init({ id: id }); }
  • 46.
  • 47. GAME ON
 ALMOST THERE Finally, the Bubble's 'init' method: 1. The Bubble instance gets the DOM Element via the id 2. Bubble creates a listener for the 'animationend' event 3. It then gets a random class from each sub-Array in ANIMATION_CLASSES 4. It saves these as a String, but doesn't set its className 5. It fires off its 'init complete' Event 6. BubbleController reacts to this and calls requestAnimationFrame. 7. requestAnimationFrame calls the Bubble instances 'show' method 8. The 'show' method attaches the classlist, starting the animation
  • 48. 'INIT' METHOD IN BUBBLE Bubble.prototype.init = function (args) { // add inited variables this.id = args.id; this.node = doc.getElementById(args.id); this.$node = $(this.node); this.classList = 'bubble on'; // add listeners addListeners(this); setClassList(this); $.publish(this.delegateName + EVENTS.INIT + STATUS.COMPLETE + this.id, [this]); };
  • 49. RANDOMISING THROUGH THE ANIMATION_CLASSES ARRAY function setClassList (instance) { var j = ANIMATION_CLASSES.length; while (j--) { instance.classList += (' ' + randomValue(ANIMATION_CLASSES[j])); } } function randomValue (arr) { var length = arr.length; var idx = (Math.random() * length) | 0; return arr[idx]; }
  • 50. CALLING REQUESTANIMATIONFRAME IN BUBBLECONTROLLER function bubbleInitCompleteHandler (e, bubble) { $.unsubscribe(e.type, bubbleInitCompleteHandler); win.requestAnimationFrame(function () { bubble.show(); }); }
  • 51. 'SHOW' METHOD IN BUBBLE Bubble.prototype.show = function () { // appending the classes makes the bubble appear and the animation run this.node.className = this.classList; };
  • 52. GAME OFF 'animationend' event 1. The Bubble reacts to the DOM Element's 'animationend' event 2. It changes the className of the DOM Element to "splat" 3. It runs its 'hide' method and fires off 'hide complete' 4. Inside the 'hide complete' Event is the id as a String 5. BubbleController reacts to this 6. It 'pools' the Bubble instance and 'pools' the id 7. It then runs its 'createBubble' method to start all over again
  • 53. RE-'POOLING' THE BUBBLE AND ID IN BUBBLECONTROLLER function bubbleAnimationCompleteHandler (e, bubble, id) { // add the completed bubble and its id back into the pools bubblePool.unshift(bubble); idPool.unshift(id); createBubble(); }
  • 55. TIME ESCAPES ME The bubbles are done with :before and :after They're webfonts - that's a story in itself You can pause the bubbles 'animation-timing-function' easing is done with cubic- beziers THEY'RE CLICKABLE!
  • 56.
  • 57.
  • 58.