前言

like a mountain that is in our path,wo cannot complain that it is there,we simply have to climb it

起由

最近,在搭建个人博客时,其中的Demo展示页面想用瀑布流形式展现,发现现有的js插件大多基于JQ的,而我稍微有点小强迫,不想基于JQ,于是就着手自己封装了一个。顺带就研究了下css3方式实现瀑布流,于是总结了下,写了几个示例demo,就有了本文。

几种常用的瀑布流介绍

一般瀑布流的实现常见有三种方式

  • 传统的多列浮动
  • css3样式定义
  • js计算绝对布局

传统的多列浮动简介

首先固定屏幕中展示的列数,每一列中间的数据作为一组单独计算,插入数据时分别插入不同列中
优点:

  • 布局最为简单,一般只依赖与一个浮动布局
  • 不需要知道内容的高度,所以当有图片未加载时也不影响

缺点:

  • 只适用于特定的屏幕,当屏幕size变化时,无法动态实现列数的更改
  • 拓展不易

css3样式定义瀑布流简介

利用css3中特有属性,在高级浏览器中实现瀑布流效果
优点:

  • 直接使用css样式,最为简洁,不依赖于任何js
  • 拓展方便,直接往容器内部添加内容即可
  • 自适应,屏幕变化,布局也会变化
  • 当各个item的宽度不一致时,这种方式也适用
  • 像一些特殊的如固定的两列瀑布流也可以很方便实现(固定显示两列,每一列可以横着有多个item)

缺点:

  • 需要高级浏览器支持(其实这个现在已经不算缺点了)
  • 这种方式和普通瀑布流的原理有区别,不是分别往不同列中插入数据,而是先往一列中插入数据,达到一定高度后再往其它列中插入数据,有时候用这种方式会达不到预期效果(这个是比较关键的,这种方式有时候体验达不到预期)

js计算绝对布局实现瀑布流简介

利用js,动态计算元素的插入位置,利用绝对布局absolute进行定位,根据屏幕的不同可以动态调整
优点:

  • 便于拓展,方便数据的添加
  • 自适应,屏幕变化,布局也会变化

缺点:

  • 计算时需要知道内容高度,如果包含图片,需要等图片加载完毕再计算,否则会存在误差
  • 各个item的宽度需要一致

** 就实用性而言,传统的瀑布流比较适合业务场景较为单一的情况,比如手机中固定两列的情况,css3瀑布流布局由于有时候会造成一些不理想的局面,所以更多的被用在了面试题等上面,最后那张绝对布局的瀑布流方式是被应用的最为广泛的**

本文主要探讨css3瀑布流和绝对定位瀑布流的实现

css3瀑布流的实现

这种实现方式是最为简单的,仅仅是基于css3的新属性(column-width或column-count),

css3中增加了一个新的属性:column,来实现等高的列的布局效果。该属性有column-width宽度,column-count数量等,并且能根据窗口自适应。

css实现瀑布流分为两种效果,普通横向瀑布流与固定列数的瀑布流

普通横向瀑布流

这种瀑布流方式常常用于和js绝对布局方式比较,但是虽然从显示上来说,效果差不多,但是从用户体验的角度讲,这个不符合平常的习惯,以下是两种方式的效果图对比

实现代码

.container{/*宽*/-webkit-column-width:200px;-moz-column-width:200px; -o-colum-width:200px; /*间距*/ -webkit-column-gap:1px; -moz-column-gap:1px; -o-column-gap:1px; }

固定列数的瀑布流

这种布局用到比较少,但是某些面试题会经常提到,效果如下

实现代码

.container{/*固定列*//*-moz-column-count:2; -webkit-column-count:2; column-count:2;*//*间距*/-webkit-column-gap:1px; -moz-column-gap:1px; -o-column-gap:1px; }

示例与源码

想看示例页面可以戳一戳
css3瀑布流效果
源码可以查看
https://github.com/dailc/showDemo/blob/master/html/waterfallflow/demo_waterfall_flow_css3.html

js绝对布局瀑布流实现

这种实现方式是最为经典的,也是运营的最多的,网上也有很多的原生或jq插件,本文这里也用原生js重新封装了一个类库,方便调用,效果如图

实现思路

瀑布流的实现思路其实很简单,如下:

  1. 获取元素容器的总宽度allWith, 每一个瀑布流元素的列宽度 itemWidth(如果大于allwidth,会有一个默认值替代)
  2. 计算当前容器可以显示的列数 column Math.floor(allwidth/itemWidth) 向下取整
  3. 添加一个元素前,计算每一列当前的高度,寻找当前高度最小的列,然后根据列的序号k,确定item的left和top,lef=k*itemWidth top=当前列的高度,然后当前列插入这个元素,当前列的高度加上这个元素的高度
  4. 所有元素插入完毕后,容器的高度会调整为最大列的高度
  5. 初始化就是先读取页面的所有元素,然后一个一个插入,加载更多就是在已有的元素基础上,插入新的元素计算

实现代码

由于代码较为占用篇幅,这里就不再赘述,基本根据实现思路都能实现出来,也可以查看下面提供的源码链接

