Language EN
חיפוש

הוספת אנימציות CSS בגלילה באמצעות AOS

לבטח יצא לכם לראות אתרים בהם מתבצעות אנימציות שונות בזמן שאתם גוללים מטה (On Scroll Animations). אז אשתף אתכם בספרייה בשם AOS (Animate On Scroll), המאפשרת להוסיף אנימציות אלו בקלות ועם שליטת CSS מלאה על אותן אנימציות.

הרעיון מאחורי AOS הוא די פשוט: לעקוב אחר כל האלמנטים והמיקום שלהם בהתאם להגדרות שסיפקתם, ולאחר מכן להוסיף או להסיר את הקלאס aos-animate המבצע את האנימציה לאלמנט הרלוונטי.

"בפועל, זה לא כזה פשוט כמו שזה נשמע" מציין מפתח הספרייה, אך הרעיון עצמו מאחוריה הוא פשוט וכל אספקט של אנימציה מתנהל באמצעות CSS בלבד.

כיצד להשתמש בספרייה AOS?

בתור התחלה, עליכם להוסיף את הקבצים הנחוצים בכדי ש-AOS תעבוד. הוסיפו את קובץ העיצוב ב-<head> של העמוד:

<link rel="stylesheet" href="https://unpkg.com/aos@2.3.4/dist/aos.css" />

לאחר מכן הוסיפו את הסקריפט הנחוץ לפני תגית ה-</body> הסוגרת:

<script src="https://unpkg.com/aos@2.3.4/dist/aos.js"></script>

הדוגמאות לעיל משתמשות ב-aos@2.3.4, שהיא הגרסה היציבה האחרונה. ייתכן שתיתקלו ברשת בהפניות ל-aos@next – זהו גרסת בטא 3.0 שנמצאת בפיתוח כבר שנים. לאתרים בסביבת פרודקשן, השתמשו ב-2.3.4.

לא אסביר בפוסט זה כיצד להוסיף אלו בוורדפרס, דיברתי על כך רבות והבאתי בפוסטים קודמים המון דוגמאות. מוזמנים לתת מבט בפוסט הוספת CSS ו-JS באתרי וורדפרס. אם אתם מסתבכים מוזמנים לשאול כאן בתגובות ומבטיח לענות.

בכדי לחסוך לכם זמן, ניתן להוריד מקישור זה את שני הקבצים הרלוונטיים.

אתחול הספרייה AOS

בכדי לאתחל את הספרייה יש להשתמש בקוד הבא:

AOS.init();

ל-AOS מספר אפשרויות ולא נרחיב עליהן. ההערות בקוד מספקות הסבר מצוין.

הוספת אנימציה לאלמנט HTML

בואו ניתן מבט בדוגמה ונראה כיצד להוסיף אנימציה לאלמנט HTML כלשהו. בהנחה וטענתם את הספרייה כמו שצריך, קביעה כי אלמנט יבצע אנימציה מתבצעת בצורה הבאה:

<div class="some-item" data-aos="fade">Example Element</div>

התוצאה תהיה משהו בסגנון הבא (בהתאם ל-CSS של אותו אלמנט):

fadedata-aos="fade"duration: 500ms

או למשל, אותה דוגמה אך עם זמן אנימציה (transition) ארוך יותר:

<div class="some-item" data-aos="fade" data-aos-duration="2500">Example Element</div>

התוצאה:

fadedata-aos="fade"duration: 2500ms

כנראה והבנתם כי התכונה data-aos אחראית לסוג האנימציה שתתבצע. נשנה את האנימציה לצורך הדוגמה:

<div class="some-item" data-aos="flip-left" data-aos-duration="1500">Example Element</div>

והנה התוצאה:

flip-leftdata-aos="flip-left"duration: 1500ms

ניתן אף לקבוע השהייה לאלמנטים עם שימוש בפרמטר data-aos-delay. הנה שלושה כפתורים עם דיליי קצר ביניהם:

<div class="buttons-aos">
    <button class="aos-button" data-aos="fade-up" data-aos-delay="0" data-aos-easing="ease-in-out">Button</button>
    <button class="aos-button" data-aos="fade-up" data-aos-delay="500" data-aos-easing="ease-in-out">Button</button>
    <button class="aos-button" data-aos="fade-up" data-aos-delay="1000" data-aos-easing="ease-in-out">Button</button>
</div>

כך זה נראה:

שילוב אנימציות בתצוגה מעשית

הנה דוגמה מעשית יותר – רשת כרטיסים בסגנון דשבורד שבה כל כרטיס משתמש בסוג אנימציה שונה ודיליי מדורג, מה שיוצר אפקט חשיפה מדורג:

<div class="aos-card-grid">
    <div class="card" data-aos="fade-up" data-aos-delay="0">...</div>
    <div class="card" data-aos="fade-up" data-aos-delay="150">...</div>
    <div class="card" data-aos="fade-up" data-aos-delay="300">...</div>
    <div class="card" data-aos="zoom-in" data-aos-delay="450">...</div>
    <div class="card" data-aos="zoom-in" data-aos-delay="600">...</div>
    <div class="card" data-aos="zoom-in" data-aos-delay="750">...</div>
