javascript制作照片墙及制作过程中出现的问题


Posted in Javascript onApril 04, 2016

本文主要做了一个照片墙,整个制作过程,主要需要解决一下几个问题:

1、如何进行布局转换?

2、如何对图片进行拖拽处理?

3、如何检测图片碰撞问题?进行碰撞检测

4、当多个图片进行碰撞,如何取其中距离对象最小的物体?

5、如何将相互碰撞的两个物体的位置相互交换?涉及到运动的类库

代码如下:

<html>
<head>
<style>
body{background:black;margin: 0;padding: 0;color: white;font-size: 50px;}
p{position: absolute;width:20px;margin-left: 50px;}
#ul1{width: 690px;position: relative;margin: 20px auto;}
#ul1 li{list-style: none;float: left;margin: 10px;width: 200px;height: 150px;z-index: 1;border: 5px solid white;}
#ul1 .active{border: 5px solid yellow;}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script src="move2.js"></script>
<script type="text/javascript">
window.onload=function ()
{
  var oUl=document.getElementById('ul1');
  var oLi=oUl.getElementsByTagName('li');
  var sTore=[];
  var i;
  var iMinZindex=2;
  //进行布局转换
  for(i=0;i<oLi.length;i++)
  {
     sTore[i]={left:oLi[i].offsetLeft,top:oLi[i].offsetTop};//用数组存储每个li的左边距和高度

  }
  for(i=0;i<oLi.length;i++)
  {
     oLi[i].style.left=sTore[i].left+'px';
     oLi[i].style.top=sTore[i].top+'px';
     oLi[i].style.position='absolute';
     oLi[i].style.margin=0;
     oLi[i].index=i;
  }
  //图片拖拽处理
  for(i=0;i<oLi.length;i++)
  {
    setDrags(oLi[i]);
  }
  function setDrags(obj)
  {
    obj.onmousedown=function(ev)
    {
       //层级问题
      obj.style.zIndex=iMinZindex++;
      var oEvent=ev||event;
      var disx=oEvent.clientX-obj.offsetLeft;
      var disy=oEvent.clientY-obj.offsetTop;
      document.onmousemove=function(ev)
      {
        
        var oEvent=ev||event;
        obj.style.left=oEvent.clientX-disx+'px';//注意加px
        obj.style.top=oEvent.clientY-disy+'px';
        for(i=0;i<oLi.length;i++)
        {
          oLi[i].className='';
        }
        var oNear=findNearest(obj);
        if(oNear)//如果是最近的那个物体
        {
          oNear.className='active';
        }
      };
      document.onmouseup=function()
      {
         document.onmousemove=null;
         document.onmousedown=null;
         //交换两物体的位置
         var oNear=findNearest(obj);
         if(oNear)
         {
          startMove(oNear,sTore[obj.index]);
          startMove(obj,sTore[oNear.index]);
          //交换索引值
          var temp;
          temp=obj.index;
          obj.index=oNear.index;
          oNear.index=temp;

         }
         else
         {
          startMove(obj,sTore[obj.index])//回到自己的位置
         }
         return false;
      };
      clearInterval(obj.timer);
      return false;
    };
  }
//发生碰撞,使被碰的图片加边框,进行碰撞检测
function IBoundTest(obj1,obj2)
{
  var l1=obj1.offsetLeft;
  var r1=obj1.offsetLeft+obj1.offsetWidth;
  var t1=obj1.offsetTop;
  var b1=obj1.offsetTop+obj1.offsetHeight;
  
  var l2=obj2.offsetLeft;
  var r2=obj2.offsetLeft+obj2.offsetWidth;
  var t2=obj2.offsetTop;
  var b2=obj2.offsetTop+obj2.offsetHeight;
  if(r1<l2||l1>l2||b1<t2||t1>b2)//没有碰撞
  {
    return false;
  }
  else
  {
    return true;
  }

}
//得到两个物体之间的距离
function getDis(obj1,obj2)
{
  var a=obj1.offsetLeft-obj2.offsetLeft;
  var b=obj1.offsetTop-obj2.offsetTop;
  return Math.sqrt(a*a+b*b);
}
//发生碰撞,当与多个碰撞时,取其距离最小的图片
function findNearest(obj)
{
  var iMin=9999999;
  var iMindex=-1;
  var i;
  for(i=0;i<oLi.length;i++)
  {
     if(obj==oLi[i]){continue;}
     if(IBoundTest(obj,oLi[i]))//如果两个物体碰撞上
     {
        
         var dis=getDis(obj,oLi[i]);
         if(iMin>dis)
         {
           iMin=dis;
           iMindex=i;
         }
     }
  }
  if(iMindex==-1){return null;}
  else
  {
    return oLi[iMindex];//返回最近的那个
  }
}


  
}
</script>
</head>
<body >
<p>照片墙</p>
<ul id="ul1">
 <li><img src="images/1.jpg"></li>
 <li><img src="images/2.jpg"></li>
 <li><img src="images/3.jpg"></li>
 <li><img src="images/4.jpg"></li>
 <li><img src="images/5.jpg"></li>
 <li><img src="images/1.jpg"></li>
 <li><img src="images/2.jpg"></li>
 <li><img src="images/3.jpg"></li>
 <li><img src="images/4.jpg"></li>
</ul>
</body>
</html>

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

Javascript 相关文章推荐
JQuery学习笔记 nt-child的使用
Jan 17 Javascript
js获得参数的getParameter使用示例
Feb 26 Javascript
纯JavaScript代码实现移动设备绘图解锁
Oct 16 Javascript
Javascript中关于Array.filter()的妙用详解
Dec 04 Javascript
js css自定义分页效果
Feb 24 Javascript
微信小程序 图片绝对定位(背景图片)
Apr 05 Javascript
Vue2实时监听表单变化的示例讲解
Aug 30 Javascript
vue axios数据请求get、post方法及实例详解
Sep 11 Javascript
webpack4.x下babel的安装、配置及使用详解
Mar 07 Javascript
javascript利用键盘控制小方块的移动
Apr 20 Javascript
vue实现登录拦截
Jun 29 Javascript
Vue将props值实时传递 并可修改的操作
Aug 09 Javascript
javascript拖拽效果延伸学习
Apr 04 #Javascript
javascript事件委托的用法及其好处简析
Apr 04 #Javascript
基于javascript制作微博发布栏效果
Apr 04 #Javascript
纯js实现手风琴效果
Apr 17 #Javascript
AngularJS中的$watch(),$digest()和$apply()区分
Apr 04 #Javascript
Angular 根据 service 的状态更新 directive
Apr 03 #Javascript
jQuery中的Deferred和promise 的区别
Apr 03 #Javascript
You might like
php&amp;java(二)
2006/10/09 PHP
PHP防CC攻击实现代码
2011/12/29 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
css结合js制作下拉菜单示例代码
2014/02/27 Javascript
jQuery实现跨域
2015/02/03 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
浅谈EasyUI常用控件的禁用方法
2016/11/09 Javascript
JavaScript实现解析INI文件内容的方法
2016/11/17 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
fastadmin中调用js的方法
2019/05/14 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
Python操作列表之List.insert()方法的使用
2015/05/20 Python
Python中几个比较常见的名词解释
2015/07/04 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
python实现括号匹配的思路详解
2018/08/23 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
python自动循环定时开关机(非重启)测试
2019/08/26 Python
python实现计算器简易版
2020/12/17 Python
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
优秀体育委员自荐书
2014/01/31 职场文书
一年级小学生评语
2014/04/22 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
放飞理想演讲稿
2014/09/09 职场文书
银行求职信模板
2015/03/20 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL