Наверняка есть более простой способ сделать это? HTML, CSS, JS

Я создаю несколько анимированных линий, которые проходят от одной стороны страницы к другой, при этом они изменяются в размере. В настоящее время существует 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-блоку, который будет:

Случайным образом заставить целевой элемент перемещаться с одной стороны экрана на другую, при случайном увеличении и уменьшении ширины. Это будет применяться к каждому элементу случайным образом, чтобы сэкономить блок кода для каждого элемента, но также сэкономить на написании такого большого ключевого кадра. .

Было бы намного проще использовать Javascript для управления положением и шириной элементов вместо CSS. Вы можете сохранить массив с каждым элементом и его текущей позицией в анимации.

Tim Roberts 14.08.2024 20:14

Для случайности вам понадобится немного JS, но, используя переменные CSS, вы можете сократить код. Однако в настоящее время вы не можете использовать переменные, определяющие «точки останова» в определении ключевых кадров. Насколько случайными вам нужны вещи?

A Haworth 14.08.2024 20:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам понадобится всего несколько строк 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 создавать и назначать их на лету! По сути, вы просто написали это для меня, мне просто нужно добавить отступ или верх, чтобы немного раздвинуть их! Спасибо за это.

Joe Walker 15.08.2024 00:58

Вертикальный интервал является произвольным, поэтому будут случаи, когда две строки будут очень близки или перекрываются, поэтому добавление полей или отступов ко всем не поможет. Вам нужно будет либо запомнить, где что находится, и убедиться, что следующие не расположены слишком близко, либо иметь регионы с числом строк и назначить по одной строке для каждого региона.

A Haworth 15.08.2024 08:55

Другие вопросы по теме

Похожие вопросы

Обеспечивают ли левый и правый сдвиг лучшую производительность по сравнению с операциями умножения и деления?
Почему клавиша ENTER отпускает ожидание?
Объединить объекты внутри массива объектов с дубликатами
Проблемы доступности тегов span/mark, вложенных в абзацы
Каков наилучший масштабируемый способ реализации ContextProvider для выборки и фильтрации данных?
Кнопка воспроизведения звука запускает фантомный второй щелчок, когда currentTime изменяется программно, предотвращая воспроизведение
Как я могу вызвать повторную отрисовку элемента (который использует состояние) в функции обратного вызова?
CSS и JavaScript не применяются правильно после переноса содержимого HTML в компонент приложения Angular из-за проблем с инкапсуляцией просмотра и порядком загрузки скриптов
Передача параметров с использованием выборки Javascript
Извлечение дат из текста