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

- 日理万妓 2023-07-12 14:44 233阅读 0赞

文件目录:

在这里插入图片描述

images:

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

Html:

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

  1. <div id="main">
  2. <div class="pin">
  3. <div class="box">
  4. <img src="./images/1.jpg"/>
  5. </div>
  6. </div>
  7. <div class="pin">
  8. <div class="box">
  9. <img src="./images/2.jpg"/>
  10. </div>
  11. </div>
  12. <div class="pin">
  13. <div class="box">
  14. <img src="./images/3.jpg"/>
  15. </div>
  16. </div>
  17. <div class="pin">
  18. <div class="box">
  19. <img src="./images/4.jpg"/>
  20. </div>
  21. </div>
  22. <div class="pin">
  23. <div class="box">
  24. <img src="./images/5.jpg"/>
  25. </div>
  26. </div>
  27. <div class="pin">
  28. <div class="box">
  29. <img src="./images/6.jpg"/>
  30. </div>
  31. </div>
  32. <div class="pin">
  33. <div class="box">
  34. <img src="./images/7.jpg"/>
  35. </div>
  36. </div>
  37. <div class="pin">
  38. <div class="box">
  39. <img src="./images/8.jpg"/>
  40. </div>
  41. </div>
  42. <div class="pin">
  43. <div class="box">
  44. <img src="./images/9.jpg"/>
  45. </div>
  46. </div>
  47. <div class="pin">
  48. <div class="box">
  49. <img src="./images/10.jpg"/>
  50. </div>
  51. </div>
  52. <div class="pin">
  53. <div class="box">
  54. <img src="./images/11.jpg"/>
  55. </div>
  56. </div>
  57. <div class="pin">
  58. <div class="box">
  59. <img src="./images/12.jpg"/>
  60. </div>
  61. </div>
  62. <div class="pin">
  63. <div class="box">
  64. <img src="./images/13.jpg"/>
  65. </div>
  66. </div>
  67. <div class="pin">
  68. <div class="box">
  69. <img src="./images/14.jpg"/>
  70. </div>
  71. </div>
  72. <div class="pin">
  73. <div class="box">
  74. <img src="./images/15.jpg"/>
  75. </div>
  76. </div>
  77. <div class="pin">
  78. <div class="box">
  79. <img src="./images/16.jpg"/>
  80. </div>
  81. </div>
  82. <div class="pin">
  83. <div class="box">
  84. <img src="./images/17.jpg"/>
  85. </div>
  86. </div>
  87. <div class="pin">
  88. <div class="box">
  89. <img src="./images/18.jpg"/>
  90. </div>
  91. </div>
  92. <div class="pin">
  93. <div class="box">
  94. <img src="./images/19.jpg"/>
  95. </div>
  96. </div>
  97. <div class="pin">
  98. <div class="box">
  99. <img src="./images/20.jpg"/>
  100. </div>
  101. </div>
  102. <div class="pin">
  103. <div class="box">
  104. <img src="./images/21.jpg"/>
  105. </div>
  106. </div>
  107. </div>

css:

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

js:

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

  1. $( window ).on( "load", function(){
  2. waterfall('main','pin');
  3. var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]}; // 实际开发中这个数据从后台获取
  4. window.onscroll=function(){ // 滚动条事件
  5. if(checkscrollside()){
  6. $.each( dataInt.data, function( index, value ){
  7. var $oPin = $('<div>').addClass('pin').appendTo( $( "#main" ) );
  8. var $oBox = $('<div>').addClass('box').appendTo( $oPin );
  9. $('<img>').attr('src','./images/' + $( value).attr( 'src') ).appendTo($oBox);
  10. });
  11. waterfall(); // 滚动加载的时候要执行这个函数,否则后面动态渲染的商品都没有样式
  12. };
  13. }
  14. });
  15. /*
  16. parent 父级id
  17. pin 元素id
  18. */
  19. function waterfall(parent,pin){
  20. var $aPin = $( "#main>div" );
  21. var iPinW = $aPin.eq( 0 ).width();// 一个块框pin的宽
  22. var num = Math.floor( $( window ).width() / iPinW );//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】
  23. //oParent.style.cssText='width:'+iPinW*num+'px;ma rgin:0 auto;';//设置父级居中样式:定宽+自动水平外边距
  24. $( "#main" ).css({
  25. 'width:' : iPinW * num,
  26. 'margin': '0 auto'
  27. });
  28. var pinHArr=[];//用于存储 每列中的所有块框相加的高度。
  29. $aPin.each( function( index, value ){
  30. var pinH = $aPin.eq( index ).height();
  31. if( index < num ){
  32. pinHArr[ index ] = pinH; //第一行中的num个块框pin 先添加进数组pinHArr
  33. }else{
  34. var minH = Math.min.apply( null, pinHArr );//数组pinHArr中的最小值minH
  35. var minHIndex = $.inArray( minH, pinHArr );//数组中这个最小值的index索引
  36. $( value ).css({
  37. 'position': 'absolute',
  38. 'top': minH + 15, // 加上15是padding
  39. 'left': $aPin.eq( minHIndex ).position().left
  40. });
  41. //数组 最小高元素的高 + 添加上的aPin[i]块框高
  42. pinHArr[ minHIndex ] += $aPin.eq( index ).height() + 15;//更新添加了块框后的列高
  43. }
  44. });
  45. }
  46. function checkscrollside(){
  47. var $aPin = $( "#main>div" );
  48. var lastPinH = $aPin.last().get(0).offsetTop + Math.floor($aPin.last().height()/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)
  49. var scrollTop = $( window ).scrollTop()//注意解决兼容性
  50. var documentH = $( document ).width();//页面高度
  51. return (lastPinH < scrollTop + documentH ) ? true : false;//到达指定高度后 返回true,触发waterfall()函数
  52. }

发表评论

表情:
评论列表 (有 0 条评论,233人围观)

还没有评论,来说两句吧...

相关阅读