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 EasyUI 为Combo,Combobox添加清除值功能的实例
Apr 13 jQuery
深入理解jquery的$.extend()、$.fn和$.fn.extend()
Jul 08 jQuery
jQuery获取table表中的td标签(实例讲解)
Jul 28 jQuery
jquery获取链接地址和跳转详解(推荐)
Aug 15 jQuery
jquery+ajaxform+springboot控件实现数据更新功能
Jan 22 jQuery
JS与jQuery判断文本框还剩多少字符可以输入的方法
Sep 01 jQuery
jQuery+vue.js实现的多选下拉列表功能示例
Jan 15 jQuery
javascript异步处理与Jquery deferred对象用法总结
Jun 04 jQuery
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
Oct 16 jQuery
jQuery实现点击滚动到指定元素上的方法分析
Mar 19 jQuery
jQuery实现本地存储
Dec 22 jQuery
jQuery冲突问题解决方法
Jan 19 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
PHP入门速成(2)
2006/10/09 PHP
php+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
Jquery动态更改一张位图的src与Attr的使用
2013/07/31 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
JavaScript中的迭代器和生成器详解
2014/10/29 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
基于jQuery实现的旋转彩圈实例
2015/06/26 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
2015/12/20 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
pyqt和pyside开发图形化界面
2014/01/22 Python
Python常用的爬虫技巧总结
2016/03/28 Python
Python中enumerate函数代码解析
2017/10/31 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
2017/11/06 Python
Python中关键字global和nonlocal的区别详解
2018/09/03 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
Python中PyQt5/PySide2的按钮控件使用实例
2019/08/17 Python
python读取图片的几种方式及图像宽和高的存储顺序
2020/02/11 Python
基于python3实现倒叙字符串
2020/02/18 Python
Python处理PDF与CDF实例
2020/02/26 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
美国第二大连锁书店:Books-A-Million
2017/12/28 全球购物
navabi英国:设计师大码女装
2019/06/25 全球购物
新闻发布会主持词
2014/03/28 职场文书
文案策划专业自荐信
2014/07/07 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
2015年小学语文教师工作总结
2015/10/23 职场文书
win11如何查看端口是否被占用? Win11查看端口是否占用的技巧
2022/04/05 数码科技