Я создаю несколько анимированных линий, которые проходят от одной стороны страницы к другой, при этом они изменяются в размере. В настоящее время существует 5 анимированных линий, и я могу добавить больше, но я также хочу, чтобы они все перемещались. экран с разными интервалами, меняйте размер с разными интервалами и, если возможно, в случайном порядке, чтобы анимация никогда не повторялась по-настоящему.
В настоящее время я могу думать только о том, чтобы написать очень длинный блок кода для каждой строки, и это не будет случайным образом. Мне нужно будет установить левое значение и ширину, чтобы это казалось случайным, но, очевидно, это будет просто заранее запрограммированная последовательность, которая сохранит повторяющийся.
Конечно, это можно сделать с меньшим количеством кода в JS и фактически генерировать случайным образом?
В настоящее время у меня есть следующие ключевые кадры:
@keyframes slider {
0% {width: 75%; left: 10%;}
5% {width: 66%; left: 18%;}
10% {width: 60%; left: 26%;}
15% {width: 31%; left: 34%;}
20% {width: 26%; left: 38%;}
25% {width: 20%; left: 44%;}
30% {width: 10%; left: 52%;}
35% {width: 8%; left: 71%;}
40% {width: 7%; left: 82%;}
45% {width: 5%; left: 89%;}
50% {width: 0%; left: 94%;}
55% {width: 12%; left: 79%;}
60% {width: 21%; left: 72%;}
65% {width: 35%; left: 59%;}
70% {width: 38%; left: 51%;}
75% {width: 47%; left: 41%;}
80% {width: 53%; left: 33%;}
85% {width: 70%; left: 19%;}
90% {width: 84%; left: 11%;}
95% {width: 89%; left: 6%;}
100%{width: 100%; left: 0%;}
}
Теперь я могу связать это с необходимыми мне элементами, как показано ниже:
.animation :nth-child(1) {
top: 10%;
animation: slider 3s infinite;
}
если это поможет вам получить представление о том, что я делаю, стиль div будет следующим:
.an {
height: 10px;
position: absolute;
background-color: #09a07a;
top: 0;
}
Это означает, что мне нужно написать один из этих повторяющихся блоков кода для каждого дочернего элемента. Я не прошу вас написать за меня весь код, а лишь некоторые рекомендации относительно того, на что мне следует обратить внимание при подходе к JS-блоку, который будет:
Случайным образом заставить целевой элемент перемещаться с одной стороны экрана на другую, при случайном увеличении и уменьшении ширины. Это будет применяться к каждому элементу случайным образом, чтобы сэкономить блок кода для каждого элемента, но также сэкономить на написании такого большого ключевого кадра. .
Для случайности вам понадобится немного JS, но, используя переменные CSS, вы можете сократить код. Однако в настоящее время вы не можете использовать переменные, определяющие «точки останова» в определении ключевых кадров. Насколько случайными вам нужны вещи?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам понадобится всего несколько строк JS для создания элементов .an.
Ширина, левое и верхнее положение, а также время каждой анимации задаются в этом фрагменте путем установки переменных CSS с помощью JS Math.random, чтобы они различались.
Конечно, вы можете делать более сложные вещи, например создавать сами ключевые кадры случайным образом, но я не уверен, что пользователь заметит тонкие различия.
<style>
@keyframes slider {
0% {
width: var(--w0);
left: var(--l0);
}
5% {
width: var(--w1);
left: var(--l1);
}
10% {
width: var(--w2);
left: var(--l2);
}
15% {
width: var(--w3);
left: var(--l3);
}
20% {
width: var(--w4);
left: var(--l4);
}
25% {
width: var(--w5);
left: var(--l5);
}
30% {
width: var(--w6);
left: var(--l6);
}
35% {
width: var(--w7);
left: var(--l7);
}
40% {
width: var(--w8);
left: var(--l8);
}
45% {
width: var(--w9);
left: var(--l9);
}
50% {
width: var(--w10);
left: var(--l10);
}
55% {
width: var(--w11);
left: var(--l11);
}
60% {
width: var(--w12);
left: var(--l12);
}
65% {
width: var(--w13);
left: var(--l13);
}
70% {
width: var(--w14);
left: var(--l14);
}
75% {
width: var(--w15);
left: var(--l15);
}
80% {
width: var(--w16);
left: var(--l16);
}
85% {
width: var(--w17);
left: var(--l17);
}
90% {
width: var(--w18);
left: var(--l18);
}
95% {
width: var(--w19);
left: var(--l19);
}
100% {
width: var(--w20);
left: var(--l20);
}
}
.animation {
position: relative;
width: 100vw;
height: 100vh;
overflow: hidden;
}
.an {
height: 10px;
position: absolute;
background-color: #09a07a;
top: var(--top);
animation: slider var(--t) infinite;
}
</style>
<div class = "animation">
</div>
<script>
let numLines = 5;
let numSlots = 21;
let animationEl = document.querySelector('.animation');
for (let i = 0; i < numLines; i++) {
const line = document.createElement('div');
line.classList.add('an');
line.style.setProperty('--top', Math.random() * 100 + '%');
line.style.setProperty('--t', Math.random() * 5 + 2 + 's');
for (let j = 0; j < numSlots; j++) {
line.style.setProperty('--w' + j, Math.random() * 100 + '%');
line.style.setProperty('--l' + j, Math.random() * 100 + '%');
}
animationEl.append(line);
}
</script>интересно, так что лучше просто создать заранее созданный класс, а элементы div создавать и назначать их на лету! По сути, вы просто написали это для меня, мне просто нужно добавить отступ или верх, чтобы немного раздвинуть их! Спасибо за это.
Вертикальный интервал является произвольным, поэтому будут случаи, когда две строки будут очень близки или перекрываются, поэтому добавление полей или отступов ко всем не поможет. Вам нужно будет либо запомнить, где что находится, и убедиться, что следующие не расположены слишком близко, либо иметь регионы с числом строк и назначить по одной строке для каждого региона.
Было бы намного проще использовать Javascript для управления положением и шириной элементов вместо CSS. Вы можете сохранить массив с каждым элементом и его текущей позицией в анимации.