📚معرفی و شروع سریع

ScrollReveal یک کتابخانه فوق‌سبک برای اضافه کردن انیمیشن ورود به المان‌ها هنگام اسکرول است. بدون هیچ dependency‌ای کار می‌کند و فقط ~16KB است.

نصب

<script src="scrollreveal.min.js"></script>

ساده‌ترین استفاده

// یک خط — کافیه!
ScrollReveal().reveal('.my-element');

// با تنظیمات
ScrollReveal().reveal('.card', {
  origin:   'bottom',
  distance: '50px',
  duration: 800,
  delay:    200,
  opacity:  0,
  easing:   'ease-out',
  reset:    false
});

// ⚠️ وقتی scroll در یک div خاص است (نه window):
const sr = ScrollReveal({
  container: document.querySelector('.main-container')
});
sr.reveal('.element');
ⓘ ScrollReveal در مقابل AOS: ScrollReveal از JavaScript برای کنترل استفاده می‌کند (انعطاف بیشتر). AOS از data-attributes HTML استفاده می‌کند (سریع‌تر برای پیاده‌سازی ساده). برای کنترل پیشرفته‌تر، ScrollReveal بهتر است.
▼ اسکرول کنید تا المان‌ها ظاهر شوند
🎯 المان اول — از پایین
🎯 المان دوم — با تأخیر ۲۰۰ms
🎯 المان سوم — با تأخیر ۴۰۰ms

📍Origin و Distance

origin جهت ورود المان را تعیین می‌کند و distance فاصله‌ای که طی می‌کند.

sr.reveal('.from-bottom', { origin: 'bottom', distance: '60px' });  // پیش‌فرض
sr.reveal('.from-top',    { origin: 'top',    distance: '60px' });
sr.reveal('.from-left',   { origin: 'left',   distance: '80px' });
sr.reveal('.from-right',  { origin: 'right',  distance: '80px' });
sr.reveal('.fade-only',   { distance: '0px', opacity: 0 });     // فقط fade
sr.reveal('.far',          { origin: 'bottom', distance: '150px', duration: 1000 });
🏭 دمو: همه جهت‌ها
↓ از بالا
↑ از پایین
✨ فقط Fade
← از چپ
→ از راست
↑ فاصله ۱۵۰px

🔄Scale و Rotate

// scale — بزرگ‌نمایی هنگام ورود
sr.reveal('.scale-in', {
  scale:    0.4,       // شروع از ۴۰٪ اندازه
  distance: '0px',
  duration: 800,
  easing:   'ease-out'
});

// rotate — چرخش هنگام ورود
sr.reveal('.rotate-in', {
  rotate:   { x: 0, y: 0, z: 30 },  // چرخش ۳۰ درجه روی محور Z
  origin:   'left',
  distance: '30px',
  duration: 900
});

// ترکیب — scale + origin + opacity
sr.reveal('.combo', {
  scale:    0.6,
  origin:   'bottom',
  distance: '40px',
  opacity:  0,
  duration: 700,
  easing:   'cubic-bezier(0.34, 1.56, 0.64, 1)'  // spring
});
🔄 دمو: Scale + Rotate + Combo
🔍 Scale 0.4
🔄 Rotate Z 30°
✨ Combo Spring
📈 Scale از بزرگ (1.3)
🔄 Rotate Y 45°
💡 Scale + Top

تنظیمات زمان‌بندی

گزینهپیش‌فرضتوضیح
delay0ms تأخیر قبل از شروع انیمیشن
duration600ms مدت زمان انیمیشن
interval0ms بین المان‌های هم‌سلکتور
resetfalseاگر true باشد هر بار تکرار می‌شود
viewFactor0.2نسبت دیده‌شدن برای trigger (0–1)
viewOffset{top:0, right:0, bottom:0, left:0}فاصله از لبه viewport
opacity0opacity شروع (معمولاً ۰)
sr.reveal('.fast',   { duration: 300 });       // سریع
sr.reveal('.slow',   { duration: 1500 });      // کند
sr.reveal('.late',   { delay: 600 });           // با تأخیر
sr.reveal('.partial',{ viewFactor: 0.5 });     // فقط وقتی ۵۰٪ دیده شد
sr.reveal('.offset', { viewOffset: { bottom: 100 } }); // ۱۰۰px قبل از لبه
⏰ دمو: سرعت‌های مختلف
⚡ سریع (300ms)
• عادی (600ms)
🐢 کند (1500ms)
⏳ با تأخیر (delay: 600ms)

