如何使用CSS和Sass实现绚丽的星空效果

417 阅读3分钟

先看效果

星空.gif

如何使用CSS和Sass实现绚丽的星空效果

星空效果是网页设计中常用的一种背景效果,它可以为你的网站增添梦幻和深邃的感觉。今天,我将向大家分享如何使用CSS和Sass来创建一个动态的星空背景效果。

原理解析

星空效果的核心原理非常简单:

  1. 创建多个不同大小的"星星"层
  2. 使用CSS的box-shadow属性生成大量的"星星"点
  3. 通过动画让星星向上移动,营造出穿梭太空的感觉

实现步骤

1. 创建HTML结构

首先,我们需要创建基本的HTML结构:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>sass星空</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <div class="layer1"></div>
  <div class="layer2"></div>
  <div class="layer3"></div>
  <div class="layer4"></div>
  <div class="layer5"></div>
  <div class="title">sass星空</div>
</body>
</html>

我们创建了5个不同的层级div,每一层将展示不同大小的星星,以及一个标题元素。

2. 编写SCSS样式

使用SCSS可以帮助我们更高效地生成星空效果:

@use "sass:math";

// 标题样式
.title{
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-size: 5rem;
  font-weight: bold;
  background-image: linear-gradient(to right, #f6d365, #fda085);
  -webkit-background-clip: text;
  color: transparent;
  text-shadow: 0 0 10px rgba(255, 255, 255, 0.3);
}

// 背景样式
body{
  margin: 0;
  padding: 0;
  min-height: 100vh;
  background: linear-gradient(135deg, #0f0c29, #302b63, #24243e);
  overflow: hidden;
}

// 生成随机星星函数
@function star($n){
  $result: #{math.random(100)}vw #{math.random(100)}vh #fff;
  @for $i from 1 through $n{
    $result: #{$result}, #{math.random(100)}vw #{math.random(100)}vh #fff;
  }
  @return $result;
}

// 配置参数
$n: 5;              // 星星层数
$duration: 400s;    // 初始动画持续时间
$count: 1000;       // 初始星星数量

// 生成多层星星
@for $i from 1 through $n{
  $duration: floor($duration/2);   // 每层动画速度加倍(时间减半)
  $count: floor($count/2);         // 每层星星数量减半
  
  .layer#{$i}{
    position: fixed;
    left: 0;
    top: 0;
    width: #{$i}px;
    height: #{$i}px;
    border-radius: 50%;
    background-color: transparent;
    box-shadow: star($count);
    animation: moveUp $duration linear infinite;
  }
  
  // 添加一个副本在视口下方,确保无缝滚动
  .layer#{$i}::after{
    content: '';
    position: inherit;
    width: inherit;
    height: inherit;
    border-radius: inherit;
    box-shadow: inherit;
    left: 0;
    top: 100vh;
  }
}

// 向上移动的动画
@keyframes moveUp{
  to{
    transform: translateY(-100vh);
  }
}

关键技术点解析

1. 随机星星生成

我们使用Sass的math.random()函数来生成随机位置的星星:

@function star($n){
  $result: #{math.random(100)}vw #{math.random(100)}vh #fff;
  @for $i from 1 through $n{
    $result: #{$result}, #{math.random(100)}vw #{math.random(100)}vh #fff;
  }
  @return $result;
}

这个函数会返回格式为Xvw Yvh #fff, Xvw Yvh #fff, ...的字符串,正好符合box-shadow属性的语法。

2. 多层星星结构

我们创建了5个不同大小的星星层:

  • 第一层:1px大小的星星,数量最多,移动最慢
  • 第二层:2px大小的星星,数量减半,移动速度加倍
  • ...以此类推

这种多层结构能够创造出视差效果,使星空看起来更加有深度。

3. 无缝滚动效果

为了实现无缝滚动,我们为每一层添加了一个:after伪元素,它完全复制了原始元素的星星,并放置在视口下方:

.layer#{$i}::after{
  content: '';
  position: inherit;
  width: inherit;
  height: inherit;
  border-radius: inherit;
  box-shadow: inherit;
  left: 0;
  top: 100vh;
}

当原始星星向上移出视口时,下方的复制星星会移入视口,看起来就像无限循环的星空。

4. 动画效果

我们使用CSS动画让星星向上移动:

@keyframes moveUp{
  to{
    transform: translateY(-100vh);
  }
}

扩展和优化

  1. 调整颜色:你可以改变星星的颜色或添加多彩星星,只需修改box-shadow中的颜色值
  2. 添加闪烁效果:可以为部分星星添加opacity动画使其闪烁
  3. 增加陨石效果:添加额外的元素模拟陨石划过天空
  4. 响应鼠标移动:结合JavaScript,让星空随鼠标移动产生交互效果

结论

通过CSS和Sass的强大功能,我们可以轻松创建出美丽的星空效果。这种效果不仅视觉上令人印象深刻,而且实现方法相对简单,不需要依赖任何JavaScript或外部库。

希望这篇教程对你有所帮助!你可以基于这个基础效果进一步开发,创造出属于自己的独特星空。