Maison > interface Web > js tutoriel > En savoir plus sur la disposition du flux en cascade js

En savoir plus sur la disposition du flux en cascade js

高洛峰
Libérer: 2017-01-03 10:36:00
original
1342 Les gens l'ont consulté

Les exemples de cet article partagent le matériel d'apprentissage de la disposition du flux de cascade js pour votre référence. Le contenu spécifique est le suivant

Caractéristiques : largeur égale et hauteur inégale.
Méthode d'implémentation : mise en page multi-colonnes Javascript/Jquery/CSS3.
Exemple de site Web : Huaban.com --> Catégorie

1 JS implémente le flux en cascade

index.html : structure de la page

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>瀑布流布局</title>
  <link rel="stylesheet" href="styles/layout.css">
</head>
<body>
  <div id="main">
    <div><div><img src="../waterFall/pic/0.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/1.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/2.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/3.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/4.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/5.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/6.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/7.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/8.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/9.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/10.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/11.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/12.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/13.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/14.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/15.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/16.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/17.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/18.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/19.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/20.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/21.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/22.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/23.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/24.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/25.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/26.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/27.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/28.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/29.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/30.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/31.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/32.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/33.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/34.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/35.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/36.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/37.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/38.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/39.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/40.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/41.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/42.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/43.jpg" alt=""></div></div>
  </div>
  <script src="scripts/waterfall.js"></script>
</body>
</html>
Copier après la connexion

mise en page. .css : style d'élément de page

*{
  pdding:0;
  margin:0;
}
div#main{
  position: relative;
}
div.box{
  padding:15px 0 0 15px;
  float: left;
}
div.pic{
  padding:10px;
  border:1px solid #ccc;
  border-radius:5px;
  box-shadow: 0 0 5px #ccc;
}
.pic img{
  height:auto;
  width:165px;
}
Copier après la connexion

waterfall.js

window.onload=function(){
  waterFall(&#39;main&#39;,&#39;box&#39;);
  //模拟后台相应数据json
  var dataInt={
    "data":
    [
     {"src":"0.jpg"},
     {"src":"1.jpg"},
     {"src":"2.jpg"},
     {"src":"3.jpg"},
     {"src":"4.jpg"},
     {"src":"5.jpg"},
     {"src":"6.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 img=document.createElement("img");
       img.setAttribute("src",dataInt.data[i]);
       img.src="pic/"+dataInt.data[i].src;
       oPic.appendChild(img);
     }
     dataInt=null;//清空数据块,防止无限加载
     waterFall(&#39;main&#39;,&#39;box&#39;);//对页面新元素进行布局渲染
    }
  }
}
function waterFall(parent,box){
  //将main下的class为box的所有元素取出来
  var oParent=document.getElementById(parent);
  var oBoxs=getByClass(oParent,box);
  console.log(oBoxs.length);
  //计算整个页面显示的列数(页面宽/box宽)
  var oBoxW=oBoxs[0].offsetWidth;
  // console.log(oBoxW);
  var cols=Math.floor(document.documentElement.clientWidth/oBoxW);
  // console.log(cols);
  //设置main的宽
  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);//获取当前数组最小高度值
      // console.log(minH);
      var index=getMinhIndex(hArr,minH);//获取数组最小高度的索引
      //console.log(index);
      oBoxs[i].style.position="absolute";//将之后的图片依次绝对定位
      oBoxs[i].style.top=minH+"px";
      oBoxs[i].style.left=index*oBoxW+"px";//计算新图片所在的位置并赋值
      hArr[index]+=oBoxs[i].offsetHeight;//变化数组列的高度值,因为加上了一张图片
    }
    //console.log(hArr);
  }
 
}
//根据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=0;i<arr.length;i++){
    if(arr[i]==val){
      return i;
    }
  }
 
}
//检测是否具备滚动条加载数据块条件
function checkScrollSlide(){
  var oParent=document.getElementById("main");
  var oBoxs=getByClass(oParent,"box");
  var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2);
  var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;//混杂模式和标准模式下的scrollTop获取
  //console.log(scrollTop);
  var height=document.body.clientHeight||document.documentElement.clientHeight;//混杂模式和标准模式下的浏览器窗口高度获取
  return (lastBoxH<scrollTop+height)?true:false;//检测最后一个box高度是否小于滚动高度+窗口高度,返回布尔值
 
}
Copier après la connexion

