ویژگی تصویر

افکت Scroll Reveal با CSS

  /  CSS   /  افکت Scroll Reveal با CSS
بنر تبلیغاتی الف

افکت Scroll Reveal یا نمایش محتوا هنگام پیمایش صفحه، یکی از رایج‌ترین تکنیک‌ها برای جلب توجه کاربر و بهبود تجربه کاربری در وب‌سایت‌هاست. این افکت‌ها معمولاً با ترکیبی از CSS برای انیمیشن و جاوااسکریپت برای تشخیص موقعیت المان نسبت به صفحه پیاده‌سازی می‌شوند. در این مقاله به روش‌های مختلف (CSS-only، CSS + Intersection Observer)، بهینه‌سازی‌ها و نکات دسترسی می‌پردازیم.

چرا از Scroll Reveal استفاده کنیم؟

  • افزایش جذابیت بصری و هدایت نگاه کاربر
  • بارگزاری تدریجی محتوای سنگین (perceived performance)
  • تمرکز روی بخش‌های مهم صفحه
  • ایجاد تجربه تعاملی و مدرن

روش پایه‌ای: CSS انیمیشن به همراه کلاس فعال

در این روش با استفاده از کلاس‌هایی مثل .reveal و .is-visible انیمیشن‌ها را تعریف کرده و با جاوااسکریپت ساده کلاس فعال را هنگام اسکرول اضافه می‌کنیم.

/* CSS */.reveal {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 600ms ease, transform 600ms ease;
  will-change: opacity, transform;
}

.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* Respect user motion preferences */@media (prefers-reduced-motion: reduce) {
  .reveal {
    transition: none;
    transform: none;
  }
}

توضیح: این CSS حالت پیش‌فرض المان‌ها را مخفی و کمی جابجا (translateY) قرار می‌دهد و هنگام اضافه شدن کلاس is-visible انیمیشن ظاهر شدن را اجرا می‌کند. همچنین با prefers-reduced-motion نیازهای دسترسی رعایت شده است.

کد جاوااسکریپت (پیشنهاد: Intersection Observer)

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add('is-visible');
      observer.unobserve(entry.target); // optional: stop observing
    }
  });
}, { threshold: 0.15 });

document.querySelectorAll('.reveal').forEach(el => {
  observer.observe(el);
});

توضیح: این اسکریپت از Intersection Observer API استفاده می‌کند تا وقتی المان به اندازه 15٪ درون viewport قرار گرفت کلاس is-visible را اضافه کند. سپس برای بهبود عملکرد، المان را از مشاهده خارج می‌کند تا رویدادهای بعدی اجرا نشوند.

روش بدون جاوااسکریپت (فقط CSS)

راهکار کاملاً CSS تنها محدودیت‌هایی دارد و معمولاً با تکنیک‌هایی مثل CSS Scroll-Linked Animations یا استفاده از iframe/anchor انجام می‌شود که پشتیبانی مرورگرها محدود است. مثال ساده‌ای با @supports و متغیرهای experimental را می‌توان نوشت اما برای سازگاری بهتر پیشنهاد می‌شود از JS ملایم استفاده کنید.

@supports (animation-timeline: scroll()) {
  /* Experimental Scroll-Linked Animation (very limited support) */  .reveal {
    animation-name: fadeInUp;
    animation-duration: 1s;
    animation-timeline: scroll();
  }
}

توضیح: این نمونه مربوط به ویژگی‌های آزمایشی مرورگرهاست و در اغلب موارد fallback لازم دارد. بنابراین از این روش تنها در پروژه‌هایی با نیاز خاص و تست‌شده روی مرورگرهای هدف استفاده کنید.

بهینه‌سازی‌های مهم

  • استفاده از transform و opacity: انیمیشن‌ها را روی خواص GPU-friendly مانند transform و opacity پیاده کنید تا رندر روان‌تر باشد.
  • will-change: تنها وقتی لازم است اضافه شود و برای تعداد زیاد المان‌ها استفاده بی‌رویه نشود.
  • unobserve کردن المان‌ها: بعد از اولین نمایش، اگر نیازی به انیمیشن مجدد نیست، آن را از Observer خارج کنید تا کارایی حفظ شود.
  • prefers-reduced-motion: برای کاربران حساس به حرکت، انیمیشن‌ها را غیرفعال یا کم کنید.

نمونه پیشرفته: تنظیم آستانه، rootMargin و delay سلسله‌ای

// JavaScript: staggered reveal
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const children = Array.from(entry.target.querySelectorAll('.item'));
      children.forEach((child, i) => {
        child.style.transitionDelay = `${i * 100}ms`;
        child.classList.add('is-visible');
      });
      observer.unobserve(entry.target);
    }
  });
}, {
  threshold: 0.2,
  rootMargin: '0px 0px -10% 0px'
});

document.querySelectorAll('.reveal-group').forEach(el => observer.observe(el));

توضیح: در این سناریو یک گروه از آیتم‌ها (مثلاً کارت‌ها) به صورت پله‌ای (staggered) ظاهر می‌شوند. هر کودک با تاخیر افزایشی transitionDelay دریافت می‌کند. همچنین با تنظیمات threshold و rootMargin میتوان رفتار آشکارسازی را دقیق‌تر کرد.

مقایسه روش‌ها

روشنیازمندیمزایامعایب
CSS + IntersectionObserverمرورگرهای مدرن (IO پشتیبانی)عملکرد خوب، کنترل دقیق، سازگاری بالانیاز به JS
CSS-only (experimental)پشتیبانی محدود مرورگربدون JSپایداری و سازگاری پایین
کتابخانه‌ها (ScrollReveal.js و غیره)کتابخانه‌های خارجیراه‌حل آماده، ویژگی‌های پیچیدهبار اضافه، وابستگی

نکات دسترسی و تجربه کاربری

  • همیشه از prefers-reduced-motion پشتیبانی کنید.
  • با استفاده از semantic HTML و ARIA اطمینان حاصل کنید که محتوای مخفی برای اسکرین‌ریدرها قابل‌دسترسی است (پنهان‌سازی فقط بصری نباشد).
  • افکت‌ها نباید باعث گیج شدن یا ایجاد حرکت بیش از حد شوند.

نتیجه‌گیری و توصیه‌های عملی

افکت Scroll Reveal با ترکیب CSS و Intersection Observer یک راه حرفه‌ای، سبک و قابل بهینه‌سازی برای نمایش تدریجی محتواست. همیشه اول با CSS پایه شروع کنید، سپس با IO آن را فعال کنید، و بهینه‌سازی‌هایی مانند حذف مشاهده پس از نمایش و پشتیبانی از reduced-motion را اعمال کنید. برای پروژه‌های کوچک اگر به سازگاری کامل نیاز ندارید، می‌توانید از روش‌های آزمایشی CSS استفاده کنید؛ اما در اغلب پروژه‌ها ترکیب CSS + JS بهترین تعادل بین تجربه و عملکرد را فراهم می‌کند.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: