js瀑布流布局的实现

    说到瀑布流布局,先上张图片来说明一下什么是瀑布流好了。

      这个是我毕设中的一个截图(内容是我暂时从其他网站上爬下来测试的….),那么我们从这张图片中就能看到大致来说瀑布流就是一些等宽不等高的图片来排列展 示的,因为每张图片都不一样大,以及我在图片下面展示了各种信息都不一样,所以导致这些展示的框它们的高度都不统一,那么为什么却要要求它们之间的宽度相 同呢?这就是瀑布流实现的关键了。

      那么我们就来一步步的说明它是如何实现的,这个过程中也就理解了为什么是这样设计的了,首先,我们要在页面中排列出所要展示的框的个数,下面是这个瀑布流的结构图:

      这张图片中白色的部分我们就当作是浏览器的可视区域了,那么中间这个灰色的部分我给他取名叫做‘main’,用来存放中间展示的图片,并且与页面中的其他 元素分开,那么第一个问题就来了,我们如何知道在这个main中到底改放几张图片呢?而且这个main的宽度又该怎么定呢?上代码!

#main{     position: relative; text-align: center; margin: 0 auto;
}

     我们先给它设置一下相对定位,并将这个div设置成居中,这里有个地方要注意的是,之前看了很多例子使用 text-align: center 将div居中后发现并不起效,那是因为在设置text-align的同时并没有指定它的margin值,我们要将margin值也同时设置了之后居中的效 果才会生效,因为要和页面顶部的导航栏配合,所以我在这里将margin的第一个值设置为0,第二个设置为自动(auto),为什么这么设置呢?

     margin 简写属性在一个声明中设置所有外边距属性。该属性可以有 1 到 4 个值。这个简写属性设置一个元素所有外边距的宽度,或者设置各边上外边距的宽度。在这里要注意一下的是在css中,margin和padding这样的属 性设置值的时候都是顺时针设置的,也就是上,右,下,左,这个顺序来的。

      那么当margin的值为四个的时候这4个的值依次为:上外边距,右外边距,下外边距,左外边距。

      当为三个值的时候顺序依次为:上外边距,左右外边距,下外边距。

      当为两个值的时候顺序依次为:上下外边距,左右外边距。

      当为一个值的时候就是全部的外边距了。

      现在我们就要开始放图片了,这也就是为什么我们要使用等宽的图片了,因为宽度固定我们才能动态的算出不同大小的浏览器能放几张图片来展示了。

     这里我并没有先设置main的宽度,而是在计算出放置几张图片之后才设置它的宽度,因为我们不仅仅是展示图片,还有图片下面的内容,所以在计算每张图片的 宽度的时候要将包裹图片的容器也算进来,也就是上面图片中红色框的宽度,而且由于每个展示框之间还有margin值,所以我们在计算的时候也是要考虑的, 因为我使用的是jquery,所以在这里我通过 outerWidth() 方法来取得宽度值。

//动态添加瀑布图片的功能函数
function waterfall(){

    //取得展示框对象
    var $boxs = $( "#main>div" );

    // 一个块框的宽
    var w = $boxs.eq( 0).outerWidth();

    //每行中能容纳的展示框个数【窗口宽度除以一个块框宽度】
    var cols = Math.floor( ($( window ).width()-30) / w );

    //给最外围的main元素设置宽度和外边距
    $("#main").width(w*cols).css("margin","o auto");

    //用于存储 每列中的所有块框相加的高度。
    var hArr=[];

    $boxs.each( function( index, value ){
        var h = $boxs.eq( index).outerHeight();
        if( index < cols ){
            hArr[ index ] = h; //第一行中的num个块框 先添加进数组HArr
        }else{
            var minH = Math.min.apply( null, hArr );//数组HArr中的最小值minH
            var minHIndex = $.inArray( minH, hArr );
            $( value).css({
                "position":"absolute","top":minH+"px", "left":minHIndex*w + "px"
            });
            //数组 最小高元素的高 + 添加上的展示框[i]块框高
            hArr[ minHIndex ] += $boxs.eq( index).outerHeight();//更新添加了块框后的列高
        }
    });
}

    这里的思路就是先取得浏览器的可视宽度,然后通过除以每个展示框的宽度来计算出一排可以展示多少个展示框的,然后通过一个数组 hArr来保持每一列的高度,我在这里使用jquery中的each方法来循环保存每一列的高度,这里传入的两个参数,index是展示框的索引 号,value为这个展示框的jquery对象。

     首先根据索引号来取到对应展示框的高度,这个高度是包含了margin的全部宽度,然后将这个值保存在数组中,由于之前求出了每一行最多的块数,所以在这 里进行一个判断,将第一行首先填满,然后开始填充第二排的展示框,我使用Math.min.apply()方法来取得数组中的最小值,然后通过 jquery提供的 inArray() 方法来取得最小值所在的是哪一列,第一个参数是最小值,第二个参数是需要判断的数组,然后我们将对应的展示框填充进去,最后将新加入的展示框的完整高度加 上之前最小的高度重新保存到数组中,继续循环判断,从而不断的新增展示框。

      那么现在我们就要通过后台传来的json数据动态的生成新的展示框来提供添加了,因为每个项目所要展示的内容都不一样,我在这里就不展示具体的代码 了,接下来就是要通过监听滚动条的滑动来判断什么时候开始动态添加新展示框了。

      接下来我就讲一下我判断的思路,首先是在第一组展示框添加完成后取得最后一个展示框的填充高度,然后加上这个展示框自身高度的一边,因为我觉得用户一般会 浏览到最后一个的附近的时候就该开始动态填充了,所以我在这里就判断当前滚动条滚动的距离是不是大于页面默认的高度加上最后一个展示框到屏幕顶端的高度, 如果大于了说明就该继续填充展示框了:

