原生js拼图,封装,组件化

利用原生js实现拼图游戏,实现封装,变为插件,组件化,传入参数调用,

使用立即执行函数,将变量私有化,不污染全局,

利用canvas展示效果,减少dom操作,不影响HTML结构;

  1 var myPingTu = (function(){
  2     function init(row_i,dom){
  3         var myCanvas = dom;
  4         var row = row_i || 3,// 行列数
  5             arr = [],
  6             num = row * row;// 块个数
  7         if (!myCanvas || !myCanvas.getContext) { return; }
  8         myCanvas.width = row * 100 + 10 ;
  9         myCanvas.height = row * 100 + 10 ;
 10         var ctx = myCanvas.getContext(‘2d‘);
 11         for(var i = 0; i < num; i++){
 12             arr.push(i);
 13         }
 14         var ranodmArrKey = true;
 15         ranodmArr();
 16         createMap();
 17
 18         window.onkeydown =  function (event){
 19             var e = event || window.event;
 20             move(e.keyCode);
 21         }
 22         function move(n){
 23             switch (n) {
 24                 case 38:{
 25                     if(arr.indexOf(num -1) >= row){
 26                         exchange(arr.indexOf(num -1),arr.indexOf(num - 1) - row);
 27                     }
 28                     return false;
 29                 }
 30                     break;
 31                 case 40:{
 32                     if(arr.indexOf(num -1) < num-row){
 33                         exchange(arr.indexOf(num -1),arr.indexOf(num - 1) + row);
 34                     }
 35                     return false;
 36                 }
 37                     break;
 38                 case 37:{
 39                     if(arr.indexOf(num -1) % row != 0){
 40                         exchange(arr.indexOf(num -1),arr.indexOf(num - 1) - 1);
 41                     }
 42                     return false;
 43                 }
 44                     break;
 45                 case 39:{
 46                     if(arr.indexOf(num -1) % row != row-1){
 47                         exchange(arr.indexOf(num -1),arr.indexOf(num - 1) + 1);
 48                     }
 49                     return false;
 50                 }
 51                     break;
 52                 default:
 53                     break;
 54             }
 55         }
 56         function ranodmArr(){
 57             var j;
 58             for(var i = 0; i < num * num-1; i ++){
 59                 j = parseInt(Math.random()*4) + 37;
 60                 move(j);
 61             }
 62             ranodmArrKey = false;
 63         }
 64         function exchange(proto,target){
 65             var temp = arr[target];
 66             arr[target] = arr[proto];
 67             arr[proto] = temp;
 68             if(ranodmArrKey){return false};
 69             createMap();
 70             if(isWin()){
 71                 console.log("win");
 72             };
 73         }
 74
 75         function createMap(){
 76             for(var i = 0;i < row; i++){
 77                 for(var j = 0; j < row ;j ++)
 78                 createSquare(i,j,arr[i + j * row]);
 79             }
 80         }
 81         function createSquare(x,y,text){
 82             ctx.beginPath();
 83             ctx.fillStyle = ‘antiquewhite‘;
 84             ctx.fillRect((10 + 100 * x), (10 + 100 * y), 90, 90);
 85             ctx.fillStyle = ‘red‘;
 86             ctx.font = "50px bolder";
 87             ctx.textAlign="center";
 88             if(text != num -1){
 89                 ctx.fillText(text + 1 ,(55 + 100 * x), (75 + 100 * y));
 90             }else{
 91                 ctx.fillText(‘:)‘ ,(55 + 100 * x), (75 + 100 * y));
 92             }
 93             ctx.stroke();
 94             ctx.beginPath();
 95         }
 96         function isWin(){
 97             for(var i = 0 ; i < arr.length; i ++){
 98                 if(i != arr[i]){
 99                     return false
100                 }
101             }
102             return true
103         }
104     }
105     return function(row,dom){
106         init(row,dom);// 自定义难度和canvas的dom对象
107     }
108 }())
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <!-- <script src="../jquery.min.js"></script> -->
 8     <script src="pingtu.js"></script>
 9     <style>
