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 利用show和hidden实现级联菜单示例代码
Aug 09 Javascript
javascript感应鼠标图片透明度显示的方法
Feb 24 Javascript
JQuery解析XML的方法小结
Apr 02 Javascript
JS匿名函数实例分析
Nov 26 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
Jan 29 Javascript
vue.js利用defineProperty实现数据的双向绑定
Apr 28 Javascript
浅谈vue-router2路由参数注意的问题
Nov 08 Javascript
详解KOA2如何手写中间件(装饰器模式)
Oct 11 Javascript
更优雅的微信小程序骨架屏实现详解
Aug 07 Javascript
详解element-ui中表单验证的三种方式
Sep 18 Javascript
JavaScript异步操作的几种常见处理方法实例总结
May 11 Javascript
如何将Node.js中的回调转换为Promise
Nov 10 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
基于mysql的论坛(4)
2006/10/09 PHP
Session保存到数据库的php类分享
2011/10/24 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
CSS常用网站布局实例
2008/04/03 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
python调用fortran模块
2016/04/08 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
python简单实现获取当前时间
2016/08/27 Python
在python中实现调用可执行文件.exe的3种方法
2019/07/07 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
使用python远程操作linux过程解析
2019/12/04 Python
python操作redis数据库的三种方法
2020/09/10 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
Ever New加拿大官网:彰显女性美
2018/10/05 全球购物
客户服务经理岗位职责
2014/01/29 职场文书
学生个人自我鉴定范文
2014/03/28 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
监理中标通知书
2015/04/16 职场文书
小学数学教师研修感悟
2015/11/18 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电