JSFiddle - React, Tailwind, and code Playground
Material Design Expanding Overlay
by Jennifer Perrin
HTML
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
<script src="http://fonts.googleapis.com/css?family=Open+Sans:400,300,700"></script>
<main>
<h1><a href="http://ettrics.com/">Ettrics</a></h1>
<p>A Material Design inspired expanding overlay for showcasing a variety of content.</p>
<p><a href="https://twitter.com/ettrics/" target="_blank"><i class="fa fa-twitter"></i></a></p><img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/45226/plate.svg" alt="" class="plate"/>
</main>
<!-- Component starts here-->
<ul class="blocks-names">
<li class="blocks__name">Eggs</li>
<li class="blocks__name">Bacon</li>
<li class="blocks__name">Toast</li>
<li class="blocks__name">Donuts</li>
<li class="blocks__name">Coffee</li>
</ul>
<ul class="blocks">
<li id="1" class="blocks__block"></li>
<li id="2" class="blocks__block"></li>
<li id="3" class="blocks__block"></li>
<li id="4" class="blocks__block"></li>
<li id="5" class="blocks__block"></li>
</ul>
<ul class="blocks-content">
<li class="blocks-content__content">
<div class="content__close"></div>
<h2>Eggs</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Vitae modi esse, totam sequi non quae, rerum facilis nesciunt iusto praesentium officiis assumenda dignissimos. Saepe, facere incidunt. Laudantium quisquam asperiores sint.</p><i class="blocks__content-close fa fa-close"></i>
</li>
<li class="blocks-content__content">
<h2>Bacon</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti ducimus voluptate velit quae cumque neque minima harum libero eligendi alias laboriosam ad, consequuntur error atque incidunt assumenda sapiente! Architecto, excepturi?</p><i class="blocks__content-close fa fa-close"></i>
</li>
<li class="blocks-content__content">
<h2>Toast</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sint...
CSS
* {
box-sizing: border-box;
}
body {
font-family: 'Open Sans';
font-weight: 400;
text-align: center;
}
.blocks {
position: fixed;
bottom: 0;
z-index: 1;
list-style-type: none;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
width: 100%;
margin: 0;
padding: 0;
}
.blocks__block {
will-change: transform;
position: relative;
height: 20vh;
-webkit-box-flex: 1;
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
-webkit-transition: all 0.7s cubic-bezier(0.23, 1, 0.32, 1);
transition: all 0.7s cubic-bezier(0.23, 1, 0.32, 1);
}
.blocks__block:nth-child(1) {
background: #f4d35d;
-webkit-transform-origin: 0% 100%;
-ms-transform-origin: 0% 100%;
transform-origin: 0% 100%;
}
.blocks__block:nth-child(2) {
background: #db5b4a;
-webkit-transform-origin: 25% 100%;
-ms-transform-origin: 25% 100%;
transform-origin: 25% 100%;
}
.blocks__block:nth-child(3) {
background: #e2bb7f;
-webkit-transform-origin: 50% 100%;
-ms-transform-origin: 50% 100%;
transform-origin: 50% 100%;
}
.blocks__block:nth-child(4) {
background: #f67b7d;
-webkit-transform-origin: 75% 100%;
-ms-transform-origin: 75% 100%;
transform-origin: 75% 100%;
}
.blocks__block:nth-child(5) {
background: #a1775a;
-webkit-transform-origin: 100% 100%;
-ms-transform-origin: 100% 100%;
transform-origin: 100% 100%;
}
.blocks__block.active {
z-index: 2;
}
.blocks-content {
list-style-type: none;
margin: 0;
padding: 0;
position: absolute;
bottom: 0;
left: 0;
height: 100vh;
width: 100%;
}
.blocks-content__content {
will-change: transform, opacity;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-webkit-justify-content: center;
...
JavaScript
(function() {
var bHeight, bWidth, block, bname, closeBtn, closeContent, content, expand, openContent, updateValues, wHeight, wWidth, xVal, yVal;
block = $('.blocks__block');
bname = $('.blocks__name');
content = $('.blocks-content__content');
closeBtn = $('.blocks__content-close');
wHeight = $(window).outerHeight();
wWidth = $(window).outerWidth();
bHeight = block.outerHeight();
bWidth = block.outerWidth();
xVal = Math.round(wWidth / bWidth) + 0.03;
yVal = wHeight / bHeight + 0.03;
expand = function() {
var aBlock, num;
num = $(this).index();
aBlock = block.eq(num);
if (!aBlock.hasClass('active')) {
bname.css('opacity', '0');
aBlock.css({
'transform': 'scale(' + xVal + ',' + yVal + ')',
'-webkit-transform': 'scale(' + xVal + ',' + yVal + ')'
});
aBlock.addClass('active');
openContent(num);
}
};
openContent = function(num) {
var aContent;
content.css({
'transition': 'all 0.3s 0.4s ease-out',
'-webkit-transition': 'all 0.3s 0.4s ease-out'
});
aContent = content.eq(num);
aContent.addClass('active');
};
closeContent = function() {
bname.css('opacity', '1');
content.css({
'transition': 'all 0.1s 0 ease-out',
'-webkit-transition': 'all 0.1s 0 ease-out'
});
block.css({
'transform': 'scale(1)',
'-webkit-transform': 'scale(1)'
});
block.removeClass('active');
content.removeClass('active');
};
updateValues = function() {
var yVal;
var xVal;
var bWidth;
var bHeight;
var wWidth;
var wHeight;
var aBlock;
if (block.hasClass('active')) {
aBlock = $('.blocks__block.active');
wHeight = $(window).height();
wWidth = $(window).width();
bHeight = block.height();
bWidth = block.width();
xVal = Math.round(wWidth / bWidth) + 0.03;
yVal = wHeight / bHeight + 0.03;
aBlock.css({
'transform': 'scale(' +...