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 tools 系列 scrollable(2)
Sep 06 Javascript
js给onclick事件赋值,动态传参数实例解说
Mar 28 Javascript
jQuery的live()方法对hover事件的处理示例
Feb 27 Javascript
浅谈javascript中的instanceof和typeof
Feb 27 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
Dec 03 Javascript
JavaScript提高网站性能优化的建议(二)
Jul 24 Javascript
AngularJS模板加载用法详解
Nov 04 Javascript
angular中的http拦截器Interceptors的实现
Feb 21 Javascript
纯JS实现轮播图
Feb 22 Javascript
js实现三级联动效果(简单易懂)
Mar 27 Javascript
用webpack4开发小程序的实现方法
Jun 04 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
Nov 14 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将数据导入到Foxmail
2006/10/09 PHP
php 远程关机操作的代码
2008/12/05 PHP
PHP 图片文件上传实现代码
2010/12/29 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
2013/06/26 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
javascript测试题练习代码
2012/10/10 Javascript
上传的js验证(图片/文件的扩展名)
2013/04/25 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
Vue学习之组件用法实例详解
2020/01/06 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
[00:16]热血竞技场
2019/03/06 DOTA
python的else子句使用指南
2016/02/27 Python
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
让你的Python代码实现类型提示功能
2019/11/19 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
python实现猜拳游戏项目
2020/11/30 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
少先队活动总结
2014/08/29 职场文书
世界名著读书笔记
2015/06/25 职场文书
Nginx设置日志打印post请求参数的方法
2021/03/31 Servers
vue实现锚点定位功能
2021/06/29 Vue.js
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android
Django框架中表单的用法
2022/06/10 Python