【html+css+js】瀑布流布局and懒加载

文章详细介绍了瀑布流布局的概念,即等宽不等高的元素排列,以优化视觉效果。通过HTML结构、CSS样式设置以及JavaScript实现动态加载图片和调整布局。特别是利用window.onload和onscroll事件处理函数,实现图片的懒加载效果,当最后一张图片露出一半时开始加载更多内容。
摘要由CSDN通过智能技术生成

瀑布流布局如下:

瀑布流是许多数据块组成的,可以是图片,可以是div,但是它们都有一个特点,就是等宽不等高,正是因为它等宽不等高,所以如果按部就班的排布的话,才会出现很大的缝隙,特别不好看,说白了瀑布流布局就是充分利用图片之间的空隙来合理的布局,使布局看起来好看。

HTML部分:

<div class="pubu">
        <div class="box">
              <img data-original=".jpg" src="1.jpg" alt=""><p class="share">“文字”</p>
        </div>
        <div class="box">
            <img data-original=".jpg" src="1.jpg" alt=""><p class="share">文字</p>
      </div>
      <div class="box">
        <img data-original=".jpg" src="1.jpg" alt=""><p class="share">文字</p>
  </div>
  <div class="box">
    <img data-original=".jpg" src="1.jpg" alt=""><p class="share">文字</p>
</div>
<div class="box">
    <img data-original=".jpg" src="1.jpg" alt=""><p class="share">文字</p>
</div></div>

src:为图片确定一个固定的尺寸,尺寸大小为src引用的那张图片

CSS:

body{
  margin: 0;
  padding: 0;
  background-color: rgb(230, 230, 234);
}
.pubu{
  position:absolute;
  width: 1100px;  
  left: 50%;
  margin-top: -150px;
  margin-left: -550px;
}
.box{
  padding:20px 0 0 20px;
  float: left;
}
.box img{
  position:relative;
  width: 200px;
  height: auto;
  opacity: 0;
}
.share{
  font-family:;
}

JS:

window.onload = function(){
    var oBox=document.getElementsByClassName("box");
    var oImg=document.getElementsByTagName('img');
    var oBoxw=oBox[0].offsetWidth;
    var cols=5;
  
    loadImg(oImg);
    window.onscroll = function(){
      loadImg(oImg);
    };
  
    function waterfall(ele,col,eleWidth){
      var hArr = [];
      for(var i = 0;i < ele.length;i++){
          if(i < col){
              hArr.push(ele[i].offsetHeight);
          }else{
              //min不能用于数组,apply的第一个参数传递作用域,第二个参数传递数组。Math.min.apply(null, [1, 2, 3]) 等价于 Math.min(1, 2, 3)
              var minH = Math.min.apply(null,hArr);
              var index = hArr.indexOf(minH);
              ele[i].style.position = 'absolute';   
              ele[i].style.top = minH + 'px';           //ele.style.left/top 是有px的,而offsetHeight/offsetWidth是没有px的
              ele[i].style.left = index * eleWidth + 'px';
              hArr[index] += ele[i].offsetHeight;
          }
      }
    }
  
    function loadImg(arr){
    for( var i = 0,len = arr.length; i < len; i++){
      //判断图片相对应视图窗口的高度是否小于屏幕可视窗口大小
      if(arr[i].getBoundingClientRect().top < document.documentElement.clientHeight && !arr[i].isLoad){  //判断图片
        arr[i].isLoad = true;
        if(arr[i].dataset){                    //判断是否存在HTML5的dataset对象
          aftLoadImg(arr[i],arr[i].dataset.original);    
        }else{
          aftLoadImg(arr[i],arr[i].getAttribute("data-original"));
        }
        arr[i].style.cssText = "transition: opacity 4s; opacity: 1;"    //使opacity变化在4秒内完成
      }
    }
  }
  
  function aftLoadImg(obj,url){
    obj.src = url;
    waterfall(oBox,cols,oBoxw);   //需要再次调用瀑布流方法
  }
  }

懒加载:

这里主要讲解一下最后“function checkScrollSlide()”的思想;因为我们这个要实现一直滑一直滑的效果(也就是懒加载),所以我们这里就拿最后一张图片来做对比,通俗理解函数“checkScrollSlide()”的作用就是最后一张图片露出一半了你就应该加载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值