Intersection observer и анимируй как душа пожелает. Пример есть на MDN, но с ленивой загрузкой. Делаешь так же, но вместо загрузки картинки добавляешь класс элементу, когда он во вьюпорте. Хотел ссылку скинуть - но пишу с мобилы, не нашел так быстро. 10-15 строк кода.