分别使用javascript,jquery,css实现瀑布流布局:

第一种方式:使用JavaScript:

瀑布流布局

*{padding:0;margin:0;}

.clearfix:after,

.clearfix:before {

content: " ";

display: table;

}

.clearfix:after {

clear: both;

}

.main {

position: relative;

-webkit-column-width: 210px;

-moz-column-width: 210px;

-webkit-column-gap: 5px;

-moz-column-gap: 5px;

}

.box {

float: left;

padding: 15px 0 0 15px;

}

.box .pic {

width: 180px;

height: auto;

padding: 10px;

border-radius: 5px;

box-shadow: 0 0 5px #cccccc;

border: 1px solid #cccccc;

}

.box .pic img {

display: block;

width: 100%;

}

window.onload = function(){

waterfall('main','box');

//模拟json数据

var dataJson = {'data': [{'src':'30.jpg'},{'src':'31.jpg'},{'src':'32.jpg'},{'src':'33.jpg'},{'src':'34.jpg'},{'src':'35.jpg'},{'src':'36.jpg'},{'src':'37.jpg'},{'src':'38.jpg'},{'src':'39.jpg'},{'src':'40.jpg'},{'src':'41.jpg'},{'src':'42.jpg'},{'src':'43.jpg'},{'src':'44.jpg'},{'src':'45.jpg'}]};

//监听scroll事件

window.onscroll = function(){

var isPosting = false;

if(checkScollSlide('main','box') && !isPosting){

var oParent = document.getElementById('main');

for(var i in dataJson.data){

isPosting = true;

var oBox = document.createElement('div');

oBox.className = 'box';

oBox.innerHTML = '

';

oParent.appendChild(oBox);

}

isPosting = false;

waterfall('main','box');

}

}

}

/*

* parent 父元素id clsName 块元素类*/

function waterfall(parent,clsName){

//获取父元素

var oParent = document.getElementById(parent),

//获取所有box

aBoxArr = oParent.getElementsByClassName(clsName),

//单个box宽度

iBoxW = aBoxArr[0].offsetWidth,

// 列数

cols = Math.floor(document.documentElement.clientWidth / iBoxW);

oParent.style.cssText = 'width:'+iBoxW*cols+'px;margin:0 auto;';

//储存所有的高度

var hArr = [];

for(var i = 0; i < aBoxArr.length; i++){

if(i < cols){

hArr[i] = aBoxArr[i].offsetHeight;

}else{

//获取hArr最小值

var minH = Math.min.apply(null,hArr),

// hArr最小值索引index

minHIndex = getMinHIndex(hArr,minH);

aBoxArr[i].style.cssText = 'position:absolute;top:'+minH+'px;left:'+aBoxArr[minHIndex].offsetLeft+'px;';

//添加元素之后更新hArr

hArr[minHIndex] += aBoxArr[i].offsetHeight;

}

}

}

//获取最小值索引

function getMinHIndex(arr,val){

for(var i in arr){

if(arr[i] == val){

return i;

}

}

}

//检查是否满足加载数据条件,parent 父元素id clsName 块元素类

function checkScollSlide(parent,clsName){

var oParent = document.getElementById(parent),

aBoxArr = oParent.getElementsByClassName(clsName),

// 最后一个box元素的offsetTop+高度的一半

lastBoxH = aBoxArr[aBoxArr.length - 1].offsetTop + aBoxArr[aBoxArr.length - 1].offsetHeight / 2,

//兼容js标准模式和混杂模式

scrollTop = document.documentElement.scrollTop || document.body.scrollTop,

height = document.documentElement.clientHeight || document.body.clientHeight;

return lastBoxH < scrollTop + height ? true : false;

}

第二种方式:使用jquery:(html结构跟css同上)

