Items are only hidden after the script adds js-reveal, so if JavaScript fails, the content is simply visible. Only opacity and transform animate, which means no layout shift and smooth frames.
When several items enter at once (say, a fast scroll), each gets a slightly longer --delay, so they cascade instead of popping in together.
This demo watches a scroll box with the root option. For a normal page, set scrollArea to document.body. With reduced motion on, items fade in without moving.