An interactive card with a 3D parallax tilt effect using vanilla-tilt.js and CSS transforms.
A Pen by Puneet | Techartist on CodePen.
An interactive card with a 3D parallax tilt effect using vanilla-tilt.js and CSS transforms.
A Pen by Puneet | Techartist on CodePen.
<script src="https://cdn.tailwindcss.com"></script> | |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Playfair+Display:wght@500;600;700&display=swap" rel="stylesheet"> | |
<style> | |
body { | |
font-family: 'Inter', sans-serif; | |
background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%); | |
min-height: 100vh; | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
padding: 1.5rem; | |
overflow: hidden; | |
color-scheme: dark; | |
} | |
.font-serif-display { | |
font-family: 'Playfair Display', serif; | |
} | |
.card-container { | |
position: relative; | |
display: block; | |
width: 100%; | |
max-width: 380px; | |
aspect-ratio: 9 / 15.5; | |
max-height: 90vh; | |
border-radius: 1.75rem; | |
overflow: hidden; | |
background-size: cover; | |
background-position: center; | |
box-shadow: | |
0 0 0 2px rgba(255, 214, 102, 0.4), | |
0 0 25px 8px rgba(255, 214, 102, 0.15); | |
transform-style: preserve-3d; | |
transition: transform 0.6s cubic-bezier(0.23, 1, 0.32, 1), | |
box-shadow 0.4s ease-out, | |
background-size 1.5s ease-out; | |
cursor: grab; | |
will-change: transform, box-shadow, background-size; | |
} | |
.card-container:hover { | |
box-shadow: | |
0 0 0 3px rgba(255, 214, 102, 0.6), | |
0 0 35px 12px rgba(255, 214, 102, 0.25); | |
} | |
.inner-border-overlay { | |
position: absolute; | |
inset: 14px; | |
border-radius: 1.375rem; | |
pointer-events: none; | |
z-index: 10; | |
box-shadow: | |
inset 0.5px 0.5px 1.5px rgba(255, 235, 180, 0.6), | |
inset -1px -1px 1px rgba(160, 110, 0, 0.5), | |
inset 3px 3px 6px rgba(0, 0, 0, 0.25); | |
transform: translateZ(30px); | |
will-change: transform; | |
border: 1px solid rgba(255, 214, 102, 0.1); | |
} | |
.content-area { | |
position: absolute; | |
inset: 14px; | |
border-radius: 1.375rem; | |
overflow: hidden; | |
display: flex; | |
flex-direction: column; | |
justify-content: flex-end; | |
z-index: 5; | |
transform: translateZ(60px); | |
will-change: transform; | |
} | |
.elevation-badge { | |
position: absolute; | |
top: 1rem; | |
right: 1rem; | |
background: rgba(250, 204, 21, 0.85); | |
border-radius: 9999px; | |
padding: 0.5rem 1rem; | |
color: #422006; | |
font-size: 0.75rem; | |
font-weight: 600; | |
letter-spacing: 0.025em; | |
display: flex; | |
align-items: center; | |
gap: 0.5rem; | |
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); | |
transform: translateZ(70px); | |
border: 1px solid rgba(255, 255, 255, 0.3); | |
z-index: 25; | |
will-change: transform; | |
} | |
.elevation-badge svg { | |
width: 1em; | |
height: 1em; | |
} | |
.gradient-overlay { | |
position: absolute; | |
bottom: 0; left: 0; right: 0; | |
height: 75%; | |
background: linear-gradient(to top, rgba(10, 10, 10, 0.9) 0%, rgba(10, 10, 10, 0.65) 50%, transparent 100%); | |
pointer-events: none; | |
z-index: 15; | |
transform: translateZ(5px); | |
will-change: transform; | |
} | |
.text-block { | |
position: relative; | |
z-index: 20; | |
color: #f8fafc; | |
text-align: center; | |
text-shadow: 0 2px 4px rgba(0,0,0,0.5); | |
transform: translateZ(25px); | |
will-change: transform; | |
} | |
.text-block h1 { | |
letter-spacing: 0.025em; | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
gap: 0.5rem; | |
} | |
.text-block p { | |
color: #cbd5e1; | |
} | |
.mountain-icon { | |
width: 1.5em; | |
height: 1.5em; | |
fill: currentColor; | |
opacity: 0.8; | |
vertical-align: middle; | |
margin-bottom: -0.1em; | |
} | |
.tour-button { | |
position: relative; | |
z-index: 20; | |
background: linear-gradient(145deg, #fde047, #facc15); | |
color: #422006; | |
font-weight: 600; | |
padding: 0.75rem 1.75rem; | |
border-radius: 9999px; | |
text-align: center; | |
width: auto; | |
min-width: 190px; | |
max-width: 85%; | |
margin-left: auto; | |
margin-right: auto; | |
transition: all 0.3s ease; | |
border: none; | |
box-shadow: | |
inset 2px 2px 4px rgba(160, 110, 0, 0.6), | |
inset -2px -2px 4px rgba(255, 245, 200, 0.5), | |
0 1px 2px rgba(0,0,0,0.1); | |
transform: translateZ(40px); | |
will-change: transform, box-shadow, background; | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
gap: 0.75rem; | |
letter-spacing: 0.025em; | |
margin-top: 1rem; | |
} | |
.tour-button:hover { | |
background: linear-gradient(145deg, #feec80, #fde047); | |
box-shadow: | |
inset 2px 2px 5px rgba(160, 110, 0, 0.5), | |
inset -2px -2px 5px rgba(255, 245, 200, 0.6), | |
0 2px 4px rgba(0,0,0,0.15); | |
transform: translateZ(40px) translateY(-2px); | |
color: #3f2810; | |
} | |
.tour-button:active { | |
background: linear-gradient(145deg, #facc15, #eab308); | |
box-shadow: | |
inset -2px -2px 4px rgba(160, 110, 0, 0.6), | |
inset 2px 2px 4px rgba(255, 245, 200, 0.5), | |
0 0 0 rgba(0,0,0,0); | |
transform: translateZ(40px) translateY(0px); | |
} | |
</style> | |
<div class="card-container" | |
style="background-image: url('https://static.wixstatic.com/media/3d9313_45b151504946477791c3add537ac398a~mv2.png');" | |
data-tilt data-tilt-max="10" data-tilt-speed="500" data-tilt-perspective="1800" data-tilt-glare data-tilt-max-glare="0.1" data-tilt-scale="1.03" data-tilt-reset="true"> | |
<div class="inner-border-overlay" data-tilt-transform-element></div> | |
<div class="content-area p-4 sm:p-5 lg:p-7" data-tilt-transform-element> | |
<div class="gradient-overlay"></div> | |
<div class="elevation-badge" data-tilt-transform-element> | |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-4 h-4"> | |
<path d="M12 2L6.5 12h11L12 2zm5.5 11l-5.5 9-5.5-9h11z"/> | |
</svg> | |
4,478 m | |
</div> | |
<div class="text-block" data-tilt-transform-element> | |
<h1 class="font-serif-display text-3xl sm:text-4xl lg:text-5xl font-bold mb-2"> | |
<svg class="mountain-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"> | |
<path d="M14.344 6.219l-2.344-3.219-2.344 3.219-4.656 7.781h14l-4.656-7.781zm-7.344 9.781l-1 2h10l1.625-2.708-1.501-.292-1.124 1h-4l-1.125-1-1.875.001zm11.69-1l-.69.999 1.311 1.311 1.689.69-1.311-1.311-.689-.69z"/> | |
</svg> | |
Matterhorn | |
</h1> | |
<p class="text-sm sm:text-base lg:text-lg font-light"> | |
Zermatt, Switzerland | |
</p> | |
</div> | |
<button class="tour-button" data-tilt-transform-element> | |
Take the tour | |
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> | |
<path d="M12 5l7 7-7 7"></path> | |
<path d="M5 12h14"></path> | |
</svg> | |
</button> | |
</div> | |
</div> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/vanilla-tilt/1.8.0/vanilla-tilt.min.js"></script> | |
<script> | |
VanillaTilt.init(document.querySelectorAll("[data-tilt]"), { | |
}); | |
</script> |