前端-css-js,瀑布流

不能用float实现,因为这玩意的最终效果是这样的。

瀑布流是等宽不等高的布局,并让最终底边看上去比较齐。

实现思路是

①算出浏览器的宽度,根据宽度算出一共要排多少列

②循环所有要布局的div。每次获取高度最低的列,将此div放置此列(绝对定位,top,left即可)。更新这列的高度。

需要注意的是,如果是动态加载的div元素,需要延时布局div,要不获取不到div。

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
  <style type="text/css">
    * {
      margin: 0;
      padding: 0;
    }
    img { vertical-align: top;}
    .item {
      position: absolute;
      width: 270px;
      top:0;
      left:0;
    }
    .item img {
      width: 100%;
    }
  </style>
  <script type="text/javascript" >

    onload  = function() {
      var arr = [];
      var allwidth = client().width;
      var column = Math.floor( allwidth /300 );

      initdiv(resizediv);

      //页面大小发生变化时,重新定位div
      onresize = function(){
        resizediv();
      }

      function  initdiv (fn){
        var body = document.getElementsByTagName("body")[0];
        for (var i = 0; i < 30; i++) {
          var div = document.createElement("div");
          div.className = "item";
          div.innerHTML = "<img src=\"images/010_r1_c" + (i % 9 + 1) + ".jpg\" alt=\"\">";
          body.appendChild(div);
        }
        if(fn){
          //因为div们都是用方法后加上去的,所以有延迟
          setTimeout(function(){ fn(); },500);
        }
      }

      //当屏幕尺寸重新调整时执行这个方法
      function resizediv(){
        allwidth = client().width;
        column = Math.floor( allwidth /300 );
        arr = [];
        for (var i = 0 ; i <column ; i++){
          arr.push(0);
        }
        var alldiv = document.getElementsByClassName("item");
        for (var one=0;one< alldiv.length ;one++){
          var nowheight = getmin();
          console.log()
          alldiv[one].style.top = arr[nowheight] + 10 + "px";
          alldiv[one].style.left = nowheight * 300 +"px";
          arr[nowheight] = arr[nowheight] + 10 + alldiv[one].offsetHeight;
        }
      }
      // 获取当前最小列的下标index
      function getmin(){
        var minheight = 0;
        for (var h in arr){
          if(arr[h] < arr[minheight]){
            minheight = h;
          }
        }
        return minheight;
      }
      function client (){
        if(window.innerWidth!=null){
          return {
            width:window.innerWidth,
            height:window.innerHeight
          }
        }
        if(document.compatMode=="CSS1Compat"){
          return {
            width:document.documentElement.clientWidth,
            height:document.documentElement.clientHeight
          }
        }
        return {
          width:document.body.clientWidth,
          height:document.body.clientHeight
        }
      }
    }
  </script>
</head>
<body>
</body>
</html>

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于jQuery和Masonry库实现的前端tab切换瀑布代码示例: HTML代码: ``` <div class="tab-wrapper"> <ul class="tab-nav"> <li class="active"><a href="#tab1">Tab 1</a></li> <li><a href="#tab2">Tab 2</a></li> <li><a href="#tab3">Tab 3</a></li> </ul> <div class="tab-content"> <div id="tab1" class="tab-pane active"> <div class="grid"> <div class="grid-item"><img src="image1.jpg"></div> <div class="grid-item"><img src="image2.jpg"></div> <div class="grid-item"><img src="image3.jpg"></div> <div class="grid-item"><img src="image4.jpg"></div> <div class="grid-item"><img src="image5.jpg"></div> </div> </div> <div id="tab2" class="tab-pane"> <div class="grid"> <div class="grid-item"><img src="image6.jpg"></div> <div class="grid-item"><img src="image7.jpg"></div> <div class="grid-item"><img src="image8.jpg"></div> <div class="grid-item"><img src="image9.jpg"></div> <div class="grid-item"><img src="image10.jpg"></div> </div> </div> <div id="tab3" class="tab-pane"> <div class="grid"> <div class="grid-item"><img src="image11.jpg"></div> <div class="grid-item"><img src="image12.jpg"></div> <div class="grid-item"><img src="image13.jpg"></div> <div class="grid-item"><img src="image14.jpg"></div> <div class="grid-item"><img src="image15.jpg"></div> </div> </div> </div> </div> ``` CSS代码: ``` .tab-wrapper { width: 100%; margin: 0 auto; } .tab-nav { list-style: none; margin: 0; padding: 0; display: flex; justify-content: center; align-items: center; border-bottom: 1px solid #ccc; } .tab-nav li { margin: 0 10px; } .tab-nav li a { display: block; padding: 10px; color: #333; text-decoration: none; } .tab-nav li.active a { color: #f00; border-bottom: 2px solid #f00; } .tab-content { padding: 20px; } .grid { margin: 0; padding: 0; } .grid-item { margin: 10px; float: left; } .grid-item img { max-width: 100%; } ``` JavaScript代码: ``` $(document).ready(function() { // 初始化瀑布布局 var $grid = $('.grid').masonry({ itemSelector: '.grid-item', columnWidth: '.grid-sizer', percentPosition: true }); // 切换tab时重新布局 $('.tab-nav a').on('click', function(e) { e.preventDefault(); var $tab = $(this).attr('href'); $('.tab-nav li').removeClass('active'); $(this).parent().addClass('active'); $('.tab-pane').removeClass('active'); $($tab).addClass('active'); $grid.masonry('layout'); }); }); ``` 通过以上代码,我们实现了一个基于jQuery和Masonry库的前端tab切换瀑布效果。当用户点击不同的tab标签时,页面中的瀑布布局会重新布局,以适应当前tab内容的大小和数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值