この例は非常に単純であると言え、jQuery メソッドを使用して直接処理することもできます。ただし、この記事の最下層はネイティブ js を使用して処理されています。小さな知識点があれば、それを分析することは価値があります。
原理は非常に簡単で、ブラウザがスクロール イベントをトリガーするたびに、ブラウザの一番下までスクロールしたかどうかを判断します。一番下まで到達したら、新しいデータをロードします。重要なのは、スクロールバーがブラウザの一番下までスクロールしたかどうかを計算することです。アルゴリズムは次のとおりです。
スクロールバーのロールアップ高さ + ウィンドウの高さ> ドキュメントの合計の高さ + 50/*この判断の場合、スクロール応答領域の高さを 50px にします。 true は、スクロール バーが一番下までスクロールしたことを意味します。
例
<style type="text/css"> html,body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, th, td{ margin: 0; padding:0; } *{ -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .waterfllow-loading{ z-index: 2000; display:none; } .waterfllow-loading.active{ display:block; } .waterfllow-loading img.loading-progress{ position: fixed; /*设置等待条水平居于窗口正中*/ margin-left: auto; margin-right: auto; left: 0; right: 0; /*不能设置margin-top:auto和margin-bottom:auto否则IE下bottom就不顶用了*/ bottom: 30px; } </style> <div class="waterfllow-loading"> <img class="loading-progress" src="busy.gif"> </div> <script type="text/javascript"> //图片查询中正对浏览器主页面滚动事件处理(瀑布流)。只能使用window方式绑定,使用document方式不起作用 $(window).on('scroll',function(){ if(scrollTop() + windowHeight() >= (documentHeight() - 50/*滚动响应区域高度取50px*/)){ waterallowData(); } }); function waterallowData(){ $('.waterfllow-loading').addClass('active'); /*$.ajax({ url:url, type:"post", data: params, success:function(data,textStatus,jQXHR){ //添加数据 ... //隐藏加载条 $('.waterfllow-loading.active').removeClass('active'); } });*/ }
ページ上部のロールアップ高さ関数を取得します
//获取页面顶部被卷起来的高度 function scrollTop(){ return Math.max( //chrome document.body.scrollTop, //firefox/IE document.documentElement.scrollTop); }
Chrome ブラウザと Firefox/IE では、スクロール バーが body に属するか html に属するかについての認識が異なるため、処理が異なります。
ページドキュメントの合計の高さを取得します
//获取页面文档的总高度 function documentHeight(){ //现代浏览器(IE9+和其他浏览器)和IE8的document.body.scrollHeight和document.documentElement.scrollHeight都可以 return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight); }
このアルゴリズムは、ドキュメントの高さを計算する jQuery の方法と一致しています。
ページブラウザのビューポートの高さを取得します
function windowHeight(){ return (document.compatMode == "CSS1Compat")? document.documentElement.clientHeight: document.body.clientHeight; }
ここで説明が必要なのは document.compatMode です。とても不思議で、普段は遭遇したことがないようです。
document.compatMode には、「BackCompat」と「CSS1Compat」の 2 つの値があります。公式の説明は「BackCompat: 標準互換モードがオフになっています」です。 CSS1Compat: 標準互換モードがオンになります。
IE のボックス モデルのレンダリングは標準モードと Quirks モードで大きく異なります。標準モードでのボックス モデルの解釈は他の標準ブラウザと同じですが、Doctype を宣言しないと IE には大きな違いがあります。デフォルトは Quirks モードです。
2 つのモードの違いを説明する例を示します。
document.compatMode が「BackCompat」に等しい場合、ブラウザーのクライアント領域の幅は document.body.clientWidth です。
document.compatMode が CSS1Compat と等しい場合、ブラウザーのクライアント領域の幅は document.documentElement.clientWidth です。他にも同様の属性があります。ここでは詳細には触れませんが、2 つのモードによって IE レンダリングの基礎が変化することが予想されます。構築される建物がどれほど異なるかは想像できるでしょう。
したがって、各ページの Doctype は良い習慣であるだけでなく、必要なプロセスでもあると宣言してください。 Quirks モードはゴミ箱に入る可能性があります。
わかりました。これが完全なコードと小さな例です (バックグラウンドでのデータ更新はなく、待機バーのみです)
<!DOCTYPE html> <html lang="ch-cn"> <head> <meta charset="utf-8"> <script type="text/javascript" src='jquery-1.9.1.js'></script> <style type="text/css"> html,body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, th, td{ margin: 0; padding:0; } *{ -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .waterfllow-loading{ z-index: 2000; display:none; } .waterfllow-loading.active{ display:block; } .waterfllow-loading img.loading-progress{ position: fixed; /*设置等待条水平居于窗口正中*/ margin-left: auto; margin-right: auto; left: 0; right: 0; /*不能设置margin-top:auto和margin-bottom:auto否则IE下bottom就不顶用了*/ bottom: 30px; } </style> </head> <body style="background:#ff0;height:1000px;"> <div class="waterfllow-loading"> <img class="loading-progress" src="busy.gif"> </div> </body> <script type="text/javascript"> //获取页面顶部被卷起来的高度 function scrollTop(){ return Math.max( //chrome document.body.scrollTop, //firefox/IE document.documentElement.scrollTop); } //获取页面文档的总高度 function documentHeight(){ //现代浏览器(IE9+和其他浏览器)和IE8的document.body.scrollHeight和document.documentElement.scrollHeight都可以 return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight); } //获取页面浏览器视口的高度 function windowHeight(){ //document.compatMode有两个取值。BackCompat:标准兼容模式关闭。CSS1Compat:标准兼容模式开启。 return (document.compatMode == "CSS1Compat")? document.documentElement.clientHeight: document.body.clientHeight; } </script> <script type="text/javascript"> //图片查询中正对浏览器主页面滚动事件处理(瀑布流)。只能使用window方式绑定,使用document方式不起作用 $(window).on('scroll',function(){ if(scrollTop() + windowHeight() >= (documentHeight() - 50/*滚动响应区域高度取50px*/)){ waterallowData(); } }); function waterallowData(){ $('.waterfllow-loading').addClass('active'); /*$.ajax({ url:url, type:"post", data: params, success:function(data,textStatus,jQXHR){ //添加数据 ... //隐藏加载条 $('.waterfllow-loading.active').removeClass('active'); } });*/ } </script> </html>
です
上記は、ページの一番下までスクロールして読み込みを続ける方法の例です。皆さんの学習に役立つことを願っています。