JavaScript canvas實(shí)現(xiàn)雨滴特效
本文實(shí)例為大家分享了canvas實(shí)現(xiàn)雨滴特效的具體代碼,供大家參考,具體內(nèi)容如下
一、雨滴特效需求
雨滴從窗口頂部隨機(jī)下落到達(dá)底部將呈現(xiàn)波紋逐漸散開變淡直到消失,雨滴特效隨窗口變化自適應(yīng)
二、雨滴實(shí)現(xiàn)思路
1. 用面向?qū)ο蟮乃季S 首先創(chuàng)建canvas畫布 ,繪制一個(gè)雨滴的初始化形狀
2. 在給雨滴添加運(yùn)動的方法
3. 通過定時(shí)器讓雨滴運(yùn)動起來
三、具體分析
1.雨滴初始化需要的屬性有哪些?
坐標(biāo)x,y 寬高w,h 。
2.雨滴下落是逐漸加速下落不是勻速需要給一個(gè)加速度的屬性,也就是y軸坐標(biāo)不斷加上加速度的值
3.雨滴下落到底部某一個(gè)區(qū)域后開始呈現(xiàn)波紋逐漸散開,也就是到達(dá)底部某個(gè)范圍內(nèi)開始畫圓,圓逐漸變大并且變淡加上透明度
4.雨滴下落拖尾效果需要繪制一層陰影覆蓋之前運(yùn)動的雨滴
四、代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>canvas</title> <style> * { margin: 0; padding: 0; } canvas { vertical-align: middle; background: #000; } </style> </head> <body> <canvas id="myCanvas"></canvas> <script> // 創(chuàng)建畫布 let myCanvas = document.getElementById('myCanvas') let ctx = myCanvas.getContext('2d') // 自適應(yīng)窗口 let width = myCanvas.width = window.innerWidth let height = myCanvas.height = window.innerHeight window.addEventListener('resize', () => { width = myCanvas.width = window.innerWidth height = myCanvas.height = window.innerHeight }) // 繪制雨滴 let raindropArr = [] function Raindrop(x, y, w, h, l, r, dr, maxR, a, va) { this.x = rand(0, window.innerWidth) // 雨滴的x軸 this.y = y || 0 // 雨滴的y軸 this.dy = rand(2, 4) // 雨滴的加速度 this.w = w || 2 // 雨滴的寬度 this.h = h || 10 // 雨滴的高度 this.l = rand(0.8 * height, 0.9 * height) // 雨滴的下落高度 this.r = r || 1 // 波紋半徑 this.dr = dr || 1 // 波紋增加半徑 this.maxR = maxR || 50 // 波紋最大半徑 this.a = a || 1 // 波紋透明度 this.va = 0.96 // 波紋透明度系數(shù) } Raindrop.prototype = { draw: function (index) { // 繪制雨滴 if (this.y > this.l) { ctx.beginPath() ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2) ctx.strokeStyle = `rgba(0,191,255,${this.a})` ctx.stroke() } else { ctx.fillStyle = 'skyBlue' ctx.fillRect(this.x, this.y, this.w, this.h) } this.update(index) }, update: function (index) { // 更新雨滴坐標(biāo) 運(yùn)動起來 if (this.y > this.l) { if (this.a > 0.03) { this.r += this.dr if (this.r > this.maxR) { this.a *= this.va } } else { this.a = 0 raindropArr.splice(index, 1) } } else { this.y += this.dy } } } function rand(min, max) { return Math.random() * (max - min) + min } setInterval(() => { let raindrop = new Raindrop() raindropArr.push(raindrop) }, 100) setInterval(() => { ctx.fillStyle = 'rgba(0, 0, 0, 0.1)' ctx.fillRect(0, 0, myCanvas.width, myCanvas.height) for (let i = 0; i < raindropArr.length; i++) { raindropArr[i].draw(i) } }, 30) </script> </body> </html>
五、總結(jié)
canvas基本上任何運(yùn)動,特效,都是通過js定時(shí)器改變坐標(biāo)的方式實(shí)現(xiàn)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何實(shí)現(xiàn)JavaScript動態(tài)加載CSS和JS文件
這篇文章主要為大家詳細(xì)介紹了JavaScript動態(tài)加載CSS和JS文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-10-10使用微信小程序顯示用戶當(dāng)前地理位置的詳細(xì)代碼
這篇文章主要介紹了使用微信小程序顯示用戶當(dāng)前地理位置的詳細(xì)代碼,在微信小程序的開發(fā)中不可避免的會遇到需要顯示用戶地理位置的操作,本文將簡單介紹如何在微信小程序中顯示用戶當(dāng)前的地理位置,需要的朋友可以參考下2022-06-06詳解webpack打包時(shí)排除其中一個(gè)css、js文件或單獨(dú)打包一個(gè)css、js文件(兩種方法)
本文通過兩種方法給大家介紹了webpack打包時(shí)排除其中一個(gè)css、js文件,或單獨(dú)打包一個(gè)css、js文件的方法 ,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10JS條形碼(一維碼)插件JsBarcode用法詳解【編碼類型、參數(shù)、屬性】
這篇文章主要介紹了JS條形碼(一維碼)插件JsBarcode用法,較為詳細(xì)的分析了條形碼插件JsBarcode編碼類型、參數(shù)、屬性等相關(guān)功能、使用方法與注意事項(xiàng),需要的朋友可以參考下2017-04-04JavaScript實(shí)現(xiàn)手寫call/apply/bind的示例代碼
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)手寫call/apply/bind的方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)JavaScript有一定的幫助,需要的可以參考一下2023-02-02JavaScript實(shí)現(xiàn)五種不同煙花特效
這篇文章主要給大家?guī)砦鍌€(gè)好看的基于 HTML+CSS+JS 的煙花特效,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)JavaScript有一定的幫助,需要的可以參考一下2022-01-01layer.prompt使文本框?yàn)榭盏那闆r下也能點(diǎn)擊確定的方法
今天小編就為大家分享一篇layer.prompt使文本框?yàn)榭盏那闆r下也能點(diǎn)擊確定的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09使用jscript實(shí)現(xiàn)二進(jìn)制讀寫腳本代碼
Reading And Writing Binary Files Using JScript正如我剛才推什么我能做的JScript中,我想出了對問題的二進(jìn)制文件。以下級的解決,這為小到中等大小的文件。我的部分包括這個(gè)職位在這里,因?yàn)槲壹磳⒏吨T表決,在一個(gè)職位約發(fā)送帶有附件的電郵通過JScript和它會使用這個(gè)二進(jìn)制文件碼來讀取,在二進(jìn)制附件檔案。2008-06-06