示例与源码

想看示例页面可以戳一戳
js瀑布流效果

源码可以查看
https://github.com/dailc/showDemo/blob/master/html/waterfallflow/demo_waterfall_flow_js.html

参考链接

  • [瀑布流布局——JS+绝对定位](http://www.cnblogs.com/slowsoul/archive/2013/02/10/2909746.html)
  • 基于css3 column-width 实现的瀑布流
标签: JavaScript 瀑布流 css3
转载http://www.cnblogs.com/dailc/p/6058965.html

转载于:https://www.cnblogs.com/wang1593840378/p/6063595.html

网页瀑布流效果实现的几种方式相关推荐

  1. 代码最少的网页瀑布流效果

    <!DOCTYPE html> <html><head><meta charset="utf-8"/><title>代码 ...

  2. 瀑布流效果,用女神图片用三种方法实现,比在浏览器看过瘾,哈哈哈

    第一种方法:采用纯CSS的"多列"属性 实现瀑布流用到的一些多列属性: 1. column-count:指定元素的列数 2. column-gap:指定列之间的差距 3. colu ...

  3. jQuery实现响应式瀑布流效果(jQuery+flex)

            瀑布流原理:是一种常见的网页布局方式,它的特点是将内容以多列的形式呈现,每一列的内容高度不固定,根据内容的大小自适应调整,从而形成了像瀑布一样的流动效果. 瀑布流的实现原理涉及到数据加 ...

  4. 30个创意出色的非常实用的jquery框架插件-(视觉大背景,瀑布流效果)

    jQuery是在网页设计师和开发者最近的热门话题之一.人们使用它的广泛范围从个人博客到企业网站,目前流行的视觉大背景滚动效果,瀑布流图片阴影效果,图片缩放,动态标签复制,html5音频播放,视频播放等 ...

  5. 利用JS实现简单的瀑布流效果

    转载:https://www.cnblogs.com/dyx-wx/p/4642637.html 一.瀑布流之准备工作   首先声明下, 为了方便演示和联系, 我使用的是本地图片, 如果大家有需要的话 ...

  6. javascript瀑布流效果

    javascript瀑布流效果 其实javascript瀑布流 前几年都已经很流行了(特别是美丽说,蘑菇街),最近看到网上有人问这个瀑布流效果,所以自己有空的时候就研究了下,其实也是研究别人的代码,研 ...

  7. 前端如何实现音乐盒胶盘的转动_干货来袭!web前端开发工程师必看之如何使用CSS3实现瀑布流效果?...

    首先,我们来看一下什么是瀑布流布局效果,比如电商网站 蘑菇街 原理图: 在一个大盒子里,放置多个小盒子,小盒子的大小可以不一致,长短不一样,呈现一种瀑布流的效果. 使用CSS3S实现只需要如下4步: ...

  8. wpf 客户端【JDAgent桌面助手】开发详解(三) 瀑布流效果实现与UI虚拟化优化大数据显示...

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

  9. 图片流_干货来袭!web前端开发工程师必看之如何使用CSS3实现瀑布流效果?

    首先,我们来看一下什么是瀑布流布局效果,比如电商网站 蘑菇街 原理图: 在一个大盒子里,放置多个小盒子,小盒子的大小可以不一致,长短不一样,呈现一种瀑布流的效果. 使用CSS3S实现只需要如下4步: ...

最新文章

  1. JavaScript创建对象–如何在JS中定义对象
  2. [UIImage imageNamed:@]使用误区
  3. html外链式css运行不出来div,html+css外链式
  4. 汇编:call指令的应用
  5. lodop转到其他html页面,Lodop实现打印功能
  6. cocos2d-x for wp 之Box2D的应用
  7. 斯坦福大学机器学习公开课视频及课件
  8. AcWing323. 战略游戏(树形DP)题解
  9. C#中datagirdview表头变换
  10. cisco 交换机设置时区、时间、同步日志本地时间等操作
  11. docker-compose部署nacos 集群超过2个容器的问题
  12. Delphi多媒体设计之TMediaPlayer组件(三)
  13. 华为交换机SSH登录配置
  14. 360安全浏览器极速模式怎么设置
  15. 酒桌扑克娱乐喝酒小游戏微信小程序源码下载多娱乐功能支持流量主
  16. 计算机组装与维护结构图,图解计算机组装与维护
  17. Centos7解决不能上网问题
  18. git、gitlab+jenkens版本控制的安装、升级与灾备
  19. iVX无代码挑战五秒游戏制作
  20. idea设置代码注释

热门文章

  1. Python3 高级特性
  2. 关于数论【康托展开及其逆运算】
  3. 浅谈AJAX基本实现流程
  4. AngularJS实现原理
  5. Linux(Centos6.5)用户名密码
  6. XCode 6 出现 no identity found: Command /usr/bin/codesign failed with exit code 1 解决方法汇总...
  7. BufferedReader
  8. dos 命令与 C++的联合作业,有点意思~
  9. (转)我的座驾见谁灭谁!
  10. SOA流程项目到底是业务流还是工作流