Intersection observer

Puedes usar la API del Intersection observer solo con CSS de manera fácil y rápida.

Advertencia

Actualmente, no es 100% compatible con todos los navegadores, puedes ver en caniuse.com en que navegadores si funciona

CodiLink logo codi.link

<div></div>
<div></div>
<div></div>
<div></div>

<style>

div{
  width: 300px;
  height: 500px;
  margin-bottom: 10px;
  background-color: red;
  animation-timeline: view();
  animation-fill-mode: both;
}

div:nth-child(even){
  animation-name: show;

/* te permite decidir dónde comienza la animación (entry) y dónde termina (cover) */
  animation-range: entry 5% cover 50%
}

div:nth-child(odd){
  animation-name: showInverse;
  animation-range: entry 10% cover 50%
}

@keyframes show{
  from{
    opacity: 0;
    transform: translateX(-300px);
  }
  to{
    opacity: 1;
    transform: translateX(0px);
  }
}

@keyframes showInverse{
  from{
    opacity: 0;
    transform: translateX(300px);
  }
  to{
    opacity: 1;
    transform: translateX(0);
  }
}
  
</style>