欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

原生js實(shí)現(xiàn)照片墻效果

 更新時(shí)間:2020年10月13日 15:30:35   作者:歡醉  
這篇文章主要介紹了原生js實(shí)現(xiàn)照片墻效果,幫助大家更好的利用js制作特效,感興趣的朋友可以了解下
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>照片墻一多實(shí)例演示</title>
<style type="text/css">
body,div,h2,ul,li{margin:0;padding:0;}
body{font:12px/1.5 Arail;}
.box{width:860px;margin:10px auto;background:#eee;border:1px solid #b8b8b8;overflow:hidden}
.title{height:30px;line-height:30px;font-size:14px;padding:0 15px 0 35px;border-bottom:1px solid #b8b8b8;background:#fafafa url(http://js.alixixi.com/img/mm/ico.gif) 5px 50% no-repeat;}
.title span{float:left;}
.title a{float:right;color:#06f;outline:none;}
.title a:hover{color:red;}
.box ul{float:left;padding:0 15px 15px 0;}
.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;}
.box li img{float:left;width:140px;height:105px;}
.box li.hig{padding:5px;border:2px dashed #f30;opacity:0.5;filter:alpha(opacity=50);}
</style>
<script type="text/javascript">
//獲取ID
var $ = function (id) {return typeof id === "string" ? document.getElementById(id) : id};
//獲取tagName
var $$ = function (tagName, oParent) {return (oParent || document).getElementsByTagName(tagName)};
//獲取class
var $$$ = function (sClass, oParent) {
 var aClass = [],
 i = 0,
 reClass = new RegExp("(\\s|^)" + sClass + "($|\\s)"),
 aElement = $$("*", oParent);
 for (i = 0; i < aElement.length; i++)reClass.test(aElement[i].className) && aClass.push(aElement[i]);
 return aClass
};
//獲取元素位置
function getPos(obj) {
 var iTop = obj.offsetTop;
 var iLeft = obj.offsetLeft;
 while (obj.offsetParent)
 {
 iTop += obj.offsetParent.offsetTop;
 iLeft += obj.offsetParent.offsetLeft;
 obj = obj.offsetParent;
 }
 return {top:iTop, left:iLeft} 
};
//創(chuàng)建照片墻對(duì)象
var PhotoWall = function () {this.initialize.apply(this, arguments)};
PhotoWall.prototype = {
 initialize: function (obj, aData)
 {
 var oThis = this;
 this.oParent = $(obj);
 this.oUl = $$("ul", this.oParent)[0];
 this.oBtn = $$("a", this.oParent)[0];
 this.zIndex = 1;
 this.aPos = [];
 this.aData = aData;
 this.dom = document.documentElement || document.body;
 this.create();
 this.oBtn.onclick = function () {oThis.randomOrder()}
 },
 create: function ()
 {
 var aFrag = document.createDocumentFragment();
 var i = 0;
 for (i = 0; i < this.aData.length; i++)
 {
  var oLi = document.createElement("li");
  var oImg = document.createElement("img");
  oImg.src = this.aData[i];
  oLi.appendChild(oImg);
  aFrag.appendChild(oLi) 
 }
 this.oUl.appendChild(aFrag);
 this.aLi = $$("li", this.oParent);
 this.changeLayout()
 },
 changeLayout: function ()
 {
 var i = 0;
 this.oParent.style.height = this.oParent.offsetHeight - 2 + "px";
 this.aPos.length = 0;
 for (i = 0; i < this.aLi.length; i++) this.aLi[i].style.cssText = ""; 
 for (i = 0; i < this.aLi.length; i++)
 {
  this.aLi[i].index = i;
  this.aLi[i].style.top = getPos(this.aLi[i]).top + "px";
  this.aLi[i].style.left = getPos(this.aLi[i]).left + "px";
  this.aPos.push({left:getPos(this.aLi[i]).left, top:getPos(this.aLi[i]).top})
 }
 for (i = 0; i < this.aLi.length; i++)
 {
  this.aLi[i].style.position = "absolute"; 
  this.aLi[i].style.margin = "0";  
  this.drag(this.aLi[i])
 } 
 },
 drag: function (obj, handle)
 {
 var oThis = this;
 var handle = handle || obj;
 handle.style.cursor = "move";
 handle.onmousedown = function (event)
 {
  var event = event || window.event; 
  var disX = event.clientX - this.offsetLeft;
  var disY = event.clientY - this.offsetTop;
  var oNear = null;
  handle.style.zIndex = oThis.zIndex++;
  
  document.onmousemove = function (event)
  {
  var event = event || window.event;
  var iL = event.clientX - disX;
  var iT = event.clientY - disY;
  var maxL = Math.max(oThis.dom.clientWidth, oThis.dom.scrollWidth) - handle.offsetWidth;
  var maxT = Math.max(oThis.dom.clientHeight, oThis.dom.scrollHeight) - handle.offsetHeight;
  
  iL < 0 && (iL = 0);
  iT < 0 && (iT = 0);
  iL > maxL && (iL = maxL);
  iT > maxT && (iT = maxT);
    
  handle.style.left = iL + "px";
  handle.style.top = iT + "px";
  
  oNear = oThis.findNearest(obj);
  
  for (var i = 0; i < oThis.aLi.length; i++) oThis.aLi[i].className = "";
  
  oNear && (oNear.className = "hig");
  
  return false
  };
  document.onmouseup = function ()
  {
  document.onmousemove = null;
  document.onmouseup = null;
  
  if (oNear)
  {
   handle.index = [handle.index, oNear.index];
   oNear.index = handle.index[0];
   handle.index = handle.index[1];
   oNear.style.zIndex = oThis.zIndex++;
   oThis.doMove(handle, oThis.aPos[handle.index]);
   oThis.doMove(oNear, oThis.aPos[oNear.index]);   
   oNear.className = "";
  }
  else
  {
   oThis.doMove(handle, oThis.aPos[handle.index]) 
  }
  
  handle.releaseCapture && handle.releaseCapture()
  };
  this.setCapture && this.setCapture();
  return false
 };
 },
 doMove: function (obj, iTarget, callback)
 {
 var oThis = this;
 clearInterval(obj.timer);
 obj.timer = setInterval(function ()
 {
  var iCurL = getPos(obj).left;
  var iCurT = getPos(obj).top;
  var iSpeedL = (iTarget.left - iCurL) / 5;
  var iSpeedT = (iTarget.top - iCurT) / 5;
  iSpeedL = iSpeedL > 0 ? Math.ceil(iSpeedL) : Math.floor(iSpeedL);
  iSpeedT = iSpeedT > 0 ? Math.ceil(iSpeedT) : Math.floor(iSpeedT);
  
  if (iCurL == iTarget.left && iCurT == iTarget.top)
  {
  clearInterval(obj.timer);
  callback && callback() 
  }
  else
  {
  obj.style.left = iCurL + iSpeedL + "px";
  obj.style.top = iCurT + iSpeedT + "px" 
  }
 }, 30)
 },
 findNearest: function (obj)
 {
 var aDistance = [];
 var i = 0;
 for (i = 0; i < this.aLi.length; i++) aDistance[i] = this.aLi[i] == obj ? Number.MAX_VALUE : this.getDistance(obj, this.aLi[i]);
 
 var minNum = Number.MAX_VALUE;
 var minIndex = -1;
 for (i = 0; i < aDistance.length; i++) aDistance[i] < minNum && (minNum = aDistance[i], minIndex = i);
 
 return this.isButt(obj, this.aLi[minIndex]) ? this.aLi[minIndex] : null
 },
 getDistance: function(obj1, obj2)
 {
 var a = (obj1.offsetLeft + obj1.offsetWidth / 2) - (obj2.offsetLeft + obj2.offsetWidth / 2);
 var b = (obj1.offsetTop + obj1.offsetTop / 2) - (obj2.offsetTop + obj2.offsetTop / 2);
 return Math.sqrt(a * a + b * b)
 },
 isButt: function (obj1, obj2)
 {
 var l1 = obj1.offsetLeft;
 var t1 = obj1.offsetTop;
 var r1 = l1 + obj1.offsetWidth;
 var b1 = t1 + obj1.offsetHeight;
 
 var l2 = obj2.offsetLeft;
 var t2 = obj2.offsetTop;
 var r2 = l2 + obj2.offsetWidth;
 var b2 = t2 + obj2.offsetHeight;
 
 return !(r1 < l2 || b1 < t2 || r2 < l1 || b2 < t1)
 },
 randomOrder: function ()
 {
 this.aPos.sort(function () {return Math.random() > 0.5 ? 1 : -1});
 for (var i = 0; i < this.aLi.length; i++)
 {
  this.aLi[i].index = i;
  this.doMove(this.aLi[i], this.aPos[i])
 }
 }
};
window.onload = function ()
{
 var aBox = $$$("box");
 var aData = [];
 var aExample = [];
 var i = 0;
 //生成圖片數(shù)據(jù)
 for (i = 0; i < 20; i++) aData[aData.length] = "http://js.alixixi.com/img/mm/" + i + ".jpg";
 //循環(huán)創(chuàng)建多個(gè)實(shí)例
 for (i = 0; i < aBox.length; i++)
 {
 var oExample = new PhotoWall(aBox[i], aData);
 aExample.push(oExample)
 }
 this.onresize = function ()
 {
 for (var p in aExample) aExample[p].changeLayout() 
 };
 this.onresize()
};
</script>
</head>
<body>
<div class="box">
  <h2 class="title"><span>一堆90后</span><a href="javascript:;" rel="external nofollow" rel="external nofollow" class="order">隨機(jī)排序</a></h2>
  <ul></ul>
</div>
<div class="box">
  <h2 class="title"><span>一堆90后</span><a href="javascript:;" rel="external nofollow" rel="external nofollow" class="order">隨機(jī)排序</a></h2>
  <ul></ul>
</div>
</body>
</html>

效果:

以上就是原生js實(shí)現(xiàn)照片墻效果的詳細(xì)內(nèi)容,更多關(guān)于js 照片墻的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解用webpack的CommonsChunkPlugin提取公共代碼的3種方式

    詳解用webpack的CommonsChunkPlugin提取公共代碼的3種方式

    本篇文章主要介紹了詳解用webpack的CommonsChunkPlugin提取公共代碼的3種方式,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-11-11
  • 使用微信小程序制作核酸檢測(cè)點(diǎn)查詢工具

    使用微信小程序制作核酸檢測(cè)點(diǎn)查詢工具

    出門在外,沒(méi)有核酸證明寸步難行,此文將教你如何通過(guò)小程序制作一個(gè)工具幫你在人生地不熟的情況如何迅速找到核酸檢測(cè)點(diǎn),實(shí)現(xiàn)核酸點(diǎn)查詢、地圖導(dǎo)航、撥號(hào)等功能,需要的朋友可以參考下
    2022-10-10
  • Javascript中判斷變量是數(shù)組還是對(duì)象(array還是object)

    Javascript中判斷變量是數(shù)組還是對(duì)象(array還是object)

    怎樣判斷一個(gè)JavaScript變量是array還是obiect,或許有很多初學(xué)者對(duì)此不是很清楚吧,下面為大家詳細(xì)解答下,希望對(duì)大家有所幫助
    2013-08-08
  • IE的有條件注釋判定IE版本詳解(附實(shí)例代碼)

    IE的有條件注釋判定IE版本詳解(附實(shí)例代碼)

    IE的有條件注釋是一種專有的(因此是非標(biāo)準(zhǔn)的)、對(duì)常規(guī)(X)HTML注釋的Miscrosoft擴(kuò)展。顧名思義,有條件注釋使你能夠根據(jù)條件(比如瀏覽器版本)顯示代碼塊(不一定就是css,也可以是html代碼,甚至是JavaScript代碼)。
    2012-01-01
  • js漢字轉(zhuǎn)拼音實(shí)現(xiàn)代碼

    js漢字轉(zhuǎn)拼音實(shí)現(xiàn)代碼

    漢字轉(zhuǎn)拼音,比較娛樂(lè)的一款應(yīng)用,感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)js有所幫助
    2013-02-02
  • JavaScript實(shí)現(xiàn)單鏈表過(guò)程解析

    JavaScript實(shí)現(xiàn)單鏈表過(guò)程解析

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)單鏈表過(guò)程,鏈表中的元素在內(nèi)存中不必是連續(xù)的空間。鏈表的每個(gè)元素有一個(gè)存儲(chǔ)元素本身的節(jié)點(diǎn)和指向下一個(gè)元素的引用。下面請(qǐng)和小編一起進(jìn)入文章了解更多的詳細(xì)內(nèi)容吧
    2021-12-12
  • JavaScript編程學(xué)習(xí)技巧匯總

    JavaScript編程學(xué)習(xí)技巧匯總

    這篇文章主要介紹了JavaScript編程學(xué)習(xí)技巧匯總,整理了編程技巧、實(shí)用函數(shù)、簡(jiǎn)潔方法、編程細(xì)節(jié)等相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 利用JS如何獲取form表單數(shù)據(jù)

    利用JS如何獲取form表單數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于利用JS如何獲取form表單數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 詳解axios跨端架構(gòu)是如何實(shí)現(xiàn)的

    詳解axios跨端架構(gòu)是如何實(shí)現(xiàn)的

    我們都知道,axios 是是一個(gè)跨平臺(tái)請(qǐng)求方案,在瀏覽器端采用 XMLHttpRequest API 進(jìn)行封裝,而在 Node.js 端則采用 http/https 模塊進(jìn)行封裝,那么本文,我們將來(lái)探討這個(gè)話題:axios 的跨端架構(gòu)是如何實(shí)現(xiàn)的,需要的朋友可以參考下
    2024-04-04
  • React中過(guò)渡動(dòng)畫(huà)的編寫方式實(shí)例詳解

    React中過(guò)渡動(dòng)畫(huà)的編寫方式實(shí)例詳解

    在開(kāi)發(fā)中我們想要給一個(gè)組件的顯示和消失添加某種過(guò)渡動(dòng)畫(huà),可以很好的增加用戶體驗(yàn),下面這篇文章主要給大家介紹了關(guān)于React中過(guò)渡動(dòng)畫(huà)的編寫方式,需要的朋友可以參考下
    2022-10-10

最新評(píng)論