CSS实现星空背景
效果图如下
页面结构
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>星空背景</title>
<link rel="stylesheet" href="星空背景.css">
</head>
<body>
<div class="main">
<div class="item1"></div>
<div class="item2"></div>
<div class="item3"></div>
<div class="item4"></div>
<div class="item5"></div>
</div>
</body>
</html>
- 基础结构就是只有5个元素
- 看到的大小不同的粒子就是不同层级的元素
SCSS 文件
.main {
width: 100vw;
height: 100vh;
background-color: #000;
$location: 100; // 每个粒子的随机位置单位vw、vh
$duration: 200s; // 最小粒子的运行速度
$count: 100; // 粒子数量
@function getShadows($n) {
$shadows: '#{random($location)}vw #{random($location)}vh #fff';
@for $i from 2 through $n {
$shadows: '#{$shadows}, #{random($location)}vw #{random($location)}vh #fff';
}
@return unquote($shadows);
}
@for $i from 1 through 5 {
.item#{$i} {
$size: #{$i}px;
$duration: floor($duration / 2);
$count: floor($count / 2);
position: fixed;
width: $size;
height: $size;
border-radius: 50%;
animation: moveup $duration linear infinite;
left: 0;
top: 0;
box-shadow: getShadows($count);
&::after {
content: '';
position: fixed;
left: 0;
top: 100vh;
border-radius: inherit;
width: inherit;
height: inherit;
box-shadow: inherit;
}
}
}
@keyframes moveup {
to {
transform: translateY(-100vh);
}
}
}
定义随机阴影生成函数 getShadows
:
$location
变量设定为 100,用于生成随机位置。getShadows
函数生成一组随机阴影,模拟星星效果。- 函数接受一个参数
$n
,表示生成阴影的数量。 - 使用
@for
循环生成多个随机阴影位置。
动画持续时间和阴影数量:
- 定义动画的总持续时间
$duration
为 200 秒, 逐层减少。 - 定义生成阴影的总数量
$count
为 100, 逐层减少。
生成动画层:
- 使用
@for
循环生成五个层,每个层都对应 .item1
到 .item5
。 - 每个层的大小 (
$size
) 根据循环变量 $i
依次递增。 - 每个层的动画持续时间和阴影数量分别为总值的一半。
- 使用
box-shadow
属性调用getShadows
函数生成随机阴影。 &::after
伪元素用于创建持续的动画效果,从顶部移到视口底部。
与使用Canvas相比,这种方法具有以下优点:
- 简单性:CSS动画和阴影效果易于实现和理解,无需编写复杂的JavaScript代码。
- 性能:对于简单的动画效果,CSS通常比Canvas具有更好的性能,尤其是在移动设备上。
- 响应性:CSS更容易与其他响应式设计元素集成,能够更好地适应不同屏幕尺寸。