Jank Free Card Animations
How do I make an jank free card animations?
This pen illustrates animation techniques used on the Chrome dev summit website https://developer.chrome.com/devsummit/. What is a jank free card animations? How do you make a jank free card animations? This script and codes were developed by Tryggvi Gylfason on 15 October 2022, Saturday.
Jank Free Card Animations - Script Codes HTML Codes
<!DOCTYPE html>
<html >
<head> <meta charset="UTF-8"> <title>Jank Free Card Animations</title> <link rel='stylesheet prefetch' href='https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css"'> <link rel="stylesheet" href="css/style.css">
</head>
<body> <link rel="stylesheet" href="style.css">
<body> <div> <h1 class="header">Fast animations</h1> </div> <main> <section class="card citrus"> <div class="card__container"> <a href="#" class="card__see-more"></a> <a href="#" class="card__collapse-button"></a> <h1 class="card__title">Citrus</h1> <div class="card__logo"></div> <div class="card__content-wrapper"> <div class="card__content-block"> <h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</h1> </div> </div> </div> </section> <section class="card sun"> <div class="card__container"> <a href="#" class="card__see-more"></a> <a href="#" class="card__collapse-button"></a> <h1 class="card__title">Sun</h1> <div class="card__logo"></div> <div class="card__content-wrapper"> <div class="card__content-block"> <h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</h1> </div> </div> </div> </section> <section class="img1" aria-role="img" alt="img1"></section> <div class="app-sections__card-breaker"></div> <section class="img2" aria-role="img" alt="img2"></section> <section class="card bat"> <div class="card__container"> <a href="#" class="card__see-more"></a> <a href="#" class="card__collapse-button"></a> <h1 class="card__title">Zombie</h1> <div class="card__logo"></div> <div class="card__content-wrapper"> <div class="card__content-block"> <h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</h1> </div> </div> </div> </section> </main> <script src="main.js" type="text/javascript"></script>
</body>
</html> <script src="js/index.js"></script>
</body>
</html>
Jank Free Card Animations - Script Codes CSS Codes
/*custom fonts - Bitter, Montserrat*/
@import url('https://fonts.googleapis.com/css?family=Montserrat|Bitter');
/*basic reset*/
* {margin: 0; padding: 0; box-sizing: border-box;}
body { background: url('http://thecodeplayer.com/u/m/b1.png') no-repeat center center fixed; background-size: cover; font-family: Bitter; color: #111;
}
.header { margin-top: 20px; font: normal 32px/32px Bitter; color: white; text-align: center;
}
main { position: relative; top: 150px; width: 900px; margin: 0 auto;
}
.img2 { background: url(http://img2.goodfon.su/original/1920x1200/3/b6/android-5-0-lollipop-material-5355.jpg); background-size: cover; background-position: top right; width: 300px; height: 400px; display: inline-block;
}
.img1 { background: url(http://orig11.deviantart.net/8b3a/f/2015/156/c/a/jay_material_stich_grey_red_by_jayexplicitly-d8w52h1.png); background-size: cover; background-position: top left; width: 270px; height: 200px; display: inline-block;
}
.card { height: 168px; position: relative; display: inline-block; -webkit-tap-highlight-color: transparent;
}
.card__see-more { display: block; width: 100%; height: 100%; position: absolute; text-indent: -30000px; overflow: hidden;
}
.card__see-more:focus { background: rgba(0, 0, 0, 0.12);
}
.card__title { font-family: 'Roboto',sans-serif; line-height: 1; letter-spacing: -0.01em; font-size: 16px; opacity: 1; color: #FFF; top: 16px; left: 16px; position: absolute; line-height: 18px; margin: 0; padding: 0; height: 18px; pointer-events: none; -moz-osx-font-smoothing: grayscale; -webkit-transform-origin: 0 0; transform-origin: 0 0;
}
.card__collapse-button { position: absolute; top: 16px; left: 16px; width: 24px; height: 24px; background: url(http://www.valencia.org/images/leftArrow.png) center center no-repeat; background-size: contain; text-indent: -2000px; overflow: hidden; pointer-events: none; opacity: 0; -webkit-transform-origin: 0 0; transform-origin: 0 0;
}
.card__logo { position: absolute; pointer-events: none; -webkit-transform-origin: 0 0; transform-origin: 0 0;
}
.card__container { height: 100%; overflow: hidden; position: relative;
}
.card__container:after { content: ''; display: block; width: 100%; height: 100%; position: absolute; left: 0; top: 0; opacity: 0; pointer-events: none; background: #000; -webkit-transition: opacity 0.33333s cubic-bezier(0, 0, 0.21, 1); transition: opacity 0.33333s cubic-bezier(0, 0, 0.21, 1);
}
.card_img {background: top no-repeat; background-size: contain; height:150px;}
.card__logo { position: absolute; pointer-events: none; -webkit-transform-origin: 0 0; transform-origin: 0 0;
}
.card__content-wrapper { border-top: 136px solid #EA006F; position: relative; min-height: calc(100vh - 60px); top: 260px; background: #FFF; -webkit-transform-origin: 0 0; transform-origin: 0 0;
}
.card__content-wrapper { max-width:574px; height: auto; min-height: initial; margin: 0 auto; border-radius: 3px; box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.16),0px 2px 5px 0px rgba(0, 0, 0, 0.23);
}
.card__content-block { margin-bottom: 20px; padding: 10px;
}
.citrus {width: 200px; height: 200px;}
.citrus > .card__container {background: rgb(216, 46, 27);}
.citrus .card__logo { background: url(http://www.iconsplace.com/download/white-citrus-256.png) no-repeat; background-size: contain; height: 120px; width: 120px; top: calc(50% - 50px); left: calc(50% - 60px);
}
.citrus .card__content-wrapper { border-top: 145px solid rgb(140, 15, 0);
}
.citrus.card--expanded .card__logo { left: calc(50% - 61px); top: 76px; width: 120px; height: 120px;
}
.sun {width: 400px; height: 200px;}
.sun > .card__container {background: rgb(38, 116, 27);}
.sun .card__logo { background: url(http://www.iconsplace.com/icons/preview/white/sun-128.png) no-repeat; background-size: contain; height: 120px; width: 120px; top: calc(50% - 50px); left: calc(50% - 60px);
}
.sun .card__content-wrapper { border-top: 145px solid rgb(109, 185, 0);
}
.sun.card--expanded .card__logo { left: calc(50% - 61px); top: 76px; width: 120px; height: 120px;
}
.bat {width: auto; height: 400px;}
.bat > .card__container {background: rgb(25, 25, 25);}
.bat .card__logo { background: url(http://www.iconsplace.com/icons/preview/white/zombie-256.png) no-repeat; background-size: contain; height: 300px; width: 300px; top: calc(50% - 150px); left: calc(50% - 150px);
}
.bat .card__content-wrapper { border-top: 145px solid rgb(75, 75, 75); top: 500px;
}
.bat.card--expanded .card__logo { left: calc(50% - 61px); top: 76px; width: 120px; height: 120px;
}
.card--expanded {z-index: 4;}
.card--expanded .card__logo {z-index: 5;}
.card--expanded>.card__container { margin: 0; position: fixed; top: 0; left: 0; width: 100%; min-height: 100%; height: 100vh;
}
.card--expanded>.card__container>.card__see-more { display: none;
}
.card--expanded>.card__container>.card__collapse-button { top: 16px; left: 16px; pointer-events: auto; opacity: 1; position: fixed;
}
.card--expanded>.card__container>.card__collapse-button:focus,.card--expanded>.card__container>.card__collapse-button:hover { opacity: 1; outline: none;
}
.card--expanded>.card__container>.card__title { font-size: 20px; left: 72px; height: 22px; line-height: 22px; position: fixed;
}
.card--expanded>.card__container>.card__content-wrapper { top: 64px;
}
.card--expanded>.card__container:before { position: fixed; content: ''; height: 56px; width: 100%; background: rgba(0, 0, 0, 0.16); top: 0; left: 0; display: block;
}
.card--expanded>.card__container:before { box-shadow: 0px 2px 5px 0px rgba(0, 0, 0, 0.16),0px 2px 5px 0px rgba(0, 0, 0, 0.23);
}
.card--expanded>.card__container--scrollable>.card__collapse-button { opacity: 0.7;
}
.card--expanded.card__no-fixed-header>.card__container>.card__collapse-button { position: relative; display: inline-block; top: 16px;
}
.card--expanded.card__no-fixed-header>.card__container>.card__title { position: relative; display: inline-block; top: 20px; left: 43px;
}
.card--expanded.card__no-fixed-header>.card__container:before { position: relative; display: none;
}
.card--expanded.card__no-fixed-header>.card__container>.card__content-wrapper { top: 36px;
}
.card--animatable>.card__container { margin: 0; position: fixed; top: 0; left: 0; width: 100%; height: 100%; -webkit-transition: clip 0.33333s cubic-bezier(0, 0, 0.21, 1); transition: clip 0.33333s cubic-bezier(0, 0, 0.21, 1);
}
.card--animatable>.card__container>.card__title,.card--animatable>.card__container>.card__content-wrapper { -webkit-transition: -webkit-transform 0.33333s cubic-bezier(0, 0, 0.21, 1),opacity 0.33333s cubic-bezier(0, 0, 0.21, 1); transition: transform 0.33333s cubic-bezier(0, 0, 0.21, 1),opacity 0.33333s cubic-bezier(0, 0, 0.21, 1);
}
.card--animatable>.card__container>.card__logo { -webkit-transition: -webkit-transform 0.33333s cubic-bezier(0, 0, 0.21, 1),opacity 0.33333s cubic-bezier(0, 0, 0.21, 1); transition: transform 0.33333s cubic-bezier(0, 0, 0.21, 1),opacity 0.33333s cubic-bezier(0, 0, 0.21, 1);
}
.card--animatable>.card__container>.card__collapse-button { -webkit-transition: -webkit-transform 0.33333s cubic-bezier(0, 0, 0.21, 1),opacity 0.33333s cubic-bezier(0, 0, 0.21, 1); transition: transform 0.33333s cubic-bezier(0, 0, 0.21, 1),opacity 0.33333s cubic-bezier(0, 0, 0.21, 1);
}
.card--animatable>.card__container--lofi-animations { -webkit-transform-origin: 0 0; transform-origin: 0 0; -webkit-transition: -webkit-transform 0.33333s cubic-bezier(0, 0, 0.21, 1); transition: transform 0.33333s cubic-bezier(0, 0, 0.21, 1);
}
.card--animatable>.card__container--lofi-animations:after { -webkit-transition: none; transition: none; opacity: 1;
}
.card--collapsing>.card__container { -webkit-transition: clip 0.32666s cubic-bezier(0, 0, 0.21, 1); transition: clip 0.32666s cubic-bezier(0, 0, 0.21, 1);
}
.card--collapsing>.card__container--lofi-animations { -webkit-transition: -webkit-transform 0.33333s cubic-bezier(0, 0, 0.21, 1); transition: transform 0.33333s cubic-bezier(0, 0, 0.21, 1);
}
.app-sections { background: #FFF;
}
.app-sections__card-breaker { clear: both; display: block;
}
.app-sections__card-breaker:after { content: ''; clear: both; display: table;
}
/** * Material design images created by * http://jayexplicitly.deviantart.com/ */
Jank Free Card Animations - Script Codes JS Codes
/** * Illustration of techniques used on the Chrome * dev summit website :https://developer.chrome.com/devsummit/ * which was developed by Paul Lewis (http://aerotwist.com/) */
var App = {};
App.Utils = { makeObject : function(keys, value) { var obj = {}; for (var i = 0; i < i.length; i++) obj[keys[i]] = value; return obj; }
};
App.Card = function(elem) { 'use strict'; this.elements_ = { root: elem, seeMoreLink: elem.querySelector('.card__see-more'), container: elem.querySelector(".card__container"), title: elem.querySelector(".card__title"), logo: elem.querySelector(".card__logo"), contentWrapper: elem.querySelector(".card__content-wrapper"), collapseButton: elem.querySelector(".card__collapse-button") }; this.expanded_ = false; this.diffs_ = { root: App.Utils.makeObject(this.properties_, 0), seeMoreLink: App.Utils.makeObject(this.properties_, 0), container: App.Utils.makeObject(this.properties_, 0), title: App.Utils.makeObject(this.properties_, 0), logo: App.Utils.makeObject(this.properties_, 0), contentWrapper: App.Utils.makeObject(this.properties_, 0), collapseButton: App.Utils.makeObject(this.properties_, 0) } this.onSeeMoreLinkClick_ = this.onSeeMoreLinkClick_.bind(this); this.onCollapseButtonClick_ = this.onCollapseButtonClick_.bind(this); this.elements_.seeMoreLink.addEventListener('click',this.onSeeMoreLinkClick_); this.elements_.collapseButton.addEventListener('click', this.onCollapseButtonClick_); this.parts_ = Object.keys(this.elements_); this.collapsedPositions_ = App.Utils.makeObject(this.parts_, null); this.expandedPositions_ = App.Utils.makeObject(this.parts_, null); var self = this; this.elements_.container.addEventListener('transitionend', function() { self.elements_.root.classList.remove('card--animatable'); self.elements_.container.style.clip = ""; if(!self.expanded_) { self.elements_.root.classList.remove('card--expanded'); self.elements_.root.classList.remove('card--collapsing'); self.resetElementTransformsAndOpacity_(); } });
};
App.Card.prototype = { applyClipRect_: function() { if (this.expanded_) { var a = this.elements_.container.getBoundingClientRect(); this.elements_.container.style.clip = "rect(0, " + a.width + "px, " + a.height + "px, 0)" } }, onCollapseButtonClick_ : function() { this.applyClipRect_(); this.expanded_ = false; this.elements_.root.classList.add("card--collapsing"); this.elements_.root.classList.add("card--animatable"); this.setElementTransformsToStartAndClipToCollapsed_(); }, onSeeMoreLinkClick_ : function() { this.expanded_ = true; // Read collapsed positions. this.collectProperties_(this.collapsedPositions_); // Expand the card and read again. this.elements_.root.classList.add('card--expanded'); this.collectProperties_(this.expandedPositions_); // Figure out the difference and transform back. this.calculatePositionDiffs_(); this.setElementTransformsToStartAndClipToCollapsed_(); // Read to force the style change to take hold. var forceLayoutTrigger = this.elements_.root.offsetTop; // Switch on animations and remove the transforms. this.elements_.root.classList.add('card--animatable'); this.setElementTransformsToZeroAndClipToExpanded_(); }, calculatePositionDiffs_ : function() { var part; for (var i = 0; i < this.parts_.length; i++) { part = this.parts_[i]; this.diffs_[part].left = this.collapsedPositions_[part].left - this.expandedPositions_[part].left; this.diffs_[part].top = this.collapsedPositions_[part].top - this.expandedPositions_[part].top; this.diffs_[part].width = this.collapsedPositions_[part].width - this.expandedPositions_[part].width; this.diffs_[part].height = this.collapsedPositions_[part].height - this.expandedPositions_[part].height; this.diffs_[part].scaleX = this.collapsedPositions_[part].width / this.expandedPositions_[part].width; this.diffs_[part].scaleY = this.collapsedPositions_[part].height / this.expandedPositions_[part].height;
this.diffs_[part].opacity = 1 - (this.expandedPositions_[part].opacity - this.collapsedPositions_[part].opacity); } }, collectProperties_ : function(target) { var part; for (var i = 0; i < this.parts_.length; i++) { part = this.parts_[i]; target[part] = this.elements_[part].getBoundingClientRect(); target[part].opacity = parseFloat(window.getComputedStyle( this.elements_[part]).opacity); target[part].width = Math.min(target[part].width, window.innerWidth); target[part].height = Math.min(target[part].height, window.innerHeight); } }, setElementTransformAndOpacity_ : function(elem, transforms, opacity) { elem.style.opacity = opacity; // transform is either an object or a string. if("string" != typeof transforms) { var transformString = "translate(" + transforms.left + "px," + transforms.top + "px)"; if(elem !== this.elements_.contentWrapper && elem !== this.elements_.content) transformString += " scale(" + transforms.scaleX + ", " + transforms.scaleY + ")"; elem.style.transform = transformString; } else { elem.style.transform = transforms; } }, setElementTransformsToZeroAndClipToExpanded_ : function() { var part; for (var i = 0; i < this.parts_.length; i++) { part = this.parts_[i]; if('root' != part) { this.setElementTransformAndOpacity_(this.elements_[part], 'translate(0,0) scale(1)', this.expandedPositions_[part].opacity); } } this.elements_.container.style.clip = "rect(" + this.expandedPositions_.container.top + "px, " + this.expandedPositions_.container.right + "px, " + this.expandedPositions_.container.bottom + "px, " + this.expandedPositions_.container.left + "px)"; }, setElementTransformsToStartAndClipToCollapsed_ : function() { this.boxPositionOnExpand_ = this.elements_.root.getBoundingClientRect(); var part; var b = this.elements_.root.getBoundingClientRect(), leftOffset = b.left; topOffset = b.top; for (var i = 0; i < this.parts_.length; i++) { part = this.parts_[i]; if("container" !== part && "root" !== part) { this.setElementTransformAndOpacity_( this.elements_[part], this.diffs_[part], this.diffs_[part].opacity ); } } var left = this.collapsedPositions_.container.left; var right = this.collapsedPositions_.container.right; var top = this.collapsedPositions_.container.top; var bottom = this.collapsedPositions_.container.bottom; this.elements_.container.style.clip = "rect(" + top + "px, " + right + "px, " + bottom + "px, " + left + "px)"; }, resetElementTransformsAndOpacity_: function() { var part; for (var b = 0; b < this.parts_.length; b++) { part = this.parts_[b]; this.setElementTransformAndOpacity_(this.elements_[part], "", ""); } }
};
App.Cards = function() { "use strict"; var cards = []; var cardsEl = document.querySelectorAll(".card"); for (var i = 0; i < cardsEl.length; i++) { var card = cardsEl[i]; cards[i] = new App.Card(card); } return cards;
};
var cards = App.Cards();
Developer | Tryggvi Gylfason |
Username | tryggvigy |
Uploaded | October 15, 2022 |
Rating | 3.5 |
Size | 5,953 Kb |
Views | 14,168 |
Find the perfect freelance services for your business! Fiverr's mission is to change how the world works together. Fiverr connects businesses with freelancers offering digital services in 500+ categories. Find Developer!
Name | Size |
Flexbox - one-line form | 3,021 Kb |
Heart Construction Loading Animation | 2,518 Kb |
Icelandic characters | 1,216 Kb |
Smallest possible website | 1,185 Kb |
Flexbox - text-align | 2,526 Kb |
Flexbox - equal height grid | 2,689 Kb |
P R E S S E D | 2,047 Kb |
Redux - Template | 3,669 Kb |
ImmutableJS Object as key | 1,464 Kb |
Macintosh 128k - Terminal | 4,994 Kb |
Jasper is the AI Content Generator that helps you and your team break through creative blocks to create amazing, original content 10X faster. Discover all the ways the Jasper AI Content Platform can help streamline your creative workflows. Start For Free!
Name | Username | Size |
A Pen by MurabitoB | MurabitoB | 4,421 Kb |
Greyscale image with filter in CSS3 | NickyCDK | 1,562 Kb |
Iron Man SVG Loading Animation | Andythayer | 3,069 Kb |
React JS Movie Info App | MTushar | 4,870 Kb |
Vanilla JS - A toggleClass function | Woodwork | 2,532 Kb |
Toggle Time | Petebot | 5,345 Kb |
Font stack | Adrianjacob | 1,868 Kb |
A Pen by Paul Sullivan | Pwsm50 | 2,349 Kb |
Starfield using KineticJS | Asp | 3,512 Kb |
Two joint circles - One element | Berdejitendra | 1,704 Kb |
Surf anonymously, prevent hackers from acquiring your IP address, send anonymous email, and encrypt your Internet connection. High speed, ultra secure, and easy to use. Instant setup. Hide Your IP Now!