神奇的 Canvas

最近在瀏覽掘金網(wǎng)站的時(shí)候看到掘金小冊中有一個(gè)很有(便)意(宜)思的冊子:如何使用 Canvas 制作出炫酷的網(wǎng)頁背景特效酪碘,便想到給我的博客添加一個(gè)炫酷的背景。順便學(xué)習(xí)一下 canvas 這個(gè)元素的使用淮逻。

效果

最終效果就在博客上就能看到啦。下面來說一下實(shí)現(xiàn)方式。

實(shí)現(xiàn)

建議對 canvas 還不了解的同學(xué)去掘金小冊上學(xué)習(xí)學(xué)習(xí)欠母,我這里不再講解。

我的博客是用 Hexo 搭建的吆寨,使用了 Archer 主題赏淌,博客的最上層樣式作者定義在 layout.ejs 文件里。

<!DOCTYPE html>
<html>
   ...
    <div class="wrapper">
        ...
    </div>
    ...
</html>

既然是在 canvas 里面畫炫酷的背景啄清,那就需要在這里添加一個(gè) canvas 元素六水,并且和 div:class="wrapper" 一樣大。

改造 layout.ejs 文件,用一個(gè) div 將 div:class="wrapper" 和我們的 canvas 包裹起來:

<!DOCTYPE html>
<html>
    ...
    <div id="container-wrapper-canvas" style="position:relative;">
        <div class="wrapper">
        ...
        </div>
        <canvas id="myCanvas" style="position:absolute;left:0;top:0;z-index:0;pointer-events:none;" />
        <script>
        </script>
        ...
    </div>
    ...
</html>

因?yàn)椴幌胱?canvas 響應(yīng)點(diǎn)擊事件掷贾,所以在它的 style 里面加上:

pointer-events:none;

先定義一些變量(以下代碼一股腦塞到 script 標(biāo)簽里就行啦)睛榄。

// 屏幕寬高
let container = document.getElementById('container-wrapper-canvas')
let WIDTH = container.offsetWidth
let HEIGHT = container.offsetHeight
// canvas
let canvas = document.getElementById('myCanvas')
let context = canvas.getContext('2d')
// 圓點(diǎn)數(shù)量
let roundCount = HEIGHT / 10
// 存放遠(yuǎn)點(diǎn)屬性的數(shù)組
let round = []

// 令 canvas 鋪滿屏幕
canvas.width = WIDTH
canvas.height = HEIGHT

構(gòu)造圓點(diǎn)位置顏色大小等屬性

// 構(gòu)造圓點(diǎn)位置顏色大小等屬性
function roundItem(index, x, y) {
    this.index = index
    this.x = x
    this.y = y
    this.r = Math.random() * 4 + 1
    let alpha = (Math.floor(Math.random() * 5) + 1) / 10 / 2
    this.color = "rgba(0,0,0," + alpha + ")"
}

畫圓點(diǎn)

// 畫圓點(diǎn)
roundItem.prototype.draw = function() {
    context.fillStyle = this.color
    context.shadowBlur = this.r * 2
    context.beginPath()
    context.arc(this.x, this.y, this.r, 0, 2 * Math.PI, false)
    context.closePath()
    context.fill()
}

這里看著很熟悉,在做 android想帅、iOS 開發(fā)自定義 View 的時(shí)候就遇到過類似的代碼懈费,在 draw() 函數(shù)里畫圖,這里我想到可以在移動(dòng)端使用類似的方法畫出類似的背景博脑。

這個(gè)時(shí)候調(diào)用初始化函數(shù)就可以看到靜態(tài)的一個(gè)個(gè)小圓點(diǎn)了

// 調(diào)用初始化函數(shù)
init();
function init() {
    for(var i = 0; i < roundCount; i++ ){
        round[i] = new roundItem(i,Math.random() * WIDTH,Math.random() * HEIGHT);
        round[i].draw();
    }
    animate()
}

為了讓小圓點(diǎn)動(dòng)起來憎乙,我們寫下面的函數(shù)。

// 移動(dòng)圓點(diǎn)
roundItem.prototype.move = function () {
    // y方向移動(dòng)速度與圓點(diǎn)半徑成正比
    this.y -= this.r / 20

    // x方向移動(dòng)分兩個(gè)方向叉趣,移動(dòng)速度與圓點(diǎn)半徑成正比
    if (this.index % 2 == 0) {
        this.x -= 0.08
    } else {
        this.x += this.r / 40
    }

    // 如果超出范圍就把它拉回來
    if (this.y <= 0) {
        this.y += HEIGHT
    }
    if (this.x <= 0) {
        this.x += WIDTH
    }
    if (this.x >= WIDTH) {
        this.x -= WIDTH
    }

    this.draw()
}
// 定義動(dòng)畫
function animate() {
    context.clearRect(0, 0, WIDTH, HEIGHT);
    for (var i in round) {
        round[i].move()
    }
    requestAnimationFrame(animate)
}

這個(gè)時(shí)候就可以看到動(dòng)態(tài)的一個(gè)個(gè)小圓點(diǎn)了泞边。

是不是很炫酷呢。有空我再將它改造得更炫酷一點(diǎn)疗杉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阵谚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烟具,更是在濱河造成了極大的恐慌梢什,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朝聋,死亡現(xiàn)場離奇詭異嗡午,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冀痕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門荔睹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人言蛇,你說我怎么就攤上這事僻他。” “怎么了腊尚?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵吨拗,是天一觀的道長。 經(jīng)常有香客問我婿斥,道長劝篷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任受扳,我火速辦了婚禮携龟,結(jié)果婚禮上兔跌,老公的妹妹穿的比我還像新娘勘高。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布华望。 她就那樣靜靜地躺著蕊蝗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赖舟。 梳的紋絲不亂的頭發(fā)上蓬戚,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音宾抓,去河邊找鬼子漩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛石洗,可吹牛的內(nèi)容都是我干的幢泼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼讲衫,長吁一口氣:“原來是場噩夢啊……” “哼缕棵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涉兽,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤招驴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后枷畏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體别厘,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年拥诡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丹允。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袋倔,死狀恐怖雕蔽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宾娜,我是刑警寧澤批狐,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站前塔,受9級特大地震影響嚣艇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜华弓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一食零、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寂屏,春花似錦贰谣、人聲如沸娜搂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽百宇。三九已至,卻和暖如春秘豹,著一層夾襖步出監(jiān)牢的瞬間携御,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工既绕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啄刹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓凄贩,卻偏偏與公主長得像鸵膏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子怎炊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容