为了账号安全,请及时绑定邮箱和手机立即绑定

关于缩小窗口的bug

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jQuery瀑布流</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
<script type="text/javascript" src="js/jquery-3.2.0.min.js"></script>
<script type="text/javascript" src="js/script.js"></script>
</head>
<body>
<div id="main">
<div>
<div>
<img src="images/0.jpg" />
</div>
</div>

<div>
<div>
<img src="images/1.jpg" />
</div>
</div>


<div>
<div>
<img src="images/2.jpg" />
</div>
</div>


<div>
<div>
<img src="images/3.jpg" />
</div>
</div>


<div>
<div>
<img src="images/4.jpg" />
</div>
</div>

<div>
<div>
<img src="images/5.jpg" />
</div>
</div>

<div>
<div>
<img src="images/6.jpg" />
</div>
</div>

<div>
<div>
<img src="images/7.jpg" />
</div>
</div>

<div>
<div>
<img src="images/8.jpg" />
</div>
</div>

<div>
<div>
<img src="images/9.jpg" />
</div>
</div>

<div>
<div>
<img src="images/10.jpg" />
</div>
</div>

<div>
<div>
<img src="images/11.jpg" />
</div>
</div>

<div>
<div>
<img src="images/12.jpg" />
</div>
</div>

<div>
<div>
<img src="images/13.jpg" />
</div>
</div>

<div>
<div>
<img src="images/14.jpg" />
</div>
</div>

<div>
<div>
<img src="images/15.jpg" />
</div>
</div>

<div>
<div>
<img src="images/16.jpg" />
</div>
</div>
</div>


</body>
</html>
*{
	margin: 0;
	padding: 0;
}

#main{
	position: relative;
}

/* 设置图片与图片之间的间距 用padding 是因为后面会用到offsetHeight 该属性不能获取margin */
.box{
	padding: 15px 0 0 15px;
	float: left;
}

.pic{
	padding: 10px;
	border: 1px solid #ccc;
	border-radius: 5px;
	box-shadow: 0 0 5px #ccc;
}

.box img{
	width: 162px;
	height: auto;
}
$(window).on("load",function(){
	waterfall();
	var dataInt={"data":[{"src":"0.jpg"},{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"}]};
	$(window).on("scroll",function(){
		if(checkScrollSlide()){
			$.each(dataInt.data,function(key,value){
				//jQuery创建元素
				var oBox=$("<div>").addClass("box").appendTo($("#main"));
				var oPic=$("<div>").addClass('pic').appendTo($(oBox));

				$("<img>").attr("src","./images/"+$(value).attr("src")).appendTo($(oPic));

			});
			waterfall();
		}
	});
});

function waterfall(){
	var $boxs=$("#main>div");
	//见前端收藏
	var w=$boxs.eq(0).outerWidth(); 

	//width()括号内没值就是获取 有值就是设置元素宽度
	var cols=Math.floor($(window).width()/w);

	$("main").width(w*cols).css("margin","0 auto");

	var hArr=[];



	$boxs.each(function(index,value){
		var h=$boxs.eq(index).outerHeight();
		if(index<cols){
			hArr[index]=h;
		}else{
			var minH=Math.min.apply(null, hArr);

			//在数组中寻找某元素的下标
			var minHIndex=$.inArray(minH, hArr);
			//value中是DOM对象,需要转变成jQuery对象才能调用css方法
			$(value).css({
				"position":"absolute",
				"top":minH+"px",
				"left":minHIndex*w+"px"
			});

			hArr[minHIndex]+=$boxs.eq(index).outerHeight();
		}
		
	})
}

function checkScrollSlide(){
	var $lastBox=$("#main>div").last();
	//offset().top最后一个图片框距离顶部的距离
	var lastBoxDis=$lastBox.offset().top+Math.floor($lastBox.outerHeight()/2);

	var scrollTop=$(window).scrollTop();

	var documentH=$(window).height();

	return (lastBoxDis<scrollTop+documentH)?true:false;
}

当窗口缩小的时候 第一行右上角图片消失

http://img1.sycdn.imooc.com//590c1deb0001cb5606960270.jpg

但把窗口最大化后,又恢复正常

在上一章节中,js实现里面我在问答里看到有人加了一段代码后解决了

http://img1.sycdn.imooc.com//590c1e7a00015f1405750411.jpg

因此我仿照这个写了个jQuery的

http://img1.sycdn.imooc.com//590c1ec00001329505190396.jpg

但是没有作用,请大神指点指点 如何解决这个问题,或是用其他方法来解决,谢谢

正在回答

4 回答

你改变页面大小时没执行函数,图片并没有消失,而是设置了绝对定位,被下面的图片覆盖了,你可以再加上$(window).resize事件,让窗口大小改变时,将第一行图片的绝对定位清除或重新设置

0 回复 有任何疑惑可以回复我~

我下载了老师的源代码,她的也是随着页面的改变列数也随之改变。问一下大佬吧!

0 回复 有任何疑惑可以回复我~

第二个main没有加#(main是id要加#,)

这是我的代码,如果还有问题你可以看看。我刚刚接触jquery,不太会,共勉共勉!!!

$(window).on('load',function(){
    waterfall();
    var dataInt = {"data":[{"src":'1.jpg'},{"src":'2.jpg'},{"src":'3.jpg'}]};
    $(window).on('scroll',function(){
        if(checkScrollSlide){
            $.each(dataInt.data,function(key,value){
                var oBox = $('<div>').addClass('box').appendTo($('#main'));
                var oPic = $('<div>').addClass('pic').appendTo($(oBox));
                $('<img>').attr('src','img/'+$(value).attr('src')).appendTo($(oPic));
                
            })
            waterfall();
        }
    })
})
function waterfall(){
    var $boxs = $('#main>div');
    var w = $boxs.eq(0).outerWidth();<!---获取第一个图片的宽度---->
    var cols = Math.floor($(window).width()/w);<!--获取列数--->
    $('#main').width(w*cols).css('margin','0 auto');
    var hArr = [];
    $boxs.each(function(index, value) {
        //console.log(index);
        var h = $boxs.eq(index).outerHeight();
        if(index < cols){
            hArr[index] = h;
        }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]+=$boxs.eq(index).outerHeight();
        }
    });
    
}

function checkScrollSlide(){
    var $lastBox = $('#main>div').last();
    var lastBoxDis = $lastBox.offset().top
    + Math.floor($lastBox.outerHeight()/2);
    var scrollTop = $(window).scrollTop();
    var documentH = $(window).height();
    return (lastBoxDis < scrollTop + documentH)?true:false;
}

0 回复 有任何疑惑可以回复我~
#1

weibo_happy的小小明_0 提问者

加了#号后,缩小窗口滚动一会又整个页面又变成5列排布的
2017-05-06 回复 有任何疑惑可以回复我~

body>
    <div id="main">
        <div class="box">
            <div class="pic">
                <img src="img/1.jpg">
            </div>
        </div>
        <div class="box">
            <div class="pic">
                <img src="img/2.jpg">
            </div>
        </div>
你没有给div加类名。你看看是不是这个问题。

0 回复 有任何疑惑可以回复我~
#1

weibo_happy的小小明_0 提问者

从sublimetext编辑器里复制过来的,不知道为什么没显示类名,但我的源代码里是有的
2017-05-05 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

关于缩小窗口的bug

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信