18
Views
12
Comments
scroll-triggered animations on list items/blocks
Application Type
Traditional Web

Hello OutSystems Community,

I'm working on a screen in a Traditional Web that displays a list of items (using a List widget with repeated Blocks). I want to add subtle entrance animations (like fade-in or slide-up) to each block's content, but crucially, the animation should only trigger when the user scrolls that specific block into the viewport.

My Goal & What I'm Looking For:

  • The classic "reveal on scroll" effect for list items.

  • Understanding the recommended and most performant way to implement this in the OutSystems architecture.

  • Any common pitfalls to avoid, especially concerning long lists or mobile performance.

2024-10-05 13-30-20
Huy Hoang The

I'm thinking OS have Animate Item for each item.

And If you want to customize it, I think you can set Animate Items to NO, then add a class "reveal-on-scroll " and custom CSS for it. 

Alternatively, you can also use JavaScript.

 I hope this helps.

Huy Hoang. 

UserImage.jpg
Wei Shen

Thank you for the helpful suggestions, Huy Hoang!

 I'll explore this path alongside the JavaScript library methods Sherif have suggested. It's helpful to know there are multiple ways to tackle this within the OutSystems framework.

2024-10-05 13-30-20
Huy Hoang The

You're welcome. Hope you will create a UI with good effects.

2025-12-22 13-50-43
Sherif El-Habibi
Champion

Hello,

Adding to Huy's explanation regarding JavaScript, most of the animations that you require outside of OutSystems can be done using JS libraries or jQuery. I, for example, used animation for my personal portfolio, but this is within OutSystems itself, which is fade-in/fade-out:

https://personal-zaqcf0md.outsystemscloud.com/PersonalPortofolio_UI/Sherif_ElHabibi

As for the scroll, I was using another library called AOS: https://michalsnik.github.io/aos/

For this old one: https://sherifelhabibi.github.io/Portofolio/

So overall, there is flexibility in doing that. For the recommendation you asked it depends on the library itself, its documentation, and its potential pitfalls.

UserImage.jpg
Wei Shen

Thank you for sharing those examples, Sherif! 

You mentioned using AOS for scroll-triggered animations. Could you share the specific steps for installing and using such JavaScript libraries within OutSystems ODC (OutSystems Developer Cloud)?

2024-10-05 13-30-20
Huy Hoang The

Thanks Sherif!

2025-12-22 13-50-43
Sherif El-Habibi
Champion
2025-12-22 13-50-43
Sherif El-Habibi
Champion

@Wei Sheng Pang 

Mostly, all libraries follow the same implementation steps. You add the script to the Scripts folder, then in the OnInitialize event you initialize the library, for example AOS.Init().

There is also a discussion here that explains the steps in more detail for AOS specifically:

https://www.outsystems.com/forums/discussion/101420/how-to-use-library-aos-for-reactive-web/

2023-10-16 05-50-48
Shingo Lam
  1. Copy the source from this link: https://cdnjs.cloudflare.com/ajax/libs/aos/2.3.4/aos.js
  2. Save to js file
  3. Import the script in Studio, choose the file
  4. Remember to add css to theme

UserImage.jpg
Jayaprakash Ramesh

Hello,

Traditional Web does not have a built-in “reveal on scroll” feature, so the recommended approach is to combine lightweight CSS animations with minimal JavaScript. The animation itself should always be handled by CSS (for example, opacity and translateY transitions), since this is the most performant and avoids blocking the main thread.

JavaScript is only used to detect when a block enters the viewport and to add a CSS class that triggers the animation. Where browser support allows, IntersectionObserver is the preferred solution because it is efficient and does not run logic on every scroll event. If you must support older browsers, a throttled scroll handler using getBoundingClientRect can be used as a fallback.

In OutSystems, it’s best to keep the viewport detection logic at the screen level and let repeated blocks remain purely presentational. Each block should expose a stable CSS class or ID, and the animation should run only once when the element becomes visible.

For long lists, avoid animating large numbers of items at once. Pagination or progressive loading is strongly recommended, especially for mobile, to prevent scroll jank and performance degradation.

2026-01-15 03-18-59
Vijay Malviya

Hi @Wei Sheng Pang 

pls place the following JavaScript in the Screen’s On Ready event to trigger reveal-on-scroll animations for elements with the reveal-item class

const items = document.querySelectorAll(".reveal-item");

const observer = new IntersectionObserver(

  (entries, obs) => {

    entries.forEach(entry => {

      if (entry.isIntersecting) {

        entry.target.classList.add("revealed");

        obs.unobserve(entry.target);

      }

    });

  },

  { threshold: 0.2 }

);


items.forEach(item => observer.observe(item));




UserImage.jpg
Wei Shen

Hello everyone,

Following up on my earlier thread about scroll-triggered animations. Thank you everyone for suggesting the AOS library and other approach. I've attempted to implement with the AOS library but the result is a completely blank/empty list.

Here are my exact implementation steps in ODC:

  1. Added the AOS library @Shingo Lam :

    • JavaScript: Added https://cdnjs.cloudflare.com/ajax/libs/aos/2.3.4/aos.js to my Screen's Required Scripts property.

    • CSS: Added @import url("https://cdnjs.cloudflare.com/ajax/libs/aos/2.3.4/aos.css"); to my Theme's Style Sheet.

  2. Initialized AOS (Screen's OnReady event, JavaScript node) @Vijay Malviya 

    :


  3. Applied CSS Classes:

    • Added the reveal-item class to the Extended Class property of each Block inside my List widget.

The Problem: The list content is not visible at all (appears blank).

Community GuidelinesBe kind and respectful, give credit to the original source of content, and search for duplicates before posting.