→ לכל המאגר

G125 · כרטיס זכוכית שמטה ומבריק בגלילה

GSAP GSAP · ScrollTrigger · 3D כרטיסיםתמונות וגלריות ממתין

כרטיס (חברות, אשראי, כרטיס מוצר) שמטה בתלת-ממד ככל שגוללים, ופס אור עובר עליו באלכסון בדיוק ברגע ההטיה. כמו להחזיק אותו ביד מול החלון.

מתי משתמשים: כרטיס חברות, מנוי, כרטיס מתנה, הצגת מוצר שטוח. פעם אחת בעמוד.

הדמו כאן עיצובי-ניטרלי בכוונה. כשהמהלך נכנס לפרויקט, מיובאת רק ההתנהגות: הצבעים, הרדיוסים, הפונטים והצללים יורשים את העיצוב של אותו פרויקט.

הדמו

גלול למטה, הדמו מגיע ↓
חבר מועדון
•••• •••• •••• 2026
שםליאב מצרי
בתוקף עד12/28
עוד מסלול גלילה. נסה גם חזרה למעלה ↑
rotateX ו-rotateY בסקראב על טווח קצר של המסך (הכרטיס לא מוצמד), והברק הוא גרדיאנט שה-background-position שלו נקשר לאותו progress. במובייל ההטיה חצי.

קוד להדבקה

הקוד כאן עומד בפני עצמו. כל טוקן עיצוב נושא ברירת מחדל, מחלקות העזר של המאגר מוטמעות בו, ותגי הסקריפט מסודרים לפי הסדר הנכון. פרויקט שמגדיר --accent או --line משלו יורש אותם אוטומטית. הרכיב הזה מסתמך על dir="rtl".

פתח קובץ עצמאי ↗
הצג את הקוד כאן

CSS

/* G125 · כרטיס זכוכית שמטה ומבריק בגלילה */
.gc-wrap{min-height:120vh;display:grid;place-items:center;perspective:1200px;padding-inline:var(--gutter, clamp(24px, 5vw, 96px))}
.gc{position:relative;width:min(520px,90vw);aspect-ratio:1.586;border-radius:24px;background:linear-gradient(135deg,color-mix(in srgb,var(--ink, #16182b) 92%,var(--accent, #4a3aff)),var(--ink, #16182b));color:var(--bg, #f7f7fa);padding:clamp(18px,3vw,32px);display:flex;flex-direction:column;justify-content:space-between;
  box-shadow:0 40px 80px rgba(0,0,0,.3);will-change:transform;transform-style:preserve-3d;overflow:hidden}
.gc::after{content:"";position:absolute;inset:0;background:linear-gradient(115deg,transparent 40%,rgba(255,255,255,.35) 50%,transparent 60%);background-size:300% 100%;background-position:120% 0;pointer-events:none}
.gc-top{display:flex;justify-content:space-between;align-items:center;font-size:13px;letter-spacing:.14em;opacity:.8}
.gc-chip{width:44px;height:32px;border-radius:8px;background:linear-gradient(135deg,#f1d27a,#b98a2e)}
.gc-num{font-size:clamp(18px,2.6vw,28px);letter-spacing:.14em;font-variant-numeric:tabular-nums;direction:ltr;text-align:left}
.gc-bot{display:flex;justify-content:space-between;font-size:14px}
.gc-bot b{display:block;font-size:11px;opacity:.6;letter-spacing:.12em;margin-bottom:2px;font-weight:500}

HTML

<div class="gc-wrap"><div class="gc">
  <div class="gc-top"><span>חבר מועדון</span><span class="gc-chip"></span></div>
  <div class="gc-num">•••• •••• •••• 2026</div>
  <div class="gc-bot"><div><b>שם</b>ליאב מצרי</div><div><b>בתוקף עד</b>12/28</div></div>
</div></div>

JS

gsap.registerPlugin(ScrollTrigger);

(function(){
  const card=document.querySelector(".gc");
  if(matchMedia("(prefers-reduced-motion: reduce)").matches)return;
  const k=matchMedia("(max-width:767px)").matches?.5:1;
  gsap.timeline({scrollTrigger:{trigger:".gc-wrap",start:"top bottom",end:"bottom top",scrub:.6}})
    .fromTo(card,{rotateX:18*k,rotateY:-22*k},{rotateX:-14*k,rotateY:22*k,ease:"none",duration:1},0)
    // הברק: background-position על הפסאודו לא נגיש ל-GSAP, לכן משתנה CSS על הכרטיס
    .fromTo(card,{"--shine":"120%"},{"--shine":"-20%",ease:"none",duration:1},0);
  const st=document.createElement("style");st.textContent=".gc::after{background-position:var(--shine,120%) 0}";document.head.appendChild(st);
})();