JavaScript利用canvas實現(xiàn)星空效果
前言
由于最近用了挺多Echarts的,所以突然想學習學習它的底層原理Canvas。Canvas對于我們前端來說是一個非常強大的工具,它可以實現(xiàn)各種復雜的圖形和動畫效果,我們如果能夠熟練掌握它,我們就可以做很多炫酷的效果。
Canvas 介紹
首先我們來介紹介紹Canvans,Canvas是 HTML5提供的一個繪圖API,它允許通過JavaScript和HTML元素創(chuàng)建和操作圖形。Canvas提供的是一個矩形畫布,我們可以在上面繪制各種圖形、動畫與交互效果。
功能
上面了解了Canvas是什么之后, 我們再來和大家展開說說Canvas 一些主要功能:
- 畫布:
Canvas提供了一個矩形的畫布區(qū)域, 我們可以通過HTML中的<canvas>標簽來創(chuàng)建并通過設置畫布的寬高來確定繪圖區(qū)域的大小。 - 繪畫API:
Canvas提供了豐富的繪圖API,包括繪制路徑、直線、曲線、矩形、圓形、文本等。 我們使用這些API來創(chuàng)建各種圖形,并自定義樣式、顏色、透明度等屬性。 - 動畫:
Canvas可以與JavaScript的動畫函數(shù)結合使用,實現(xiàn)動態(tài)的圖形效果。通過在每一幀中更新畫布上的內容,能創(chuàng)建平滑的動畫效果。 - 圖像處理:
Canvas可以加載和繪制圖像。我們可以使用Canvas的API對圖像進行裁剪、縮放、旋轉等操作,從而實現(xiàn)圖像處理的功能。 - 事件處理:
Canvas支持鼠標和觸摸事件的處理,我們可以通過監(jiān)聽這些事件來實現(xiàn)交互效果,例如點擊、拖拽、縮放等等。
注意:Canvas 繪制的內容是即時生成的,它不會被瀏覽器緩存,所以每次頁面加載Canvas都需要重新繪制,所以我們在使用時需要考慮性能問題。
星空
在介紹完Canvas之后,我們再來用Canvas和 JS結合,實現(xiàn)一片星空的效果。
第一步,我們先創(chuàng)建好html 結構,代碼如下:
<div class="landscape">
</div>
<canvas id="canvas"></canvas>
<div class="filter"></div>
<script src="./round_item.js"></script>
現(xiàn)在是沒有效果的,我們在給它加上css代碼,將其美化,同時我們再在css上加一些動畫效果,完整代碼如下:
* {
margin: 0;
padding: 0;
}
html,
body {
width: 100%;
height: 100%;
}
body {
background: linear-gradient(to bottom, #000 0%, #5788fe 100%);
}
.landscape {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
background-image: url(./star/xkbg.png);
background-repeat: repeat-x;
background-size: 1000px 250px;
background-position: center bottom;
}
.filter{
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 2;
background: #fa7575;
animation: colorChange 30s ease-in infinite;
}
/* 漸變動畫*/
@keyframes colorChange {
0%,100%{
opacity: 0;
}
50%{
opacity: 0.7;
}
}
這時候,我們看到的效果是這樣的:

這效果好像只有黃昏的顏色變化,少了星空。那這最后一步,就該我們Canvas上場了,我們要用Canvas畫出來一片星空,并配合css的顏色變化,實現(xiàn)一個夜晚到清晨的感覺。
我們 js 代碼這樣寫:
//創(chuàng)建星星的函數(shù)
function RoundItem(index, x, y, ctx) {
this.index = index
this.x = x
this.y = y
this.ctx = ctx
this.r = Math.random() * 2 + 1
this.color = 'rgba(255,255,255,1)'
}
// 繪制
RoundItem.prototype.draw = function () {
this.ctx.fillStyle = this.color //指定顏色
this.ctx.beginPath() // 開始繪制
this.ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI, false) // 繪制圓形
this.ctx.closePath() // 結束繪制
this.ctx.fill() //填充形狀
}
//移動
RoundItem.prototype.move = function () {
this.y -= 0.5
this.draw()
}
let canvas = document.getElementById('canvas'),
ctx = canvas.getContext('2d'),
round = [],
initRoundPopulation = 200; //星星的個數(shù)
const WIDTH = document.documentElement.clientWidth,
HEIGHT = document.documentElement.clientHeight;
canvas.width = WIDTH
canvas.height = HEIGHT
init()
// setInterval(animate, 1700)
animate()
function init() {
for (var i = 0; i < initRoundPopulation; i++) {
round[i] = new RoundItem(i, Math.random() * WIDTH, Math.random() * HEIGHT, ctx)
round[i].draw()
}
}
function animate() {
ctx.clearRect(0, 0, WIDTH, HEIGHT) //清除畫布
for (let star of round) {
star.move()
}
requestAnimationFrame(animate) //通過刷新幀數(shù)來調用函數(shù)
}
將上述代碼添加上之后,我們也就完成星星的繪制并添加到了頁面上,最終的效果如下:

到這里,我們就用canvas 畫出了一片美麗的星空。同時我們也看到了canvas的強大功能,感興趣的小伙伴可以深入的了解它更多的用法哦。
以上就是JavaScript利用canvas實現(xiàn)星空效果的詳細內容,更多關于JavaScript canvas星空效果的資料請關注腳本之家其它相關文章!
相關文章
javascript break指定標簽打破多層循環(huán)示例
break的語法有兩種break; 和 break label;下面為大家介紹下直接break掉整個循環(huán)嵌套示例2014-01-01
javascript中String類的subString()方法和slice()方法
最近在看《Javascript高級程序設計》一書,在書中發(fā)現(xiàn)一些以前沒有接觸過的且比較實用的技巧和知識點,想通過博客記錄一下,以加深記憶。2011-05-05
頁面中實現(xiàn)setInterval和setTimeout效果示例詳解
這篇文章主要為大家介紹了不使用setTimeout和setInterval在頁面中實現(xiàn)setInterval和setTimeout效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09

