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 相关文章推荐
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
May 07 Javascript
基于javascript滚动图片具体实现
Nov 18 Javascript
js中通过父级进行查找定位元素
Jun 15 Javascript
浅析js中substring和substr的方法
Nov 09 Javascript
js实现商城星星评分的效果
Dec 29 Javascript
Vue.js原理分析之observer模块详解
Feb 17 Javascript
VUE中v-model和v-for指令详解
Jun 23 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
Sep 14 Javascript
koa源码中promise的解读
Nov 13 Javascript
基于layui实现高级搜索(筛选)功能
Jul 26 Javascript
Vue通过WebSocket建立长连接的实现代码
Nov 05 Javascript
JS实现斐波那契数列的五种方式(小结)
Sep 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
收听困难?教您超简便短波广播抗干扰方法!
2021/03/01 无线电
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
详解React路由传参方法汇总记录
2020/11/29 Javascript
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
Django Highcharts制作图表
2016/08/27 Python
Python实现简单的四则运算计算器
2016/11/02 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Python使用微信接入图灵机器人过程解析
2019/11/04 Python
布隆过滤器的概述及Python实现方法
2019/12/08 Python
通过实例解析python描述符原理作用
2020/01/22 Python
如何利用Python识别图片中的文字
2020/05/31 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
文体活动实施方案
2014/03/27 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang