ホームページ >ウェブフロントエンド >jsチュートリアル >ウォーターフォールレイアウトのJavaScript実装の詳細説明_javascriptスキル

ウォーターフォールレイアウトのJavaScript実装の詳細説明_javascriptスキル

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-05-16 15:16:571067ブラウズ

この記事では、JavaScript ウォーターフォール レイアウト の関連コンテンツを紹介し、参考として皆さんと共有します。具体的な内容は次のとおりです

JS 原則

上で述べたように、列レイアウトは単純に絶対レイアウトです。絶対レイアウトは 1 日あたり 10 元のレンガ職人のようなものです。列のレイアウトは、監督者がそこに立ってレンガを動かすのを見ているというものです。 彼らもみなレンガを動かしており、一人は一生懸命働いており、もう一人は自分のIQを誇示しています。単に! ! !
これを聞いたら、暗い人生と向き合いましょう。
列レイアウトの原理は、実際には絶対レイアウトとあまり変わりません。
また、3 つの部分に分かれており、1 つはアダプティブ ページの読み込み、もう 1 つはスライド 読み込み、3 つ目はレスポンシブ レイアウトです。
別途説明:

1. アダプティブローディング

まずコードを見てみましょう:

var $ = function() { //一个hacks
  return document.querySelectorAll.apply(document, arguments);
}
var waterFall = (function(){
  //初始化布局
  var arrHeight = []; //列的高度
  var columns = function() { //计算页面最多可以放多少列
      var bodyW = $('#container')[0].clientWidth,
        pinW = $(".column")[0].offsetWidth;
      return Math.floor(bodyW / pinW);
    }
    //设置瀑布流居中
  var getHtml = function() {
      var cols = $('.column'), //获得已有的列数
        arrHtml = [];
      for (var i = 0, col; col = cols[i++];) {
        var htmls = col.innerHTML.match(/<img(&#63;:.|\n|\r|\s)*&#63;p>/gi); //获取一个columns的
        arrHtml = arrHtml.concat(htmls);
      }
      return arrHtml;
    }
    //获得数组中最低的高度
  var getMinIndex = function() { //获得最小高度的index
    var minHeight = Math.min.apply(null, arrHeight); //获得最小高度
    for (var i in arrHeight) {
      if (arrHeight[i] === minHeight) {
        return i;
      }
    }
  }
  var createCol = function() {
      var cols = columns(), //获得列数
        contain = $("#container")[0];
      contain.innerHTML = ''; //清空数据
      for (var i = 0; i < cols; i++) {
        var span = document.createElement("span");
        span.className = "column";
        contain.appendChild(span);
      }
    }
    //初始化列的高度
  var initHeight = function() {
      var cols = columns(),
        arr = [];
      for (var i = 0; i < cols; i++) {
        arr.push(0);
      }
      arrHeight = arr;
    }
   //创建一个ele并且添加到最小位置
  var createArticle = function(html){
    var cols = $('.column'),
      index = getMinIndex(),
      ele = document.createElement('article');
    ele.className = "panel";;
    ele.innerHTML = html;
    cols[index].appendChild(ele);
    arrHeight[index] += ele.clientHeight;
  }
  //遍历获得的html然后添加到页面中
  var reloadImg = function(htmls) {
    for (var i = 0, html, index; html = htmls[i++];) {
      createArticle(html);
    }

  }
  var onload = function() {
      var contain = $("#container")[0], //获得容器
        arrHtml = getHtml(); //获得现有的所有瀑布流块
      //创建列,然后进行加载
      createCol();
      //初始化arrHeight
      initHeight();
      //进行页面的重绘
      reloadImg(arrHtml);
      return this;
    }
})();

プログラムを参照したら、最初にそのエントリ関数を探します。次に、onload 関数を観察します。合計 4 つの関数があることがわかります。
ユーザーの幅が不確かであるため、列数も不確かです。このとき実際のサイズを求めて計算する必要があります。次に、元のデータを再配置する必要があります。
したがって、getHtml は最初から元のデータ (innerHTML) を取得することになります。 その後、さらに幅のある列を追加できます。
createCol 関数は、列を追加する幅がより広くなります。
このとき、各列の高さを保存するための配列 (arrHeight) が必要です (デフォルトは 0)。
その後、ページを並べ替えることができます =>reloadImg(arrHtml)。arrHtml が元のデータです。
さて、ここで基本的なレンガの移動が完了しました。
次に、強化を開始します。

2. スライドローディング

これは私が直接コピーしたものであると考えられるため、機能がよく書かれており、再利用性が優れています。

コードを表示


 var isLoad=function() { //是否可以进行加载
    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop,
      wholeHeight = document.documentElement.clientHeight || document.body.clientHeight,
      point = scrollTop + wholeHeight; //页面底部距离header的距离
    var lastHei = Math.min.apply(null,arrHeight);
    return (lastHei < point) &#63; true : false;
  }

  var dealScroll = (function(){
    window.onscroll = ()=>{dealScroll();}
    var container = $('#container')[0];
    return function(){
      if(isLoad()){
        for(var i = 0,html,data;data = dataInt[i++]; ){
          html = tpl.temp(data.src); //获得数据然后添加模板
          createArticle(html);
        }
      }
      return this;
    }
  })();

同じ isload、同じ dealScroll ロジック。 ここで説明する必要があるのは、createArticle は高さの最も低い列にレンガを追加する関数であるということです。

それでは、もうありません。

3. レスポンシブレイアウト

これも直接コピーしました。

 var resize = (function(){
    window.onresize = ()=>{resize();};
    var flag;
    return function(){
      clearTimeout(flag);
      flag = setTimeout(()=>{onload();},500);
      return this;
    }
onload、dealScroll、resize の 3 つの関数の後に「return this」を追加したのは、その後の再利用のニーズに備えてチェーン呼び出しを可能にすることに注意してください。

以上がこの記事の全内容です。皆様が JavaScript ウォーターフォール フローを学習するのに役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。