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 相关文章推荐
javascript 写类方式之九
Jul 05 Javascript
几个比较经典常用的jQuery小技巧
Mar 01 Javascript
Javascript类库的顶层对象名用户体验分析
Oct 24 Javascript
JQuery将文本转化成JSON对象需要注意的问题
May 09 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
Sep 02 Javascript
javascript检测移动设备横竖屏
May 21 Javascript
获取select的value、text值的简单示例(jquery与javascript)
Dec 07 Javascript
详解Node中导入模块require和import的区别
Aug 11 Javascript
JS实现websocket长轮询实时消息提示的效果
Oct 10 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
Mar 01 Javascript
完美解决linux下node.js全局模块找不到的情况
May 16 Javascript
实例讲解JavaScript 计时事件
Jul 04 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数据库的查询统计速度 select 索引应用
2007/04/11 PHP
php面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
javascript 多级checkbox选择效果
2009/08/20 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
2017/05/11 Javascript
Angular 1.x个人使用的经验小结
2017/07/19 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
在Python中操作字典之fromkeys()方法的使用
2015/05/21 Python
详解Python3中字符串中的数字提取方法
2017/01/14 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
python语音识别实践之百度语音API
2018/08/30 Python
市政施工员自我鉴定
2014/01/15 职场文书
公益广告语集锦
2014/03/13 职场文书
眼镜促销方案
2014/03/15 职场文书
工厂车间标语
2014/06/19 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
2014年人事专员工作总结
2014/11/19 职场文书
毕业实习感受与体会
2015/05/26 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
创业计划书之农家乐
2019/10/09 职场文书
Springboot集成阿里云OSS上传文件系统教程
2021/06/28 Java/Android
HTTP中的Content-type详解
2022/01/18 HTML / CSS
CentOS7环境下MySQL8常用命令小结
2022/06/10 Servers