分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

js实现瀑布流布局

发布时间:2023-09-06 02:22责任编辑:郭大石关键词: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();
???????????}
???????};
???}
};
//创建item
Waterfall.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;
}

js实现瀑布流布局

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved