瀑布流的实现

注:本文部分图片自百度下载,如有侵权,联系删图。

首先,选择几张图片布局到HTML内容中。HTML如下所示。

 <div class="wrapper">
<div class="item"><img src="img/1.jpg" height="auto"/></div>
<div class="item"><img src="img/2.jpg" height="auto"/></div>
<div class="item"><img src="img/3.jpg" height="auto"/></div>
<div class="item"><img src="img/4.jpg" height="auto"/></div>
<div class="item"><img src="img/5.jpg" height="auto"/></div>
<div class="item"><img src="img/6.jpg" height="auto"/></div>
<div class="item"><img src="img/7.jpg" height="auto"/></div>
<div class="item"><img src="img/8.jpg" height="auto"/></div>
<div class="item"><img src="img/9.jpg" height="auto"/></div>
<div class="item"><img src="img/10.jpg" height="auto"/></div>
<div class="item"><img src="img/11.jpg" height="auto"/></div>
<div class="item"><img src="img/12.jpg" height="auto"/></div>
<div class="item"><img src="img/13.jpg" height="auto"/></div>
<div class="item"><img src="img/14.jpg" height="auto"/></div>
<div class="item"><img src="img/15.jpg" height="auto"/></div>
</div>

纯CSS实现

纯CSS实现较为简单,主要代码为设置列数和间距的两行。

/* 将边距设为0 */
*{
margin:;
padding:;
border: none;
}

.wrapper{
width: auto;
height: auto;
position: relative;
margin: 0 auto;
/* 设置列数和间距 */
column-count:;
column-gap:;
}
.item{
position:relative;
width: 100%;
height: auto;
box-sizing: border-box;
padding: 2px;
}

.item img{
display: block;
width: 100%;
cursor: pointer;
border-radius: 5px;
}
.item img:hover{
opacity: 0.8;
}

Jquery实现

  1. 有bug 的写法

    定义一个瀑布流方法:

     function waterfall(element,child,padding) {
    var child = $(child) || $('.item');
    var wrap = $(element) || $('.wrapper');
    var padding = padding || 25;

    // 宽度,所有元素宽度一致
    var itemW=$(".item").outerWidth(true);

    // 可容纳总列数
    var colNum=Math.floor(wrap.outerWidth(true)/child.outerWidth(true));
    console.log(colNum);//

    // 初始化第一列的top和left值
    var posi=new Array(colNum);

    $.each(posi,(i)=>{
    posi[i]=new Object();
    posi[i].top = padding;
    posi[i].left = padding + i * itemW;

    }) // 每个元素所处列数
    var eleCol=[];
    //循环图片列表
    child.each(function (i) { if ((i+1)% colNum == 0) {
    eleCol[i] = colNum;
    }else{
    eleCol[i] = (i+1) % colNum;
    }
    var sub = eleCol[i]-1;
    var top = posi[sub].top+'px';
    var left = posi[sub].left+'px';
    // 设置每个元素的位置
    $(this).css({"position":"absolute","top" :top,"left" : left});
    // 每遍历完一次,重置top值
    posi[sub].top += $(this).outerHeight(true);

    })
    }

    该方法原理图如图所示:

    这是按照顺序,根据上行图片大小对定位加以调整的方式布局的。

    但是,这种方法会造成空行。如图:

    这是由于第一列某张图片过于大的缘故。

    因此,在做瀑布流时,应该根据已布局好的元素的高度进行剩余元素的布局。就是说,比如第一行元素已经布局完成,第二行元素应该先选择第一行元素中,高度最小的那个元素所在列进行插入。这样,才能保证不会出现某一列太长或者某一列过短的现象。

  2. 根据以上分析,我们得到,实现瀑布流的核心其实是,找出图片高度最小的一列,并在此插入图片

    改进后的瀑布流方法:

    function waterfall(element,child) {
    var child = $(child) || $('.item');
    var wrap = $(element) || $('.wrapper');

    // 宽度,所有元素宽度一致
    var itemW=$(".item").outerWidth(true);

    // 可容纳总列数
    var colNum=Math.floor(wrap.outerWidth(true)/child.outerWidth(true));
    console.log(colNum);//
    ​ // 定义列高度数组并初始化
    var itemH = new Array(colNum);
    $.each(itemH,(i)=>{
    itemH[i]=0;
    })


    //循环图片列表
    child.each(function (i) {
    // 定义最小高度和对应的index并初始化
    var minHeight = itemH[0];
    var minIndex = 0;
    console.log("最初最小高度为:"+minHeight+"下标为:"+minIndex);

    // 存储本次循环对象的高度
    var thisH = $(this).outerHeight(true);

    $.each(itemH,(i)=>{
    if (itemH[i] < minHeight) {
    minHeight = itemH[i];
    minIndex = i;
    }
    console.log("比较后最小高度为:"+minHeight+"下标为:"+minIndex);
    }) ​
    var sub = minIndex;
    var top = minHeight;
    var left = minIndex * itemW;
    // 设置每个元素的位置
    $(this).css({"position":"absolute","top" :top,"left" : left});
    // 每遍历完一次,重置列高度值
    itemH[sub] += thisH;
    console.log("itemH值:"+itemH[sub]);

    })
    }

    如图所示:

