jQuery+css实现瀑布流布局(无限加载)

news/2024/7/11 1:51:37 标签: jquery, css, html, 瀑布流, 无限加载

文件目录:

在这里插入图片描述

images:

这个文件夹放了需要的照片,名字都按照0,1,2,3…排列,便于取的时候好取,我放了23张,当然实际应用肯定是Ajax请求来的
在这里插入图片描述

Html:

最外层#main这个容器就是放整个瀑布流的盒子,里面.pin是每个商品详情盒子,.box是每张商品图片的盒子,里面放上商品图片

<div id="main">
    <div class="pin">
        <div class="box">
            <img src="./images/1.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/2.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/3.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/4.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/5.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/6.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/7.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/8.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/9.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/10.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/11.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/12.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/13.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/14.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/15.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/16.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/17.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/18.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/19.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/20.jpg"/>
        </div>
    </div>
    <div class="pin">
        <div class="box">
            <img src="./images/21.jpg"/>
        </div>
    </div>
</div>

html" title=css>css_116">html" title=css>css:

<style type="text/html" title=css>css">
    *{padding: 0;margin:0;}        /* 不要效仿啊,要引入重置html" title=css>css文件 */
    #main{
        position: relative;   /* 动态渲染的.pin都加上了绝对定位,所以父元素相对定位 */
    }
    .pin{
        padding: 15px 0 0 15px;    /* 这是每个商品盒子之间的距离,之所以用'padding'而不用'margin',是要获取盒子之间或者距离顶部距离的时候,获取不到‘margin’ */
        float:left;        /* 让所有盒子横向排列 */
    }
    .box{
        padding: 10px;          /* 内容内缩 */
        border:1px solid #ccc;
        box-shadow: 0 0 6px #ccc;
        border-radius: 5px;
    }
    .box img{
        width:162px;    /* 所有照片定宽,高度自由 */
        height:auto;
    }
</style>

js:

首先放入jQuery源文件,去官网下载就好了,然后就是实现瀑布流的逻辑,注释已经写得很清楚了:

$( window ).on( "load", function(){
    waterfall('main','pin');
    var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]}; // 实际开发中这个数据从后台获取
    window.onscroll=function(){   // 滚动条事件
        if(checkscrollside()){
            $.each( dataInt.data, function( index, value ){
                var $oPin = $('<div>').addClass('pin').appendTo( $( "#main" ) );
                var $oBox = $('<div>').addClass('box').appendTo( $oPin );
                $('<img>').attr('src','./images/' + $( value).attr( 'src') ).appendTo($oBox);
            });
            waterfall();   // 滚动加载的时候要执行这个函数,否则后面动态渲染的商品都没有样式
        };
    }
});

/*
    parent 父级id
    pin 元素id
*/
function waterfall(parent,pin){
    var $aPin = $( "#main>div" );
    var iPinW = $aPin.eq( 0 ).width();// 一个块框pin的宽
    var num = Math.floor( $( window ).width() / iPinW );//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】
    //oParent.style.html" title=css>cssText='width:'+iPinW*num+'px;ma rgin:0 auto;';//设置父级居中样式:定宽+自动水平外边距
    $( "#main" ).html" title=css>css({
        'width:' : iPinW * num,
        'margin': '0 auto'
    });

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

    $aPin.each( function( index, value ){
        var pinH = $aPin.eq( index ).height();
        if( index < num ){
            pinHArr[ index ] = pinH; //第一行中的num个块框pin 先添加进数组pinHArr
        }else{
            var minH = Math.min.apply( null, pinHArr );//数组pinHArr中的最小值minH
            var minHIndex = $.inArray( minH, pinHArr );//数组中这个最小值的index索引
            $( value ).html" title=css>css({
                'position': 'absolute',
                'top': minH + 15,    // 加上15是padding
                'left': $aPin.eq( minHIndex ).position().left
            });
            //数组 最小高元素的高 + 添加上的aPin[i]块框高
            pinHArr[ minHIndex ] += $aPin.eq( index ).height() + 15;//更新添加了块框后的列高
        }
    });
}

function checkscrollside(){
    var $aPin = $( "#main>div" );
    var lastPinH = $aPin.last().get(0).offsetTop + Math.floor($aPin.last().height()/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)
    var scrollTop = $( window ).scrollTop()//注意解决兼容性
    var documentH = $( document ).width();//页面高度
    return (lastPinH < scrollTop + documentH ) ? true : false;//到达指定高度后 返回true,触发waterfall()函数
}

http://www.niftyadmin.cn/n/1845550.html

相关文章

关于JavaScript 的 async/await

解说详尽明朗&#xff0c;还有例子 请移步这个博客https://blog.csdn.net/hj7jay/article/details/61191416?depth_1-utm_sourcedistribute.pc_relevant.none-task&utm_sourcedistribute.pc_relevant.none-task

jQuery国际化i18n--中文、英文、中文繁体

关于jquery-i18n的了解&#xff0c;从零零散散的查阅拼凑起来&#xff0c;拼了一份完整的示例&#xff0c;这个博主的这篇给了我很大帮助&#xff1a; 首先&#xff0c;结构目录如下&#xff1a; jquery.i18n.js&#xff1a; (function($) {$.fn.extend({i18n: function(opti…

【Flutter 混合开发】嵌入原生View-Android

Flutter 混合开发系列 包含如下&#xff1a; 嵌入原生View-Android嵌入原生View-IOS与原生通信-MethodChannel与原生通信-BasicMessageChannel与原生通信-EventChannel添加 Flutter 到 Android Activity添加 Flutter 到 Android Fragment添加 Flutter 到 iOS 每个工作日分享一篇…

使用Gulp构建前端自动化方案

一直使用vue.js写项目&#xff0c;搞来搞去都快忘了jQ了&#xff0c;最近要写公司官网&#xff0c;决定用jQ来写&#xff0c;先做准备工作&#xff0c;选择一个自动化构建工具gulp&#xff0c;具体的可以看官网&#xff0c;我看了这篇博文&#xff0c;清晰明了 项目路径&#x…

【Flutter 混合开发】嵌入原生View-iOS

Flutter 混合开发系列 包含如下&#xff1a; 嵌入原生View-Android嵌入原生View-iOS与原生通信-MethodChannel与原生通信-BasicMessageChannel与原生通信-EventChannel添加 Flutter 到 Android Activity添加 Flutter 到 Android Fragment添加 Flutter 到 iOS 每个工作日分享一篇…

【Flutter 混合开发】与原生通信-MethodChannel

Flutter 混合开发系列 包含如下&#xff1a; 嵌入原生View-Android嵌入原生View-iOS与原生通信-MethodChannel与原生通信-BasicMessageChannel与原生通信-EventChannel添加 Flutter 到 Android Activity添加 Flutter 到 Android Fragment添加 Flutter 到 iOS 每个工作日分享一篇…

uni-app引入阿里巴巴iconfont

将选定的图标加入项目&#xff0c;然后下载下来&#xff0c;将这个几个文件放入static文件夹下&#xff1a; 然后在main.js里面引入&#xff1a; 在页面里引用&#xff1a; <view class"icon iconfont icon-kehuishouwu-zhiwulei"></view>效果如下&…

【Flutter 混合开发】与原生通信-BasicMessageChannel

Flutter 混合开发系列 包含如下&#xff1a; 嵌入原生View-Android嵌入原生View-iOS与原生通信-MethodChannel与原生通信-BasicMessageChannel与原生通信-EventChannel添加 Flutter 到 Android Activity添加 Flutter 到 Android Fragment添加 Flutter 到 iOS 每个工作日分享一篇…