原生javascript制作的拼图游戏实现方法详解


Posted in Javascript onFebruary 23, 2020

本文实例讲述了原生javascript制作的拼图游戏实现方法。分享给大家供大家参考,具体如下:

实现方法

//1、让所有的li(在ul里)可以拖拽

//2、交换li的位置  计算背景图位置

//1、让所有的li(在ul里)可以拖拽
//根据鼠标的位置,计算目标li的序号

//根据行号和列号计算下标
//行号*3+列号
//2、归位

此处没有背景图  请自行添加 css样式

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
      html,body{
        margin:0;
        padding:0;
      }
      #box{
        list-style:none;
        position:relative;
        width:600px;
        height:600px;
        box-sizing:border-box;
        margin:10px auto;
      }
      li{
        position:absolute;
        width:200px;
        height:200px;
        border:1px solid white;
        background-image:url(img/b1.jpg);
        background-size:600px 600px;
      }
      #box li:nth-child(1){
        left:0px;
        top:0px;
        background-position:0px 0px;
      }
      #box li:nth-child(2){
        left:200px;
        top:0px;
        background-position:-200px 0px;
      }
      #box li:nth-child(3){
        left:400px;
        top:0px;
        background-position:-400px 0px;
      }
      
      #box li:nth-child(4){
        left:0px;
        top:200px;
        background-position:0px -200px;
      }
      #box li:nth-child(5){
        left:200px;
        top:200px;
        background-position:-200px -200px;
      }
      #box li:nth-child(6){
        left:400px;
        top:200px;
        background-position:-400px -200px;
      }
      
      #box li:nth-child(7){
        left:0px;
        top:400px;
        background-position:0px -400px;
      }
      #box li:nth-child(8){
        left:200px;
        top:400px;
        background-position:-200px -400px;
      }
      #box li:nth-child(9){
        left:400px;
        top:400px;
        background-position:-400px -400px;
      }
      
    </style>
  </head>
  <body>
    <ul id="box">
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
    </ul>
  </body>
</html>
<script type="text/javascript" src="js/cssTools.js"></script>
<script type="text/javascript" src="js/eventTools.js"></script>

这个是这连个js连接的代码

//csstools
//功能:获取某个DOM元素的样式属性的兼容性写法
//参数:dom元素,样式属性名
//返回值:样式属性的值
function getStyle(domObj,attr){
  if(domObj.currentStyle){//domObj.currentStyle如果能够正确获取到,那就真
    return domObj.currentStyle[attr];//当对象的属性名是变量时,用方括号而不是点。
  }else{
    return window.getComputedStyle(domObj)[attr];
  }  
}
//eventTools
//功能:阻止浏览器默认行为的封装
//参数:事件对象
//返回值:无
function preventDefault1809(evt) {
  if(evt.returnValue){
    evt.returnValue = false;
  }else{
    evt.preventDefault();
  }
}
//功能:绑定事件
//参数:
  //事件源
  //事件类型名,不带on
  //事件处理函数,
  //是否冒泡
//返回值:无
function addEvent1809(domObj,eventType,func,isBubble){
  if(domObj.addEventListener){
    domObj.addEventListener(eventType,func,isBubble);
  }else if(domObj.attachEvent){
    domObj.attachEvent('on'+eventType,func);
  }else{
    domObj['on'+eventType] = func;
  }
}
//当对象的属性是变量时,不能用点,只能用方括号
/*
var obj = {
  id:'007'
}
obj.id;
var temp = "id";
obj[temp]
*/

js部分

