jQuery实现网页拼图游戏


Posted in jQuery onApril 22, 2020

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

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

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

看效果:

1.生成格子图片成功:

jQuery实现网页拼图游戏

2.打乱图片次序

jQuery实现网页拼图游戏

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

jQuery实现网页拼图游戏

4.再次打乱

jQuery实现网页拼图游戏

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);

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

jQuery 相关文章推荐
jquery点赞功能实现代码 点个赞吧!
May 29 jQuery
jQuery初级教程之网站品牌列表效果
Aug 02 jQuery
使用jQuery实现鼠标点击左右按钮滑动切换
Aug 04 jQuery
jQuery图片缩放插件smartZoom使用实例详解
Aug 25 jQuery
jqueryUI tab标签页代码分享
Oct 09 jQuery
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
layui中使用jquery控制radio选中事件的示例代码
Aug 15 jQuery
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
Mar 19 jQuery
jQuery/JS监听input输入框值变化实例
Oct 17 jQuery
jQuery实现的图片点击放大缩小功能案例
Jan 02 jQuery
Jquery 获取相同NAME 或者id删除行操作
Aug 24 jQuery
jQuery实现影院选座订座效果
Apr 13 jQuery
基于jquery实现九宫格拼图小游戏
Nov 30 #jQuery
jQuery实现购物车的总价计算和总价传值功能
Nov 28 #jQuery
jQuery点击页面其他部分隐藏下拉菜单功能
Nov 27 #jQuery
jQuery实现上下滚动公告栏详细代码
Nov 21 #jQuery
jQuery 同时获取多个标签的指定内容并储存为数组
Nov 20 #jQuery
IE8中jQuery.load()加载页面不显示的原因
Nov 15 #jQuery
JQuery模拟实现网页中自定义鼠标右键菜单功能
Nov 14 #jQuery
You might like
PHP中的串行化变量和序列化对象
2006/09/05 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
PHP fopen中文文件名乱码问题解决方案
2020/10/28 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
一个简单的JavaScript 日期计算算法
2009/09/11 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
Python多进程原理与用法分析
2018/08/21 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
浅析python,PyCharm,Anaconda三者之间的关系
2019/11/27 Python
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
化工工艺专业求职信
2013/09/22 职场文书
财务工作个人求职的自我评价
2013/12/19 职场文书
学习雷锋倡议书
2014/04/15 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
平安家庭示范户事迹
2014/06/02 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
出国签证在职证明
2014/09/20 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
2015年采购工作总结
2015/04/10 职场文书
手机销售员岗位职责
2015/04/11 职场文书
邮政营业员岗位职责
2015/04/14 职场文书
电台广播稿范文
2015/08/19 职场文书
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL