前幾天使用css樣式和js致敬了一下github404的類似界面,同時最近又接觸了canvas,本著瞎折騰的想法,便借著之前的js的算法,使用canvas來完成了github404的動態效果。
2.再創建imgData的對象,將所有的img所需的參數傳入ps:top和left用于 drawImage() 方法時定位, scale 參數用于計算鼠標移動時對應的圖片移動的計算
4.畫圖方法的實現就是用 for in 循環遍歷 imgData[],再依次賦值,最后用drawImage()方法繪畫,只是在移動的繪圖方法中,需要注意使用了ctx.clearRect() 方法先將畫布清空。
<script>
var github404 = {
imgData: {//將所有圖片的信息用json對象記錄
bg: {
top: 0,
left: 110,//top和left用于定位,在畫圖時使用
src: './images/field.png',//對應圖片路徑
scale: 0.06,//鼠標移動時,該圖片所對應移動的比例
},
building_2: {
top: 133,
left: 1182,
src: './images/building_2.png',
scale: 0.05,
},
building_1: {
top: 79,
left: 884,
src: './images/buliding_1.png',
scale: 0.03,
},
speeder_shadow: {
top: 261,
left: 776,
src: './images/speeder_shadow.png',
scale: 0.01,
},
cat_shadow: {
top: 288,
left: 667,
src: './images/cat_shadow.png',
scale: 0.02,
},
speeder: {
top: 146,
left: 777,
src: './images/speeder.png',
scale: 0.01,
},
cat: {
top: 88,
left: 656,
src: './images/cat.png',
scale: 0.05,
},
text: {
top: 70,
left: 364,
src: './images/text.png',
scale: 0.03,
},
},
rate_w: 0,
rate_h: 0,//偏移的比例
field_width: 1680,
field_height: 370,//背景高度和寬度
canvas: document.querySelector('#mycanvas'),//獲得canvas元素
init: function() {//初始化加載方法
this.setRateWH();
this.placeImg();
this.attachMouseEvent();
},
setRateWH: function() {//計算偏移比的方法
var window_width = document.body.clientWidth;
var window_height = document.body.clientHeight;
this.rate_w = this.field_width/window_width;
this.rate_h = this.field_height/window_height;
},
placeImg: function() {//初始化的繪圖方法
let ctx = this.canvas.getContext('2d');//獲得畫筆
for(key in this.imgData){//遍歷imageData 對象
var image = new Image();
var left = this.imgData[key].left;
var top = this.imgData[key].top;
image.src = this.imgData[key].src;
ctx.drawImage(image,left,top,
image.width,image.height);
}
},
attachMouseEvent: function() {
var that = this;
document.body.onmousemove = function(e){
that.picMove(e.pageX,e.pageY);
}
},
picMove: function(pageX,pageY) {//鼠標移動時重新畫圖的方法
let ctx = this.canvas.getContext('2d');
ctx.clearRect(0,0,this.canvas.width,this.canvas.height);
for(key in this.imgData) {
var image = new Image();
var offer_w = this.rate_w * pageX * this.imgData[key].scale;
var offer_h = this.rate_h * pageY * this.imgData[key].scale;
//定義 left和top,下面畫圖時給參數定位
var left = this.field_width/100 - offer_w + this.imgData[key].left;
var top = this.field_height/100 - offer_h + this.imgData[key].top;
image.src = this.imgData[key].src;
ctx.drawImage(image,left,top,
image.width,image.height);
}
}
}
window.onload = function() {
//只調用github404的init方法 封裝了數據
github404.init();
}
</script>