代码实现链接: https://github.com/jiujiu12/web-practice/tree/master/%E7%80%91%E5%B8%83%E6%B5%81%E5%AE%9E%E7%8E%B0

瀑布流的实现纯CSS实现Jquery实现的更多相关文章

  1. 纯CSS的jQuery的气泡提示组件

    1. [代码][JavaScript]代码 //调用说明//$(selector).bub($(selector) | string[, options]);//示例: $('#demo1').bub ...

  2. 分享:纯 css 瀑布流 和 js 瀑布流

    分享一次纯 css 瀑布流  和 js 瀑布流 纯 css 写瀑布流 1.multi-columns 方式: 通过 Multi-columns 相关的属性 column-count.column-ga ...

  3. Jquery简单瀑布流代码示例

    最近很多网站都采用瀑布流风格设计,感觉挺有个性的,比较合适做图片类型的网站,没事仿开心网做一个瀑布流示例. 需要用到Jquery,jquery.masonry.min.js <!DOCTYPE ...

  4. 面向对象js瀑布流效果

    index.html <!doctype html><html lang="en"> <head>  <!--网站编码格式,UTF-8 国 ...

  5. 前端-PC端瀑布流【10张图】

    .HTML 利用封装的 jquerywaterfall.js 方法 完成 <!DOCTYPE html> <html lang="en"> <head ...

  6. 纯手工打造漂亮的瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox!

    前两天写的文章<纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!>受到很多网友的喜爱,今天特别推出姊妹篇<纯手工打造漂亮的瀑 ...

  7. [置顶] 纯手工打造漂亮的瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox!

    前两天写的文章<纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!>受到很多网友的喜爱,今天特别推出姊妹篇<纯手工打造漂亮的瀑 ...

  8. 详解纯css实现瀑布流(multi-column多列及flex布局)

    瀑布流的布局自我感觉还是很吸引人的,最近又看到实现瀑布流这个做法,在这里记录下,特别的,感觉flex布局实现瀑布流还是有点懵的样子,不过现在就可以明白它的原理了 1.multi-column多列布局实 ...

  9. 关于瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)

    瀑布流 又称瀑布流式布局,是比较流行的一种网站页面布局方式.即多行等宽元素排列,后面的元素依次添加到其后,等宽不等高,根据图片原比例缩放直至宽度达到我们的要求,依次按照规则放入指定位置. 为什么使用瀑 ...

随机推荐

  1. Skywalking的存储配置与调优

    https://blog.csdn.net/smooth00/article/details/96479544 作为一款APM和全链路监控平台,Skywalking算是挺出色的.Skywalking是 ...

  2. 史上最经典的git教程

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wsyht90.blog.51cto.com/9014030/1832284 文档 ...

  3. 3、尚硅谷_SSM高级整合_使用ajax操作实现修改员工的功能

    当我们点击编辑案例的时候,我们要弹出一个修改联系人的模态对话框,在上面可以修改对应的联系人的信息 这里我们我们要编辑按钮添加点击事件弹出对话框 第一步:在页面中在新增一个编辑联系人的模态对话框 第二步 ...

  4. 并发编程,python的进程,与线程

    并发编程 操作系统发展史 基于单核研究 多道技术 1.空间上的复用 多个程序公用一套计算机硬件 2.时间上的复用 切换+保存状态 例子:洗衣 烧水 做饭 切换 1.程序遇到IO操作系统会立刻剥夺走CP ...

  5. Unity常见的三种数据本地持久化方案

    做游戏的时候常常会有数据配置或者存读档的需求,本文整理了常用的几种解决方案,分别是Unity自带的PlayerPrefs类,XML文件和Json文件. 一. PlayerPrefs 这是Unity自带 ...

  6. Python 中的元类到底是什么?这篇恐怕是最清楚的了

    类作为对象 在理解元类之前,您需要掌握 Python 的类.Python 从 Smalltalk 语言中借用了一个非常特殊的类概念. 在大多数语言中,类只是描述如何产生对象的代码段.在 Python ...

  7. 【总结-前台发送后台接收表单】MVC提交表单的四种方式

    https://www.cnblogs.com/chenwolong/p/Form.html#commentform 后台控制器接收前台表单参数三种方法: 一.普通参数 HTML标签name 和参数名 ...

  8. MySQL统计库表大小

    统计每个库每个表的大小是数据治理的其中最简单的一个要求,本文将从抽样统计结果及精确统计结果两方面来统计MySQL的每个库每个表的数据量情况. 1.统计预估数据量 mysql数据字典库informati ...

  9. Python 简明教程 --- 22,Python 闭包与装饰器

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 当你选择了一种语言,意味着你还选择了一组技术.一个社区. 目录 本节我们来介绍闭包与装饰器. 闭包与 ...

  10. c语言学习笔记第三章———数据和C

    B站有视频演示 本章将会讲解c语言的数据定义和使用,您将会了解int.float.double.char的含义,了解命名的规则,对c语言会有更加深刻的认识. 变量命名: 我们先讲上次视频没讲的变量命名 ...