动态html效果源代码,canvas 实现 github404动态效果的示例代码

本文介绍了作者使用CSS样式和JavaScript实现GitHub404页面致敬效果后,进一步利用canvas重构这一动态效果的过程。通过封装JSON对象来管理图片参数,详细阐述了初始化方法、画图方法以及鼠标移动时的重绘方法。这次实践加深了作者对canvas用法的理解,并提高了组织代码的能力。
摘要由CSDN通过智能技术生成

前几天使用css样式和js致敬了一下github404的类似界面,同时最近又接触了canvas,本着瞎折腾的想法,便借着之前的js的算法,使用canvas来完成了github404的动态效果。

效果图

74f03b6b6ac524949ea4640f86a93494.gif

文件目录

1404a499f4fb25aa1cc7ae0564e6c1de.png

文件资源

文件源码与图片在文章末尾给出

代码

网页的body部分

这里给canvas 定义好宽和高,设为块级元素。这些img 标签是将这些图片加载出来,我们就不用在js中去加载了,再将图片设为不显示 display:none。

style="margin:0;display:block">

您的浏览器不支持canvas

field.png

text.png

cat.png

cat_shadow.png

speeder.png

speeder_shadow.png

buliding_1.png

building_2.png

js部分

1.这里我还是新建了一个名为github404的json对象,以对所有的参数和方法进行封装

2.再创建imgData的对象,将所有的img所需的参数传入ps:top和left用于 drawImage() 方法时定位, scale 参数用于计算鼠标移动时对应的图片移动的计算

3.init()方法用来初始化,是与外部的接口

4.画图方法的实现就是用 for in 循环遍历 imgData[],再依次赋值,最后用drawImage()方法绘画,只是在移动的绘图方法中,需要注意使用了ctx.clearRect() 方法先将画布清空。

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();

}

总结

此次使用canvas来完成这个动态效果,使我更多的了解了canvas的用法。同时使我

对于使用json对象去封装数据和方法,如何组织代码都有了更深的一些了解。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值