Chinaunix首页 | 论坛 | 博客
  • 博客访问: 76565
  • 博文数量: 73
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 740
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-04 16:50
文章分类
文章存档

2014年(73)

我的朋友

分类: Html/Css

2014-07-21 11:56:33

一个基于JavaScript技术的照片墙实例演示,使用鼠标拖动图片可为图片换位置,可随机打乱图片顺序。使用时先准备好一定序列编号的图片集,设定JavaScript代码内的路径,程序会自动读取图片,记得不要让循环溢出哦,那样会出错的。



点击(此处)折叠或打开

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">
  2. <html xmlns="">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>JavaScript照片墙实例演示</title>
  6. <style type="text/css">
  7. body,div,h2,ul,li{margin:0;padding:0;}
  8. body{font:12px/1.5 Arail;}
  9. .box{width:860px;margin:10px auto;background:#eee;border:1px solid #b8b8b8;overflow:hidden}
  10. .title{height:30px;line-height:30px;font-size:14px;padding:0 15px 0 35px;border-bottom:1px solid #b8b8b8;background:#fafafa;}
  11. .title span{float:left;}
  12. .title a{float:right;color:#06f;outline:none;}
  13. .title a:hover{color:red;}
  14. .box ul{float:left;padding:0 15px 15px 0;}
  15. .box li{float:left;width:140px;height:105px;padding:6px;background:#fff;border:1px solid #c3c3c3;display:inline;margin:15px 0 0 15px;list-style:none;}
  16. .box li img{float:left;width:140px;height:105px;}
  17. .box li.hig{padding:5px;border:2px dashed #f30;opacity:0.5;filter:alpha(opacity=50);}
  18. </style>
  19. <script type="text/javascript">
  20. //获取ID
  21. var $ = function (id) {return typeof id === "string" ? document.getElementById(id) : id};
  22. //获取tagName
  23. var $$ = function (tagName, oParent) {return (oParent || document).getElementsByTagName(tagName)};
  24. //获取class
  25. var $$$ = function (sClass, oParent) {
  26.     var aClass = [],
  27.     i = 0,
  28.     reClass = new RegExp("(\\s|^)" + sClass + "($|\\s)"),
  29.     aElement = $$("*", oParent);
  30.     for (i = 0; i < aElement.length; i++)reClass.test(aElement[i].className) && aClass.push(aElement[i]);
  31.     return aClass
  32. };
  33. //获取元素位置
  34. function getPos(obj) {
  35.     var iTop = obj.offsetTop;
  36.     var iLeft = obj.offsetLeft;
  37.     while (obj.offsetParent)
  38.     {
  39.         iTop += obj.offsetParent.offsetTop;
  40.         iLeft += obj.offsetParent.offsetLeft;
  41.         obj = obj.offsetParent;
  42.     }
  43.     return {top:iTop, left:iLeft}    
  44. };
  45. //创建照片墙对象
  46. var PhotoWall = function () {this.initialize.apply(this, arguments)};
  47. PhotoWall.prototype = {
  48.     initialize: function (obj, aData)
  49.     {
  50.         var oThis = this;
  51.         this.oParent = $(obj);
  52.         this.oUl = $$("ul", this.oParent)[0];
  53.         this.oBtn = $$("a", this.oParent)[0];
  54.         this.zIndex = 1;
  55.         this.aPos = [];
  56.         this.aData = aData;
  57.         this.dom = document.documentElement || document.body;
  58.         this.create();
  59.         this.oBtn.onclick = function () {oThis.randomOrder()}
  60.     },
  61.     create: function ()
  62.     {
  63.         var aFrag = document.createDocumentFragment();
  64.         var i = 0;
  65.         for (i = 0; i < this.aData.length; i++)
  66.         {
  67.             var oLi = document.createElement("li");
  68.             var oImg = document.createElement("img");
  69.             oImg.src = this.aData[i];
  70.             oLi.appendChild(oImg);
  71.             aFrag.appendChild(oLi)    
  72.         }
  73.         this.oUl.appendChild(aFrag);
  74.         this.aLi = $$("li", this.oParent);
  75.         this.changeLayout()
  76.     },
  77.     changeLayout: function ()
  78.     {
  79.         var i = 0;
  80.         this.oParent.style.height = this.oParent.offsetHeight - 2 + "px";
  81.         this.aPos.length = 0;
  82.         for (i = 0; i < this.aLi.length; i++) this.aLi[i].style.cssText = "";    
  83.         for (i = 0; i < this.aLi.length; i++)
  84.         {
  85.             this.aLi[i].index = i;
  86.             this.aLi[i].style.top = getPos(this.aLi[i]).top + "px";
  87.             this.aLi[i].style.left = getPos(this.aLi[i]).left + "px";
  88.             this.aPos.push({left:getPos(this.aLi[i]).left, top:getPos(this.aLi[i]).top})
  89.         }
  90.         for (i = 0; i < this.aLi.length; i++)
  91.         {
  92.             this.aLi[i].style.position = "absolute";    
  93.             this.aLi[i].style.margin = "0";            
  94.             this.drag(this.aLi[i])
  95.         }    
  96.     },
  97.     drag: function (obj, handle)
  98.     {
  99.         var oThis = this;
  100.         var handle = handle || obj;
  101.         handle.style.cursor = "move";
  102.         handle.onmousedown = function (event)
  103.         {
  104.             var event = event || window.event;    
  105.             var disX = event.clientX - this.offsetLeft;
  106.             var disY = event.clientY - this.offsetTop;
  107.             var oNear = null;
  108.             handle.style.zIndex = oThis.zIndex++;
  109.             
  110.             document.onmousemove = function (event)
  111.             {
  112.                 var event = event || window.event;
  113.                 var iL = event.clientX - disX;
  114.                 var iT = event.clientY - disY;
  115.                 var maxL = Math.max(oThis.dom.clientWidth, oThis.dom.scrollWidth) - handle.offsetWidth;
  116.                 var maxT = Math.max(oThis.dom.clientHeight, oThis.dom.scrollHeight) - handle.offsetHeight;
  117.                 
  118.                 iL < 0 && (iL = 0);
  119.                 iT < 0 && (iT = 0);
  120.                 iL > maxL && (iL = maxL);
  121.                 iT > maxT && (iT = maxT);
  122.                             
  123.                 handle.style.left = iL + "px";
  124.                 handle.style.top = iT + "px";
  125.                 
  126.                 oNear = oThis.findNearest(obj);
  127.                 
  128.                 for (var i = 0; i < oThis.aLi.length; i++) oThis.aLi[i].className = "";
  129.                 
  130.                 oNear && (oNear.className = "hig");
  131.                 
  132.                 return false
  133.             };
  134.             document.onmouseup = function ()
  135.             {
  136.                 document.onmousemove = null;
  137.                 document.onmouseup = null;
  138.                 
  139.                 if (oNear)
  140.                 {
  141.                     handle.index = [handle.index, oNear.index];
  142.                     oNear.index = handle.index[0];
  143.                     handle.index = handle.index[1];
  144.                     oNear.style.zIndex = oThis.zIndex++;
  145.                     oThis.doMove(handle, oThis.aPos[handle.index]);
  146.                     oThis.doMove(oNear, oThis.aPos[oNear.index]);                    
  147.                     oNear.className = "";
  148.                 }
  149.                 else
  150.                 {
  151.                     oThis.doMove(handle, oThis.aPos[handle.index])    
  152.                 }
  153.                 
  154.                 handle.releaseCapture && handle.releaseCapture()
  155.             };
  156.             this.setCapture && this.setCapture();
  157.             return false
  158.         };
  159.     },
  160.     doMove: function (obj, iTarget, callback)
  161.     {
  162.         var oThis = this;
  163.         clearInterval(obj.timer);
  164.         obj.timer = setInterval(function ()
  165.         {
  166.             var iCurL = getPos(obj).left;
  167.             var iCurT = getPos(obj).top;
  168.             var iSpeedL = (iTarget.left - iCurL) / 5;
  169.             var iSpeedT = (iTarget.top - iCurT) / 5;
  170.             iSpeedL = iSpeedL > 0 ? Math.ceil(iSpeedL) : Math.floor(iSpeedL);
  171.             iSpeedT = iSpeedT > 0 ? Math.ceil(iSpeedT) : Math.floor(iSpeedT);
  172.             
  173.             if (iCurL == iTarget.left && iCurT == iTarget.top)
  174.             {
  175.                 clearInterval(obj.timer);
  176.                 callback && callback()    
  177.             }
  178.             else
  179.             {
  180.                 obj.style.left = iCurL + iSpeedL + "px";
  181.                 obj.style.top = iCurT + iSpeedT + "px"    
  182.             }
  183.         }, 30)
  184.     },
  185.     findNearest: function (obj)
  186.     {
  187.         var aDistance = [];
  188.         var i = 0;
  189.         for (i = 0; i < this.aLi.length; i++) aDistance[i] = this.aLi[i] == obj ? Number.MAX_VALUE : this.getDistance(obj, this.aLi[i]);
  190.         
  191.         var minNum = Number.MAX_VALUE;
  192.         var minIndex = -1;
  193.         for (i = 0; i < aDistance.length; i++) aDistance[i] < minNum && (minNum = aDistance[i], minIndex = i);
  194.         
  195.         return this.isButt(obj, this.aLi[minIndex]) ? this.aLi[minIndex] : null
  196.     },
  197.     getDistance: function(obj1, obj2)
  198.     {
  199.         var a = (obj1.offsetLeft + obj1.offsetWidth / 2) - (obj2.offsetLeft + obj2.offsetWidth / 2);
  200.         var b = (obj1.offsetTop + obj1.offsetTop / 2) - (obj2.offsetTop + obj2.offsetTop / 2);
  201.         return Math.sqrt(a * a + b * b)
  202.     },
  203.     isButt: function (obj1, obj2)
  204.     {
  205.         var l1 = obj1.offsetLeft;
  206.         var t1 = obj1.offsetTop;
  207.         var r1 = l1 + obj1.offsetWidth;
  208.         var b1 = t1 + obj1.offsetHeight;
  209.         
  210.         var l2 = obj2.offsetLeft;
  211.         var t2 = obj2.offsetTop;
  212.         var r2 = l2 + obj2.offsetWidth;
  213.         var b2 = t2 + obj2.offsetHeight;
  214.         
  215.         return !(r1 < l2 || b1 < t2 || r2 < l1 || b2 < t1)
  216.     },
  217.     randomOrder: function ()
  218.     {
  219.         this.aPos.sort(function () {return Math.random() > 0.5 ? 1 : -1});
  220.         for (var i = 0; i < this.aLi.length; i++)
  221.         {
  222.             this.aLi[i].index = i;
  223.             this.doMove(this.aLi[i], this.aPos[i])
  224.         }
  225.     }
  226. };
  227. window.onload = function ()
  228. {
  229.     var aBox = $$$("box");
  230.     var aData = [];
  231.     var aExample = [];
  232.     var i = 0;
  233.     //生成图片数据
  234.     for (i = 1; i < 9; i++) aData[aData.length] = "" + i + ".jpg";
  235.     //循环创建多个实例
  236.     for (i = 0; i < aBox.length; i++)
  237.     {
  238.         var oExample = new PhotoWall(aBox[i], aData);
  239.         aExample.push(oExample)
  240.     }
  241.     this.onresize = function ()
  242.     {
  243.         for (var p in aExample) aExample[p].changeLayout()    
  244.     };
  245.     this.onresize()
  246. };
  247. </script>
  248. </head>
  249. <body>
  250. <div class="box">
  251.     <h2 class="title"><span>一堆90后</span><a href="javascript:;" class="order">随机排序</a></h2>
  252.     <ul></ul>
  253. </div>
  254. <div class="box">
  255.     <h2 class="title"><span>一堆90后</span><a href="javascript:;" class="order">随机排序</a></h2>
  256.     <ul></ul>
  257. </div>
  258. </body>
  259. </html>

阅读(1444) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~