$( window ).on( "load", function(){

waterfall('main','box');

//模拟数据json

var dataJson = {'data': [{'src':'30.jpg'},{'src':'31.jpg'},{'src':'32.jpg'},{'src':'33.jpg'},{'src':'34.jpg'},{'src':'35.jpg'},{'src':'36.jpg'},{'src':'37.jpg'},{'src':'38.jpg'},{'src':'39.jpg'},{'src':'40.jpg'},{'src':'41.jpg'},{'src':'42.jpg'},{'src':'43.jpg'},{'src':'44.jpg'},{'src':'45.jpg'}]};

window.οnscrοll=function(){

var isPosting = false;

if(checkscrollside('main','box') && !isPosting){

isPosting = true;

$.each(dataJson.data,function(index,dom){

var $box = $('

$box.html('

');

$('#main').append($box);

waterfall('main','box');

isPosting = false;

});

}

}

});

/*

parend 父级id

clsName 元素class

*/

function waterfall(parent,clsName){

var $parent = $('#'+parent);//父元素

var $boxs = $parent.find('.'+clsName);//所有box元素

var iPinW = $boxs.eq( 0 ).width()+15;// 一个块框box的宽

var cols = Math.floor( $( window ).width() / iPinW );//列数

$parent.width(iPinW * cols).css({'margin': '0 auto'});

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

$boxs.each( function( index, dom){

if( index < cols ){

pinHArr[ index ] = $(dom).height(); //所有列的高度

}else{

var minH = Math.min.apply( null, pinHArr );//数组pinHArr中的最小值minH

var minHIndex = $.inArray( minH, pinHArr );

$(dom).css({

'position': 'absolute',

'top': minH + 15,

'left': $boxs.eq( minHIndex ).position().left

});

//添加元素后修改pinHArr

pinHArr[ minHIndex ] += $(dom).height() + 15;//更新添加了块框后的列高

}

});

}

//检验是否满足加载数据条件,即触发添加块框函数waterfall()的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)

function checkscrollside(parent,clsName){

//最后一个块框

var $lastBox = $('#'+parent).find('.'+clsName).last(),

lastBoxH = $lastBox.offset().top + $lastBox.height()/ 2,

scrollTop = $(window).scrollTop(),

documentH = $(document).height();

return lastBoxH < scrollTop + documentH ? true : false;

}

第三种方式:使用css:(html结构同上)

.clearfix:after,

.clearfix:before {

content: " ";

display: table;

}

.clearfix:after {

clear: both;

}

.main {

position: relative;

[color=#ff0000]-webkit-column-width: 210px;

-moz-column-width: 210px;

-webkit-column-gap: 5px;

-moz-column-gap: 5px;[/color]

}

.box {

float: left;

padding: 15px 0 0 15px;

}

.box .pic {

width: 180px;

height: auto;

padding: 10px;

border-radius: 5px;

box-shadow: 0 0 5px #cccccc;

border: 1px solid #cccccc;

}

.box .pic img {

display: block;

width: 100%;

}

瀑布流实现方式比较:

Javascript原生方式/jquery方式

1、需要计算,列数 = 浏览器窗口宽度/图片宽度,图片定位是根据每一列的高度计算下来图片的位置;

2、图片排序是按照图片计算的位置横向排列,位置是计算出来的,比较规范

Css方式

1、不需要计算,浏览器自动计算,只需设置列宽,性能高;

2、列宽随着浏览器窗口大小进行改变,用户体验不好;

3、图片排序按照垂直顺序排列,打乱图片显示顺序;

4、图片加载还是依靠javascript/jquery实现

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

html布局结构瀑布流,三种方式实现瀑布流布局相关推荐

  1. 瀑布流第二种方式————基于ajax方式

    第二种瀑布流是基于ajax方式工作的.与之前一种形式相比,这种方式可以向后台发送数据, 同时,ajax可以根据数据,每次只取一部分的数据,等滚轮划到底部时,再出发ajax,然后又去一次 models文 ...

  2. 定义结构体变量的三种方式

    #include <stdio.h>//定义结构体的三种方式,推荐使用第三种//第一种 struct student1 {int age;char name[20];float score ...

  3. 实现双飞翼布局的三种方式

    实现双飞翼布局的三种方式 使用定位来实现 实现流程: 1.父盒子相对定位,左右 padding 为子盒子宽度,左右子盒子绝对定位,宽度写死: 2.左边子盒子 left top 给 0,右边子盒子 ri ...

  4. 创建一对多表结构实例 /操作的三种方式

    例 1.注册App01  完成各项配置 2. 写完后自动生成一个id自增列(主键) 如果不想生成 自己写 创建两张表 3.执行创建语句 (其中还进行了一个小修改) 4.按照之前的方法 打开数据库 并输 ...

  5. C#利用WCF改进文件流传输的三种方式

    摘要:本文介绍C#利用WCF改进文件流传输的三种方式:MTOM模型.基于同步传输的异步回调模型.基于异步传输的异步模型,并提供相应的实现代码供参考. - WCF在跨域传输使用了两种模型的方法调用:一种 ...

  6. JavaScript高级第2天:定义函数的三种方式、函数的原型链结构、完整原型链、作用域以及作用域链、函数的四种调用模式、闭包、计数器、斐波那契数列优化、三种继承方式

    JavaScript高级第二天 01-定义函数的三种方式 1.函数声明 function:可以先调用再声明,因为预解析(把函数声明.变量声明进行提升) function fn() {//函数体conl ...

  7. css table设置边框_(代码示例)css实现等高布局的三种方式

    本篇文章给大家带来的内容是关于css实现等高布局的三种方式(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 本文讲的等高布局是在不手动设置元素高度的情况下,使用纯css实现 ...

  8. 【Java基础】IO流概述分类、字节流写数据、字节流写数据的三种方式及写数据的两个小问题

    目录 一.IO流概述和分类 二.字节流写数据 三.字节流写数据的三种方式 四.字节流写数据的两个小问题 一.IO流概述和分类 IO流介绍: ● IO:输入/输出(Input/Output) ● 流:是 ...

  9. 向函数传递结构的三种方式

    向函数传递结构的三种方式 零.写在前面 在程序设计的过程当中,我们经常会涉及到选择数据的类型,在很多情况下,单单是普通的变量和数组并不足以满足我们的需求,这时候,C语言为我们提供了一种计较好用的数据类 ...

最新文章

  1. 查找手机型号云服务器,查找手机型号云服务器
  2. LINUX分区空间扩容操作
  3. c25---条件编译
  4. JS原型链与instanceof底层原理
  5. explain分析SQL查询
  6. Equals,ReferenceEquals,==的区别
  7. efl是什么意思_efl
  8. android alertdialog_Android进阶:Activity设置主题背景后AlertDialog的背景随之改变的问题分析
  9. 14-2 正则表达式
  10. 如何搭建克隆系统服务器,FOG Project网络克隆系统安装和搭建
  11. Raki的读paper小记:Dark Experience for General Continual Learning: a Strong, Simple Baseline
  12. 泛微oa部署linux步骤,泛微OA流程搭建操作流程
  13. ubuntu + GTK+ + anjuta
  14. MFC对话框美化四(自绘标题栏)
  15. poj 1321 排兵布阵问题 dfs算法
  16. 软件测试周刊(第48期):无聊是非常有必要的,一个人在空白时间所做的事,决定了这个人和其他人根本的不同。
  17. VSCode常用插件和字体设置
  18. 数据分析 - 关于彩票中奖结果的数据分析猜想(一)
  19. 中国石油大学《物理化学》第三阶段在线作业
  20. python连乘函数_python 连乘

热门文章

  1. opencv 的形态学操作,cv2.erode,cv.dilate等。
  2. 双色球与大乐透号码生成器
  3. STM32启动文件startup_stm32f407xx.s
  4. msvcp120.dll一键修复教程,只需1分钟即可
  5. 北京内推 | 联想研究院招聘计算机视觉算法实习生
  6. python爬虫(多线程锁信号量)
  7. 乐高大颗粒作品8:抽油机的搭建
  8. Adobe XD 交互原型15个小技巧,一看就会
  9. 史上最靠谱 Ubuntu 镜像下载
  10. EtherCAT igh主站控制松下伺服(csp模式)