实现瀑布流的三种方法

部分html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>瀑布流</title>
    <!-- <link rel="stylesheet" type="text/css" href="css/Pinterest.css"> -->
    <!-- // <script type="text/javascript" src="js/Pinterest.js"></script> -->
    <!-- <script type="text/javascript" src="js/jquery.js"></script>
    // <script type="text/javascript" src="js/Pinterest_jquery.js"></script> -->
    <link rel="stylesheet" type="text/css" href="css/Pinterest_css3.css">
</head>
<body>
    <div id="pic_main">
        <div class="pic_box">
            <div class="pic">
                <img src="Pinterest_img/1.jpg" alt="图片1">
            </div>
        </div>
        <div class="pic_box">
            <div class="pic">
                <img src="Pinterest_img/2.jpg" alt="图片2">
            </div>

        </div>
    </div>
</body>
</html>

其CSS代码

#pic_main{position: relative;}
.pic_box{padding: 15px 0 0 15px;float: left;}

.pic{padding: 10px;border: 1px solid #ccc;border-radius: 5px; box-shadow: 0 0 5px #ccc;}
.pic img{width: 165px;height:auto;}

原生JS

window.onload=function(){
    waterfall(‘pic_main‘,‘pic_box‘);
    var dataInt = {‘data‘:[{‘src‘:‘1.jpg‘},{‘src‘:‘4.jpg‘},{‘src‘:‘7.jpg‘},{‘src‘:‘17.jpg‘}]};
    window.onscroll=function(){
        if (checkScrollSlide) {
            var oparent = document.getElementById(‘pic_main‘);
            for(var i=0;i<dataInt.data.length;i++){
                var oBox=document.createElement(‘div‘);
                oBox.className=‘pic_box‘;
                oparent.appendChild(oBox);
                var oPic=document.createElement(‘div‘);
                oPic.className=‘pic‘;
                oBox.appendChild(oPic);
                var oImg=document.createElement(‘img‘);
                oImg.src=‘Pinterest_img/‘+dataInt.data[i].src;
                oPic.appendChild(oImg);
            }
            waterfall(‘pic_main‘,‘pic_box‘);
        }
    }
};

function waterfall(parent,box){
    // 获取父元素pic_main
    var oparent = document.getElementById(parent);
    // 获取picbox数组
    var oboxs = getByClass(oparent,box);

    // 计算每个box的宽度
    var oboxw=oboxs[0].offsetWidth;
    // 计算列数
    var cols=Math.floor(document.documentElement.clientWidth/oboxw);
    // 设置main的宽度
    oparent.style.cssText=‘width:‘+cols*oboxw+‘px;margin:50px auto‘;

    // 存放第一列的高度
    var harray=[];
    for (var i=0; i<oboxs.length;i++){
        if(i<cols){
            harray.push(oboxs[i].offsetHeight);
        }else{
            var minH = Math.min.apply(null,harray);
            var index = getMinIndex(harray,minH);
            oboxs[i].style.position=‘absolute‘;
            oboxs[i].style.top=minH+‘px‘;
            oboxs[i].style.left=index*oboxw+‘px‘;
            harray[index]+=oboxs[i].offsetHeight;
        }
    }

}

function getByClass(parent,className){
    var oelements=parent.getElementsByTagName(‘*‘);
    var boxArray=new Array();
    for (var i=0;i<oelements.length;i++){
        if(oelements[i].className==className){
            boxArray.push(oelements[i]);
        }
    }
    return boxArray;
}

function getMinIndex(array,min){
    for(var i=0;i<array.length;i++){
        if(min==array[i])
            return i;
    }
}

function checkScrollSlide(){
    var oparent = document.getElementById(‘pic_main‘);
    var oboxs = getByClass(oparent,‘pic_box‘);
    var lastBoxH=oboxs[length-1].offsetTop+Math.floor(oboxs[length-1].offsetHeight/2);
    var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
    var height = document.body.clientHeight||document.documentElement.clientHeight;
    return (lastBoxH<scrollTop+height)?true:false;
}

JQuery

$(function(){
    waterFull();
    var dataInt = {‘data‘:[{‘src‘:‘1.jpg‘},{‘src‘:‘4.jpg‘},{‘src‘:‘7.jpg‘},{‘src‘:‘17.jpg‘}]};
    $(window).on(‘scroll‘,function(){
        if(checkScrollSlide){
            $.each(dataInt.data,function(key,value){
                var oBox = $(‘<div>‘).addClass(‘pic_box‘).appendTo($(‘#pic_main‘));
                var oPic=$(‘<div>‘).addClass(‘pic‘).appendTo($(oBox));
                var oImg=$(‘<img>‘).attr(‘src‘,‘Pinterest_img/‘+$(value).attr(‘src‘)) .appendTo($(oPic));
            });
            waterFull();
        }
    });
});

function waterFull(){
    var $boxs=$(‘#pic_main>div‘);
    var boxW=$boxs.eq(0).outerWidth();
    var cols = Math.floor($(window).width()/boxW);

    $(‘#pic_main‘).width(cols*boxW).css(‘margin‘,‘0 auto‘);
    var hArr=[];
    $boxs.each(function(index,value){
        var h=$boxs.eq(index).outerHeight();
        if (index<cols) {
            hArr[index]=h;
        }else{
            var minH=Math.min.apply(null,hArr);
            var minHIndex=$.inArray(minH,hArr);
            $(value).css({
                ‘position‘:‘absolute‘,
                ‘top‘:minH+‘px‘,
                ‘left‘:minHIndex*boxW+‘px‘
            });
            hArr[minHIndex]+=$boxs.eq(index).outerHeight();
        }
    });
}

function checkScrollSlide(){
    var $lastBox = $(‘pic_#main>div‘).last();
    var lasrBoxDis=$lastBox.offset().top+Math.floor($lastBox.outerHeight/2);
    var scrollTop = $(window).scrollTop();
    var documentH = $(window).height();
    return (lasrBoxDis<scrollTop+documentH)?true:false;
}

CSS3

将之前的css文件换成css3文件

css3形成的瀑布流不能实现延迟加载,还是得靠js实现延迟加载

#pic_main{-webkit-column-width: 202px;-moz-column-width: 202px;-o-column-width: 202px;
-ms-column-width: 202px; column-width: 202px;}

.pic_box{padding: 15px 0 0 15px;}

.pic{padding: 10px;border:1px solid #ccc; border-radius: 5px; box-shadow: 0 0 5px #ccc;
width: 165px;}

.pic img{width:165px;height: auto;display: block;}
时间: 2024-10-21 15:09:55

实现瀑布流的三种方法的相关文章

css清除浮动float的三种方法总结【转载自https://my.oschina.net/leipeng/blog/221125】

摘要: css清除浮动float的三种方法总结,为什么清浮动?浮动会有那些影响?     一.抛一块问题砖(display: block)先看现象: 分析HTML代码结构: <div class="outer">     <div class="div1">1</div>     <div class="div2">2</div>     <div class="div3

CSS围住浮动元素的三种方法

浮动元素脱离了文档流,其父元素看不到它了,因而不会包围它.浮动会“扩散”到下一个清除浮动的元素处.这会引起不想要的页面布局效果. 清除浮动的方法有三种: 1.父元素overflow:hidden 2.同时浮动父元素 3.添加清除浮动元素. 1.父元素overflow:hidden overflow:hidden的真正作用是防止元素被超大内容撑大.使用hidden后,元素保持其设定的高宽,超大的内容会被“剪切”掉,变为页面不可见部分.同时,overflow:hidden也能强迫父元素包围浮动子元素

css清除浮动float的三种方法总结,为什么清浮动?浮动会有那些影响?一起来$(&#39;.float&#39;)

一.抛一块问题砖(display: block)先看现象: 分析HTML代码结构: <div class="outer">     <div class="div1">1</div>     <div class="div2">2</div>     <div class="div3">3</div> </div> 分析CSS代码样

css清除浮动float的三种方法总结

转载地址:https://my.oschina.net/leipeng/blog/221125 css清除浮动float的三种方法总结,为什么清浮动?浮动会有那些影响?     一.抛一块问题砖(display: block)先看现象: 分析HTML代码结构: <div class="outer"> <div class="div1">1</div> <div class="div2">2</

转载:WinForm中播放声音的三种方法

转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753094 声音文件folder.wav放置在bin目录下debug下 1.通过API调用 using System.Runtime.InteropServices; [DllImport("winmm.dll")] public static extern bool PlaySound(st

分区自动挂载的三种方法

一.修改/etc/rc.local配置文件追加类似命令:mount /dev/sda1  /sda1 到配置文件最后一行 二,修改/etc/fstab配置文件追加类似命令:/dev/sda1   /sda1  ext4   defaults   0  0 到配置文件中 三,安装autofs服务yum install autofs 追加类似命令:sda1   -fstype=ext4  :/dev/sda1 到配置/etc/autofs.misc文件中重启服务: service autofs re

VMWARE虚拟机不能上网三种方法分析

bridged(桥接模式). NAT(网络地址转换模式) host-only(主机模式). 理论理解: 1.bridged(桥接模式) 在这处模式下,虚拟机等同于网络内的一台物理主机,可对手动设置IP,子网掩码,DNS,且IP地址要和主机的IP在同一网段内.这样,虚拟机就和主机如同连在一个HUB上的两台计算机,只要主机能上网,虚拟机也会在这种模式下上网. 2.host-only(主机模式) 在host-only模式中,所有的虚拟系统是可以相互通信的,但虚拟系统和真实的网络是被隔离开的. 提示:在

pdf文件怎么编辑 如何编辑pdf文件的三种方法

pdf文件越来越流行,工作中经常遇到需要修改pdf文件的情况.一般人的电脑上都为pdf文件安装了一个pdf阅读器,可它只能用来阅读查看pdf文件,并不能满足人们的编辑需求.那么pdf文件怎么编辑?下面小编给大家讲讲关于如何编辑pdf文件的三种方法.     方法一:直接编辑,一步到位     如果要对pdf文件进行编辑,我们则需要安装pdf编辑器.最新版的迅捷pdf编辑器可以编辑pdf文件中的任何内容,包括文字.图片.页眉页脚.添加注释等等.迅捷pdf编辑器如何编辑pdf文件?     首先需要

Android TextView里直接显示图片的三种方法

方法一:重写TextView的onDraw方法,也挺直观就是不太好控制显示完图片后再显示字体所占空间的位置关系.一般如果字体是在图片上重叠的推荐这样写.时间关系,这个不付源码了. 方法二:利用TextView支持部分Html的特性,直接用api赋图片.代码如下: //第一种方法在TextView中显示图片 String html = "<img src='" + R.drawable.circle + "'/>"; ImageGetter imgGett