</div>

התוצאה – גללו מטה כדי להפעיל את האנימציה:

Visitors12,847fade-up / 0ms
Conversions3.2%fade-up / 150ms
Revenue$48.5Kfade-up / 300ms
Sessions5,291zoom-in / 450ms
Uptime99.9%zoom-in / 600ms
Speed1.2szoom-in / 750ms

הטכניקות העיקריות כאן: שילוב fade-up לשורה הראשונה עם zoom-in לשנייה, ערכי data-aos-delay מדורגים שיוצרים אפקט גל, ו-data-aos-duration משותף ששומר על קצב אחיד.

אנימציות זמינות

AOS מגיעה עם סט מוכן של אנימציות מובנות שניתן להשתמש בהן מיד. הנה הקבוצות העיקריות:

  • Fade: fade, fade-up, fade-down, fade-left, fade-right, fade-up-right, fade-up-left, fade-down-right, fade-down-left
  • Flip: flip-up, flip-down, flip-left, flip-right
  • Slide: slide-up, slide-down, slide-left, slide-right
  • Zoom: zoom-in, zoom-in-up, zoom-in-down, zoom-in-left, zoom-in-right, zoom-out, zoom-out-up, zoom-out-down, zoom-out-left, zoom-out-right

כל אנימציה מקבלת פרמטרים כגון data-aos-duration, data-aos-delay, data-aos-easing ו-data-aos-offset לכיוונון עדין של ההתנהגות.

אפשרויות הקונפיגורציה של AOS

בעת אתחול AOS, ניתן להעביר אובייקט הגדרות לשליטה בהתנהגות הגלובלית. הנה דוגמה מלאה עם כל האפשרויות הזמינות:

AOS.init({
  // Global settings:
  disable: false, // accepts: 'phone', 'tablet', 'mobile', boolean, expression or function
  startEvent: 'DOMContentLoaded', // event that triggers AOS initialization
  initClassName: 'aos-init', // class applied after initialization
  animatedClassName: 'aos-animate', // class applied on animation
  useClassNames: false, // if true, adds data-aos value as classes on scroll
  disableMutationObserver: false, // disables automatic mutation detection (advanced)
  debounceDelay: 50, // debounce delay on window resize (advanced)
  throttleDelay: 99, // throttle delay on scroll (advanced)

  // Per-element settings (overridable via data-aos-* attributes):
  offset: 120, // offset (in px) from the trigger point
  delay: 0, // values from 0 to 3000, step 50ms
  duration: 400, // values from 0 to 3000, step 50ms
  easing: 'ease', // default easing for animations
  once: false, // whether animation runs only once while scrolling down
  mirror: false, // whether elements animate out while scrolling past them
  anchorPlacement: 'top-bottom', // which position of the element triggers the animation
});

הגדרה נפוצה לסביבת פרודקשן היא לקבוע once: true כך שהאנימציות יפעלו פעם אחת ולא יחזרו בכל פעם שהמשתמש גולל חזרה למעלה. זה מרגיש פחות מסיח את הדעת ומשפר את ביצועי הגלילה.

הוספת אנימציה משלכם ל-AOS

אם האנימציות שהספרייה מספקת אינן מספיקות, מכיוון שכל האנימציות מתבצעות ב-CSS, באפשרותכם להוסיף אנימציה משלכם ל-AOS בצורה פשוטה.

[data-aos="new-animation"] {
  opacity: 0;
  transition-property: transform, opacity;
}
[data-aos="new-animation"].aos-animate {
  opacity: 1;
}
@media screen and (min-width: 768px) {
  [data-aos="new-animation"] {
    transform: translateX(100px);
  }
  [data-aos="new-animation"].aos-animate {
    transform: translateX(0);
  }
}

ואז ניתן להשתמש באנימציה זו בצורה הבאה:

<div data-aos="new-animation"></div>

נגישות

אנימציות גלילה עלולות להיות בעייתיות למשתמשים רגישים לתנועה. דפדפנים מודרניים תומכים ב-prefers-reduced-motion media query, ומומלץ לכבד הגדרה זו. AOS מקלה על כך עם האפשרות disable:

AOS.init({
  disable: window.matchMedia('(prefers-reduced-motion: reduce)').matches
});

קוד זה משבית את כל אנימציות AOS כאשר המשתמש ביקש הפחתת תנועה בהגדרות מערכת ההפעלה שלו.

אנימציות גלילה נייטיב ב-CSS

ראוי לציין כי דפדפנים מתחילים לתמוך באנימציות גלילה נייטיב באמצעות ה-property של animation-timeline עם הפונקציות scroll() ו-view(). זה מאפשר לקשר אנימציות CSS להתקדמות הגלילה ללא צורך ב-JavaScript כלל.