//监听滚动条
    window.onscroll=function(){
        if(checkscrollside()){
            AddWaterfall
(dataInt);//这个是动态填充新展示框的函数
            waterfall();
        };
    }

//判断是否需要继续加载瀑布流
function checkscrollside(){
    var $lastBox = $("#main>div").last();
    var lastBoxDis = $lastBox.offset().top + Math.floor($lastBox.outerHeight()/2);
    var scrollTop = $(window).scrollTop();
    var documentH = $(window).height();
    return (lastBoxDis<scrollTop+documentH)?true:false;
}

       现在整个瀑布流的展示就完成了,今天在这里记录下来,留已备用。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
, 图片
, 毕设
, 高度
, 一个
, 宽度
, js实现瀑布流
, jquery瀑布流布局
, 动态展示
, 展示图片
, 展示
, js获取数组最小值
, JS数组最小值
纯js实现瀑布流
瀑布流布局实现、纯css实现瀑布流布局、css实现瀑布流布局、瀑布流布局实现原理、浮动实现瀑布流布局,以便于您获取更多的相关知识。

时间: 2025-01-21 04:06:01

js瀑布流布局的实现的相关文章

深入学习js瀑布流布局_javascript技巧

本文实例为大家分享了js瀑布流布局学习资料,供大家参考,具体内容如下 特点:等宽不等高.实现方式:Javascript/Jquery/CSS3多栏布局. 样例网站:花瓣网-->分类 一.JS实现瀑布流 index.html:页面结构     <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>瀑布流布局</t

jquery瀑布流布局(masonry.js)

这样参差不齐的多栏布局,叫"方砖石布局",和"瀑布流布局",很多网站都有使用这样的布局,比如:淘宝的哇哦.花瓣网.蘑菇街 这里,我们仅使用瀑布流插件实现当页内容的排列. 那这插件到底有什么用呢?请看看下面的图片:右图是左图使用了插件之后的效果.具体例子 引用插件实例: <style type="text/css"> img { border:none; } .wrapper { width:1000px; margin:0 auto;

解析瀑布流布局:JS+绝对定位的实现_javascript技巧

绝对定位方式的瀑布流布局: 一.布局 1.包围块框的容器: 复制代码 代码如下: <div id="main">    ... ...<div> 2.一个块框: 复制代码 代码如下: <div class="pin">    <div class="box">        <img src="./images/g (1).jpg"/>    </div>

原生JS实现美图瀑布流布局赏析_javascript技巧

自pinterest网站爆红以来,国内一度掀起"仿PIN"狂潮,诸如花瓣.蘑菇街等等.正是如此,"瀑布流"式布局受到广大网民的青睐.众多知名JS库,也相继出现"瀑布流"布局插件,譬如jQuery的Masonry插件.KISSY的waterfall插件等.今天闲来无聊,我也自己动手弄了段原生JS代码,实现了简单的"瀑布流"布局效果,当然肯定不能和以上那些优秀插件相提并论,有兴趣的朋友,可以去看看,希望能带给你或多或少的收获. 1

纯js实现瀑布流布局及ajax动态新增数据_javascript技巧

本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax模拟数据图片后,是将整个页面的所有图片都重新定位一次. 3. 程序是等所有图片加载完成后再读取图片的尺寸,实际中肯定不能这样做. 4. 实际项目中,应该由后台程序给出图片尺寸值,在js代码中直接使用图片的width属性.  本程序思路: html结构: <body> <div id=&quo

原生JS实现响应式瀑布流布局_javascript技巧

原生JS实现的瀑布流布局,代码及demo代码地址:https://github.com/leozdgao/responsive_waterfall Demo:http://leozdgao.github.io/demo/responsive_waterfall/ 演示图: 核心代码: responsive_waterfall.js (function() { var Waterfall = function(opts) { var minBoxWidth; Object.defineProper

瀑布流布局的两种实现方式:传统多列浮动和绝对定位布局

瀑布流布局想必大家对它并不陌生吧,在一些网站上都会有这种效果的出现,下面为大家介绍下使用两种方式实现传统多列浮动和绝对定位布局,具体的实现代码如下,感兴趣的朋友可以参考下,希望对大家有所帮助   传统多列浮动 各列固定宽度,并且左浮动: 一列中的数据块为一组,列中的每个数据块依次排列即可: 更多数据加载时,需要分别插入到不同的列上: 优点: (1)布局简单,应该说没啥特别的难点: (2)不用明确知道数据块高度,当数据块中有图片时,就不需要指定图片高度. 缺点: (1)列数固定,扩展不易,当浏览器

瀑布流布局代码一例

 提起瀑布流布局想必大家并不陌生吧,其实呢?原理也就那样,下面有个小例子,与大家分享  代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml"&

瀑布流布局代码一例_javascript技巧

复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=&qu