使用canvas来完成github404的动态效果

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

效果图

文件目录

文件资源

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

代码

  • 网页的body部分

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

<body>
<canvas id="mycanvas" width="1680" height="630"
style="margin:0;display:block">
您的浏览器不支持canvas
</canvas>
<img src="./images/field.png" style="display:none">
<img src="./images/text.png" style="display:none">
<img src="./images/cat.png" style="display:none">
<img src="./images/cat_shadow.png" style="display:none">
<img src="./images/speeder.png" style="display:none">
<img src="./images/speeder_shadow.png" style="display:none">
<img src="./images/buliding_1.png" style="display:none">
<img src="./images/building_2.png" style="display:none">
</body>
  • js部分

      1.这里我还是新建了一个名为github404的json对象,以对所有的参数和方法进
    行封装
    2.再创建imgData的对象,将所有的img所需的参数传入
    ps:top和left用于 drawImage() 方法时定位, scale 参数用于计算鼠标移动
    时对应的图片移动的计算
    3.init()方法用来初始化,是与外部的接口
    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>

总结

此次使用canvas来完成这个动态效果,使我更多的了解了canvas的用法。同时使我
对于使用json对象去封装数据和方法,如何组织代码都有了更深的一些了解。


源项目地址

本文转载于:猿2048➪https://www.mk2048.com/blog/blog.php?id=h1bjhki22hj

最新文章

  1. html中frameset简介
  2. Apache Spark技术实战之6 -- spark-submit常见问题及其解决
  3. js正则验证方法大全
  4. FFT快速傅立叶
  5. lesson1:压测普通网页
  6. MYSQL免安装版使用说明
  7. 写一个Windows上的守护进程(8)获取进程路径
  8. CloudFoundry虚拟机实例配置DNS
  9. 我在学JavaScript中的循环
  10. 发现AspNet.Core版本控制库Bug一枚,你还想入坑?
  11. Python_Excel文件操作
  12. 绘图和可视化---matplotlib包的学习
  13. Java实现inputstream流的复制
  14. LeetCode - Subarray sum equals k
  15. 如何猜出 Y combinator
  16. python中处理.db文件借助navicat
  17. 实现Redis Cluster并实现Python链接集群
  18. 我所理解的selenium之PO设计模式
  19. ecipse theme
  20. Windows Phone 推送通知的第四类推送

热门文章

  1. 实现同比、环比计算的N种姿势
  2. 穿透、击穿、雪崩…Redis这么多问题,如何解决?
  3. 从零开始,开发一个 Web Office 套件(9):拖动鼠标选中文字 Edge Case
  4. tensorflow源码解析之framework-node
  5. 20192204-exp1-逆向与Bof基础
  6. 6月27日 ajax
  7. 4月20日 python学习总结 套接字工作流程
  8. First Note
  9. 类型转换Java day8
  10. C# WinForm 解决子窗体放大后,子窗体图标放大的问题