當(dāng)元素第一次出現(xiàn)在可視范圍內(nèi),提示并且只提示一次

問(wèn)題

當(dāng)窗口滾動(dòng)時(shí),判斷一個(gè)元素是不是出現(xiàn)在窗口可視范圍。在元素第一次出現(xiàn)時(shí)在控制臺(tái)打印 true,以后再次出現(xiàn)不做任何處理。

第一種情況:目標(biāo)元素有多個(gè)

預(yù)覽地址
控制臺(tái)輸出結(jié)果:

image.png

當(dāng)窗口滾動(dòng)時(shí),這三個(gè)目標(biāo)出現(xiàn)在可視范圍內(nèi)會(huì)在控制臺(tái)打印出它的文本內(nèi)容和true ,并且不管窗口怎么滾動(dòng)只打印一次。

JS部分:

$(window).scroll(function () {
    $node.each(function(){  //  用的時(shí)候把這里的$node替換成目標(biāo)就可以了,上面鏈接里是$('.test')
           if (isVisible($(this)) && ($(this).data('shown')) !== 'true') {
               // 如果元素在窗口可視范圍,并且自定義屬性shown 的值不為true的時(shí)候,說(shuō)明之前沒(méi)有出現(xiàn)過(guò),可以打印true
               console.log($(this).text()+':true');
               $(this).data('shown','true') //  元素在窗口可視范圍出現(xiàn)后,我們給她加個(gè)自定義屬性,做個(gè)標(biāo)記
       }
    });

});  //  每次滑動(dòng),函數(shù)都會(huì)執(zhí)行

function isVisible($node) {  //  判斷元素是否在可視范圍內(nèi)
    var $nodePosition = $node.offset().top;
    var $scrollDistance = $(window).scrollTop();
    var $windowHeight = $(window).height();
    if (($nodePosition >= $scrollDistance) && ($nodePosition <= ($scrollDistance + $windowHeight))) {
        return true
    }
    return false
}

看到這個(gè)要求的時(shí)候,第一反應(yīng)是這還不簡(jiǎn)單嗎,加個(gè)狀態(tài)鎖就行了,可是實(shí)際操作并不行。于是就有了下面的第二種情況。

第二種情況: 目標(biāo)元素只有一個(gè)

我們將JS部分改成如下代碼,其他代碼不變:

$(window).scroll(function () {
    $($('.test')).each(function(){
       if (isVisible($(this))&& shown !== true){
         console.log('true');
         console.log($(this).text()+':true');
         shown = true;  //  元素出現(xiàn)后,上鎖
       }
    });

});  //  每次滑動(dòng),函數(shù)都會(huì)執(zhí)行

var shown = false;  // 狀態(tài)鎖
function isVisible($node) {
    var $nodePosition = $node.offset().top;
    var $scrollDistance = $(window).scrollTop();
    var $windowHeight = $(window).height();
    if (($nodePosition >= $scrollDistance) && ($nodePosition <= ($scrollDistance + $windowHeight))) {
        return true;
    }
    return false;
}

控制臺(tái)輸出結(jié)果:

image.png

不管怎么滾動(dòng)窗口,都只提醒一個(gè)元素一次,當(dāng)對(duì)第一個(gè)出現(xiàn)的目標(biāo)元素執(zhí)行函數(shù)后,shown的值就改變了,這個(gè)鎖就鎖上了.....

總結(jié)

要想對(duì)多個(gè)目標(biāo)元素生效,就得想辦法給出現(xiàn)過(guò)的元素添加一個(gè)她獨(dú)有的標(biāo)記,然后通過(guò)檢查當(dāng)前元素是否有這個(gè)獨(dú)有的標(biāo)記來(lái)判斷她是否出現(xiàn)過(guò)。

就醬,如果有人剛好看到這個(gè),剛好有其他的辦法,歡迎交流~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 如何判斷一個(gè)元素是否出現(xiàn)在窗口可視范圍(瀏覽器的上邊緣和下邊緣之間,肉眼可視)。寫(xiě)一個(gè)函數(shù) isVisible實(shí)現(xiàn)...
    _Dot912閱讀 1,778評(píng)論 10 8
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,171評(píng)論 25 708
  • 圖、文/孝恩 靈魂依附于藍(lán)天、碧海、綠地,此景的重合,予人以無(wú)限強(qiáng)烈的滌蕩感, 輕撫風(fēng)的只影,凝聽(tīng)海浪的嬉逐,徜徉...
    孝蒽閱讀 409評(píng)論 0 3

友情鏈接更多精彩內(nèi)容