簡易照片墻

其中ul標簽給了margin:50px auto;是為了方便,在IE7-無效。

  <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="author" content="十七-vikang" />
    <title>十七 - http://www.lxweimin.com/u/626b6b7f6b78</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            list-style: none;
        }
        #ul1 {
            width: 516px;
            overflow: hidden;
            margin: 50px auto;
        }
        #ul1 li {
            width: 150px;
            height: 150px;
            float: left;
            margin: 10px;
            border: 1px solid #000;
            background-color: aqua;
            text-align: center;
            font-size: 100px;
            line-height: 150px;
            color: blue;
        }
        #ul1 li img {
            width: 100%;
            height: 100%;
        }
    </style>
    <script>
        function getStyle(obj,name){
            return obj.currentStyle?obj.currentStyle[name]:getComputedStyle(obj,false)[name];
        }
        function move(obj,json,opitions){
            //opitions={ duration,easing,complete}
            opitions = opitions || {};
            opitions.duration = opitions.duration || '800';
            opitions.easing = opitions.easing || 'ease-in';
            clearInterval(obj.timer);
            //json={width:0,height:0};
            var start = {};
            //json={width:200,height:200};
            var dis= {};
            for(var name in json){
                start[name] = parseFloat(getStyle(obj,name));
                dis[name] = json[name]-start[name];
            }
            var count = Math.floor(opitions.duration/30);
            var n = 0;
            obj.timer = setInterval(function(){
                n++
                for(var name in json){
                    switch(opitions.easing){
                        case 'linear':
                            var a = n/count;
                            var cur = dis[name]*a;
                            break;
                        case 'ease-in':
                            var a = n/count;
                            var cur = dis[name]*a*a*a;
                            break;
                        case 'ease-out':
                            var a = 1-n/count;
                            var cur = dis[name]*(1-a*a*a);
                            break;
                    }
                    /*var a = n/count;
                    var cur = dis[name]*a;*/
                    if(name=='opacity'){
                        obj.style[name]=start[name]+cur;
                        obj.style.filter='alpha(opacity:'+(start[name]+cur)*100+')';
                    }else{
                        obj.style[name]=start[name]+cur+'px';
                    }
                }
                if(n==count){
                    clearInterval(obj.timer);
                    opitions.complete && opitions.complete();
                }
            },30);
        }
    </script>
    <script>
        // 獲取兩個物體之間的距離
        function getDis(obj1,obj2) {
            var l1 = obj1.offsetLeft + obj1.offsetWidth/2;
            var t1 = obj1.offsetTop + obj1.offsetHeight/2;

            var l2 = obj2.offsetLeft + obj2.offsetWidth/2;
            var t2 = obj2.offsetTop + obj2.offsetHeight/2;
            var a = l2 - l1;
            var b = t2 - t1;
            return Math.sqrt(a*a+b*b);
        }

        // 碰撞檢測
        function collTest(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 (l1 > r2 || t1 > b2 || r1 < l2 || b1 < t2) {
                return false;
            } else {
                return true;
            }
        }

        window.onload = function() {
            var oUl = document.getElementById('ul1');
            var aLi = oUl.children;
            var oBtn = document.getElementById('btn1');
            var zIndex = 1000;

            // 布局轉化
            var aPos = [];
            for (var i = 0; i < aLi.length; i++) {
                aPos[i] = {
                    left: aLi[i].offsetLeft,
                    top: aLi[i].offsetTop
                };
            }
            for (var i = 0; i < aLi.length; i++) {
                aLi[i].style.left = aPos[i].left + 'px';
                aLi[i].style.top = aPos[i].top + 'px';
                aLi[i].style.position = 'absolute';
                aLi[i].style.margin = 0;
            }

            // 拖拽
            for (var i = 0; i < aLi.length; i++) {
                drag(aLi[i]);
                aLi[i].index = i;
            }

            // 隨機換位置
            oBtn.onclick = function() {
                aPos.sort(function() {
                    return Math.random() - 0.5;
                });

                for (var i = 0; i < aLi.length; i++) {
                    move(aLi[i], aPos[aLi[i].index]);
                }
            };

            function drag(obj) {
                obj.onmousedown = function(ev) {
                    var oEvent = ev || event;
                    zIndex++;
                    // 保證當前拖拽的物體在最上面
                    obj.style.zIndex = zIndex;
                    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';
                        obj.style.top = oEvent.clientY - disY + 'px';
                        for (var i = 0; i < aLi.length; i++) {
                            aLi[i].style.border = '1px solid #000';
                        }

                        var oNear = findNearest(obj);
                        if (oNear) {
                            oNear.style.border = '3px dashed #f60';
                        }
                    };
                    document.onmouseup = function() {
                        document.onmousemove = null;
                        document.onmouseup = null;

                        var oNear = findNearest(obj);
                        if (oNear) {
                            // 碰到了 要換位置
                            // obj -> oNear
                            // oNear -> obj
                            move(oNear, aPos[obj.index]);
                            move(obj, aPos[oNear.index]);

                            // 交換索引位置
                            var temp;
                            temp = oNear.index;
                            oNear.index = obj.index;
                            obj.index = temp;
                            oNear.style.border = '1px solid #000';
                        } else {
                            // 沒有找到最近的物體 回到原來的位置
                            move(obj, aPos[obj.index]);
                        }

                        obj.releaseCapture && obj.releaseCapture();
                    };
                    obj.setCapture && obj.setCapture();
                    return false;
                };
            }

            function findNearest(obj) {
                var iMin = 999999999;
                var iMinIndex = -1;
                for (var i = 0; i < aLi.length; i++) {
                    if (obj == aLi[i]) continue;
                    // 判斷當前物體跟哪些物體有碰撞
                    if (collTest(obj,aLi[i])) {
                        // 求兩個物體之間的距離
                        var dis = getDis(obj,aLi[i]);
                        if (iMin > dis) {
                            iMin = dis;
                            iMinIndex = i;
                        }
                    }
                }
                if (iMinIndex == -1) {
                    return null;
                } else {
                    return aLi[iMinIndex];
                }
            }
        };
    </script>
</head>
<body>
    <input type="button" value="隨機換一下" id="btn1" />
    <ul id="ul1">
        <li><!--<img src="" alt="">-->1</li>
        <li><!--<img src="" alt="">-->2</li>
        <li><!--<img src="" alt="">-->3</li>
        <li><!--<img src="" alt="">-->4</li>
        <li><!--<img src="" alt="">-->5</li>
        <li><!--<img src="" alt="">-->6</li>
        <li><!--<img src="" alt="">-->7</li>
        <li><!--<img src="" alt="">-->8</li>
        <li><!--<img src="" alt="">-->9</li>
    </ul>
</body>
</html>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,779評論 1 92
  • 1.DOCTYPE 影響 CSS 處理 2.FF: div 設置 margin-left, margin-righ...
    LabRaDor2079閱讀 692評論 0 2
  • 本課來自http://www.imooc.com/learn/9請不要用作商業用途。 HTML5 HTML介紹 H...
    PYLON閱讀 3,287評論 0 5
  • 一:在制作一個Web應用或Web站點的過程中,你是如何考慮他的UI、安全性、高性能、SEO、可維護性以及技術因素的...
    Arno_z閱讀 1,200評論 0 1
  • 基本內容: html超文本標記語言。 頁面組成: html>//版本聲明 //萬國碼——gb1312解決中文亂碼 ...
    Spencerhyuk閱讀 1,320評論 0 1