【css3進階】less實現星空動畫

效果動圖以下:css

預覽連接和代碼在個人codepen: codepen.io/lio-mengxia…

知識點預覽

這篇文章的less技巧 + css技巧知識點包括:html

  • less如何寫循環
  • less裏如何使用js表達式
  • css3屬性: box-shadow如何生成成百上千的星星
  • css3屬性: background: radial-gradient徑向漸變,如何生成漸變的背景色

HTML文檔結構

首先html文件結構很簡單,以下:css3

<div>
    <div id="start1"></div>
    <div id="start2"></div>
    <div id="start3"></div>
</div>
複製代碼

第一步:radial-gradient生成漸變背景

設置在html和body標籤上bash

* {
    padding: 0;
    margin: 0;
}

html, body {
    background: radial-gradient(ellipse at bottom, #1B2735 0%, #090A0F 100%);
    overflow: hidden;
    height: 100%;
}
複製代碼

效果以下:less

爲了對比一下我畫的不是純黑色背景圖,接着放一張純黑色的圖來對比一下,能夠看出來上圖沒有那麼黑,有點偏灰

這裏radial-gradient參數介紹

  • ellipse 代表我是用的橢圓漸變,你看下圖就知道怎麼用了

// 上圖的參數是
radial-gradient(ellipse,#ffffff, #6a6a6a)
複製代碼

也就是顏色是白色#ffffff到灰色#6a6a6a的橢圓漸變dom

  • at bottom 這是代表橢圓漸變的圓心在底部,請看下圖具體效果:

// 上圖的參數是
radial-gradient(ellipse at bottom,#ffffff, #6a6a6a)
複製代碼

好了,到了這一步,漸變咱們就完成了函數

第二步:box-shadow如何生成成百上千的星星

首先咱們要解決3個問題,第一個是如何用less寫循環,請看以下less代碼 ( 詳細解釋在代碼下面 )oop

2.1 less如何實現循環

舉例以下:動畫

.loop(@counter) when(@counter > 0) {
  .h@{counter} {
    padding: (10px*@counter);
  }
  .loop((@counter - 1)); //遞歸調用自身
}
div{
  .loop(5);
}

//編譯輸出
div .h5 {
  padding: 50px;
}
div .h4 {
  padding: 40px;
}
div .h3 {
  padding: 30px;
}
div .h2 {
  padding: 20px;
}
div .h1 {
  padding: 10px;
}
複製代碼
  • .loop(@counter) when(@counter > 0) 是less裏面的函數,意思是定義了一個loop函數
  • @counter是傳入函數的變量
  • when(@counter > 0) 意思是當變量的值@counter > 0的時候,這個函數纔會執行
  • .loop((@counter - 1))這是遞歸調用

因此咱們總結出來less實現循環的辦法就是遞歸調用定義的函數spa

接着解決第二個問題,就是如何在less裏面寫JS表達式

2.2 如何在less裏面寫JS表達式

.loop(@counter) when(@counter > 0) {
  padding: ~`@{counter} + Math.round(2.4)`;
  .loop(@counter - 1); //遞歸調用自身
}
div{
  .loop(2);
}

// 生成代碼以下
div {
  padding: 4;
  padding: 3;
}
複製代碼

因此咱們總結出來在less裏面使用js表達式的方法就是用~開頭,而後``包裹表達式

接着解決第三個問題,就是如何用box-shadow屬性生成 成百上千的星星

2.3 如何用less循環在box-shadow屬性上生成 成百上千的星星

這些星星其實就是正方形的小點,咱們先生成4個正方形小點

// 
div
{
	width:10px;
	height:10px;
	box-shadow: 10px 0px #9bcded, 50px 0px #9bcded, 10px 40px #9bcded, 50px 40px #9bcded;
}
複製代碼

效果以下

這裏使用了box-shadow多個值來生成正方形

// 好比如下屬性10px 0px #9bcded 表示,在相對於div元素x軸10px,y軸0px處有一個#9bcded顏色的小點
// 由於div自己是width 10px height 10px 是一個正方形,因此它的box-shadow也是正方形
box-shadow: 10px 0px #9bcded,
width:10px;
height:10px;
複製代碼

接着,咱們要結合less循環在box-shadow上生成更多的方塊(星星):

// 首先定義個mixin函數,參數是@n, 條件是隻有@n > 0的時候才執行函數裏的代碼
.mixin(@n) when(@n > 0) {
    box-shadow+ : ~`Math.round(Math.random() *  2000) + 'px' + ' ' +Math.round(Math.random() *  2000) + 'px #FFF' `;
    .mixin((@n - 1));
 } 
複製代碼

上面函數主要是box-shadow中,主要包括3個參數

  • 生成了x軸是0-2000隨機數的值(Math.round(Math.random() * 2000) + 'px')
  • 生成了y軸是0-2000隨機數的值(Math.round(Math.random() * 2000) + 'px #FFF' `)
  • 顏色是#FFF

假如咱們調用mixin(100),就生成了在2000 * 2000的背景上 100個白色方塊(星星)

第三步:結合html,生成星星

以前html結構以下
<div>
    <div id="start1"></div>
    <div id="start2"></div>
    <div id="start3"></div>
</div>
複製代碼

less以下:

// start1生成了長1px,寬1px的星星700個,這是小星星
// 小星星表明距離遠的星星,大星星表明距離近的,這樣就有了空間感
#start1 {
    .mixin(700);
    width: 1px;
    height: 1px;
    animation: animStar 50s linear infinite;
    animation-delay:-10s;
}
// start2生成了長2px,寬2px的星星200個
#start2 {
    .mixin(200);
    width: 2px;
    height: 2px;
    animation: animStar 100s linear infinite;
    animation-delay:-8s;
}
// start3生成了長3px,寬3px的星星100個
#start3 {
    .mixin(100);
    width: 3px;
    height: 3px;
    animation	: animStar 150s linear infinite;
    animation-delay:-5s;
}
// 動畫效果以下
@keyframes animStar {
    from { transform: translateY(0px) }
    to { transform: translateY(-2000px) }
}
複製代碼

本文完結,能夠本身去codepen試試效果哦,嘿嘿

相關文章
相關標籤/搜索