SCSS 粒子动画 - 在随机位置创建,但将所有粒子朝同一方向移动
SCSS particles animation - create at random position, but move all particles in the same direction
我对 SCSS 还很陌生,所以希望有人能帮助我。
我正在尝试沿相同方向(向下)移动粒子,但因为所有粒子都是随机放置的,所以它们的目的地最终也是随机的。
我想保持随机放置,但一旦它们被放置,我希望它们都朝着相同的方向(向下)而不是随机方向。我不知道如何在不丢失步骤生成的随机定位的情况下做到这一点。
我知道如何在 CSS 中执行此操作,但这将需要手动指定每个路径,如果我可以让它与 SCSS 一起使用,这将是我的最终解决方案,除非有人可以帮我吗?
这里 JSFiddle 展示了它的行为方式,但这是创建随机步骤的部分:
SCSS
@for $i from 1 through $dot-count {
&:nth-of-type(#{$i}) {
animation-name: move-path-#{$i};
&:before {
animation-duration: random(5000) + 5000ms, random(1000) + 7000ms;
animation-delay: random(6000) + 500ms, 0s;
}
}
$steps: random(15) + 10;
@keyframes move-path-#{$i} {
@for $step from 0 through $steps {
#{$step / $steps * 100%} {
transform: translateX(random(100) - 50vw)
translateY(random(100) - 50vh)
scale(random(70) / 100 + 0.3);
}
}
}
}
您可以定义一个所有粒子共有的随机变量,用它来定位粒子,然后根据它们的步数而不是随机移动它们。
html {
font-size: 30vmax / 1920 * 100;
font-family: "Quicksand", sans-serif;
background-color: #000;
margin: 0;
padding: 0;
@media (max-width: 768px) {
font-size: 50px;
}
}
// Stars
$dot-color: #fff;
$dot-count: 35;
#milky-way {
width: 100%;
}
.sky {
position: fixed;
width: 100%;
height: 100%;
z-index: 10;
pointer-events: none;
}
.dot {
position: absolute;
width: 0.08rem;
height: 0.08rem;
top: 50%;
left: 50%;
animation: 160s ease both infinite alternate;
&:before {
content: "";
display: block;
width: 100%;
height: 100%;
border-radius: 50%;
background-color: $dot-color;
transform-origin: -1rem;
animation: lighting ease both infinite, auto-rotating ease both infinite;
}
@for $i from 1 through $dot-count {
// Random variable common to all particles
$random: random(100);
&:nth-of-type(#{$i}) {
animation-name: move-path-#{$i};
&:before {
animation-duration: random(5000) + 5000ms, random(1000) + 7000ms;
animation-delay: random(6000) + 500ms, 0s; // less than max duration
}
}
$steps: random(15) + 10;
@keyframes move-path-#{$i} {
@for $step from 0 through $steps {
#{$step / $steps * 100%} {
// first translation is depending on a common random, second is depending on the step number
transform: translateX($random - 50vw) translateX($step * $step * 150px)
translateY($random - 50vh) translateY($step * $step * 150px)
scale(random(70) / 100 + 0.3);
}
}
}
}
}
@keyframes lighting {
0%,
30%,
100% {
opacity: 0;
}
5% {
opacity: 1;
box-shadow: 0 0 0.3rem 0.05rem $dot-color;
}
}
@keyframes auto-rotating {
to {
transform: rotate(0deg);
}
}
我对 SCSS 还很陌生,所以希望有人能帮助我。 我正在尝试沿相同方向(向下)移动粒子,但因为所有粒子都是随机放置的,所以它们的目的地最终也是随机的。
我想保持随机放置,但一旦它们被放置,我希望它们都朝着相同的方向(向下)而不是随机方向。我不知道如何在不丢失步骤生成的随机定位的情况下做到这一点。
我知道如何在 CSS 中执行此操作,但这将需要手动指定每个路径,如果我可以让它与 SCSS 一起使用,这将是我的最终解决方案,除非有人可以帮我吗?
这里 JSFiddle 展示了它的行为方式,但这是创建随机步骤的部分:
SCSS
@for $i from 1 through $dot-count {
&:nth-of-type(#{$i}) {
animation-name: move-path-#{$i};
&:before {
animation-duration: random(5000) + 5000ms, random(1000) + 7000ms;
animation-delay: random(6000) + 500ms, 0s;
}
}
$steps: random(15) + 10;
@keyframes move-path-#{$i} {
@for $step from 0 through $steps {
#{$step / $steps * 100%} {
transform: translateX(random(100) - 50vw)
translateY(random(100) - 50vh)
scale(random(70) / 100 + 0.3);
}
}
}
}
您可以定义一个所有粒子共有的随机变量,用它来定位粒子,然后根据它们的步数而不是随机移动它们。
html {
font-size: 30vmax / 1920 * 100;
font-family: "Quicksand", sans-serif;
background-color: #000;
margin: 0;
padding: 0;
@media (max-width: 768px) {
font-size: 50px;
}
}
// Stars
$dot-color: #fff;
$dot-count: 35;
#milky-way {
width: 100%;
}
.sky {
position: fixed;
width: 100%;
height: 100%;
z-index: 10;
pointer-events: none;
}
.dot {
position: absolute;
width: 0.08rem;
height: 0.08rem;
top: 50%;
left: 50%;
animation: 160s ease both infinite alternate;
&:before {
content: "";
display: block;
width: 100%;
height: 100%;
border-radius: 50%;
background-color: $dot-color;
transform-origin: -1rem;
animation: lighting ease both infinite, auto-rotating ease both infinite;
}
@for $i from 1 through $dot-count {
// Random variable common to all particles
$random: random(100);
&:nth-of-type(#{$i}) {
animation-name: move-path-#{$i};
&:before {
animation-duration: random(5000) + 5000ms, random(1000) + 7000ms;
animation-delay: random(6000) + 500ms, 0s; // less than max duration
}
}
$steps: random(15) + 10;
@keyframes move-path-#{$i} {
@for $step from 0 through $steps {
#{$step / $steps * 100%} {
// first translation is depending on a common random, second is depending on the step number
transform: translateX($random - 50vw) translateX($step * $step * 150px)
translateY($random - 50vh) translateY($step * $step * 150px)
scale(random(70) / 100 + 0.3);
}
}
}
}
}
@keyframes lighting {
0%,
30%,
100% {
opacity: 0;
}
5% {
opacity: 1;
box-shadow: 0 0 0.3rem 0.05rem $dot-color;
}
}
@keyframes auto-rotating {
to {
transform: rotate(0deg);
}
}