→ ZAKAI.COM
IDEAS
DESIGN
TECHNOLOGY
PEOPLE
MOTION
FOR A
BRIGHTER WEB
// אין צורך ב-JavaScript או ב-GSAP בדמו הזה.
// הכרטיסים נערמים בגלילה באמצעות CSS position: sticky.
/* =========================================================
ZAKAI LAB - SCROLL CARD STACK
========================================================= */
/* Allow stacking inside the LAB wrappers */
.zakai-lab-single:has(#zkl-stack),
.zakai-lab-single .lab-demo:has(#zkl-stack) {
overflow: clip !important;
}
.lab-demo:has(#zkl-stack) .elementor-widget-html,
.lab-demo:has(#zkl-stack) .elementor-widget-container {
width: 100%;
min-width: 0;
overflow: visible;
}
/* Main demo */
#zkl-stack {
--step: 18px;
--stop: 90px;
--card-height: min(560px, calc(100svh - 164px));
direction: ltr;
position: relative;
isolation: isolate;
width: 100%;
padding: 60px 0 100px;
color: #f7f3ec;
border-radius: 24px;
background:
radial-gradient(
circle at 73% 16%,
#e56f2d3d,
transparent 38%
),
radial-gradient(
circle at 35% 58%,
#dda53212,
transparent 34%
),
linear-gradient(
115deg,
#080808,
#160f0c 44%,
#432113
);
}
#zkl-stack,
#zkl-stack * {
box-sizing: border-box;
}
/* Introduction */
#zkl-stack .zkl-intro {
position: relative;
width: 86%;
min-height: 270px;
margin: 0 auto 40px;
text-align: center;
}
#zkl-stack .zkl-eyebrow {
display: block;
margin-bottom: 24px;
color: #dda532;
font: 500 12px/1 monospace;
letter-spacing: .28em;
}
#zkl-stack .zkl-title {
margin: 0;
color: #f7f3ec;
font: 300 clamp(42px, 4.4vw, 70px)/.98 Arial, sans-serif;
letter-spacing: -.045em;
}
/* Decorative light */
#zkl-stack .zkl-glow,
#zkl-stack .zkl-dot {
position: absolute;
width: 8px;
height: 8px;
border-radius: 50%;
background: #ff5a24;
box-shadow:
0 0 8px #ff5a24,
0 0 28px #e56f2d99;
}
#zkl-stack .zkl-glow {
left: calc(50% - 4px);
bottom: 22px;
}
/* Stack container */
#zkl-stack .zkl-deck {
display: block;
position: relative;
width: min(1050px, 86%);
margin: 0 auto;
padding-bottom: calc(3 * var(--step) + 80px);
overflow: visible;
}
/* Cards */
#zkl-stack .zkl-card {
position: sticky;
top: calc(var(--stop) + var(--i) * var(--step));
z-index: calc(1 + var(--i));
width: 100%;
height: var(--card-height);
min-height: 280px;
margin: 0;
padding: 48px 52px;
border: 1px solid #dda53266;
border-radius: 30px;
overflow: hidden;
box-shadow: 0 22px 55px #0003;
color: #2d211b;
background: linear-gradient(135deg, #faf6ee, #f3e9db);
}
#zkl-stack .zkl-card + .zkl-card {
margin-top: 36px;
}
/* Card colors */
#zkl-stack .zkl-card--2 {
background: linear-gradient(135deg, #efe0cd, #ddba91);
}
#zkl-stack .zkl-card--3 {
color: #f7f3ec;
background: linear-gradient(135deg, #6d3824, #321a13);
}
#zkl-stack .zkl-card--4 {
color: #f7f3ec;
background:
radial-gradient(
circle at 78% 18%,
#e56f2d33,
transparent 38%
),
linear-gradient(135deg, #402116, #17100e);
}
/* Top row */
#zkl-stack .zkl-top {
display: flex;
justify-content: space-between;
align-items: center;
}
#zkl-stack .zkl-number {
color: #c64e28;
font: 13px monospace;
letter-spacing: .18em;
}
#zkl-stack .zkl-stars,
#zkl-stack .zkl-bottom {
color: #d54232;
font: 20px monospace;
}
/* Card content */
#zkl-stack .zkl-content {
position: absolute;
top: 50%;
right: 54px;
width: 75%;
transform: translateY(-44%);
text-align: right;
}
#zkl-stack .zkl-label {
display: block;
margin-bottom: 24px;
color: #b64a26;
font: 12px/1 monospace;
letter-spacing: .24em;
}
#zkl-stack .zkl-card--3 .zkl-label,
#zkl-stack .zkl-card--4 .zkl-label,
#zkl-stack .zkl-card--3 .zkl-number,
#zkl-stack .zkl-card--4 .zkl-number {
color: #dda532;
}
#zkl-stack .zkl-content h3 {
margin: 0;
color: inherit;
font: 300 clamp(34px, 4.6vw, 70px)/.98 Arial, sans-serif;
letter-spacing: -.05em;
overflow-wrap: normal;
}
#zkl-stack .zkl-dot {
left: 12%;
top: 54%;
}
#zkl-stack .zkl-bottom {
position: absolute;
bottom: 28px;
left: 50%;
transform: translateX(-50%);
}
/* Mobile */
@media (max-width: 767px) {
#zkl-stack {
--step: 12px;
--stop: 64px;
--card-height: min(440px, calc(100svh - 124px));
padding: 42px 0 64px;
}
#zkl-stack .zkl-intro {
width: calc(100% - 28px);
min-height: 210px;
margin-bottom: 25px;
}
#zkl-stack .zkl-eyebrow {
font-size: 9px;
letter-spacing: .16em;
}
#zkl-stack .zkl-title {
font-size: clamp(28px, 8vw, 48px);
}
#zkl-stack .zkl-deck {
width: calc(100% - 24px);
}
#zkl-stack .zkl-card {
padding: 24px 18px;
border-radius: 24px;
}
#zkl-stack .zkl-card + .zkl-card {
margin-top: 24px;
}
#zkl-stack .zkl-content {
right: 18px;
width: calc(100% - 36px);
}
#zkl-stack .zkl-content h3 {
font-size: clamp(22px, 6.3vw, 48px);
}
#zkl-stack .zkl-label {
font-size: 10px;
letter-spacing: .16em;
margin-bottom: 18px;
}
#zkl-stack .zkl-number {
font-size: 10px;
}
#zkl-stack .zkl-stars,
#zkl-stack .zkl-bottom {
font-size: 15px;
}
#zkl-stack .zkl-dot {
left: 24px;
top: 72%;
}
}
SCROLL / STACK / DEPTH
STORIES BUILD
LAYER BY LAYER
01
*****
IDEA
START WITH
THE QUESTION.
*****
02
*****
DESIGN
GIVE THE IDEA
A SHAPE.
*****
03
*****
MOTION
MAKE THE
STORY MOVE.
*****
04
*****
EXPERIENCE
TURN IT INTO
AN EXPERIENCE.
*****
EXPLORE / LEARN / REUSE / CREATE
.Costomize to fit your vision
גודל
גובה הכרטיסים מוגדר בתחילת הקוד, בתוך #zkl-stack:
--card-height: min(560px, calc(100svh - 164px));הערך 560px הוא הגובה המרבי. החלק השני מתאים את הגובה למסכים נמוכים. לדוגמה, לכרטיסים נמוכים יותר החליפו את השורה ב־:
--card-height: min(480px, calc(100svh - 164px));רוחב הערימה מוגדר בתוך .zkl-deck:
width: min(1050px, 86%);הערימה תתפוס עד 86% מרוחב הדמו, ולא יותר מ־1050 פיקסלים. להרחבה:
width: min(1200px, 92%);.zkl-card:border-radius: 30px
צבע
לכל כרטיס רקע משלו. רקע הכרטיס הראשון מוגדר בתוך .zkl-card:
background: linear-gradient(135deg, #faf6ee, #f3e9db);החליפו את שני קודי הצבע כדי לשנות את מעבר הצבעים. לרקע אחיד אפשר להחליף את השורה ב־:
background: #f3e9db;רקע הכרטיס השני נמצא בתוך .zkl-card--2, השלישי בתוך .zkl-card--3, והרביעי בתוך .zkl-card--4.
צבע הטקסט הראשי מוגדר באמצעות:
color: #2d211b;בכרטיסים הכהים הוא מוגדר בנפרד:
color: #f7f3ec;צבע המסגרת נמצא בתוך .zkl-card:
border: 1px solid #dda53266;שמרו על ניגודיות ברורה בין הטקסט לרקע. המספרים, התוויות והכוכביות מקבלים צבעים נפרדים בקוד.
תנועה / עוצמה
עומק הערימה נקבע באמצעות ההפרש בין מיקומי העצירה של הכרטיסים.
בתחילת הקוד:
--step: 18px;ערך קטן ייצור ערימה צפופה:
--step: 8px;ערך גדול יחשוף יותר מהחלק העליון של הכרטיסים שמאחור:
--step: 24px;מיקום העצירה של הכרטיס הראשון נקבע באמצעות:
--stop: 90px;הערך מציין את המרחק מהחלק העליון של חלון הדפדפן. אם יש באתר כותרת עליונה קבועה, התאימו את המרחק לגובה שלה.
כשמגדילים את --stop או את --step, בדקו שנותר מקום לכרטיס האחרון במסך. ייתכן שתצטרכו להקטין גם את גובה הכרטיסים.
מהירות
האפקט מגיב ישירות לגלילה. אין כאן משך אנימציה או ערך speed.
אפשר לשנות את מרחק הגלילה בין כניסת כרטיס אחד לבא אחריו. חפשו:
#zkl-stack .zkl-card + .zkl-card {
margin-top: 36px;
}למעבר צפוף יותר בין הכרטיסים:
margin-top: 16px;למרחק גדול יותר בין הכרטיסים:
margin-top: 70px;גם גובה הכרטיס משפיע על מרחק הגלילה. השינוי הזה משנה את המרווח, לא את מהירות הגלילה של המבקר.
כיוון
הערימה בנויה לגלילה אנכית: הכרטיסים הבאים עולים מלמטה ונערמים מעל הקודמים. גלילה חזרה למעלה מחזירה את התהליך לאחור.
ההגדרה:
direction: ltr;קובעת את כיוון התוכן והפריסה, ולא את כיוון האנימציה.
לטקסט בעברית אפשר להחליף אותה ב־:
direction: rtl;יישור הכותרות מוגדר בנפרד בתוך .zkl-content:
text-align: right;אפשר לשנות אותו ל־left או ל־center.
שימו לב: החלפת direction עשויה לשנות גם את סדר המספר והכוכביות בשורה העליונה. ליצירת ערימה אופקית או כניסה מהצד נדרשת התאמה אחרת של המנגנון.
מובייל
ההתאמות למסכים צרים נמצאות בתוך:
@media (max-width: 767px) {
/* Mobile settings */
}הערכים המרכזיים במובייל הם:
--step: 12px;
--stop: 64px;
--card-height: min(440px, calc(100svh - 124px));--step קובע כמה מהכרטיסים האחוריים ייחשף.--stop קובע את מרחק העצירה מהחלק העליון של המסך.--card-height קובע את גובה הכרטיס, בהתאם לגובה המסך.מרווח הכרטיסים במובייל מוגדר בנפרד:
#zkl-stack .zkl-card + .zkl-card {
margin-top: 24px;
}גודל כותרות הכרטיסים במובייל:
font-size: clamp(22px, 6.3vw, 48px);הטקסט גדל בהתאם לרוחב המסך, בין 22 ל־48 פיקסלים. אחרי החלפת הטקסטים בדקו בטלפון שהמילים אינן נחתכות ושאפשר לקרוא את כל הכרטיס.
הערה חשובה 🚩
תיקון חשוב לתוכן שמופיע כרגע בצילום שלך: הקטעים עם .lab-code-section ו־.lab-code-card משנים את עיצוב אזור הקוד, ולא את אנימציית הכרטיסים. החליפי את ההסברים הישנים בתכנים שלמעלה. גם ההפניה ל־gsap.matchMedia() אינה נחוצה לדמו הזה, כי הוא פועל ללא GSAP.