Add hover effect on Homepage collage PhotoCard

This commit is contained in:
2021-10-25 23:44:45 +02:00
parent 450ceb2bfa
commit 7c4d890706
4 changed files with 128 additions and 39 deletions

View File

@@ -4,6 +4,8 @@
export let id: string
export let alt: string
export let url: string = undefined
export let title: string = undefined
export let location: any = undefined
const sizes = {
small: { width: 224 },
@@ -14,15 +16,27 @@
<div class="photo-card">
{#if url}
<a href={url}>
<Image
id={id}
sizeKey="postcard"
{sizes}
ratio={1.5}
alt={alt}
/>
</a>
<a href={url}>
<Image
id={id}
sizeKey="postcard"
{sizes}
ratio={1.5}
alt={alt}
/>
{#if title && location}
<div class="photo-card__info">
<Image
id={location.country.flag.id}
sizeKey="square"
width={24}
height={24}
alt="Flag of {location.country.name}"
/>
<p>{title} - {location.name}, {location.city ? `, ${location.city}, ` : ''}{location.country.name}</p>
</div>
{/if}
</a>
{:else}
<Image
id={id}

View File

@@ -40,11 +40,13 @@
<section class="homepage__photos">
<div class="homepage__collage">
{#each photos as { slug, location: { slug: locationSlug, country }, image: { id, title } }}
{#each photos as { slug, title, image, location }}
<PhotoCard
id={id}
id={image.id}
alt={title}
url="/{country.slug}/{locationSlug}/{slug}"
url="/{location.country.slug}/{location.slug}/{slug}"
title={title}
location={location}
/>
{/each}
</div>
@@ -101,14 +103,18 @@
query {
photo (limit: 11, sort: ["-date_created"]) {
slug
title
city
location {
name
slug
country { slug }
}
image {
id
title
country {
slug
name
flag { id }
}
}
image { id }
}
}
`)

View File

@@ -2,9 +2,18 @@
picture {
width: 100%;
height: 100%;
overflow: hidden;
background: $color-primary-tertiary20;
}
& > * {
border-radius: 8px;
}
a {
display: block;
overflow: hidden;
cursor: zoom-in;
box-shadow: 0 16px 12px rgba(#000, 0.15), 0 26px 52px rgba(#000, 0.2);
transition: transform 0.7s var(--ease-quart);
will-change: transform;
}
img {
display: block;
@@ -12,4 +21,85 @@
height: 100%;
object-fit: cover;
}
// Informations
&__info {
position: absolute;
z-index: 2;
bottom: 16px;
left: 20px;
right: 20px;
display: flex;
flex-wrap: wrap;
align-items: center;
color: $color-cream;
font-size: clamp(#{rem(14px)}, 1.25vw, #{rem(16px)});
picture {
width: 24px;
height: 24px;
margin-right: 16px;
border-radius: 100%;
overflow: hidden;
img {
display: block;
width: 100%;
height: 100%;
}
}
p {
max-width: min(80%, 300px);
line-height: 1.4;
}
& > * {
opacity: 0;
transform: translate3d(0, 8px, 0);
transition: opacity 0.8s var(--ease-quart), transform 0.8s var(--ease-quart);
@include bp (md) {
transform: translate3d(0, 16px, 0);
}
}
}
// Gradient
a:after {
content: "";
display: block;
opacity: 0;
position: absolute;
z-index: 1;
pointer-events: none;
bottom: 0;
left: 0;
width: 100%;
height: 50%;
background: linear-gradient(180deg, rgba(#2D1745, 0) 0%, #2D1745 100%);
transition: opacity 0.8s var(--ease-quart);
}
// Slightly zoom in and show info on hover
@media (hover: hover) {
a:hover {
transform: scale(1.0375) rotate(2deg) translateZ(0);
.photo-card__info {
& > * {
opacity: 1;
transform: translate3d(0,0,0);
}
picture {
transition-delay: 60ms;
}
p {
transition-delay: 120ms;
}
}
&:after {
opacity: 1;
}
}
}
}

View File

@@ -110,22 +110,6 @@
height: clamp(156px, 18vw, 400px);
}
picture {
background: $color-primary-tertiary20;
}
img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
a {
display: block;
cursor: zoom-in;
transition: transform 0.7s var(--ease-quart);
will-change: transform;
}
// First row
// Mobile: Top left
&:nth-child(1) {
@@ -290,11 +274,6 @@
z-index: 13;
}
}
// Slightly zoom in on hover
a:hover {
transform: scale(1.0375) rotate(2deg) translateZ(0);
}
}
// CTAS