原生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 相关文章推荐
北京奥运官方网站幻灯切换效果flash版打包下载
Jan 30 Javascript
jquery连缀语法如何实现
Nov 29 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
Apr 12 Javascript
jQuery响应enter键的实现思路
Apr 18 Javascript
JavaScript取得键盘按下方向键是哪个的方法
Aug 04 Javascript
jQuery插件Timelinr 实现时间轴特效
Oct 04 Javascript
浅谈Vue的基本应用
Dec 27 Javascript
jQuery实现简单的下拉菜单导航功能示例
Dec 07 jQuery
详解vue-cli 接口代理配置
Dec 13 Javascript
集成vue到jquery/bootstrap项目的方法
Feb 10 jQuery
Vue项目全局配置页面缓存之按需读取缓存的实现详解
Aug 01 Javascript
vue 微信扫码登录(自定义样式)
Jan 06 Javascript
原生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
使用phpstorm和xdebug实现远程调试的方法
2015/12/29 PHP
ThinkPHP使用Ueditor的方法详解
2016/05/20 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
动手学习无线电
2021/03/10 无线电
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
Javascript中的window.event.keyCode使用介绍
2011/04/26 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
js使用removeChild方法动态删除div元素
2014/08/01 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
vue-cli+webpack记事本项目创建
2017/04/01 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
js实现图片轮播效果学习笔记
2017/07/26 Javascript
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
jQuery实现动态生成年月日级联下拉列表示例
2019/05/11 jQuery
Vue formData实现图片上传
2019/08/20 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
Python采集腾讯新闻实例
2014/07/10 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
CSS3绘制不规则图形的一些方法示例
2015/11/07 HTML / CSS
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
应届毕业生个人自我评价
2013/09/20 职场文书
应届毕业生求职信范文
2014/05/08 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
居住证明范文
2015/06/17 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
原生JS实现分页
2022/04/19 Javascript