📈Easing — منحنی انیمیشن

// انواع easing
sr.reveal('.linear',   { easing: 'linear' });
sr.reveal('.ease-in',  { easing: 'ease-in' });
sr.reveal('.ease-out', { easing: 'ease-out' });
sr.reveal('.ease',     { easing: 'ease' });

// cubic-bezier سفارشی
sr.reveal('.spring', { easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)' });  // spring
sr.reveal('.bounce', { easing: 'cubic-bezier(0.68, -0.6, 0.32, 1.6)' }); // bounce
sr.reveal('.sharp',  { easing: 'cubic-bezier(0.4, 0, 0.6, 1)' });        // sharp
📈 دمو: مقایسه Easing‌ها (از راست می‌آیند)
linear — یکنواخت
ease-in — شروع کند
ease-out — پایان کند (توصیه‌شده)
ease — طبیعی
spring cubic-bezier — فنری
bounce cubic-bezier — پرشی

Interval و Stagger

با interval می‌توانید المان‌های هم‌سلکتور را یکی‌پس‌از‌دیگری animate کنید — بدون نوشتن delay جداگانه برای هر کدام.

// همه .card ها با ۱۵۰ms فاصله ظاهر می‌شوند
sr.reveal('.card', {
  origin:   'bottom',
  distance: '40px',
  interval: 150   // ← کلید اصلی
});

// grid از بالا + interval
sr.reveal('.grid-item', {
  origin:   'top',
  interval: 100,
  scale:    0.85
});
★ دمو: Stagger با interval=120ms
۱
۲
۳
۴
۵
۶
A
B
C
D
E
F

🗑Reset و Cleanup

// reset: true — هر بار که المان وارد viewport می‌شود تکرار
sr.reveal('.repeating', { reset: true });

// حذف انیمیشن از یک المان
sr.clean('.my-element');

// حذف کامل ScrollReveal از صفحه
sr.destroy();

// تنظیمات پیش‌فرض سراسری
const sr = ScrollReveal({
  container: document.querySelector('.main'),
  distance:  '60px',
  duration:  800,
  easing:    'ease-out',
  opacity:   0,
  reset:     false        // پیش‌فرض سراسری
});
↻ دمو: reset:true — بالا برو و برگرد!
↻ این المان reset:true دارد — هر بار که وارد viewport شود تکرار می‌شود
⚠ احتیاط: reset: true را برای المان‌های اصلی صفحه استفاده نکنید. اگر کاربر زیاد scroll کند، انیمیشن آزاردهنده می‌شود. فقط برای المان‌های تزئینی مناسب است.

👁Container و Viewport

به‌صورت پیش‌فرض ScrollReveal از window به عنوان container استفاده می‌کند. اگر صفحه شما داخل یک div با overflow:auto اسکرول می‌شود، باید container را تعیین کنید.

// مشکل رایج: scroll داخل یک div (نه window)
// در این حالت ScrollReveal() پیش‌فرض کار نمی‌کند!

// ✓ راه‌حل: تعیین container
const sr = ScrollReveal({
  container: document.querySelector('.main-container')
});

// viewFactor — چقدر المان باید دیده شود (0 تا 1)
sr.reveal('.el', { viewFactor: 0.0 });  // فقط لبه‌اش دیده شود
sr.reveal('.el', { viewFactor: 0.5 });  // ۵۰٪ دیده شود
sr.reveal('.el', { viewFactor: 1.0 });  // کاملاً دیده شود

// viewOffset — فاصله trigger از لبه viewport
sr.reveal('.el', {
  viewOffset: { top: 50, bottom: 50 }
});

// opacity شروع (پیش‌فرض 0)
sr.reveal('.el', { opacity: 0.3 });  // شروع از ۳۰٪ شفافیت
ⓘ نکته این پروژه: در تمام دموهای این صفحه از container: document.querySelector('#mainCont') استفاده شده چون scroll داخل div اصلی است نه window.

📞Callback و رویدادها

sr.reveal('.el', {
  origin:   'bottom',
  duration: 600,

  // وقتی المان ظاهر شد
  afterReveal: function(el) {
    console.log('ظاهر شد:', el.id);
    el.classList.add('revealed');
  },

  // وقتی المان پنهان شد (فقط در reset:true)
  afterReset: function(el) {
    console.log('ریست شد:', el.id);
    el.classList.remove('revealed');
  },

  // وقتی المان وارد viewport شد (قبل از انیمیشن)
  beforeReveal: function(el) {
    console.log('در راه است...');
  }
});
📞 دمو: Callback — هر بار که المان ظاهر می‌شود لاگ می‌دهد
المان با Callback — ID: cb-box-1
المان با Callback — ID: cb-box-2
المان با Callback — ID: cb-box-3
// لاگ Callback اینجا نمایش داده می‌شود...
💡 کاربرد Callback:
  • اضافه کردن کلاس CSS بعد از reveal برای انیمیشن‌های اضافی
  • شروع counter یا تایمر بعد از ظاهر شدن المان
  • لود کردن محتوای lazy هنگام ورود به viewport
  • ثبت analytics هنگام دیده شدن محتوا

🏆پروژه کامل — Landing Page

ترکیب تمام قابلیت‌ها برای ساخت یک Landing Page با انیمیشن‌های حرفه‌ای:

const sr = ScrollReveal({
  container: document.querySelector('.page'),
  distance:  '60px',
  duration:  800,
  easing:    'ease-out',
  opacity:   0,
  reset:     false
});

// Hero — از بالا با delay
sr.reveal('.hero-title',   { origin: 'top',    delay: 0 });
sr.reveal('.hero-sub',     { origin: 'bottom', delay: 200 });
sr.reveal('.hero-btn',     { scale: 0.8, delay: 400 });

// Feature cards — stagger از پایین
sr.reveal('.feature-card', { origin: 'bottom', interval: 150 });

// آمار — از چپ و راست
sr.reveal('.stat-item',    { origin: 'left', interval: 100 });

// Footer cols — از پایین با interval
sr.reveal('.footer-col',   { origin: 'bottom', interval: 120 });
▼ اسکرول کنید تا Landing Page ظاهر شود

🚀 محصول جدید ما

بهترین راه‌حل برای کسب‌وکار شما — سریع، امن و مقرون‌به‌صرفه

شروع رایگان

سریع

بهینه‌شده برای بالاترین عملکرد

🔒

امن

رمزنگاری end-to-end

🎨

زیبا

رابط کاربری مدرن و شهودی

10K+کاربر فعال
99.9%آپتایم
50msمیانگین پاسخ
4.9★امتیاز
💡 خلاصه ScrollReveal:
  • ScrollReveal({container: el}).reveal('.sel', opts) — راه‌اندازی
  • origin: top, bottom, left, right — جهت ورود
  • distance: '60px' — فاصله حرکت
  • scale: 0.5 — بزرگ‌نمایی شروع
  • interval: 150 — Stagger بین المان‌ها
  • delay: 200 — تأخیر شروع
  • reset: true — تکرار هر بار
  • afterReveal: callback پس از ظاهر شدن

🚀زمین بازی کد (Playground)

المان‌ها را با ScrollReveal هنگام اسکرول نمایان کن. داخل کادر نتیجه اسکرول کن تا افکت اجرا شود. reset:true باعث تکرار می‌شود. نسخهٔ ۴.۰.۹ آفلاین بارگذاری می‌شود.