jQuery实现网页拼图游戏

之前看了一个页面中将图片分割的效果,感觉不错,有些好奇他是怎么实现的。

跟搭档说了一下,大概明白。其实就是利用 overflow=hidden ,margin-left, margin-top 这三个属性的配合,让人感觉图片被一个个格子地分开了。

刚刚写了个 Jquery的小插件,处理了整个的图片分格化,用户只要指定一个图片就可以自动生成格子图片,还自动生成“打乱”,“复原”,行,列等按钮。同时具有提示位置正确的图片数的功能。

看效果:

1.生成格子图片成功:

2.打乱图片次序

3.手动设置行列,这里限定了最大的行列都是 10 ,最小是3,多了会眼花撩乱。

4.再次打乱

5.去除小格子的边框,去除了图片分格子就不明显了

在页面上这用调用:

<div style="width:640px; height:400px;">
  <img id="origin" class="myimage" src="11.jpg"/>
</div><div id="targetDiv"></div>
<script>
$(document).ready(function(){

 $("#origin").tablePic({
  target: 'targetDiv',col:4,row:3,borderColor:'#fff',freeColor:'#cec'
 });

});
</script>

完整的js:

(function($){
 /*
 * 坐标类
 * @param {Object} x
 * @param {Object} y
 * @memberOf {TypeName}
 */
 function Point(x,y){
 this.top=x;
 this.left=y;
 }

 /**
 * 修正版本,原图右下角的小图不显示,是活动格子
 * 添加 “打乱”,“换图按钮”
 *
 * @param {Object} options
 * @memberOf {TypeName}
 * @return {TypeName}
 */
 $.fn.tablePic=function(options){
 var DEFAULT={
  target:'',
  row:2,
  col:2,
  isBorder:true,
  borderColor:'#f88',
  mode:'strict',//是否严格判断格式相邻移到,如果不是strict,那么就是不管怎样都是直接和空白格式内容交换
  freeColor:'#92cf28' //空白格子的背景颜色
 }

 var options=$.extend(DEFAULT,options);
 //系统变量
 var SYSTEM={
  width:0,height:0,
  //小格子的大小
  sonWidth:0,sonHeight:0,
  src:null,
  current:'',correct:0,//正确个数
  hits:0//步数
 }
 var parent=null;//这个是待分割的图片
 var target=null;//这个是格子存放的容器,一般是一个div,也应该是!!!!!别搞独特=.=

 //这个是左,上 的margin
 var margin=new Array();

 this.each(function(){
  parent=$(this);
  SYSTEM.src=parent.attr("src");
  SYSTEM.width=parseInt(parent.css("width"));
  SYSTEM.height=parseInt(parent.css("height"));
  SYSTEM.sonWidth=Math.round(SYSTEM.width/options.col);
  SYSTEM.sonHeight=Math.round(SYSTEM.height/options.row);

  init();
  initMargin();
 });

 //初始化目标
 function init(){
  target=$("#"+options.target);
  initTarget();
  //最后我们要添加一个空白的divprepend
  target.append($("<div/>").attr("id","control").css("position","absolute").css("top",SYSTEM.height+8+((options.isBorder)?(options.row):0)+'px').css("right","0px").css("width",SYSTEM.Width/3).css("height",SYSTEM.sonHeight)
  .append($("<span/>").attr("id","correctInfo"))
  .append($("<button/>").bind("click",function(){initMargin();}).append("复原"))
  .append($("<button/>").bind("click",function(){mixMargin();}).append("打乱"))
  .append($("<button/>").attr("id","isBorder").bind("click",function(){border();}).append(((options.isBorder)?"去除":"添加")+"边框"))
  .append(" 行:")
  .append($("<select/>").attr("id","rowSelect"))
  .append("列:")
  .append($("<select/>").attr("id","colSelect"))
  );
  initSelect();
 }

 function initTarget(){
  SYSTEM.sonWidth=Math.floor(SYSTEM.width/options.col);
  SYSTEM.sonHeight=Math.floor(SYSTEM.height/options.row);
  target.css("width",SYSTEM.width+'px').css("height",SYSTEM.height+'px');
  //是否显示边框
  if(options.isBorder){
  target.css("width",SYSTEM.width+options.col+'px').css("height",SYSTEM.height+options.row+'px');
  }
  target.css("position","relative");
 }
 /**
  * 设置两个 select的属性,并添加事件
  */
 function initSelect(){
  for(var i=3;i<=10;i++){
  $("#rowSelect").append($("<option/>").attr("vaule",i).append(i));
  $("#colSelect").append($("<option/>").attr("vaule",i).append(i));
  }
  target.find("select").each(function(){
  $(this).change(function(){
   options.row=parseInt($("#rowSelect").val());
   options.col=parseInt($("#colSelect").val());
   initTarget();
   initMargin();
  });
  });
 }

 /**
  * 边框的设置
  */
 function border(){
  options.isBorder=!options.isBorder;
  //initTarget();
  //initMargin();
  target.children(":not(#control)").children().each(function(){
  $(this).css("border-top",(options.isBorder?"1px solid "+options.borderColor:"none")).css("border-left",(options.isBorder?"1px solid "+options.borderColor:"none"));
  });
  $("#isBorder").html(((options.isBorder)?"去除":"添加")+"边框");
 }

 function initImage(){
  //清空 target
  target.children(":not(#control)").remove();
  $("#rowSelect").val(options.row);
  $("#colSelect").val(options.col);
  //生成格子,基本形式:
  //<div class="miniDiv">
    // <div><img src="?????"/></div>
   // </div>
  //
  //为了兼容神奇的ie6,我们添加一个div在外围
  var $temp=$("<div/>");
  target.append($temp);
  for(var i=0;i<options.row*options.col;i++){
   if(margin[i].left==options.col-1&&margin[i].top==options.row-1){
   $temp.append($("<div/>").attr("id","gz"+(i+1)).css("border-top",(options.isBorder?"1px solid "+options.borderColor:"none")).css("border-left",(options.isBorder?"1px solid "+options.borderColor:"none")).css("width",SYSTEM.sonWidth).css("height",SYSTEM.sonHeight).css("overflow","hidden").css("float","left")
    .append($("<div/>").css("width","100%").css("height","100%").css("background-color",options.freeColor)));
   SYSTEM.current='gz'+(i+1);
   }
   else{
   $temp.append($("<div/>").attr("id","gz"+(i+1)).css("border-top",(options.isBorder?"1px solid "+options.borderColor:"none")).css("border-left",(options.isBorder?"1px solid "+options.borderColor:"none")).css("width",SYSTEM.sonWidth).css("height",SYSTEM.sonHeight).css("overflow","hidden").css("float","left").append(
    $("<div/>").css("margin-left",(margin[i].left*SYSTEM.sonWidth)*-1+"px").css("margin-top",(margin[i].top*SYSTEM.sonHeight)*-1+"px")
    .append($("<img/>").attr("src",SYSTEM.src).css("width",SYSTEM.width+'px').css("height",SYSTEM.height+'px').css("display","block"))
   ));
   }
  }

  initHandle();
  checkRight();
 }

 //初始化 margin 这个属性
 function initMargin(){
  var temp=0;
  for(var i=0;i<options.row;i++){
   for(var j=0;j<options.col;j++)
   margin[temp++]=new Point(i,j);
  }
  initImage();
 }

 //打乱图片次序
 //使用 margin.splice 不能正确返回被删除的数组元素,这里使用一个 中间 数组进行随机排序
 function mixMargin(){
  var temp1=new Array();
  var temp2=new Array();
  for(var i=0;i<options.col*options.row;i++){
  temp2[i]=i;
  }
  //使用 js 的splice 函数得到随机排序的数组
  for(var i=0;i<options.col*options.row;i++){
  temp1[i]=margin[temp2.splice(Math.floor(Math.random()*temp2.length),1)];
  }
  margin=temp1;
  initImage();
 }

 /**
  * 添加事件
  * @memberOf {TypeName}
  * @return {TypeName}
  */
 function initHandle(){
  for(var i=0;i<=options.col*options.row;i++){
  $("#gz"+i).bind("click",function(){
   var newId=$(this).attr("id");
   if(newId==SYSTEM.current)
   return false;
   //如果设定了mode为strict,就判断是不是与空白格子相邻,只有相邻了才可以发生效果
   if(options.mode=='strict'){
   if(SYSTEM.current=='gz0'&&newId!=('gz'+options.col))
    return false;
   var ii=parseInt(newId.substring(2));
   var jj=parseInt(SYSTEM.current.substring(2));
   if(!(Math.abs(ii-jj)==1||Math.abs(ii-jj)==options.col))
    return false;
   }
   var temp=$(this).html();
   $(this).html($("#"+SYSTEM.current).html());
   $("#"+SYSTEM.current).html(temp);
   SYSTEM.current=$(this).attr("id");
   checkRight();
  });
  }
 }

 /*
  * 检查当前正确的图片数
  */
 function checkRight(){
  SYSTEM.correct=0;
  for(var i=0;i<options.col*options.row-1;i++){
  var $temp=$("#gz"+(i+1)).children(":first");
  if($temp.html()!=''&&parseInt($temp.css("margin-left"))==(-1*SYSTEM.sonWidth*(i%options.col))&&parseInt($temp.css("margin-top"))==(-1*SYSTEM.sonHeight*Math.floor(i/options.col))){
   SYSTEM.correct++;
  }
  }
  showCorrect();
 }

 /*
  * 显示正确的图片信息
  */
 function showCorrect(){
  $("#correctInfo").html("正确图片:"+SYSTEM.correct+"/"+(options.col*options.row-1)+"  ");
 }
 }
})(jQuery);

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

