بعدها · فصل ٦

تختار أنهي نمط وإزاي متبوّظش التجربة

choosing a pattern · accessibility · performance · keyboard · reduced motion
🎯 الهدف: تختار النمط المناسب للمحتوى، وتراجع أي شغل scroll على الأداء وسهولة الاستخدام قبل ما تسلّمه.

الجدول الكامل

النمطبيعمل إيهالأداةJS؟مناسب لـ
StickyHeader يثبت ويسلّمposition: stickyلأعناوين الأقسام، جداول، sidebars
Scroll snapلوحات تقف مكانهاscroll-snap-*لأcarousels، stories، onboarding
Scroll triggeredيظهر لما يدخلIntersectionObserverأيوهlanding pages، كروت، أرقام
Infinite scrollيجيب أكتر قرب الآخرIntersectionObserverأيوهfeeds، نتايج بحث
Scroll drivenقيمة ماشية مع الـ scrollscroll() timelineلأprogress bar، header بيصغر
Zoom on scrollصورة تكبر وهي بتعدّيview() timelineلأصور مميزة في مقالة
Parallaxطبقات بسرعات مختلفةscroll() timelineلأhero section
Horizontal scrollرأسي ← حركة بالعرضsticky + view-timelineلأعرض مراحل أو منتجات
Scrollytellingمشهد ثابت، خطوات بتغيّرهsticky + IntersectionObserverأيوهقصص وتقارير تفاعلية
تختار إزاي؟
  1. عايز إيه؟ ← يثبت أو يقف: شكل
  2. عايز إيه؟ ← يحصل مرة: حدث
  3. عايز إيه؟ ← يمشي مع الـ scroll: تقدّم
  4. يحصل مرة ← قصة بمشهد ثابت: + sticky

راجع قبل ما تسلّم

⚡ الأداء

حرّك transform و opacity بس. مفيش شغل تقيل في scroll event. استخدم { passive: true } لو مضطر تسمع للـ scroll. وجرّب على موبايل ضعيف من DevTools ← Performance ← CPU throttling.

♿ الوصول

prefers-reduced-motion بيوقف الحركة. الـ scroller بيتحرك بالكيبورد (tabindex="0" لو container). المحتوى يبان من غير JS. ومحدش يخطف الـ scroll أو يغيّر سرعته.

الصفحة بتقطّع مع الـ scrollشيل الـ scroll listener، واستخدم IntersectionObserver أو scroll timeline، وحرّك transform بس
sticky مش ثابتأب عليه overflow، أو ناقص top
snap مانع يوصل لآخر لوحة طويلةproximity بدل mandatory
المحتوى فاضي لما الـ JS يتأخرالكلاس اللي بيخفي يتضاف بالـ JS
الـ footer مش باينزرار حمّل أكتر بدل infinite
Firefox مش بيحرّك@supports + حالة نهائية ثابتة، أو polyfill
ناس بتدوخprefers-reduced-motion: reduce يوقف parallax و zoom
الـ scroller مش بيتحرك بالكيبوردtabindex=0 و role=region و aria-label

خلّصت الفصل لما

🧠 اختبر نفسك
١) header بيصغر كل ما تنزل. أنهي نمط وأداة؟
scroll driven بـ scroll() timeline على الـ header.
٢) أرقام بتعد لما قسم الإحصائيات يظهر. أنهي؟
scroll triggered بـ IntersectionObserver، وبعدين العد بـ JS أو animation.