Skip to content

Instantly share code, notes, and snippets.

@mikewlange
Created October 22, 2018 23:01
Show Gist options
  • Save mikewlange/0c23235254fffff33dcf3000c50e69ea to your computer and use it in GitHub Desktop.
Save mikewlange/0c23235254fffff33dcf3000c50e69ea to your computer and use it in GitHub Desktop.
3D Fold out reveal

3D Fold out reveal

Click to reveal more info. Info folds out beneath the card, while the rest of the grid recedes.

A Pen by mike lange on CodePen.

License.

<div class="cards">
<div class="card">
<img src="http://s4c.cymru/temp/wave1.jpg">
<div class="card-title">
<a href="#" class="toggle-info btn">
<span class="left"></span>
<span class="right"></span>
</a>
<h2>
Card title
<small>Image from unsplash.com</small>
</h2>
</div>
<div class="card-flap flap1">
<div class="card-description">
This grid is an attempt to make something nice that works on touch devices. Ignoring hover states when they're not available etc.
</div>
<div class="card-flap flap2">
<div class="card-actions">
<a href="#" class="btn">Read more</a>
</div>
</div>
</div>
</div>
<div class="card">
<img src="http://s4c.cymru/temp/wave2.jpg">
<div class="card-title">
<a href="#" class="toggle-info btn">
<span class="left"></span>
<span class="right"></span>
</a>
<h2>
Card title
<small>Image from unsplash.com</small>
</h2>
</div>
<div class="card-flap flap1">
<div class="card-description">
This grid is an attempt to make something nice that works on touch devices. Ignoring hover states when they're not available etc.
</div>
<div class="card-flap flap2">
<div class="card-actions">
<a href="#" class="btn">Read more</a>
</div>
</div>
</div>
</div>
<div class="card">
<img src="http://s4c.cymru/temp/wave3.jpg">
<div class="card-title">
<a href="#" class="toggle-info btn">
<span class="left"></span>
<span class="right"></span>
</a>
<h2>
Card title
<small>Image from unsplash.com</small>
</h2>
</div>
<div class="card-flap flap1">
<div class="card-description">
This grid is an attempt to make something nice that works on touch devices. Ignoring hover states when they're not available etc.
</div>
<div class="card-flap flap2">
<div class="card-actions">
<a href="#" class="btn">Read more</a>
</div>
</div>
</div>
</div>
<div class="card">
<img src="http://s4c.cymru/temp/wave2.jpg">
<div class="card-title">
<a href="#" class="toggle-info btn">
<span class="left"></span>
<span class="right"></span>
</a>
<h2>
Card title
<small>Image from unsplash.com</small>
</h2>
</div>
<div class="card-flap flap1">
<div class="card-description">
This grid is an attempt to make something nice that works on touch devices. Ignoring hover states when they're not available etc.
</div>
<div class="card-flap flap2">
<div class="card-actions">
<a href="#" class="btn">Read more</a>
</div>
</div>
</div>
</div>
<div class="card">
<img src="http://s4c.cymru/temp/wave3.jpg">
<div class="card-title">
<a href="#" class="toggle-info btn">
<span class="left"></span>
<span class="right"></span>
</a>
<h2>
Card title
<small>Image from unsplash.com</small>
</h2>
</div>
<div class="card-flap flap1">
<div class="card-description">
This grid is an attempt to make something nice that works on touch devices. Ignoring hover states when they're not available etc.
</div>
<div class="card-flap flap2">
<div class="card-actions">
<a href="#" class="btn">Read more</a>
</div>
</div>
</div>
</div>
<div class="card">
<img src="http://s4c.cymru/temp/wave1.jpg">
<div class="card-title">
<a href="#" class="toggle-info btn">
<span class="left"></span>
<span class="right"></span>
</a>
<h2>
Card title
<small>Image from unsplash.com</small>
</h2>
</div>
<div class="card-flap flap1">
<div class="card-description">
This grid is an attempt to make something nice that works on touch devices. Ignoring hover states when they're not available etc.
</div>
<div class="card-flap flap2">
<div class="card-actions">
<a href="#" class="btn">Read more</a>
</div>
</div>
</div>
</div>
<div class="card">
<img src="http://s4c.cymru/temp/wave3.jpg">
<div class="card-title">
<a href="#" class="toggle-info btn">
<span class="left"></span>
<span class="right"></span>
</a>
<h2>
Card title
<small>Image from unsplash.com</small>
</h2>
</div>
<div class="card-flap flap1">
<div class="card-description">
This grid is an attempt to make something nice that works on touch devices. Ignoring hover states when they're not available etc.
</div>
<div class="card-flap flap2">
<div class="card-actions">
<a href="#" class="btn">Read more</a>
</div>
</div>
</div>
</div>
<div class="card">
<img src="http://s4c.cymru/temp/wave1.jpg">
<div class="card-title">
<a href="#" class="toggle-info btn">
<span class="left"></span>
<span class="right"></span>
</a>
<h2>
Card title
<small>Image from unsplash.com</small>
</h2>
</div>
<div class="card-flap flap1">
<div class="card-description">
This grid is an attempt to make something nice that works on touch devices. Ignoring hover states when they're not available etc.
</div>
<div class="card-flap flap2">
<div class="card-actions">
<a href="#" class="btn">Read more</a>
</div>
</div>
</div>
</div>
<div class="card">
<img src="http://s4c.cymru/temp/wave2.jpg">
<div class="card-title">
<a href="#" class="toggle-info btn">
<span class="left"></span>
<span class="right"></span>
</a>
<h2>
Card title
<small>Image from unsplash.com</small>
</h2>
</div>
<div class="card-flap flap1">
<div class="card-description">
This grid is an attempt to make something nice that works on touch devices. Ignoring hover states when they're not available etc.
</div>
<div class="card-flap flap2">
<div class="card-actions">
<a href="#" class="btn">Read more</a>
</div>
</div>
</div>
</div>
</div>
$(document).ready(function(){
var zindex = 10;
$("div.card").click(function(e){
e.preventDefault();
var isShowing = false;
if ($(this).hasClass("show")) {
isShowing = true
}
if ($("div.cards").hasClass("showing")) {
// a card is already in view
$("div.card.show")
.removeClass("show");
if (isShowing) {
// this card was showing - reset the grid
$("div.cards")
.removeClass("showing");
} else {
// this card isn't showing - get in with it
$(this)
.css({zIndex: zindex})
.addClass("show");
}
zindex++;
} else {
// no cards in view
$("div.cards")
.addClass("showing");
$(this)
.css({zIndex:zindex})
.addClass("show");
zindex++;
}
});
});
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>
// font stuff
@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,200,300,600,700,900);
// colour stuff
@white: #ffffff;
@lightBG: #dce1df;
@salmon: #ff6666;
@teal: #0096a0;
@tealMid: #0ebac7;
@tealContrast: #33ffff;
@tealShade: #007c85;
@darkGrey: #4f585e;
body {
background: @lightBG;
color: @darkGrey;
font-family: 'Source Sans Pro', sans-serif;
text-rendering: optimizeLegibility;
}
a.btn {
background: @teal;
border-radius: 4px;
box-shadow: 0 2px 0px 0 rgba(0,0,0,0.25);
color: @white;
display: inline-block;
padding: 6px 30px 8px;
position: relative;
text-decoration: none;
transition: all 0.1s 0s ease-out;
}
.no-touch a.btn:hover {
background: lighten(@teal,2.5);
box-shadow: 0px 8px 2px 0 rgba(0, 0, 0, 0.075);
transform: translateY(-2px);
transition: all 0.25s 0s ease-out;
}
.no-touch a.btn:active,
a.btn:active {
background: darken(@teal,2.5);
box-shadow: 0 1px 0px 0 rgba(255,255,255,0.25);
transform: translate3d(0,1px,0);
transition: all 0.025s 0s ease-out;
}
div.cards {
margin: 80px auto;
max-width: 960px;
text-align: center;
}
div.card {
background: @white;
display: inline-block;
margin: 8px;
max-width: 300px;
perspective: 1000;
position: relative;
text-align: left;
transition: all 0.3s 0s ease-in;
z-index: 1;
img {
max-width: 300px;
}
div.card-title {
background: @white;
padding: 6px 15px 10px;
position: relative;
z-index: 0;
a.toggle-info {
border-radius: 32px;
height: 32px;
padding: 0;
position: absolute;
right: 15px;
top: 10px;
width: 32px;
span {
background: @white;
display: block;
height: 2px;
position: absolute;
top: 16px;
transition: all 0.15s 0s ease-out;
width: 12px;
}
span.left {
right: 14px;
transform: rotate(45deg);
}
span.right {
left: 14px;
transform: rotate(-45deg);
}
}
h2 {
font-size: 24px;
font-weight: 700;
letter-spacing: -0.05em;
margin: 0;
padding: 0;
small {
display: block;
font-size: 18px;
font-weight: 600;
letter-spacing: -0.025em;
}
}
}
div.card-description {
padding: 0 15px 10px;
position: relative;
font-size: 14px;
}
div.card-actions {
box-shadow: 0 2px 0px 0 rgba(0,0,0,0.075);
padding: 10px 15px 20px;
text-align: center;
}
div.card-flap {
background: darken(@white,15);
position: absolute;
width: 100%;
transform-origin: top;
transform: rotateX(-90deg);
}
div.flap1 {
transition: all 0.3s 0.3s ease-out;
z-index: -1;
}
div.flap2 {
transition: all 0.3s 0s ease-out;
z-index: -2;
}
}
div.cards.showing {
div.card {
cursor: pointer;
opacity: 0.6;
transform: scale(0.88);
}
}
.no-touch div.cards.showing {
div.card:hover {
opacity: 0.94;
transform: scale(0.92);
}
}
div.card.show {
opacity: 1 !important;
transform: scale(1) !important;
div.card-title {
a.toggle-info {
background: @salmon !important;
span {
top: 15px;
}
span.left {
right: 10px;
}
span.right {
left: 10px;
}
}
}
div.card-flap {
background: @white;
transform: rotateX(0deg);
}
div.flap1 {
transition: all 0.3s 0s ease-out;
}
div.flap2 {
transition: all 0.3s 0.2s ease-out;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment