美文网首页
瀑布流预加载和响应式布局

瀑布流预加载和响应式布局

作者: 胡自鲜 | 来源:发表于2017-11-07 20:58 被阅读0次
    <!doctype html>
    <html>
        <head>
            <meta charset="utf-8" />
            <title>图片版瀑布流</title>
            <style type="text/css">
                .box{
                    width: 850px;
                    border: 1px purple solid;
                    position: relative;
                    margin:0 auto;
                    min-width: 220px;
                }
                .box img{
                    width: 200px;
                    position: absolute;
                    transition:0.5s;
                }
            </style>
        </head>
        <body>
            <div>
                <!-- 进度条 -->
                <progress min="0" max="100" value="0" id="progress" ></progress>
            </div>
            <div class="box">       
            </div>
        </body>
        <script type="text/javascript">
            var progress = document.getElementById("progress");
            var box = document.getElementsByClassName('box')[0];
            var heightArr = [];
            var count = 0;
            var arr = ["wk1.png", "bg.png", "cold.png", "wm.png"]
            var imgArr = [];
            for(var j = 0; j < 16; j++){
                var readyImg = new Image();
                imgArr.push(readyImg);
                readyImg.src = "imgs/P_0" + j + ".jpg";
                readyImg.onload = function(){
                    count++;
                    progress.value = (count / 16) * 100;
                    if(count == 16){
                        start();
                        //  把改变窗口方法放在预加载里,否则当图片加载时拖动窗口图片会一张一张显示
                        re();   
                    }
                }
            }
            //   加一个开关让过渡有效果,否则再次调用start方法时,会把img再次插入,transtion不会有用
            var isFirst = true;
            function start(){
                //  ****************************************
                //  onresize里面的方法放上来为了让刷新页面的时候也会发生变化
                var l = parseInt((window.innerWidth - 16)/200);
                //  当窗口移动的范围很小时,还是当前列数时,不用重新布局,直接return
                //  当l为0时heightArr.length为0,刷新页面下面不会执行,所以会堆叠在一起
                if(heightArr.length ==l && l !=0){
                    return;
                }
                console.log("重新布局");
                //如果窗口列数不足一列,也要保证heightArr.length的长度为1
                //当l为0时,heightArr.length为1;(至少放一列)
                heightArr.length = l == 0 ? 1 : l;
                box.style.width = 210 * l + "px";
                for(var i=0; i <heightArr.length; i++){
                    heightArr[i] = 0;
                }
                //  **********************************************
                //   比较每列数组的长度,将生成的图片插入长度最小的数组
                for(var i = 0; i < 16; i++){
                    var img = imgArr[i]
                    var minIndex = 0;
                    for(var j = 1; j < heightArr.length; j++){
                        if (heightArr[minIndex] > heightArr[j]) {
                            minIndex = j;
                        }
                    }
                    img.style.left = minIndex * 210 + "px";
                    img.style.top = heightArr[minIndex] + "px";
                    if(isFirst){
                        box.appendChild(img);   
                    }
                    heightArr[minIndex] += (img.offsetHeight + 10);
                }
                isFirst = false;
            }
            // 改变窗口大小,让整个box的宽度
            function re(){
                window.onresize = function(){
                    start();
                }
            }   
        </script>
    </html>
    

    相关文章

      网友评论

          本文标题:瀑布流预加载和响应式布局

          本文链接:https://www.haomeiwen.com/subject/nnhsmxtx.html