Так как вы устанавливаете положение с помощью JS, вы можете точно знать, где каждый элемент появится, и использовать эту информацию для настройки анимации.
Вот базовый c пример для иллюстрации:
.dot {
background: blue;
position:fixed;
width: 50px;
height: 50px;
border-radius: 50%;
z-index: -1;
left:var(--x,0px);
animation:move 2s linear infinite;
}
@keyframes move {
0% {
transform: translateX(0vw);
}
100% {
transform: translateX(calc(100vw - var(--x,0px)));
}
}
<div class="dot" style="top:10px;--x:80px;"></div>
<div class="dot" style="top:20px;--x:150px;"></div>
<div class="dot" style="top:100px;--x:350px;"></div>
Переменная --x
определит левую и будет вычтена из 100vw
Для лучшей поддержки и с тех пор, как вы используя JS, вы можете избавиться от calc()
и CSS переменных. Просто сделайте небольшое вычисление, чтобы найти значение преобразования.
Вот пример, где я использую jQuery для простоты, но вы можете легко сделать его JS -только кодом:
$('.dot').each(function() {
$(this).css('transform','translateX('+ ($(window).width() - parseInt($(this).css('left')))+'px)');
});
.dot {
background: blue;
position:fixed;
width: 50px;
height: 50px;
border-radius: 50%;
z-index: -1;
animation:move 2s linear infinite;
}
@keyframes move {
0% {
transform: translateX(0px);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="dot" style="top:10px;left:80px;"></div>
<div class="dot" style="top:20px;left:150px;"></div>
<div class="dot" style="top:100px;left:350px;"></div>
Стоит отметить, что вам нужно обновить значение при изменении размера окна
Еще одна идея сохранить l oop Эффект состоит в том, чтобы иметь одинаковую позицию и одинаковую анимацию для всех, и вы настраиваете задержку для имитации другой позиции:
.dot {
background: blue;
position:fixed;
width: 50px;
height: 50px;
border-radius: 50%;
z-index: -1;
left:0;
animation:move 2s linear infinite;
}
@keyframes move {
0% {
transform: translateX(0px);
}
100% {
transform: translateX(100vw);
}
}
<div class="dot" style="top:10px;animation-delay:-1s;"></div>
<div class="dot" style="top:20px;animation-delay:-0.1s;animation-duration:1s"></div>
<div class="dot" style="top:100px;animation-delay:-0.5s;animation-duration:4s"></div>
Расчет прост. Если продолжительность анимации составляет D
, то задержка в -D/2
будет помещать элемент в центр по существу. -D*0.1
поместит изображение в 10%
и т. Д.