افکت 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 بهترین تعادل بین تجربه و عملکرد را فراهم میکند.
آیا این مطلب برای شما مفید بود ؟




