Как отметил @onewaveadrian, нет смысла пытаться сохранить несколько байтов, генерируя CSS в браузере, но вместо этого скачайте компилятор S CSS или LESS, чтобы сделать это.
Тем не менее, вы могли бы генерировать эти CSS тени, используя только ваниль JS в браузере, без учета какой-либо дополнительной зависимости, которая сэкономит много байтов и, вероятно, будет работать быстрее, чем полноценный а также компилятор.
Чтобы сделать его еще быстрее, функция multipleBoxShadow
использует простую while
l oop, конкатенацию строк и побитовое ИЛИ оператор (|
) до номера этажа намного быстрее, чем Math.floor()
.
const MAX_Y_OFFSET = 2000;
const MAX_X = window.innerWidth;
const MAX_Y = window.innerHeight + MAX_Y_OFFSET;
function multipleBoxShadow(n) {
let boxShadow = '';
// Let's use a simple while loop and the bitwise OR operator (`|`) to round up values here
// to run this as fast as possible:
while (n--) {
boxShadow += `,${ Math.random() * MAX_X | 0 }px ${ Math.random() * MAX_Y | 0 }px #FFF`;
}
return boxShadow.slice(1);
}
const { documentElement } = document;
documentElement.style.setProperty('--shadows-small', multipleBoxShadow(700));
documentElement.style.setProperty('--shadows-medium', multipleBoxShadow(200));
documentElement.style.setProperty('--shadows-big', multipleBoxShadow(100));
body {
min-height: 100vh;
background: radial-gradient(ellipse at bottom, #1b2735 0%, #090a0f 100%);
overflow: hidden;
}
#stars {
width: 1px;
height: 1px;
background: transparent;
animation: animStar 50s linear infinite;
box-shadow: var(--shadows-small);
}
#stars:after {
content: " ";
position: absolute;
top: 2000px;
width: 1px;
height: 1px;
background: transparent;
box-shadow: var(--shadows-small);
}
#stars2 {
width: 2px;
height: 2px;
background: transparent;
animation: animStar 100s linear infinite;
box-shadow: var(--shadows-medium);
}
#stars2:after {
content: " ";
position: absolute;
top: 2000px;
width: 2px;
height: 2px;
background: transparent;
box-shadow: var(--shadows-medium);
}
#stars3 {
width: 3px;
height: 3px;
background: transparent;
animation: animStar 150s linear infinite;
box-shadow: var(--shadows-big);
}
#stars3:after {
content: " ";
position: absolute;
top: 2000px;
width: 3px;
height: 3px;
background: transparent;
box-shadow: var(--shadows-big);
}
@keyframes animStar {
from {
transform: translateY(0px);
}
to {
transform: translateY(-2000px);
}
}
<div id='stars'></div>
<div id='stars2'></div>
<div id='stars3'></div>
Как видите, я использую CSS пользовательских свойств , чтобы передать сгенерированное значение box-shadow
в CSS, чтобы я мог использовать его и в псевдоэлементах. Если вы предпочитаете не использовать CSS переменные, вы можете использовать 6 <div>
s вместо 3 и использовать атрибут style
следующим образом:
document.getElementById('stars').style.boxShadow = multipleBoxShadow(700);
document.getElementById('stars2').style.boxShadow = multipleBoxShadow(700);
document.getElementById('stars3').style.boxShadow = multipleBoxShadow(200);
document.getElementById('stars4').style.boxShadow = multipleBoxShadow(200);
document.getElementById('stars5').style.boxShadow = multipleBoxShadow(100);
document.getElementById('stars6').style.boxShadow = multipleBoxShadow(100);
Также, если производительность самой анимации не достаточно хорош, вы, вероятно, могли бы легко адаптировать этот код для рисования начальных точек (фактически, кругов или квадратов) на <canvas>
и анимировать их, используя Window.requestAnimationFrame()
.