Hacking together a solution to show part of an element in a card as a default state, lining up the element headline across each card and then animating the element to the center of its parent element
A Pen by Ryan Mulligan on CodePen.
Hacking together a solution to show part of an element in a card as a default state, lining up the element headline across each card and then animating the element to the center of its parent element
A Pen by Ryan Mulligan on CodePen.
| - var cards = [{ title: 'Mountain View', copy: 'Check out all of these gorgeous mountain trips with beautiful views of, you guessed it, the mountains', button: 'View Trips' }, { title: 'To The Beach', copy: 'Plan your next beach trip with these fabulous destinations', button: 'View Trips' }, { title: 'Desert Destinations', copy: 'It\'s the desert you\'ve always dreamed of', button: 'Book Now' }, { title: 'Explore The Galaxy', copy: 'Seriously, straight up, just blast off into outer space today', button: 'Book Now' }] | |
| mixin card(title, copy, button) | |
| .card | |
| .content | |
| h2.title= title | |
| p.copy= copy | |
| button.btn= button | |
| main.page-content | |
| each card in cards | |
| +card(card.title, card.copy, card.button) |
| @import url('https://fonts.googleapis.com/css?family=Cardo:400i|Rubik:400,700&display=swap'); | |
| $imageIds: '1517021897933-0e0319cfbc28', '1533903345306-15d1c30952de', '1545243424-0ce743321e11', '1531306728370-e2ebd9d7bb99'; | |
| $bp-md: 600px; | |
| $bp-lg: 800px; | |
| :root { | |
| --d: 700ms; | |
| --e: cubic-bezier(0.19, 1, 0.22, 1); | |
| --font-sans: 'Rubik', sans-serif; | |
| --font-serif: 'Cardo', serif; | |
| } | |
| * { | |
| box-sizing: border-box; | |
| } | |
| html, body { | |
| height: 100%; | |
| } | |
| body { | |
| display: grid; | |
| place-items: center; | |
| } | |
| .page-content { | |
| display: grid; | |
| grid-gap: 1rem; | |
| padding: 1rem; | |
| max-width: 1024px; | |
| margin: 0 auto; | |
| font-family: var(--font-sans); | |
| @media (min-width: $bp-md) { | |
| grid-template-columns: repeat(2, 1fr); | |
| } | |
| @media (min-width: $bp-lg) { | |
| grid-template-columns: repeat(4, 1fr); | |
| } | |
| } | |
| .card { | |
| position: relative; | |
| display: flex; | |
| align-items: flex-end; | |
| overflow: hidden; | |
| padding: 1rem; | |
| width: 100%; | |
| text-align: center; | |
| color: whitesmoke; | |
| background-color: whitesmoke; | |
| box-shadow: 0 1px 1px rgba(0,0,0,0.1), | |
| 0 2px 2px rgba(0,0,0,0.1), | |
| 0 4px 4px rgba(0,0,0,0.1), | |
| 0 8px 8px rgba(0,0,0,0.1), | |
| 0 16px 16px rgba(0,0,0,0.1); | |
| @media (min-width: $bp-md) { | |
| height: 350px; | |
| } | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 110%; | |
| background-size: cover; | |
| background-position: 0 0; | |
| transition: transform calc(var(--d) * 1.5) var(--e); | |
| pointer-events: none; | |
| } | |
| &:after { | |
| content: ''; | |
| display: block; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 200%; | |
| pointer-events: none; | |
| background-image: linear-gradient( | |
| to bottom, | |
| hsla(0, 0%, 0%, 0) 0%, | |
| hsla(0, 0%, 0%, 0.009) 11.7%, | |
| hsla(0, 0%, 0%, 0.034) 22.1%, | |
| hsla(0, 0%, 0%, 0.072) 31.2%, | |
| hsla(0, 0%, 0%, 0.123) 39.4%, | |
| hsla(0, 0%, 0%, 0.182) 46.6%, | |
| hsla(0, 0%, 0%, 0.249) 53.1%, | |
| hsla(0, 0%, 0%, 0.320) 58.9%, | |
| hsla(0, 0%, 0%, 0.394) 64.3%, | |
| hsla(0, 0%, 0%, 0.468) 69.3%, | |
| hsla(0, 0%, 0%, 0.540) 74.1%, | |
| hsla(0, 0%, 0%, 0.607) 78.8%, | |
| hsla(0, 0%, 0%, 0.668) 83.6%, | |
| hsla(0, 0%, 0%, 0.721) 88.7%, | |
| hsla(0, 0%, 0%, 0.762) 94.1%, | |
| hsla(0, 0%, 0%, 0.790) 100% | |
| ); | |
| transform: translateY(-50%); | |
| transition: transform calc(var(--d) * 2) var(--e); | |
| } | |
| @each $id in $imageIds { | |
| $i: index($imageIds, $id); | |
| &:nth-child(#{$i}):before { | |
| background-image: url(https://images.unsplash.com/photo-#{$id}?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjE0NTg5fQ); | |
| } | |
| } | |
| } | |
| .content { | |
| position: relative; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| width: 100%; | |
| padding: 1rem; | |
| transition: transform var(--d) var(--e); | |
| z-index: 1; | |
| > * + * { | |
| margin-top: 1rem; | |
| } | |
| } | |
| .title { | |
| font-size: 1.3rem; | |
| font-weight: bold; | |
| line-height: 1.2; | |
| } | |
| .copy { | |
| font-family: var(--font-serif); | |
| font-size: 1.125rem; | |
| font-style: italic; | |
| line-height: 1.35; | |
| } | |
| .btn { | |
| cursor: pointer; | |
| margin-top: 1.5rem; | |
| padding: 0.75rem 1.5rem; | |
| font-size: 0.65rem; | |
| font-weight: bold; | |
| letter-spacing: 0.025rem; | |
| text-transform: uppercase; | |
| color: white; | |
| background-color: black; | |
| border: none; | |
| &:hover { | |
| background-color: lighten(black, 5%); | |
| } | |
| &:focus { | |
| outline: 1px dashed yellow; | |
| outline-offset: 3px; | |
| } | |
| } | |
| @media (hover: hover) and (min-width: $bp-md) { | |
| .card:after { | |
| transform: translateY(0); | |
| } | |
| .content { | |
| transform: translateY(calc(100% - 4.5rem)); | |
| > *:not(.title) { | |
| opacity: 0; | |
| transform: translateY(1rem); | |
| transition: | |
| transform var(--d) var(--e), | |
| opacity var(--d) var(--e); | |
| } | |
| } | |
| .card:hover, | |
| .card:focus-within { | |
| align-items: center; | |
| &:before { transform: translateY(-4%); } | |
| &:after { transform: translateY(-50%); } | |
| .content { | |
| transform: translateY(0); | |
| > *:not(.title) { | |
| opacity: 1; | |
| transform: translateY(0); | |
| transition-delay: calc(var(--d) / 8); | |
| } | |
| } | |
| } | |
| .card:focus-within { | |
| &:before, | |
| &:after, | |
| .content, | |
| .content > *:not(.title) { | |
| transition-duration: 0s; | |
| } | |
| } | |
| } |