Вы можете использовать фиксированную позицию , чтобы элементы могли перемещаться независимо по области просмотра - теперь вы можете использовать top значение для вашей анимации и влево случайным образом распределить его по горизонтали.
Также обратите внимание на использование animation-fill-mode: forwards
, которое гарантирует, что после анимации изображение не вернется в верхнюю часть окна.
См. Демонстрацию ниже и updated codepen here
:
var rainDiv = document.querySelector('#action');
function appendImage() {
var img = document.createElement('img');
img.setAttribute('src', 'http://pixelartmaker.com/art/3ba7f5717ac3c63.png');
img.style.left = Math.floor(Math.random() * 100) + 'vw';
rainDiv.appendChild(img);
}
img {
position: fixed;
animation-duration: 20s;
animation-name: slidedown;
animation-fill-mode: forwards;
height: 100px;
width: 100px;
top: 0;
}
@keyframes slidedown {
to {
top: 120%;
}
}
<input type="button" value="Test Button" onclick="appendImage();" />
<div id="action"></div>