js实现瀑布流布局

window.onload = function () {    var d1 = new Waterfall();    d1.init();};//构造函数function Waterfall() {    this.oColNum =null;//显示列数    this.oData = null;  //存储请求数据    this.settings ={        width:300,        autoLoad:true    }}//初始化方法Waterfall.prototype.init = function (opt) {    extend(this.settings,opt);    this.requestData();    var that = this;    window.onresize = function(){        that.init();    };

//滚动无限加载    if(this.settings.autoLoad){        // var that = this;        window.onscroll = function(){            if(getScrollTop() + getWindowHeight() == getScrollHeight()){                that.recreateEle();            }        };    }};//创建itemWaterfall.prototype.createItem = function (Data) {    var owater = document.getElementById("water-content");    var html="";    this.oData = Data;    var _this = this;    // console.log(this.oData.waterfall);    this.oData.waterfall.forEach(function (item,index) {        html +=‘<div class="waterfall-item" style="width: ‘+_this.settings.width+"px"+‘"><div class="waterfall-img"><img class="waterfall-images" src="‘+item.src+‘"></div><div class="info"><span>‘+item.name+‘</span></div></div>‘;    });    owater.innerHTML=html;};

//请求获取数据Waterfall.prototype.requestData =function () {    var xmlhttp;    var data=null;    var _this=this;    if (window.XMLHttpRequest)    {        //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码        xmlhttp=new XMLHttpRequest();    }    else    {        // IE6, IE5 浏览器执行代码        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");    }

xmlhttp.onreadystatechange=function()    {        if (xmlhttp.readyState==4 && xmlhttp.status==200)        {            data=eval(‘(‘ +xmlhttp.responseText+ ‘)‘);            //渲染数据            _this.createItem(data);

//存储img的src            var src =document.getElementsByClassName("waterfall-images");

//循环遍历创建 new Image;对象,保证onload事件执行,以获取加载img的div高度            for(var i = 0; i<src.length;i++){                var img = new Image();                img.onload =function () {                    // console.log(img.src);

//设置位置样式

_this.setWaterfall();

};                img.src = src[i].src;            }

}    };    xmlhttp.open("GET","waterfall.json",true);    xmlhttp.send();

};//排版布局Waterfall.prototype.setWaterfall = function () {    this.oColNum = parseInt(viewWidth()/this.settings.width);    var oColNumHeight = [];//存储每一列的高度

for(var i = 0;i<this.oColNum;i++){        oColNumHeight.push(0);    }

var items =document.getElementsByClassName("waterfall-item");    //遍历设置元素位置    for(var i = 0; i < items.length; i++){        var curEle = items[i],            idx = 0;//存储最小值对应索引        var minHeight = oColNumHeight[0];//临时存储最小高度        //获取最小高度,以放置元素

for(var j = 0; j < oColNumHeight.length; j++){

if( minHeight >oColNumHeight[j]){                minHeight = oColNumHeight[j];                idx = j;

}

}

//设置元素位置        curEle.style.left = curEle.offsetWidth * idx +"px";        curEle.style.top = minHeight + "px";

// //更新每列的高度数据

oColNumHeight[idx] = oColNumHeight[idx]+ curEle.offsetHeight;

}

// for (var i = 0; i<items.length ;i++){    //     items[i].className = ‘waterfall-item‘;    // }

// items.forEach(function (item,index) {    //     var curEle = item,    //         idx =0,    //         minHeight = that.oColNumHeight[0];    //     for(var i = 0; i<that.oColNumHeight.length;i++){    //         if(minHeight>that.oColNumHeight[i]){    //             minHeight = that.oColNumHeight[i];    //             idx = i;    //         }    //     }    //     curEle.style.left = that.settings.width*idx +"px";    //     curEle.style.top = minHeight + "px";    //     that.oColNumHeight[idx] = minHeight + curEle.style.height;    //    // })};

//滚动无限加载Waterfall.prototype.recreateEle = function () {    var dataSrc = {        "data":[            {                "src":"1.jpg",                "name":"重加载!"            },            {                "src":"5.jpg",                "name":"重加载!"            },            {                "src":"3.jpg",                "name":"重加载!"            },            {                "src":"6.jpg",                "name":"重加载!"            },            {                "src":"9.jpg",                "name":"重加载!"            },            {                "src":"8.jpg",                "name":"重加载!"            },            {                "src":"1.jpg",                "name":"重加载!"            },            {                "src":"5.jpg",                "name":"重加载!"            },            {                "src":"3.jpg",                "name":"重加载!"            },            {                "src":"6.jpg",                "name":"重加载!"            },            {                "src":"9.jpg",                "name":"重加载!"            },            {                "src":"8.jpg",                "name":"重加载!"            }        ]    };    var _this =this;    var oDiv = document.getElementById("water-content");// <div class="waterfall-img"><img class="waterfall-images" src="‘+item.src+‘"></div><div class="info"><span>‘+item.name+‘</span></div>    //创建加载的元素    for (var i = 0; i < dataSrc.data.length;i++){        var oItem = document.createElement("div");        oItem.className = "waterfall-item";        oItem.style.width = _this.settings.width +‘px‘;        oDiv.appendChild(oItem);

var oItemImg = document.createElement("div");        oItemImg.className = ‘waterfall-img‘;        oItem.appendChild(oItemImg);

var oImg = document.createElement("img");        oImg.className = ‘waterfall-images‘;        oImg.src =dataSrc.data[i].src;        oItemImg.appendChild(oImg);

var oInfoDiv = document.createElement("div");        oInfoDiv.className = ‘info‘;        oItem.appendChild(oInfoDiv);

var oSpan = document.createElement("span");        oSpan.innerHTML = dataSrc.data[i].name;        oInfoDiv.appendChild(oSpan);    }    //存储img的src    var src =document.getElementsByClassName("waterfall-images");

// console.log(src);    //循环遍历创建 new Image;对象,保证onload事件执行,以获取加载img的div高度    for(var i = src.length - 1; i > src.length - dataSrc.data.length;i--){        var img = new Image();        img.onload =function () {

//设置位置样式            _this.setWaterfall();            // console.log(‘.....‘)        };        img.src = src[i].src;    }

};

//获取浏览器可视宽度function viewWidth() {    return document.documentElement.clientWidth;}//实现复制function extend(obj1,obj2) {    for(var attr in obj2){        obj1[attr] = obj2[attr];    }}

//滚动条在Y轴上的滚动距离

function getScrollTop(){    var scrollTop = 0, bodyScrollTop = 0, documentScrollTop = 0;    if(document.body){        bodyScrollTop = document.body.scrollTop;    }    if(document.documentElement){        documentScrollTop = document.documentElement.scrollTop;    }    scrollTop = (bodyScrollTop - documentScrollTop > 0) ? bodyScrollTop : documentScrollTop;    return scrollTop;}

//文档的总高度

function getScrollHeight(){    var scrollHeight = 0, bodyScrollHeight = 0, documentScrollHeight = 0;    if(document.body){        bodyScrollHeight = document.body.scrollHeight;    }    if(document.documentElement){        documentScrollHeight = document.documentElement.scrollHeight;    }    scrollHeight = (bodyScrollHeight - documentScrollHeight > 0) ? bodyScrollHeight : documentScrollHeight;    return scrollHeight;}

//浏览器视口的高度

function getWindowHeight(){    var windowHeight = 0;    if(document.compatMode == "CSS1Compat"){        windowHeight = document.documentElement.clientHeight;    }else{        windowHeight = document.body.clientHeight;    }    return windowHeight;}

原文地址:https://www.cnblogs.com/chenjianbao/p/9969663.html

时间: 2024-10-12 06:49:59

js实现瀑布流布局的相关文章

纯js实现瀑布流布局及ajax动态新增数据

本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax模拟数据图片后,是将整个页面的所有图片都重新定位一次. 3. 程序是等所有图片加载完成后再读取图片的尺寸,实际中肯定不能这样做. 4. 实际项目中,应该由后台程序给出图片尺寸值,在js代码中直接使用图片的width属性. 本程序思路: html结构: ? 1 2 3 4 5 6 7 8 9 10 1

原生JS实现瀑布流布局

一.瀑布流之准备工作   首先声明下, 为了方便演示和联系, 我使用的是本地图片, 如果大家有需要的话可以尝试着写下网络的, 不过本地和远端的大致是相同的. 那么我就来简单介绍下本地的瀑布流效果吧, 我们要先准备好八九张图片, 当然啦, 我们实现的是瀑布流效果, 所以最好是高度不相同的, 这样才可以看出来效果, 对吧, 嘿嘿. 二.代码的准备工作  我们打开开发工具, 先建个html工程, 在内部写下如下代码, 因为是准备工作, 所以刚开始写的都是一些基础性的东西, 就不一一解释了, 直接上代码