נכון לתחילת 2026, Chrome, Edge ו-Safari תומכים בפיצ'ר זה, אך ב-Firefox הוא עדיין מושבת כברירת מחדל. לתמיכה רחבה בדפדפנים, AOS נשארת בחירה אמינה. עקבו אחר animation-timeline ככל שהיא מתבגרת – ייתכן שבסופו של דבר היא תחליף לחלוטין ספריות JavaScript לאנימציות גלילה.

שאלות נפוצות

שאלות נפוצות בנושא AOS ואנימציות גלילה:

האם AOS עדיין מתוחזקת?
AOS היא ספרייה בוגרת ויציבה. הגרסה היציבה האחרונה היא 2.3.4. למרות שפיתוח פעיל של פיצ'רים חדשים הואט, הספרייה עובדת בצורה אמינה וממשיכה להיות בשימוש נרחב בפרודקשן. גרסת בטא 3.0 (aos@next) נמצאת בפיתוח אך טרם הגיעה לגרסה יציבה.
האם AOS משפיעה על ביצועי העמוד?
AOS היא קלת משקל במשקל של כ-8KB. עם זאת, אנימציה של אלמנטים רבים בו-זמנית עלולה לגרום לחישובי layout מחדש ולהשפיע על חלקות הגלילה. השתמשו באפשרות once: true כך שהאנימציות ירוצו פעם אחת בלבד, והימנעו מאנימציה של עשרות אלמנטים באותו עמוד.
ניתן להשתמש ב-AOS עם React, Vue או פריימוורקים אחרים?
כן. יבאו את AOS בקומפוננטה, קראו ל-AOS.init() ב-hook של mounted או useEffect, והוסיפו תכונות data-aos לאלמנטים ב-JSX או בתבנית. אם ה-DOM משתנה דינמית, קראו ל-AOS.refresh() לאחר העדכונים כדי ש-AOS תזהה את האלמנטים החדשים.
כיצד מכבדים את הגדרת prefers-reduced-motion עם AOS?
העבירו פונקציה או ביטוי לאפשרות disable. לדוגמה: AOS.init({ disable: window.matchMedia('(prefers-reduced-motion: reduce)').matches }). קוד זה מכבה את כל אנימציות הגלילה כאשר המשתמש הפעיל הפחתת תנועה בהגדרות מערכת ההפעלה.
מה ההבדל בין once לבין mirror ב-AOS?
האפשרות once קובעת האם האנימציה תפעל רק בגלילה הראשונה מטה. כשהיא מוגדרת ל-true, האלמנט מבצע אנימציה פעם אחת ונשאר גלוי. האפשרות mirror קובעת האם אלמנטים יבצעו אנימציה הפוכה כשגוללים מעבר להם. כברירת מחדל שתיהן false, כך שהאנימציות חוזרות בכל פעם שהאלמנט נכנס לאזור הצפייה.
ניתן ליצור אנימציות מותאמות אישית עם AOS?
כן. הגדירו כלל CSS המכוון ל-[data-aos="שם-האנימציה-שלכם"] עם המצב ההתחלתי, וכלל נוסף עבור [data-aos="שם-האנימציה-שלכם"].aos-animate עם המצב הסופי. לאחר מכן השתמשו ב-data-aos="שם-האנימציה-שלכם" על כל אלמנט. מכיוון שכל האנימציות מבוססות CSS, יש לכם שליטה מלאה על transforms, opacity ו-transitions.

סיכום

AOS היא ספרייה קלת משקל מבוססת CSS שהופכת את הוספת אנימציות הגלילה לפשוטה. הגדירו את התכונה data-aos על כל אלמנט, אתחלו את הספרייה, וסיימתם. לסביבת פרודקשן, השתמשו בגרסה 2.3.4, הגדירו once: true לחוויה נקייה יותר, וזכרו להשבית אנימציות למשתמשים שמעדיפים הפחתת תנועה.

עוד מידע על אפשרויות הספרייה, על האנימציות הזמינות ועל כל הפרמטרים ניתן למצוא בעמוד הגיטהאב של AOS.

דיון ותגובות
3 תגובות  ]
  • אדיר פרץ 18 יוני 2021, 12:43

    אלוף
    מאמר איכותי ומפושט כמו שרק אתה יודע.

    • רועי יוסף 18 יוני 2021, 13:20

      אליפות אתה. לגבי השאלה במייל – אני לא מעביר קורסים אך בהחלט שוקל כי המון פונים אליי בהקשר, בין אם מכללות או אנשים פרטיים..

      • אדיר פרץ 20 יוני 2021, 9:13

        אשמח להיות הראשון במידה ותחליט שכן (:

השאירו תגובה

הוסיפו קוד באמצעות הכפתורים מטה. למשל, בכדי להוסיף PHP לחצו על הכפתור PHP והוסיפו את הקוד בתוך השורטקוד. מצאתם שגיאה בפוסט? עדכנו אותנו...

Savvy WordPress Development official logo