热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

页面瀑布流布局的实现javascript+css

先看所谓的瀑布流布局在不使用瀑布流布局的情况下,当页面要显示不同高度的图片时,会如下面显示下面的元素总是和最靠近它的元素对齐。为了使元素能够在我们想要的位置上显示,我们使用绝对定位。 说一下大体思路(也是看了别人的):一切的不对齐都是从第一行的图片排列开始的,也许不是很准确,那么换一个说法:要想使图片排列整齐,那么就得从第一行排列开始。假设第一行x个元素排列中有一

先看所谓的瀑布流布局

页面瀑布流布局的实现 Javascript+css

在不使用瀑布流布局的情况下,当页面要显示不同高度的图片时,会如下面显示

页面瀑布流布局的实现 Javascript+css

下面的元素总是和最靠近它的元素对齐。

为了使元素能够在我们想要的位置上显示,我们使用绝对定位。

 

说一下大体思路(也是看了别人的):
一切的不对齐都是从第一行的图片排列开始的,也许不是很准确,那么换一个说法:
要想使图片排列整齐,那么就得从第一行排列开始。
假设第一行x个元素排列中有一个最矮的(假设不假设都一样,假设是为了便于理解),
较高的元素比这个最矮的要多出一块区域来,那么第二行就要有人去把这个多出来的区域填上
当有人填上后,我们发现第一行最矮元素再加上这个填空白元素,比其他元素都更高了,这时我们把他俩看成一个元素
这样还是只有一行x个元素,然后就循环呗!每次找出最矮的来,让下一行的元素填充

代码如下(图片和reset.css要自己准备)

  1 DOCTYPE html>
  2 <html>
  3 <head>
  4 <meta charset="gb2312" />
  5 <title>瀑布流练习title>
  6 <link type="text/css" rel="stylesheet" href="./css/reset.css" />
  7 
  8 <style>
  9 ul.wrap{
 10     width:1200px;
 11     margin:0 auto;
 12     position:relative; /* 相对定位 */
 13 }
 14 ul.wrap li{
 15     width:400px;
 16     float:left;
 17     position:absolute; /* 绝对定位 */
 18 }
 19 ul.wrap li img{
 20     /* 计算好长度 */
 21     width:364px;
 22     border:2px solid #bdbdbd;
 23     padding:10px;
 24     margin:4px;
 25 }
 26 style>
 27 
 28 <script type="text/Javascript">
 29 
 30 window.onload = function(){
 31     pubuliu("ulwrap",3,400);
 32 };
 33 
 34 //实现ul下的li瀑布流
 35 //cols 表示一行几列,liWidth 表示一列的宽度
 36 function pubuliu(ulId,cols,liWidth){
 37     var wrap = document.getElementById(ulId);
 38     var lis = wrap.getElementsByTagName("li");
 39     
 40     var li_h = [];
 41     for(var i=0; i<lis.length; i++){
 42         if(i < cols){
 43             li_h[i] = lis[i].scrollHeight;
 44             //定位元素
 45             lis[i].style.left = i * liWidth + "px";
 46             lis[i].style.top = "0px";
 47         }else{
 48             //获取数组最小值
 49             var min_liH = Math.min.apply( Math, li_h );
 50             var key = getKeyByValue(li_h,min_liH);
 51             //重定义最小高度
 52             li_h[key] = min_liH + lis[i].scrollHeight;
 53             
 54             //定位元素
 55             lis[i].style.left = key * liWidth + "px";
 56             lis[i].style.top = min_liH + "px";
 57         }
 58     }
 59 }
 60 
 61 //根据数组中的值获取索引
 62 function getKeyByValue(arr,value){
 63     for(var i=0; i<arr.length; i++){
 64         if(arr[i] == value){
 65             return i;
 66         }
 67     }
 68 }
 69 script>
 70 head>
 71 
 72 <body>
 73     <ul class="wrap clearfix" id="ulwrap">
 74         <li>
 75             <img src="./images/1.jpg" />
 76         li>
 77         <li>
 78             <img src="./images/2.jpg" />
 79         li>
 80         <li>
 81             <img src="./images/3.jpg" />
 82         li>
 83         <li>
 84             <img src="./images/4.jpg" />
 85         li>
 86         <li>
 87             <img src="./images/5.jpg" />
 88         li>
 89         <li>
 90             <img src="./images/6.jpg" />
 91         li>
 92         <li>
 93             <img src="./images/7.jpg" />
 94         li>
 95         <li>
 96             <img src="./images/8.jpg" />
 97         li>
 98         <li>
 99             <img src="./images/9.jpg" />
100         li>
101         <li>
102             <img src="./images/10.jpg" />
103         li>
104     ul>
105 body>
106 html>

瀑布流布局分为两部分:css部分和js部分。

css部分负责确定 li 的宽度、一行显示几列和定位方式

js部分负责确定具体的定位坐标

 

解释一下pubuliu(ulId, cols, liWidth)这个函数。它对 ulId 元素下的子li元素进行瀑布流布局,cols是一行显示几列,liWidth是一列的宽度。

 


推荐阅读
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • 基于JavaScript实现下拉列表左右移动的案例
    这篇文章将为大家详细讲解有关基于JavaScript实现下拉列表左右移动的案例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章 ... [详细]
  • 今天我们开始学习下拉及多级弹出菜单,包含以下内容和知识点:带下拉子菜单的导航菜单绝对定位和浮动的区别和运用css自适应宽度滑动门菜单一、带下拉子菜单的导航菜单下拉菜单在一些 ... [详细]
  • 在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用java.util包中的Date类。这个类最主要的作用就是获取当前时间,我们来看下Date类的使用:使用Date类的 ... [详细]
  • 1.Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时 ... [详细]
  • Android获取app应用程序大小的方法
    Android获取app应用程序大小的方法-Android对这种方法进行了封装,我们没有权限去调用这个方法,所以我们只能通过AIDL,然后利用Java的反射机制去调用系统级的方法。 ... [详细]
  • asp中如何嵌入python的简单介绍
    本文目录一览:1、如何在IIS中执行Python脚本 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • 巧用arguments在Javascript的函数中有个名为arguments的类数组对象。它看起来是那么的诡异而且名不经传,但众多的Javascript库都使用着它强大的功能。所 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • 第8章 使用外部和内部链接
    8.1使用web地址LearnAboutafricanelephants. ... [详细]
  • nginx+多个tomcat
    学习nginx的时候遇到的问题:nginx怎么部署两台tomcat?upstream在网上找的资源,我在nginx配置文件(nginx.conf)中添加了两个server。结果只显 ... [详细]
  • 学习kmp算法我最后是看的数据结构书上的一本教材学会的。。我觉得kmp相对于普通的BF算法就是避免了很多不必要的匹配,而kmp算法的精髓自然就在于next数组的运用。。。而next ... [详细]
  • opengl 旋转矩阵和纹理坐标相乘_OpenGLRotating Points
    全球图形学领域教育的领先者、自研引擎的倡导者、底层技术研究领域的技术公开者,东汉书院在致力于使得更多人群具备内核级竞争力的道路上,将带给小伙伴们更多的公 ... [详细]
  • 4554:[Tjoi2016&Heoi2016]游戏 ... [详细]
author-avatar
郭昊天886688
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有