10几款网站瀑布流布局图片无限加载动效

jQuery选项卡形式图片瀑布流布局选项卡切换效果代码 jquery masonry瀑布流插件制作图片瀑布流布局代码 原生js简单瀑布流图片无限加载带鼠标悬停图片遮罩效果 jquery masonry瀑布流插件制作图片瀑布流布局代码 jquery柔韧性的图片滑动瀑布流布局 jquery时间轴插件文字图片瀑布流布局时间轴特效(不兼容IE678) modernizr html5图片预加载瀑布流布局鼠标悬停动画效果代码 jquery.waterfall.js自动底部填充对齐的瀑布流布局代码 jquer

JS瀑布流布局模式(1)

在实际的项目中,偶尔会用到一种布局——瀑布流布局.瀑布流布局的特点是,在多列布局时,可以保证内容区块在水平方向上不产生大的空隙,类似瀑布的效果.简单的说,在垂直列表里,内容区块是一个挨着一个的.当内容较多且不固定时,就依赖于html结构的顺序,非常受限制.这里给了一个简单的例子,只要传入列表的数量和宽度,就可以动态的将数据放到对应的列里. 原理 1.定义两个容器,一个是存放内容,一个是要展示的列表. 2.将每列的offsetHeight存入一个数组里,比较得出最小的那一列,然后把数据放到最小的列

我的第一篇博客 —— 用 js 和 css 简单实现瀑布流布局

一个拖延症晚期患者的自述: 注册了博客快一个月了,终于要迎来我的第一篇博客了哈哈哈!!! 刚注册的时候,满脑子要频繁更新,扩充自己的知识库,一到真正落实,就不得不为懒惰屈服,还好有了学习计划,以后应该会每周一更(不更当我没说).当然了,肯定是希望被更多人看到,帮助到大家,如果没人看的话就当作是自己的积累与记录吧! 还有,我目前工作是前端工程师,还是一名刚入行不久的菜鸟哈哈哈!!!现在主要目标是先把前端知识巩固好,再逐步往全栈领域发展(毕竟装13是我一生的职责). 所以,请各位大佬们多多指教,如果

js瀑布流布局

绝大多数的网页都是分为几列进行排版(几个div),传统布局就是将内容模块直接写在这几个div中.但是这种布局存在一个问题,那就是如果这个页面的信息非常的庞大,内容很多时这几列div会非常的长.而浏览器是逐行加载的,上述情况下会出现页面一直在加载第一列的内容,半天加载不完,而另外的几列什么都不显示. 用户是横向观看网页的,而上述情况下网页却是在逐列的纵向加载,这使得用户体验极差.为解决这种情况,就需要瀑布流布局.在几列中进行横向加载. 代码如下: function fnRand(min,max){

微信小程序 瀑布流布局

今天做小程序的时候,碰到一个比较常见的需求,就是要瀑布流布局,两列,交错分布,大概如下图 最终要实现的结果就是如左图所示. 不过在微信小程序里面,不能通过JavaScript来直接操作dome,所以一些常用的方法在这里都没有办法用了.这让笔者非常着急,因为项目比较赶,不能因为这种低级的布局问题拖慢了进度. 百度了半天,发现了css3的column这个属性,但是最后实现出来的方法就如右图所示,这不符合需求,需求是两列,从左到右进行排列的,大概就像小红书APP那种瀑布流布局 最后笔者终于找到一种非常

js实现瀑布流以及加载效果

一.瀑布流是个啥? 瀑布流,是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部. 最早采用瀑布流布局的网站是Pinterest,逐渐在国内流行开来,比如我们熟知的百度图片的布局,在"很久"以前,百度图片还是需要一页一页的点击进行查看更多图片,而现在的瀑布流布局使用户查找图片更加方便. 二.瀑布流的优缺点 优点: 1.节省了页面的空间,不再需要导航和页码按钮. 2.增强了用户的体验,使用户的体验更多的是在于浏览图

JavaScript——基本的瀑布流布局及ajax动态新增数据

本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax模拟数据图片后,是将整个页面的所有图片都重新定位一次. 3. 程序是等所有图片加载完成后再读取图片的尺寸,实际中肯定不能这样做. 4. 实际项目中,应该由后台程序给出图片尺寸值,在js代码中直接使用图片的width属性. 本程序思路: html结构: <body> <div id="