JS IntersectionObserver交叉觀察器

來源:http://itssh.cn/post/934.html

IntersectionObserver 可以自動"觀察"元素是否可見轴踱,Chrome 51+ 已經支持牌芋。由于可見(visible)的本質是,目標元素與視口產生一個交叉區(qū)盆犁,所以這個 API 叫做"交叉觀察器"
使用IntersectionObserver實現(xiàn)圖片懶加載功能:
ps:使用最新新版Chrome幽七、Firefox測試谬运,IE11及其以下暫不支持

案例:

<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
        <title>使用IntersectionObserver實現(xiàn)懶加載</title>
        <!-- 
            @author:sm
            @email:sm0210@qq.com
            @desc:使用IntersectionObserver實現(xiàn)懶加載
            ps:使用最新新版Chrome爽冕、Firefox測試仇祭,IE11及其以下暫不支持
         -->
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            ul,li {
                list-style: none;
            }
            .list {
                width: 800px;
                margin: 0 auto;
            }
            .list ul {
                width: 100%;
                overflow: hidden;
            }
            .list ul li {
                float: left;
                width: 185px;
                height: 400px;
                margin-bottom: 10px;
                margin-left: 10px;
                background-color: #ccc;
                overflow: hidden;
                text-align: center;
                line-height: 400px;
                color: red;
                font-size: 24px;
            }
        </style>
    </head>
    <body>
        <!-- 
            template:h5新標簽,模板標簽颈畸,不可見元素
         -->
        <div class="list">
            <ul>
                <li class="lazy-loaded">
                    <template>
                        ![](images/1.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/2.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/3.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/4.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/5.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/6.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/7.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/8.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/9.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/10.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/1.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/2.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/3.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/4.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/5.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/6.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/1.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/2.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/3.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/4.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/5.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
                <li class="lazy-loaded">
                    <template>
                        ![](images/6.jpg)
                    </template>
                    <span class="loading">正在加載...</span>
                </li>
            </ul>
        </div>
        
    </body>
    <!--  -->
    <script type="text/javascript">
        //獲取dom
        function filterDom(selector) {
            //
            return Array.from(document.querySelectorAll(selector));
        }
        //事件觀察者
        var observer = new IntersectionObserver(observerCall);
        //回調函數(shù)(可見性變化時的回調函數(shù))
        //回調被調用何時被調用:
            //1.目標元素剛剛進入視口(開始可見)調用回調;
            //2.另一次是完全離開視口(開始不可見)調用回調;
        function observerCall(changes) {
            changes.forEach(function(change) {
                //使用setTimeout本地模擬加載速度乌奇,從服務器加載資源不需要添加setTimeout
                setTimeout(function(){
                    //當前dom
                    var container = change.target;
                    //獲取模板內容
                    var content = container.querySelector('template').content;
                    //追加元素
                    container.appendChild(content);
                    //移除loading
                    //container.querySelector('.loading').remove();
                    //隱藏loading
                    container.querySelector('.loading').style.display = 'none';
                    //停止觀察,butin否則離開窗口可見區(qū)域也會執(zhí)行callback
                    observer.unobserve(container);
                    //observer.disconnect(); 停止所有觀察
                }, 100);//end setTimout
            });
        }
        //過濾元素
        filterDom('.lazy-loaded').forEach(function (item) {
            //開始觀察
            observer.observe(item);
        });
    </script>
</html>

來源:http://itssh.cn/post/934.html

效果:

Paste_Image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末眯娱,一起剝皮案震驚了整個濱河市礁苗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌困乒,老刑警劉巖寂屏,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贰谣,死亡現(xiàn)場離奇詭異娜搂,居然都是意外死亡迁霎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門百宇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來考廉,“玉大人,你說我怎么就攤上這事携御〔粒” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵啄刹,是天一觀的道長涮坐。 經常有香客問我,道長誓军,這世上最難降的妖魔是什么袱讹? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮昵时,結果婚禮上捷雕,老公的妹妹穿的比我還像新娘。我一直安慰自己壹甥,他們只是感情好救巷,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著句柠,像睡著了一般浦译。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溯职,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天管怠,我揣著相機與錄音,去河邊找鬼缸榄。 笑死渤弛,一個胖子當著我的面吹牛,可吹牛的內容都是我干的甚带。 我是一名探鬼主播她肯,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鹰贵!你這毒婦竟也來了晴氨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤碉输,失蹤者是張志新(化名)和其女友劉穎籽前,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡枝哄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年肄梨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挠锥。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡众羡,死狀恐怖,靈堂內的尸體忽然破棺而出蓖租,到底是詐尸還是另有隱情粱侣,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布蓖宦,位于F島的核電站齐婴,受9級特大地震影響,放射性物質發(fā)生泄漏稠茂。R本人自食惡果不足惜尔店,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望主慰。 院中可真熱鬧嚣州,春花似錦、人聲如沸共螺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藐不。三九已至匀哄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雏蛮,已是汗流浹背涎嚼。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挑秉,地道東北人法梯。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像犀概,于是被迫代替她去往敵國和親立哑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,777評論 25 707
  • 每次提筆(或者說打開輸入界面)姻灶,總想著能夠瞬間筆下驚云铛绰,文思泉涌,但往往無從下手产喉,無所適從捂掰,無疾而終敢会。對于咬文嚼字...
    一日一書松白閱讀 247評論 0 0
  • 落寞寞su閱讀 258評論 13 4
  • 最近一直單曲循環(huán)毛不易的消愁鸥昏,可能是覺得有點慢慢的聽懂了一些歌曲之外的東西吧! 一杯敬朝陽疤苹,一杯敬...
    別讓我吃糖閱讀 869評論 0 0
  • 有時候卧土,你真的很想找個人說話,可是像樊,你猶豫了尤莺,左向右想,最后還是沒有張口生棍! 你想有個人可以讓你肆無忌憚的做自己颤霎,想...
    stoneonly閱讀 91評論 0 1