0%

Sass 實現星空效果

前言

練習 Sass 來實現星空的背景

實作的網址唷唷唷唷唷唷


開始前 先創立一個 Html 及 SCSS 檔案

index.html & stars.scss

html 簡易代碼如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="./stars.css" />
<title>Document</title>
</head>
<body>
<div class="layer1"></div>
<div class="layer2"></div>
<div class="layer3"></div>
<div class="title">Sass 星空</div>
</body>
</html>

stars.scss 初始如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
html {
height: 100%;
background: radial-gradient(ellipse at bottom, #1b2735 0%, #090a0f 100%);
overflow: hidden;
}

.title {
position: absolute;
top: 50%;
left: 50%;
color: #fff;
text-align: center;
font-family: "lato", sans-serif;
font-weight: bold;
font-size: 50px;
letter-spacing: 10px;
margin-top: -60px;
padding-left: 10px;
background: linear-gradient(white, #38495a);
background-color: text;
-webkit-background-clip: text;
color: transparent;
}

接下來開始來寫星星

1
2
3
4
5
6
7
8
9
10
11
12
.layer1 {
$size: 100px;

position: fixed;
width: $size;
height: $size;
border-radius: 50%;
background: #f40;
left: 0;
top: 0;
box-shadow: 10vw 10vh #fff, 20vw 20vh #fff;
}

第一顆星星 出來了!!!!

當然這樣沒辦法變成滿螢幕的星星

但發現可以透過box-shadow 來控制星星數量 還有位置

所以可以寫一個funtion來處理星星

1
2
3
4
5
6
7
8
9
10
//寫星星的function
@function getShadows($n) {
$shadows: "#{random(100)}vw #{random(100)}vh #fff";

@for $i from 2 through $n {
$shadows: "#{$shadows},#{random(100)}vw #{random(100)}vh #fff";
}

@return unquote($shadows);
}

box-shadow 後面帶入 function : getShadows(1000); <—————假設 1000 顆星星

這樣星星就出來啦~~

然後要做移動效果

開始寫一個動畫 把每顆星星往上移到螢幕外面

1
2
3
4
5
@keyframes moveUp {
100% {
transform: translateY(-100vh);
}
}

在剛剛的.layer1

加上 animation

1
2
3
4
5
6
7
8
9
10
11
12
.layer1 {
$size: 1px;
position: fixed;
width: $size;
height: $size;
border-radius: 50%;
background: #f40;
left: 0;
top: 0;
box-shadow: getShadows($count);
animation: moveUp 100s linear infinite; //<--------------------這邊
}

100S 可以寫成變數$duration

1
2
3
4
5
6
7
8
9
10
11
12
13
.layer1 {
$size: 1px;

position: fixed;
width: $size;
height: $size;
border-radius: 50%;
background: #f40;
left: 0;
top: 0;
box-shadow: getShadows($count);
animation: moveUp $duration linear infinite;
}

這樣開始畫面就可以移動拉~~~

但是這樣還有個問題

就是畫面移開 下面就沒星星了

picc

所以可以在後面加一個&::after

1
2
3
4
5
6
7
8
9
10
&::after {
content: "";
position: fixed;
width: $size;
height: $size;
left: 0;
top: 100vh;
border-radius: inherit;
box-shadow: inherit;
}

接下來這只是第一層星星
剛剛 html 還有其他 2、 3 層

所以可以用 for 迴圈來寫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//循環每層的星星
$duration: 400s;
$count: 1000;
@for $i from 1 through 3 {
$duration: floor($duration/2); //每層星星時間差異
$count: floor($count/2); //每層星星數量差異
.layer#{$i} {
$size: #{$i}px;
position: fixed;
width: $size;
height: $size;
border-radius: 50%;
background: #f40;
left: 0;
top: 0;
box-shadow: getShadows($count);
animation: moveUp $duration linear infinite;
&::after {
content: "";
position: fixed;
width: $size;
height: $size;
left: 0;
top: 100vh;
border-radius: inherit;
box-shadow: inherit;
}
}
}

這樣就完成星空 SCSS

總結

少少的code 就可以完成星星
未來想增加層數星星 還可以修改 for 迴圈 輕鬆修改
gif

123

你的支持是我活力的來源 :)