(0)

相关推荐

  • jQuery实现拼图小游戏(实例讲解)

    小熊维尼拼图 jQuery代码实现拼图小游戏,鼠标选中拼块,用上下左右键移动拼块. html代码 <div id="box-div"> <!--走不通时的提示!--> <div id="tips"> <p>\(╯-╰)/ 哎呦,走不通啦!</p> </div> <div id="container"> <div class="row"&g

  • 基于jquery实现九宫格拼图小游戏

    九宫格拼图小游戏是小时候比较常见的小游戏之一.闲着无聊就用js简单写了一个. 游戏的玩法很简单.九宫格中有八个小图片.随机打乱之后,将八张小图片拼接成一个完整的图. html代码 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <style> body{ border: 0; } .out{ width: 606px; height: 606px; margin: 0 aut

  • jquery实现的美女拼图游戏实例

    本文实例讲述了jquery实现的美女拼图游戏.分享给大家供大家参考.具体如下: 这里可以自由打乱拼图次序,3*3,4*4等多种组合来进行格数拼图 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo

  • jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】

    本文实例讲述了jQuery+vue.js实现的九宫格拼图游戏.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> * { margin: 0; padding: 0; } /*#piclist { width: 600p

  • jQuery制作可自定义大小的拼图游戏

    我把大小限制在了3-10之间,实在闲的,或者有自虐倾向的可以试试改下.. 本来准备弄图片上去的,还没弄.. pintu.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/199

  • jQuery制作拼图小游戏

    源代码思路分析: [一]如何生成图片网格,我想到两种方法: (1)把这张大图切成16张小图,然后用img标签的src (2)只有一张大图,然后每个元素的背景图用css的background-position进行切割定位,这样就需要16个数组[0,0],[-150,0],[-300,0]..........(我采用这种) [二]图片背景定位数组与布局定位数组 在选择了使用CSS定位切图,就需要生成数据. 需要的css背景 定位数组为:[0,0],[-150,0],[-300,0],[-450,0]

  • jQuery实现网页拼图游戏

    之前看了一个页面中将图片分割的效果,感觉不错,有些好奇他是怎么实现的. 跟搭档说了一下,大概明白.其实就是利用 overflow=hidden ,margin-left, margin-top 这三个属性的配合,让人感觉图片被一个个格子地分开了. 刚刚写了个 Jquery的小插件,处理了整个的图片分格化,用户只要指定一个图片就可以自动生成格子图片,还自动生成"打乱","复原",行,列等按钮.同时具有提示位置正确的图片数的功能. 看效果: 1.生成格子图片成功: 2.

  • jQuery实现的五子棋游戏实例

    本文实例讲述了jQuery实现的五子棋游戏.分享给大家供大家参考.具体如下: 这是一款非常不错的代码,就是人工智能方面差了一点 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999

  • jquery实现网页的页面平滑滚动效果代码

    本文实例讲述了jquery实现网页的页面平滑滚动效果代码.分享给大家供大家参考,具体如下: 这款网页页面平滑滚动jquery代码,点击链接会让网页平滑滚动到链接对应的位置. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-link-scroll-page-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo

  • JQUERY实现网页右下角固定位置展开关闭特效的方法

    本文实例讲述了JQUERY实现网页右下角固定位置展开关闭特效的方法.分享给大家供大家参考.具体如下: html代码: <div class="tagbox"> <div class="tag"> <span>热门标签...</span> <ul> <li><a href='/tag/js展开收起_1.html' target="_blank">js展开收起<

  • js+html5实现可在手机上玩的拼图游戏

    本文实例讲述了js+html5实现可在手机上玩的拼图游戏.分享给大家供大家参考.具体如下: 手机版的拼图.pc上用Chrome 或者 Firefox var R=(function(){ /*右边菜单*/ function fa(){ if(mo.style.right!='0px'){ mo.style.right='0px'; mco.rcss('','cmck'); }else{ mo.style.right='-100px'; mco.rcss('cmck',''); } } on(mc

  • Android拼图游戏 玩转从基础到应用手势变化

    相信大家在小的时候都玩过拼图游戏,现如今,手机普及,能在手机上玩的游戏越来越多,于是乎,重温小时候,编写这个简易拼图游戏,而且也能进一步加深Android的一些基础知识. 老规矩,先是效果图: 这里我把为了演示效果,把图片打乱的很少,在代码里可以更改. 首先,有个默认的图片,可以用来拼图,也可以选择你喜欢的图片进行拼图,拼图的过程会记录移动的步数,并且当游戏胜利的时候会弹出一个笑脸提示,游戏胜利,用了多少步数. ps:感兴趣的完全可以继续在这上面进行扩展,比如增加游戏难度的选项,可以将图片分成更

  • 原生js实现的贪吃蛇网页版游戏完整实例

    本文实例讲述了原生js实现的贪吃蛇网页版游戏.分享给大家供大家参考.具体实现方法如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>原生js写的贪吃蛇网页版游戏</title> </head> <body> </body> <sc

  • Python加pyGame实现的简单拼图游戏实例

    本文实例讲述了Python加pyGame实现的简单拼图游戏.分享给大家供大家参考.具体实现方法如下: import pygame, sys, random from pygame.locals import * # 一些常量 WINDOWWIDTH = 500 WINDOWHEIGHT = 500 BACKGROUNDCOLOR = (255, 255, 255) BLUE = (0, 0, 255) BLACK = (0, 0, 0) FPS = 40 VHNUMS = 3 CELLNUMS

随机推荐