zoukankan      html  css  js  c++  java
  • 两种方式实现水平瀑布流布局

    在实际开发中,经常会遇到图片排序处理的问题,进过多次尝试,我在这里总结两种图片水平排序的方式:

    第一种:CSS属性直接设置图片样式

    具体是使用CSS中的column-count属性,给图片的外部box设置后,里面的img可以直接根据数量来进行排序

    页面效果就是以下这样:

    html和css代码如下:

     

     可能细心的你会发现,但是这个属性可以进行水平对齐,但是排序会出现问题,所以应用场景有限,但是优势也很明显,就是省事(*^▽^*)。

    第二种:使用js代码来动态进行设置

    原理是通过一个数学逻辑来对图片进行计算,假设我们需要把4张大小不同的图片进行水平瀑布流对齐,我们需要先计算好所有图片的高宽比,然后给一个统一的高度,根据这个统一的高度进行排序,我们可以获得一个长方形,

    这个长方形也是有宽高比的,我们把它计算出来,然后将宽度调整为页面宽度,那么这个时候高度我们自需要调整宽高比就可以确定,根据这个调整好的高度,我们再根据4张图片的宽高比,来获取这个时候的宽度,对图片进行排序即可。

    案例如下:

    第一张图片:400*300,宽高比为4:3

    第二张图片:500*100,宽高比为5:1

    第三张图片:200*500,宽高比为2:5

    第四张图片:200*100,宽高比为2:1

    我们首先确定一个高度,这里设定为300

    那么总的长方形宽度为2620,

    这个长方形的宽高比为131:15

    接下来我们需要获取页面宽度,这里以1920为例,

     那么安装这个比例来调整总长方形,它的高度为219.84,这里小数点两位后的可以直接舍弃,从页面显示来看无关痛痒

    那么安装这个高度,我们再反推4张图片的宽度为:

    第一张图片:293.12*219.84

    第二张图片:1099.2*219.84

    第三张图片:87.963*219.84

    第四张图片:439.68*219.84

    这四张图片的总宽度为:1919.963

    根据这个逻辑来设置js代码,对所有的图片进行分组,在分组中进行这样的操作,就可以实现图片水平瀑布流布局,代码设计的好,可以兼容所有宽度,一切随心所欲,但缺点也是有的,就是麻烦,麻烦,麻烦,而且考虑到这套逻辑实现,

    对内存的占用量较大,对懒加载也很不友好,需要改逻辑才可以兼容栏加载和图片缓存︿( ̄︶ ̄)︿。

    这里提供一个案例dome给大家进行观看和调试

    http://www.linheng.xyz/project/sppbl/index.html

    效果如下(具备简单的懒加载功能):

     主要代码如下:

    <html>
    
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>水平瀑布流懒加载</title>
    </head>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    
        h1 {
            text-align: center;
        }
    
        .box {
            overflow: auto;
            /* 80%; */
            border: 1px black solid;
            margin: 0 auto;
        }
    
        .box img {
            float: left;
            display: block;
        }
    </style>
    
    <body>
        <h1>水平瀑布流</h1>
        <div class="box"></div>
    </body>
    <script>
        var box = document.getElementsByClassName("box")[0];
        var imglist = [];
        var img,
            length = 0,
            count = 0,
            line = 3;
        // console.log(box);
        var maxwidth = window.innerWidth - 100;
        box.style.width = maxwidth + "px";
        addimg(20);
    
        function fomate() {
            var row = Math.floor(length / line);
    
            // console.log(row);
            for (var i = 0; i < row; i++) {
                var w = 0; //每行的宽度和
    
                for (var j = 0; j < line; j++) {
                    if (imglist[i * line + j].prop != undefined) {
                        w += imglist[i * line + j].prop * 300; //单张图片以300为高的宽度累加到w中
                    }
    
                }
    
                // console.log(w);
                var h = 300 * maxwidth / w;
    
                for (var j = 0; j < line; j++) {
                    if (imglist[i * line + j].prop != undefined) {
                        imglist[i * line + j].style.height = h + "px";
                        imglist[i * line + j].style.width = h * imglist[i * line + j].prop + "px";
                    }
    
                }
            }
        }
    
        window.onresize = function () {
            maxwidth = window.innerWidth - 100;
            box.style.width = maxwidth + "px";
            fomate();
        }
    
        window.onscroll = function () {
            var scroll = document.documentElement.scrollTop;
            var screen = window.innerHeight;
            var offsetTop = box.offsetTop;
            var height = box.offsetHeight;
    
            if (scroll + screen - offsetTop - height > -20) {
                addimg(20);
            }
    
            ;
        }
    
        function addimg(i) {
            length += i;
    
            // console.log(length);
            for (var i = 1; i <= 20; i++) {
                img = createimg("img/pics (" + i + ").jpg", box);
                imglist.push(img);
                // console.log(imglist.length);
    
            }
        }
    
        function createimg(src, pad) {
            //创建图片的方法
            var length = 20;
            count = 0;
            var img = document.createElement("img");
            img.src = src;
            pad.appendChild(img);
    
            img.onload = function () {
                this.prop = this.width / this.height;
                count++;
                // console.log(count);
    
                if (count == length) {
                    fomate();
                }
            }
    
            return img;
    
        }
    </script>
    
    </html>
    

      

    以上是我总结出的两种方法,如果有更好的方法,欢迎你在评论进行补充ヾ(◍°∇°◍)ノ゙。

  • 相关阅读:
    js面对对象编程
    MyBatis -- 一步步教你使用MyBatis
    简洁常用权限系统的设计与实现(一):构造权限菜单树的N(N>=4)种方法
    2014年工作中遇到的20个问题:181-200
    2014年工作中遇到的20个问题:181-200
    老雷:思儿壮志小诗一首(老爸写得都比我好,让我这个文艺青年情何以堪)(家人对幸福美好生活的追求,就是我的奋斗目标)
    老雷:思儿壮志小诗一首(老爸写得都比我好,让我这个文艺青年情何以堪)(家人对幸福美好生活的追求,就是我的奋斗目标)
    雷观(十三):功能优先,开发与重构并举,性能殿后
    雷观(十三):功能优先,开发与重构并举,性能殿后
    URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致(两种解决方法)
  • 原文地址:https://www.cnblogs.com/smileZAZ/p/13650790.html
Copyright © 2011-2022 走看看