時隔很久,本人終於又寫部落格了(重度拖延症),把之前留下的canvas互動動畫講一講。電腦上的互動,指的是滑鼠和鍵盤,我們今天主要用的是滑鼠。
既然是滑鼠的話,就要獲取滑鼠的各種事件,這次以mousemove
做示例。
我們先定義乙個滑鼠物件,然後新增mousemove
事件:
var mouse =
//這樣的話控制台就會跟隨我們的滑鼠移動輸出相應的座標
window.addeventlistener("mousemove",function (event) );
我們宣告乙個初始化函式init()
,用於把製造圓的過程封裝:
function init()
}init();
function circle(x, y, dx, dy, radius)
this.update = function()
if (this.y + this.radius > innerheight || this.y - this.radius < 0 )
//重新整理繪製時圓的偏移運動
this.x += this.dx;
this.y += this.dy;
//根據更新的值進行繪製
this.draw();
}}
接下來我們就要用mousemove於動畫進行互動了,我們假定圓心在滑鼠座標周圍50px以內的時候圓會增大,這段**應該寫在update()裡:
if (mouse.x - this.x < 50 && mouse.x - this.x >-50 && mouse.y - this.y < 50 && mouse.y - this.y >-50)
}
我們設定了10個圓,把滑鼠移上去的時候會看到在控制範圍內的圓會不斷變大,不會停下來,所以我在前面就設定了乙個圓半徑的最大值,以免它一直增大,然後把注釋的內容去掉,圓就不會無限增大了:
但是有乙個問題,圓放大了以後不會縮小,那麼我們就讓它在離開圓50px半徑範圍後縮小:
if (mouse.x - this.x < 50 && mouse.x - this.x >-50 && mouse.y - this.y < 50 && mouse.y - this.y >-50)
//其他的所有圓半徑不斷減小
}else
這時候又有新問題產生了,畫面一片空白,因為圓心不在滑鼠固定範圍內的圓全都變小了,甚至半徑為負!顯然簡單的else是不成立的,還是得加個條件:
if (mouse.x - this.x < 50 && mouse.x - this.x >-50 && mouse.y - this.y < 50 && mouse.y - this.y >-50)
//其他的所有圓半徑減小到最小值
}else if (this.radius > this.minradius)
這裡出現了乙個新值:minradius
,我加在了circle物件裡this.minradius = radius;
,以原本的初始值作為它的最小值。好了,現在基本效果已經成型了:
接下來就是顏色的問題了,只要懂得canvas的基本api,修改顏色完全就是小兒科。我們設定乙個陣列,用於存放顏色值。
var colorarray = [
'#58d68d',
'#e67f22',
'#3598db',
'#e84c3d',
'#9a59b5',
'#27ae61',
'#d25400',
'#bec3c7',
'#297fb8'
]
然後在circle物件裡加上乙個bg
屬性:this.bg = colorarray[math.floor(math.random()*colorarray.length)];
,再往circle的繪製函式添上一句ctx.fillstyle = this.bg;
,然後ctx.fill();
,多彩運動的圓圈canvas就做完了。
這是乙個運用mousemove事件做的canvas互動動畫,有興趣的可以嘗試其他事件(製作遊戲用的鍵盤事件以及其他滑鼠事件),或者思考如何給球加重力,如何檢測碰撞事件,canvas的世界並不只有這麼一點,相關資料的話,給大家推薦本書《canvas開發詳解》。
/**
* * @authors dkplus ([email protected])
* @date 2017-10-01 20:37:26
* @version $1.0$
*//**
* 獲取canvas物件,設定寬度高度自適應
* @type
*/var canvas = document.queryselector("#canvas");
canvas.width = window.innerwidth;
canvas.height = window.innerheight;
var ctx = canvas.getcontext("2d");
/** * 螢幕滑鼠座標
* @type
*/var mouse =
/** * @param
* @return
*/window.addeventlistener("mousemove",function (event) );
/** * @param
* @return
*/window.addeventlistener("resize",function () )
//繪製圓的最大半徑
var maxradius = 40;
// var minradius = 2;
//圓的顏色陣列
var colorarray = [
'#58d68d',
'#e67f22',
'#3598db',
'#e84c3d',
'#9a59b5',
'#27ae61',
'#d25400',
'#bec3c7',
'#297fb8'
]/**
* @param
* @param
* @param
* @param
* @param
* minradius圓的最小半徑
* bg圓的背景顏色
* draw繪製函式
* update圓運動偏移
*/function circle(x, y, dx, dy, radius)
this.update = function()
if (this.y + this.radius > innerheight || this.y - this.radius < 0 )
//重新整理繪製時圓的偏移運動
this.x += this.dx;
this.y += this.dy;
//滑鼠半徑50畫素範圍內的圓,它們的半徑逐步增加到最大值
if (mouse.x - this.x < 50 && mouse.x - this.x >-50 && mouse.y - this.y < 50 && mouse.y - this.y >-50)
//其他的所有圓半徑減小到最小值
}else if (this.radius > this.minradius)
//根據更新的值進行繪製
this.draw();
}}//圓的物件陣列
var circlearray = ;
/** * 初始化函式,製造800個隨機座標、偏移速度和半徑的圓,加入到物件陣列
* @return
*/function init()
}init();
/** * 動畫函式
* @return
*/function animate()
}animate();
canvas動畫時鐘
在html 中,插入canvas標籤 設定canvas的css樣式 position absolute left 50 top 50 transform translate 50 50 寫入了兩個畫布,乙個是為了畫靜態的表盤,另乙個是為了畫動態的指標 在js中建立畫布,進行相關的初始化設定 var ...
canvas動畫迴圈
動畫迴圈是製作動畫效果的基礎,由3個部分組成。先後是更新操作,清楚操作,繪製操作,並且會不斷重複的進行。如下有demo 有助於更好地理解.var canvas document.getelementbyid canvas var context canvas.getcontext 2d var ci...
canvas動畫時鐘
最近在學canvas,然後根據mdn上的例子做了個動畫時鐘 為什麼要造個輪子,因為醜。這是mdn上的例子,怎麼說呢,比較復古吧。首先,找一張時鐘的,就是下面這張了。來自bigger than bigger的dribbble 侵刪 然後就開始用canvas實現這個逼格滿滿的時鐘吧。在html 中插入c...