10         *{
11             margin: 0;
12             padding: 0;
13         }
14         #pingtu {
15             border: 1px solid silver;
16             position: relative;
17             margin-top: 20px;
18             left: 50%;
19             transform: translateX(-50%);
20         }
21     </style>
22     <title>Document</title>
23 </head>
24 <body>
25     <canvas id="pingtu"></canvas>
26     <script>
27         window.onload = function(){
28             var aaa = document.getElementById("pingtu");
29             myPingTu(5,aaa);// 传入行数与dom
30         }
31
32     </script>
33 </body>
34 </html>

一开始把这个只作为jQuery的扩展插件,后来发现不怎么用得上jQuery的东西,主要还是canvas,就没必要用jquery,原生就够了!

原文地址:https://www.cnblogs.com/bacydm/p/9786086.html

时间: 2024-10-13 09:10:50

原生js拼图,封装,组件化的相关文章

面试指南」JS 模块化、组件化、工程化相关的 15 道面试题

JS 模块化.组件化.工程化相关的 15 道面试题 1.什么是模块化? 2.简述模块化的发展历程? 3.AMD.CMD.CommonJS 与 ES6 模块化的区别? 4.它们是如何使用的? 5.export 是什么? 6.module.export.export 与 export defalut 有什么区别? 7.什么是组件化? 8.组件化的原则是什么? 9.全局组件与局部组件的区别? 10.如何注册一个全局组件,并使用它? 11.局部组件又是如何注册并使用的? 12.如何封装一个高复用的 Vu

原生js实现vue组件功能

在如今VUE盛行的情况下,我们一直在惊叹于VUE的组件的功能,却不知道,原生js早就已经支持了这个功能. 最近在公开课学到的,js还有很多很多需要探索学习. 下面是一个简单的例子 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>创建标签</title> </head> <body> <x-product>测试

Vue结合原生js实现自定义组件自动生成

就目前三大前端主流数据驱动框架(vue,ng,react)而言,均具有创建自定义组件的api,但都是必须先做到事先写好挂载点,这个挂载点可以是原有静态元素标签也可以是自定义模板:对于多种组件通过同一数据流生成的,如果事先在页面上写好挂载点(mounted),然后通过dom操作去动态添加,会遇到类似这样一条错误提示信息:Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.(…).这又是为何呢,下一

原生JS代码封装(将字符串转换为日期 2019.08.24 )

function string2date(str){ if( hasLetter(str) ) { throw new Error("哥们儿,你写错了!!"); } return new Date(str); } 原文地址:https://www.cnblogs.com/sunyang-001/p/10812830.html

原生JS代码封装(获取指定范围的随机数)

function randomInt(a, b) { if(parseInt(a) != a || parseInt(b) != b) { throw new Error("请输入整数参数!!") } return Math.min(a,b)+ Math.floor(Math.random()*Math.abs(a-b)) } 原文地址:https://www.cnblogs.com/sunyang-001/p/10812846.html

原生JS代码封装(获取一个16进制的随机颜色)

function randomColor(){ var r = randomInt(0,255).toString(16); var g = randomInt(0,255).toString(16); var b = randomInt(0,255).toString(16); return "#"+ numberDoubled(r)+numberDoubled(g)+numberDoubled(b); } 原文地址:https://www.cnblogs.com/sunyang-0

原生JS代码封装(获取年月日时分秒 )

function numberDoubled(n){ n = n+""; return n.length==1?"0"+n:n; } function date2string(d, sp){ sp = sp || "-"; var year = d.getFullYear(); var month = d.getMonth()+1; var date = d.getDate(); var hour = d.getHours(); var min

原生js封装ajax:传json,str,excel文件上传表单提交

由于项目中需要在提交ajax前设置header信息,jquery的ajax实现不了,我们自己封装几个常用的ajax方法. jQuery的ajax普通封装 var ajaxFn = function(uri, data, cb) { $.ajax({ url: uri, type: 'POST', dataType: 'json', data: data, }) .done(cb) .fail(function() { console.log("error"); }) .always(f

原生JS面向对象思想封装轮播图组件

原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能实现都分别分为不同的模块.目前我封装的这个版本还不适配移动端,只适配PC端. 主要的功能有:自动轮播,点击某一张图片对应的小圆点就跳转到指定图片,有前后切换按钮.使用的时候只需要传入图片的路径以及每张图片分别所对应的跳转路径还有目标盒子ID就可以了,还可以自定义每张图轮播的延时,不过延时参数不是必须