明白了,那是页面居中对齐?
因为IE浏览器不支持getElementsByClassName这个方法 所以我们都是设置一个函数来通过类名获取变量。已解决
cols的值是根据浏览器窗口的宽度动态计算出来的
我想说的是浮动地元素在排列在一行时,不是顶端对齐呀,如果不够一排,不是换行显示,等到第二排,时,那么第二排,不是以第一排浮动地元素排列的元素最下端为顶点啊,不知道我说的你明白不
元素的实际宽度,包括padding 和 border 应该是这样,希望能帮到你
知道了,原来我html里面写的是class 所以用byid 出不来,要把class换成id
应该是waterfall函数里oParent有没有获取到#main元素.后面通过tagName获取元素oElements=parent.getElementByTagName('*');getElementByTagName应该是getElementsByTagName
因为这些盒子和里面的图片是需要根据接收到的后台数据,动态创建出来,再渲染到页面上的;
只有 getElementsByTagName 可以获取到动态创建的 DOM,getElementsByClassName、querySelectorAll 这些都只能获取前端写死的数据。
function getByClass(parent,clsname) {
var boxarr = new array(),
OElements = parent.getElementsByTagName('*');
for (var i = 0; i < OElements.length; i++) {
if (OElements[i].className == clsname) {
boxarr.push(OElements[i]);
}
}
return boxarr;
}
document.getElementById('main').offsetHeight
var boxs=document.querySelectorAll("div[class='box']");还可以使用这个啊,里面的参数符合css规范可以很方便查出 所有class为box的div
waterfall是实现瀑布流的函数对吧,而parent和box是获取两个值对吧(box子元素要从parent父元素里面找),那么就需要有东西来接收这两个值,所以定义了oParent这个对象来接收parent这个值(父元素),oBox是存放所有class为box的数组,里面放着class="box"的全部的盒子,一个盒子是一个值,我们要控制这些值来达到控制盒子的目的,getByclass一个功能的函数,所以单独封装成一个函数了,这里创建这个函数是为了从“main”中获取子元素“box”,main为box的父元素,所以用parent来定义
15px 是padding,不是margin,没用margin属性
就是将最外层的div设置为水平居中对齐呀
我知道了,因为我的boxes是数组不是一个元素嘻嘻
js里面的waterfall其实也可以不用放参数,你可以试一下。个人觉得放参数的目的是为了将这个函数传入不同的参数以便多次应用。但是本课中不放参数也没什么影响的地方。
function waterfall(){ var oParent = document.getElementById('container'); var oBoxs = oParent.getElementsByClassName('box'); //获取一行能放几张图片 var boxWidth = oBoxs[0].offsetWidth; var cols = Math.floor(window.innerWidth/boxWidth); var oContainer = document.getElementById('container'); oContainer.style.width=cols*boxWidth+'px'; var oBoxH =[]; for(var i=0;i<oBoxs.length;i++){ if(i<cols){ //定义一个数组用来保存每一行的高度 oBoxH[i]= oBoxs[i].offsetHeight; }else{ //找到oBoxH中高度最小的元素 var minH = Math.min.apply(null,oBoxH); var index = getminHIndex(oBoxH,minH); oBoxs[i].style.position='absolute'; oBoxs[i].style.left=index*boxWidth+'px'; oBoxs[i].style.top = minH + oBoxs[index].offsetTop+'px'; oBoxH[index]+=oBoxs[i].offsetHeight; } } }
这个是jQuery的。
function waterfall(){ var $boxs = $('.box'); var w = $boxs.eq(0).outerWidth(); var cols = Math.floor($(window).width()/w); $('#container').css('width',cols*w); var hArr =[]; $boxs.each(function(index,value){ if(index<cols){ hArr[index]=$boxs.eq(index).outerHeight(); }else{ var minH = Math.min.apply(null,hArr); var minHIndex = $.inArray(minH,hArr); $(value).css({ 'position':'absolute', 'top':minH+'px', 'left':minHIndex*w+'px' }); hArr[minHIndex]+=$(value).outerHeight(); } }) }
刚学完瀑布流,新人勿喷。
我解决了 我把包括mian在内的div全部复制粘贴了 hhhhhh...
JQuery都直接获取了... 你还想传啥?
。。。。知道哪里错了
样式没问题,应该是js部分出错了
因为我们仅仅是设置了页面的宽度,没有给img设置固定位置
body是DOM对象里的body子节点,即 <body> 标签;
documentElement 是整个节点树的根节点root,即<html> 标签;
我有个方法,试试吧var oParent=document.getElementById('parent');当中的引号去掉,他们就能找到main元素,然后就正常了
视频中
Ma.style.cssText = 'width:'+oBoxW*cols+'px;margin:0 auto';
是在waterfall函数里的 我贴下我的整个代码你参考下吧
window.onload = function() {
waterfall('main', 'box');
//模拟后台过来的JSON数据
var dataInt = {"data":[{"src":'0.jpg'},{"src":'1.jpg'},{"src":'2.jpg'}]}
window.onscroll = function() {
if (checkScrollSlide){
var oParent = document.getElementById('main');
//将数据块渲染到当前页面的尾部
for (var i = 0; i < dataInt.data.length; i++) {
var oBox = document.createElement('div');
oBox.className = 'box';
oParent.appendChild(oBox);
var oPic = document.createElement('div');
oPic.className = 'pic';
oBox.appendChild(oPic);
var oImg = document.createElement('img');
oImg.src = "images/" + dataInt.data[i].src;
oPic.appendChild(oImg);
}
//再将新数据排列
waterfall('main', 'box');
}
}
}
function waterfall(parent, box) {
//将main下的所有class为box的元素取出来
var oParent = document.getElementById(parent);
var oBoxs = getByClass(oParent, box);
//计算页面显示的列数(页面宽/box的宽)
var oBoxW = oBoxs[0].offsetWidth;
//document.documentElement.clientWidth获取用户页面宽度
var cols = Math.floor(document.documentElement.clientWidth / oBoxW);
//动态设置main div的宽度和居中
oParent.style.cssText = 'width:' + oBoxW * cols + 'px;margin:0 auto';
var hArr = [];
for (var i = 0; i < oBoxs.length; i++) {
if (i < cols) {
hArr.push(oBoxs[i].offsetHeight);
} else {
var minH = Math.min.apply(null, hArr);
var index = getMinhIndex(hArr, minH);
oBoxs[i].style.position = 'absolute';
oBoxs[i].style.top = minH + 'px';
//oBoxs[i].style.left = oBoxW*index + 'px';
oBoxs[i].style.left = oBoxs[index].offsetLeft + 'px';
//添加图片后最小值加上他下面那张图片的高度
hArr[index] += oBoxs[i].offsetHeight;
}
}
}
//根据class获取元素
function getByClass(parent, clsName) {
var boxArr = new Array(), //用来存储获取到的所有class为box 的元素
oElements = parent.getElementsByTagName('*');
for (var i = 0; i < oElements.length; i++) {
if (oElements[i].className == clsName) {
boxArr.push(oElements[i]);
}
}
return boxArr;
}
function getMinhIndex(arr, val) {
for (var i in arr) {
if (arr[i] == val) {
return i;
}
}
}
//检测是否具备加载数据块的条件
function checkScrollSlide(argument) {
var oParent = document.getElementById('main');
var oBoxs = getByClass(oParent, 'box');
//oBoxs[oBoxs.length-1].offsetTop最后一个盒子距离整个页面顶部的距离
// lastBoxH 最后一个盒子一半到整个页面顶部的距离
var lastBoxH = oBoxs[oBoxs.length - 1].offsetTop + Math.floor(oBoxs[oBoxs.length - 1].offsetHeight / 2);
//混杂模式document.body.scrollTop 标准模式document.documentElement.scrollTo 获取滚动的高度
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
var height = document.body.clientHeight || document.documentElement.clientHeight;
return (lastBoxH<scrollTop+height)?true:false;
}
我也是~
0.0声明错了啊,你声明数组完了后用的 ; 号,改成逗号就好了~
。。。。。。。。这哥们很可以啊。。。。。。
clientwidth=width+padding,main的宽度指的就是width的值
document.documentElement.clientWidth本来就是获取当前页面的宽度,所以刷新了列数变化了是正常的