В этом посте я хотел бы поделиться с вами демо -версией Vanilla JS Twinkling Stars на гладком черном холсте. По сути, такая проблема включает в себя дело со случайными параметрами, такими как ширина звезды, высота, координаты и длительность мерцания. Я думаю, что, вероятно, лучше начать с соответствующей части CSS для этой небольшой демонстрации и пройти наш путь к части JS.
Вот несколько ссылок для этой демонстрации:
👉 Github Repo: https://github.com/yoss-abramov/starry-night
👉 страница GitHub: https://yossi-abramov.github.io/starry-night/
CSS
.star { --twinkle-duration: ""; --twinkle-delay: ""; --star-size: ""; position: absolute; width: var(--star-size); height: var(--star-size); background: #fff; border-radius: 50%; animation: twinkle infinite alternate; animation-duration: var(--twinkle-duration); animation-delay: var(--twinkle-delay); } @keyframes twinkle { from { transform: scale(1); } to { transform: scale(1.5); box-shadow: 0 0 5px 0.5px rgba(150, 150, 150, 0.6); } }
Я создал .star
Класс для моих звезд и инициализировал в нем переменные CSS. Образуя эти переменные в .star
Класс Мы можем сделать эти переменные ведут себя как «аргументы». Это означает, что мы можем установить значение для нашего значения CSS -свойства на данном элементе Star (просто подумайте обо всех классных вещах, которые вы можете построить с помощью переменных CSS!). Далее я установил Ключевой кадр
Анимация для эффекта «мерцания». Как видите, оба Продолжительность анимации
и анимация-задержка
иметь присвоенную им переменную CSS. Что касается мерцания Ключевой кадр
, это довольно прямо: чередование бесконечно между шкалой 1 и 1,5 размера звезды и добавьте Box-Shadow
Для мягкого света эффекта.
JS
Теперь давайте пройдемся по части JS кода. Как упомянуто выше, нам нужно иметь дело с некоторыми случайными «звездными» свойствами. По этой причине первое, что нам нужно, – это функция, которая генерирует случайное число между мин
и Макс
Анкет Для этого мы можем использовать Mighty JS Math объект:
const genRandomNumber = (min, max) => { return Math.random() * (max - min) + min; }
После настройки нашего Genrandomnumber
Функция мы можем перейти к определению границ нашего микрокосмоса/холста/ночного неба. Помните, нам нужно случайным образом распространять наши звезды по пространству. Поэтому сначала нам нужно выбрать нашего родителя и дать нашим координатам звезд относительно выбранного родителя. В этом случае я выбрал тело
элемент:
const $el = document.body;
Теперь все, что нам нужно сделать, это создать элемент, добавить .star
Класс к нему и передайте необходимые случайные свойства CSS, которые мы определили в нашем CSS. После создания нашего звездного элемента мы просто добавим его к родительскому элементу – тело
в таком случае. Нам нужно повторить этот процесс x
Количество раз – так просто для
петля подойдет!
for (let index = 0; index < 1000; index++) { const star = document.createElement("div"); star.classList.add("star"); // Star coordinates let x = genRandomNumber(1, $el.offsetWidth); let y = genRandomNumber(1, $el.offsetHeight); star.style.left = Math.floor(x) + "px"; star.style.top = Math.floor(y) + "px"; star.style.setProperty( "--star-size", genRandomNumber(1, 3) + "px" ); star.style.setProperty( "--twinkle-duration", Math.ceil(genRandomNumber(1, 5)) + "s" ); star.style.setProperty( "--twinkle-delay", Math.ceil(genRandomNumber(1, 5)) + "s" ); $el.append(star); }
Давайте немного рефактируем этот код, вот еще одно предложение:
// Night Sky element const $el = document.body; // Generate a random number between min and max values const genRandomNumber = (min, max) => { return Math.random() * (max - min) + min; } // Generate a starconst genStar = () => { const star = document.createElement("div"); star.classList.add("star"); // Gen star coordinates relative to $el size let x = genRandomNumber(1, $el.offsetWidth); let y = genRandomNumber(1, $el.offsetHeight); const { style } = star; style.left = Math.floor(x) + "px"; style.top = Math.floor(y) + "px"; style.setProperty( "--star-size", genRandomNumber(1, 3) + "px" ); style.setProperty( "--twinkle-duration", Math.ceil(genRandomNumber(1, 5)) + "s" ); style.setProperty( "--twinkle-delay", Math.ceil(genRandomNumber(1, 5)) + "s" ); return star; } for (let index = 0; index < 800; index++) { $el.append(genStar()); }
✍ Для получения дополнительной информации: https://yossiabramov.com/
Оригинал: “https://dev.to/yossiabramov/vanilla-js-starry-night-4e7k”