<script type="text/javascript">
function $(id){
  return document.getElementById(id);
}
window.onload = function(){  
  drag();
}
//1、让所有的li(在ul里)可以拖拽
function drag(){
  var lis = $("box").children;
  var currIndex = -1;//记录被按下的那个li
  var targetIndex = -1;
  for(var i=0;i<lis.length;i++){
    lis[i].setAttribute("index",i);
    lis[i].onmousedown = function(event){
      currIndex = this.getAttribute("index");
      var evt = event || window.event;
      var offsetX = evt.offsetX;
      var offsetY = evt.offsetY;
      this.style.zIndex = 1;
      var liDom = this;
      $("box").onmousemove = function(event){
        var evt = event || window.event;
        //1、数据距离大盒子左上角的距离
        var mouseX = evt.pageX-$("box").offsetLeft; 
        var mouseY = evt.pageY-$("box").offsetTop; 
        //鼠标距离页面左边的距离- 大盒子距离页面左边的距离-鼠标距离事件源的左边距离
        var left1 = mouseX-offsetX;
        var top1 = mouseY-offsetY;
        //li不能拖拽到界外(大盒子外面)
        if(left1<0 || left1>600-200 || top1<0 || top1>600-200 ){
          return;
        }
        
        liDom.style.left = left1+"px";
        liDom.style.top = top1+"px";
        targetIndex = getTargetIndex(mouseX,mouseY);
        console.log(targetIndex);
      }
    }
    document.body.onmouseup = function(){
      $("box").onmousemove = null;
      if(currIndex>-1){
        lis[currIndex].style.zIndex = 0;
        exchangeLi(currIndex,targetIndex);
      }
    }
  }
}
//根据鼠标的位置,计算目标li的序号
function getTargetIndex(x,y){
  //计算行号
  var rowIndex = parseInt(y/200);//
  //计算列号
  var colIndex = parseInt(x/200);//
  //根据行号和列号计算下标
  //行号*3+列号
  return rowIndex*3+colIndex;
}
function exchangeLi(sourceIndex,targetIndex){
  // var lis = $("box").children;
  // if(sourceIndex<-1 || sourceIndex>lis.length-1 || targetIndex<-1 || targetIndex>lis.length-1){
  //   return;
  // }
  if(sourceIndex!=targetIndex){
     var lis = $("box").children;
     //1、交换backgroundPosition
     var temp =getStyle(lis[sourceIndex],"backgroundPosition");
     lis[sourceIndex].style.backgroundPosition = getStyle(lis[targetIndex],"backgroundPosition");
     lis[targetIndex].style.backgroundPosition = temp;
  }
   //2、归位
   rowIndex = parseInt(sourceIndex/3);
   colIndex = sourceIndex%3;
   lis[sourceIndex].style.left = colIndex*200+"px";
   lis[sourceIndex].style.top = rowIndex*200+"px";
}
</script>
Javascript 相关文章推荐
JS 动态获取节点代码innerHTML分析 [IE,FF]
Nov 30 Javascript
jQuery中DOM操作实例分析
Jan 23 Javascript
javascript实现Table排序的方法
May 15 Javascript
在JS方法中返回多个值的方法汇总
May 20 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
Sep 09 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
Jul 27 Javascript
js自定义QQ菜单效果
Jan 10 Javascript
javascript 中事件冒泡和事件捕获机制的详解
Sep 01 Javascript
小程序组件之仿微信通讯录的实现代码
Sep 12 Javascript
js获取 gif 的帧数的代码实例
Sep 10 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
Jun 05 Javascript
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
Feb 23 #Javascript
es6中Promise 对象基本功能与用法实例分析
Feb 23 #Javascript
原生JavaScript之es6中Class的用法分析
Feb 23 #Javascript
原生javascript单例模式的应用实例分析
Feb 23 #Javascript
小程序websocket心跳库(websocket-heartbeat-miniprogram)
Feb 23 #Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 #Javascript
深入理解webpack process.env.NODE_ENV配置
Feb 23 #Javascript
You might like
PHP实现权限管理功能示例
2017/09/22 PHP
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
jQuery图片的展开和收缩实现代码
2013/04/16 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
jQuery+CSS3实现仿花瓣网固定顶部位置带悬浮效果的导航菜单
2016/09/21 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
TypeScript入门-基本数据类型
2017/03/28 Javascript
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
详解react-native-fs插件的使用以及遇到的坑
2017/09/12 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
2018/09/03 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
Python程序设计入门(2)变量类型简介
2014/06/16 Python
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
Python中new方法的详解
2019/01/15 Python
python实现桌面气泡提示功能
2019/07/29 Python
python随机模块random使用方法详解
2020/02/14 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
Python多进程编程常用方法解析
2020/03/26 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
幼儿园元旦亲子活动方案
2014/02/17 职场文书
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
会员活动策划方案
2014/08/19 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
学前班学生评语
2014/12/29 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书