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

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 باعث تکرار می‌شود. نسخهٔ ۴.۰.۹ آفلاین بارگذاری می‌شود.