Jank Free Card Animations

Size
5,953 Kb
Views
14,168

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 Previews

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();
Jank Free Card Animations - Script Codes
Jank Free Card Animations - Script Codes
Home Page Home
Developer Tryggvi Gylfason
Username tryggvigy
Uploaded October 15, 2022
Rating 3.5
Size 5,953 Kb
Views 14,168
Do you need developer help for Jank Free Card Animations?

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!

Tryggvi Gylfason (tryggvigy) Script Codes
Create amazing captions with AI!

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!