2. JQuery

$( window ).on( "load", function(){
  waterfall(&#39;main&#39;,&#39;pin&#39;);
  var dataInt={&#39;data&#39;:[{&#39;src&#39;:&#39;1.jpg&#39;},{&#39;src&#39;:&#39;2.jpg&#39;},{&#39;src&#39;:&#39;3.jpg&#39;},{&#39;src&#39;:&#39;4.jpg&#39;}]};
  window.onscroll=function(){
    if(checkscrollside()){
      $.each( dataInt.data, function( index, value ){
        var $oPin = $(&#39;<div>&#39;).addClass(&#39;pin&#39;).appendTo( $( "#main" ) );
        var $oBox = $(&#39;<div>&#39;).addClass(&#39;box&#39;).appendTo( $oPin );
        $(&#39;<img>&#39;).attr(&#39;src&#39;,&#39;./images/&#39; + $( value).attr( &#39;src&#39;) ).appendTo($oBox);
      });
      waterfall();
    };
  }
});
 
/*
  parend 父级id
  pin 元素id
*/
function waterfall(parent,pin){
  var $aPin = $( "#main>div" );
  var iPinW = $aPin.eq( 0 ).width();// 一个块框pin的宽
  var num = Math.floor( $( window ).width() / iPinW );//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】
  //oParent.style.cssText=&#39;width:&#39;+iPinW*num+&#39;px;ma rgin:0 auto;&#39;;//设置父级居中样式:定宽+自动水平外边距
  $( "#main" ).css({
    &#39;width:&#39; : iPinW * num,
    &#39;margin&#39;: &#39;0 auto&#39;
  });
 
  var pinHArr=[];//用于存储 每列中的所有块框相加的高度。
 
  $aPin.each( function( index, value ){
    var pinH = $aPin.eq( index ).height();
    if( index < num ){
      pinHArr[ index ] = pinH; //第一行中的num个块框pin 先添加进数组pinHArr
    }else{
      var minH = Math.min.apply( null, pinHArr );//数组pinHArr中的最小值minH
      var minHIndex = $.inArray( minH, pinHArr );
      $( value ).css({
        &#39;position&#39;: &#39;absolute&#39;,
        &#39;top&#39;: minH + 15,
        &#39;left&#39;: $aPin.eq( minHIndex ).position().left
      });
      //数组 最小高元素的高 + 添加上的aPin[i]块框高
      pinHArr[ minHIndex ] += $aPin.eq( index ).height() + 15;//更新添加了块框后的列高
    }
  });
}
 
function checkscrollside(){
  var $aPin = $( "#main>div" );
  var lastPinH = $aPin.last().get(0).offsetTop + Math.floor($aPin.last().height()/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)
  var scrollTop = $( window ).scrollTop()//注意解决兼容性
  var documentH = $( document ).height();//页面高度
  return (lastPinH < scrollTop + documentH ) ? true : false;//到达指定高度后 返回true,触发waterfall()函数
}
Copier après la connexion

3. Disposition multi-colonnes CSS

.container{
  -webkit-column-width:160px;
  -moz-column-width:160px; 
   -webkit-column-gap:5px;
   -moz-column-gap:5px;
}
 
 
/*数据块 砖块*/
 
.container div{width:160px;
        margin:4px 0;}
Copier après la connexion

[Comparaison des méthodes d'implémentation css3 et js]
--méthode css3--
1 : Aucun calcul requis, le navigateur calcule automatiquement, il suffit de définir 1 largeur de colonne, hautes performances
2 : La largeur des colonnes change avec la largeur du navigateur, et l'expérience utilisateur n'est pas bonne ;
3 : Les images sont triées par ordre vertical, perturbant l'ordre d'affichage des images
4. Le chargement des images nécessite toujours js --Méthode js--
Le flux en cascade implémenté par js n'aura pas les défauts ci-dessus, mais les performances sont relativement médiocres !

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois.

Pour un apprentissage plus approfondi des articles relatifs à la disposition des flux en cascade js, veuillez prêter attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal