第十一周第二天筆記之照片墻實(shí)例

1 照片墻實(shí)例

  • 需求:圖片可拖拽,當(dāng)拖拽的圖片與其他圖片重合時(shí)沼溜,當(dāng)鼠標(biāo)抬起事件發(fā)生時(shí)平挑,與重合最多的進(jìn)行位置互換,如果沒有重合圖片就回到原來位置系草,當(dāng)點(diǎn)擊圖片拖拽時(shí)通熄,圖片的邊框?yàn)辄S色,在拖拽過程中找都,如重合最多的圖片的邊框也變成黃色唇辨,當(dāng)鼠標(biāo)抬起后,兩張圖片進(jìn)行位置互換檐嚣,互換完成后邊框恢復(fù)原來顏色助泽;
  • 思路:
    • 頁面布局啰扛,浮動(dòng)布局,添加margin間距嗡贺;
    • 如果需要拖拽隐解,圖片的布局必須是定位布局,所以需要將浮動(dòng)布局轉(zhuǎn)化為定位布局诫睬;
    • 遍歷圖片煞茫,添加拖拽功能,利用在拖拽中的接口來增加功能摄凡,進(jìn)行綁定執(zhí)行续徽;
    • 在mousedown事件中設(shè)置的接口行為是myDragDown,給其綁定行為方法亲澡,當(dāng)鼠標(biāo)按下時(shí)钦扭,將該圖片的層級(jí)提高,浮在所有圖片之上;
    • 在mousemove事件中設(shè)置的接口行為是myDragMove,給其綁定行為方法笨鸡,當(dāng)鼠標(biāo)移動(dòng)時(shí)茅茂,判斷跟哪個(gè)圖片進(jìn)行碰撞,如果碰撞了就放入ary數(shù)組中,然后對(duì)數(shù)組進(jìn)行一系列的操作;
    • 通過公式計(jì)算出斜邊的距離,賦值在圖片的自定義屬性上仰担,距離越短,證明重合越多绩社,所以需要對(duì)ary數(shù)組中的每一項(xiàng)身上的自定義屬性值進(jìn)行排序摔蓝,然后取最小的,對(duì)其進(jìn)行操作铃将;將其邊框變?yōu)辄S色项鬼;
    • 在mouseup事件中設(shè)置的接口行為時(shí)myDragUp,給其綁定行為方法劲阎,當(dāng)鼠標(biāo)抬起時(shí)绘盟,讓兩個(gè)圖片進(jìn)行為值互換;然后互換完悯仙,將其邊框恢復(fù)原色龄毡;
  • 知識(shí)點(diǎn):
    • 定位布局:定位元素的盒子模型(包括margin)相對(duì)于定位父級(jí)元素的內(nèi)邊框邊緣進(jìn)行定位;
    • 定位元素的offsetLeft是元素的外邊框到定位父級(jí)內(nèi)邊框邊緣的距離锡垄;而添加定位的left值沦零,是元素包含margin的整體相對(duì)于定位父級(jí)的內(nèi)邊框邊緣的距離;
    • 判斷兩個(gè)圖片是否碰撞重合:判斷四個(gè)邊的位置比較货岭,返回值為布爾值路操;
  • 注意點(diǎn):
    • 圖片的定位都是相對(duì)于外容器wrap定位疾渴;
    • 浮動(dòng)布局轉(zhuǎn)化為定位布局時(shí),注意margin的影響屯仗;需要將圖片的margin值賦為0搞坝;
    • 浮動(dòng)布局轉(zhuǎn)化為定位布局時(shí),需要先獲取位置值魁袜,在設(shè)置定位桩撮,遍歷圖片時(shí),需要從最后一個(gè)開始轉(zhuǎn)化峰弹,不然會(huì)出現(xiàn)覆蓋問題店量;
    • short的值問題,short必須設(shè)置為全局變量鞠呈,這樣在不同的函數(shù)中才能獲取short值融师;
    • ary數(shù)組為空的時(shí)候,代表沒有重合的圖片蚁吝,則讓其回到原來位置诬滩,但需要注意的是,sort在不斷被重新賦值灭将,所以在按下事件中,一定要給short賦值為null后控;如果數(shù)組為空時(shí)庙曙,也讓short為null;
    • 在交換的函數(shù)swapPos中,判斷short是否存在浩淘,如果存在就互換位置值捌朴,設(shè)置位置值;如果不存在张抄,則讓圖片回到原來位置砂蔽;
  • 代碼:
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>照片墻實(shí)例</title>
         <style>
             *{
                 margin: 0;
                 padding: 0;
             }
             .wrap{
                 width: 792px;
                 height: 462px;
                 margin: 30px auto;
                 background-color: lightskyblue;
                 padding: 10px;
                 position: relative;
             }
             .wrap img{
                 float: left;
                 width: 250px;
                 height: 140px;
                 margin: 5px;
                 border: 2px solid lightcoral;
             }
         </style>
     </head>
     <body>
     <div class="wrap" id="wrap">
         <img src="img/1.jpg" alt="">
         <img src="img/2.jpg" alt="">
         <img src="img/3.jpg" alt="">
         <img src="img/4.jpg" alt="">
         <img src="img/5.jpg" alt="">
         <img src="img/6.jpg" alt="">
         <img src="img/7.jpg" alt="">
         <img src="img/8.jpg" alt="">
         <img src="img/9.jpg" alt="">
     </div>
     <script src="JS/00utils.js"></script>
     <script src="JS/01Event.js"></script>
     <script src="JS/02Animate.js"></script>
     <script src="JS/04Drag.js"></script>
     <script>
         var oWrap=document.getElementById("wrap");
         var aImg=oWrap.getElementsByTagName("img");
         var zIndex=0;
         var short=null;
         for(var i=aImg.length-1; i>=0; i--){
             //拖拽必須為定位布局,即將浮動(dòng)布局轉(zhuǎn)化為定位布局
             var cur=aImg[i];
             cur.style.left=(cur.l=cur.offsetLeft)+"px";//將位置保存在自己的私有屬性上
             cur.style.top=(cur.t=cur.offsetTop)+"px";
             cur.style.position="absolute";//先獲取位置署惯,后設(shè)置定位左驾;
             cur.style.margin=0;
             new Drag({ele:cur}).on("myDragDown",increaseZIndex).on("myDragMove",Collision).on("myDragUp",swapPos);//鏈?zhǔn)讲僮?     }
         //按下時(shí),提高層級(jí)
         function increaseZIndex() {
             short=null;
             this.ele.style.borderColor="yellow";
             this.ele.style.zIndex=++zIndex;
         }
         //比較兩個(gè)圖片是否碰撞极谊,返回布爾值
         function isCollision(img1,img2) {
             if((img1.offsetLeft+img1.offsetWidth<img2.offsetLeft) || (img1.offsetTop+img1.offsetHeight<img2.offsetTop) || (img1.offsetLeft>img2.offsetLeft+img2.offsetWidth) || (img1.offsetTop>img2.offsetTop+img2.offsetHeight)){
                 //四種情況只要有一種情況成立诡右,就代表沒有碰到
                 return false;
             }else{
                 return true;
             }
         }
         //移動(dòng)過程中的判斷
         function Collision() {
             //此時(shí)this為實(shí)例對(duì)象,this.ele為當(dāng)前移動(dòng)的元素轻猖,與其他的所有圖片進(jìn)行比較
             var ary=[];
             for(var i=0; i<aImg.length; i++){
                 if(aImg[i]===this.ele) continue;//如果為移動(dòng)圖片本身就跳過此次循環(huán)帆吻;
                 if(isCollision(this.ele,aImg[i])){
                     ary.push(aImg[i]);
                 }
             }
             if(ary.length){
                 for(var i=0; i<ary.length; i++){
                     //將計(jì)算的值放在每個(gè)圖片自定義屬性身上
                     ary[i].dis=Math.sqrt(Math.pow(this.ele.offsetLeft-ary[i].offsetLeft,2)+Math.pow(this.ele.offsetTop-ary[i].offsetTop,2));
                 }
                 //對(duì)計(jì)算的值進(jìn)行排序,取最短的
                 ary.sort(function (a, b) {
                     return a.dis-b.dis;
                 });
                 short=ary[0];
                 short.style.borderColor="yellow";
                 for(var i=1; i<ary.length; i++){
                     ary[i].style.borderColor="lightcoral";
                 }
             }else{//如果ary為空咙边,則將short賦值為空猜煮;
                 if(short){short.style.borderColor="lightcoral";}
                 short=null;
             }
         }
         function swapPos() {
             //互換位置次员,即讓兩個(gè)圖片身上的自定義屬性值互換,然后各自設(shè)置各自身上的值王带;
             if(short){//當(dāng)short存在的時(shí)候讓位置互換淑蔚,不存在即為null則讓其回原來位置;
                 var tmp={};
                 tmp.l=this.ele.l;
                 tmp.t=this.ele.t;
                 this.ele.l=short.l;
                 this.ele.t=short.t;
                 short.l=tmp.l;
                 short.t=tmp.t;
                 /*animate({
                     ele:this.ele,
                     target:{
                         left:this.ele.l,
                         top:this.ele.t,
                     },
                     duration: 500,
                     effect: 2
                 });*/
                 short.style.zIndex=++zIndex;
                 this.ele.style.zIndex=++zIndex;
                 animate({
                     ele:short,
                     target:{
                         left:short.l,
                         top:short.t,
                     },
                     duration: 500,
                     effect: 2,
                     callback:function () {
                         this.style.borderColor="lightcoral";
                     }
                 });
             }
             //當(dāng)short為null的時(shí)候辫秧,讓元素回到自己位置
             animate({
                 ele:this.ele,
                 target:{
                     left:this.ele.l,
                     top:this.ele.t,
                 },
                 duration: 500,
                 effect: 2,
                 callback:function () {
                     this.style.borderColor="lightcoral";
                 }
             })
         }
     </script>
     </body>
     </html>
    
  • 復(fù)習(xí)照片墻實(shí)例代碼
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>照片墻實(shí)例復(fù)習(xí)</title>
         <style>
             *{
                 margin: 0;
                 padding: 0;
             }
             h1{
                 width: 100%;
                 height: 80px;
                 line-height: 80px;
                 text-align: center;
             }
             .container{
                 width: 800px;
                 height: 470px;
                 background-color: lightskyblue;
                 padding: 10px;
                 margin: 0 auto;
                 box-sizing: border-box;
             }
             .container img{
                 float: left;
                 width: 250px;
                 height: 140px;
                 margin: 5px;
                 border: 2px solid lightcoral;
                 box-sizing: border-box;
             }
         </style>
     </head>
     <body>
     <h1>美女照片墻</h1>
     <div class="container">
         <img src="./img/1.jpg" alt="tu"/><img src="./img/2.jpg" alt="tu"/><img src="./img/3.jpg" alt="tu"/><img src="./img/4.jpg" alt="tu"/><img src="./img/5.jpg" alt="tu"/><img src="./img/6.jpg" alt="tu"/><img src="./img/7.jpg" alt="tu"/><img src="./img/8.jpg" alt="tu"/><img src="./img/9.jpg" alt="tu"/>
     </div>
     <script src="js/myutils.js"></script>
     <script src="js/myEvent.js"></script>
     <script src="js/finallyAnimate.js"></script>
     <script src="js/EventEmitter.js"></script>
     <script src="js/Drag.js"></script>
     <script>
         //獲取元素
         var oCon=utils.getByClass("container")[0];
         var aImg=utils.getChildren(oCon,"img");
         //如果使用拖拽必須為定位布局束倍,所以需要將每個(gè)圖片變?yōu)槎ㄎ徊季?
         //圖片相對(duì)于外容器進(jìn)行定位;所以外容器添加相對(duì)定位
         toPosition();
         function toPosition() {
             utils.css(oCon,"position","relative");
             //從最后一個(gè)開始設(shè)置定位盟戏,獲取其位置值
             for(var i=aImg.length-1; i>=0;i--){
                 //先獲取位置值绪妹,后設(shè)置絕對(duì)定位
                 aImg[i].initLeft=aImg[i].offsetLeft;
                 aImg[i].initTop=aImg[i].offsetTop;
                 utils.css(aImg[i],{
                     margin:0,
                     position: "absolute",
                     left:aImg[i].initLeft,
                     top:aImg[i].initTop
                 })
             }
         }
         //圖片添加拖拽功能
         imgDrag();
         function imgDrag() {
             for(var i=0; i<aImg.length; i++){
                 var drag=new Drag({
                     ele:aImg[i]
                 });
                 drag.on("mymousedown",myDragdown).on("mymousemove",myDragmove).on("mymouseup",myDragup);
     
             }
             //myDragdown函數(shù)
             function myDragdown() {
                 //提高圖片的層級(jí)
                 this.bgc=utils.css(this.ele,"borderColor");
                 utils.css(this.ele,{
                     borderColor:"yellow",
                     zIndex:3
                 });
                 this.otherImg=utils.siblings(this.ele);
             }
             //myDragmove函數(shù)
             function myDragmove() {
                 this.ary=[];
                 for(var i=0; i<this.otherImg.length; i++){
                     //比較兩個(gè)圖片之間的位置
                     var tt=utils.offset(this.ele).top+this.ele.offsetHeight<utils.offset(this.otherImg[i]).top;
                     var tb=utils.offset(this.ele).top>utils.offset(this.otherImg[i]).top+this.otherImg[i].offsetHeight;
                     var rl=utils.offset(this.ele).left+this.ele.offsetWidth<utils.offset(this.otherImg[i]).left;
                     var lr=utils.offset(this.ele).left>utils.offset(this.otherImg[i]).left+this.otherImg[i].offsetWidth;
                     utils.css(this.otherImg[i],{
                         borderColor:this.bgc,
                         zIndex:1
                     });
                     if(!(tt||tb||rl||lr)){
                         //計(jì)算出距離,綁定在元素的自定義屬性上
                         this.otherImg[i].short=imgShort(this.ele,this.otherImg[i]);
                         this.ary.push(this.otherImg[i]);
                     }
                 }
                 //數(shù)組進(jìn)行排序柿究,排序目標(biāo)為圖片身上的short屬性
                 if(this.ary.length>0){
                     this.ary.sort(function (a,b) {
                         a=a.short;
                         b=b.short;
                         return a-b;//升序
                     });
                     //取最短的改變邊框顏色邮旷,其他的恢復(fù)原邊框顏色;
                     utils.css(this.ary[0],{
                         borderColor:"yellow",
                         zIndex:2
                     });
                 }
                 //比較數(shù)組中的元素哪個(gè)與移動(dòng)元素重合最多
                 //計(jì)算兩個(gè)圖片左上角點(diǎn)之間的距離蝇摸,最短的婶肩,重合度越高
                 function imgShort(curImg,tarImg) {
                     var curImgLeft=utils.offset(curImg).left;
                     var curImgTop=utils.offset(curImg).top;
                     var tarImgLeft=utils.offset(tarImg).left;
                     var tarImgTop=utils.offset(tarImg).top;
                     return Math.pow(tarImgLeft-curImgLeft,2)+Math.pow(tarImgTop-curImgTop,2);
                 }
     
             }
             //myDragup
             function myDragup() {
                 //鼠標(biāo)抬起事件后,判斷ary的長(zhǎng)度
                 if(!this.ary){
                     utils.css(this.ele,"borderColor",this.bgc);
                     return;
                 }
                 if(this.ary.length>0){
                     //如果數(shù)組不為空貌夕,就讓移動(dòng)元素與距離最短的互換位置律歼;
                     var l,t;
                     l=this.ele.initLeft;
                     t=this.ele.initTop;
                     this.ele.initLeft=this.ary[0].initLeft;
                     this.ele.initTop=this.ary[0].initTop;
                     this.ary[0].initLeft=l;
                     this.ary[0].initTop=t;
                 }
                 var othis=this;
                 for(var i=0; i<aImg.length; i++){
                     animate({
                         ele:aImg[i],
                         target:{
                             left:aImg[i].initLeft,
                             top:aImg[i].initTop
                         },
                         duration:300,
                         callback:function () {
                             utils.css(this,{
                                 borderColor:othis.bgc,
                                 zIndex:1
                             });
                             othis.ary=null;
                         }
                     })
                 }
             }
         }
     </script>
     </body>
     </html>
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市啡专,隨后出現(xiàn)的幾起案子险毁,更是在濱河造成了極大的恐慌,老刑警劉巖们童,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畔况,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡慧库,警方通過查閱死者的電腦和手機(jī)跷跪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來齐板,“玉大人吵瞻,你說我怎么就攤上這事「誓ィ” “怎么了听皿?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宽档。 經(jīng)常有香客問我尉姨,道長(zhǎng),這世上最難降的妖魔是什么吗冤? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任又厉,我火速辦了婚禮九府,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘覆致。我一直安慰自己侄旬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布煌妈。 她就那樣靜靜地躺著儡羔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪璧诵。 梳的紋絲不亂的頭發(fā)上汰蜘,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音之宿,去河邊找鬼族操。 笑死,一個(gè)胖子當(dāng)著我的面吹牛比被,可吹牛的內(nèi)容都是我干的色难。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼等缀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼枷莉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尺迂,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤依沮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后枪狂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宋渔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年州疾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皇拣。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡严蓖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氧急,到底是詐尸還是另有隱情颗胡,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布吩坝,位于F島的核電站毒姨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏钉寝。R本人自食惡果不足惜弧呐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一闸迷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俘枫,春花似錦腥沽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茅信,卻和暖如春盾舌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汹押。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工矿筝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棚贾。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓窖维,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親妙痹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铸史,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,751評(píng)論 1 92
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5怯伊? 答:HTML5是最新的HTML標(biāo)準(zhǔn)琳轿。 注意:講述HT...
    kismetajun閱讀 27,485評(píng)論 1 45
  • 學(xué)會(huì)使用CSS選擇器熟記CSS樣式和外觀屬性熟練掌握CSS各種選擇器熟練掌握CSS各種選擇器熟練掌握CSS三種顯示...
    七彩小鹿閱讀 6,314評(píng)論 2 66
  • 概述 在網(wǎng)易云課堂學(xué)習(xí)李南江老師的《從零玩轉(zhuǎn)HTML5前端+跨平臺(tái)開發(fā)》時(shí),所整理的筆記耿芹。筆記內(nèi)容為根據(jù)個(gè)人需求所...
    墨荀閱讀 2,336評(píng)論 0 7
  • 很多學(xué)平面設(shè)計(jì)的人都會(huì)遇到一個(gè)問題吧秕,那就是學(xué)平面設(shè)計(jì)需要學(xué)手繪嗎琉闪?手繪這個(gè)問題是很多學(xué)員一直關(guān)注的問題,那么學(xué)平面...
    黑色星期九閱讀 7,605評(píng)論 0 0