අනුචලනය කිරීමෙන් පසු මූලද්‍රව්‍යය දැකිය හැකිදැයි පරීක්ෂා කරන්නේ කෙසේද?


1186

මම AJAX හරහා මූලද්‍රව්‍ය පටවනවා. ඒවායින් සමහරක් දෘශ්‍ය වන්නේ ඔබ පිටුව පහළට අනුචලනය කළහොත් පමණි. දැන් පිටුවේ දෘශ්‍යමාන කොටසේ මූලද්‍රව්‍යයක් තිබේදැයි මට දැනගත හැකි ක්‍රමයක් තිබේද?


45
ඔහු අදහස් කරන්නේ බ්‍රවුසර කවුළුව තුළ දී ඇති මූලද්‍රව්‍යයක් දර්ශනය වී ඇත්ද, නැතහොත් පරිශීලකයාට එය බැලීමට අනුචලනය කළ යුතුද යන්න දැන ගැනීමට ක්‍රමවේදයක් අවශ්‍ය බවය.
රොමේන් ලින්සෝලාස්

1
කන්ටේනරයක මූලද්‍රව්‍යයක් සම්පූර්ණයෙන් දැකිය හැකිදැයි පරීක්ෂා කිරීම සඳහා, අතිරේක තේරීම් පරාමිතියක් එකතු කර ඒ සඳහා elem කේතය නැවත භාවිතා කරන්න. Library.IsElementVisibleInContainer = function (elementSelector, containerSelector) { var containerViewTop = $(containerSelector).offset().top; var containerViewBottom = containerViewTop + $(containerSelector).height();
බඩජාරී



1
සියලු පිළිතුරු නැවත පිරවීම අවුලුවන බැවින් එය බෝතල් බෙල්ල විය හැකිය, සහය දක්වන්නේ නම් ඉන්ටර්සෙක්ෂන් ඕබ්සර්වර් භාවිතා කරන්න . එය නවීන බ්‍රව්සර්වල වඩා හොඳ ක්‍රියාකාරීත්වයක් ලබා දෙනු ඇත,
jcubic

Answers:


1267

මෙය කළ යුත්තේ:

function isScrolledIntoView(elem)
{
    var docViewTop = $(window).scrollTop();
    var docViewBottom = docViewTop + $(window).height();

    var elemTop = $(elem).offset().top;
    var elemBottom = elemTop + $(elem).height();

    return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}

සරල උපයෝගිතා ශ්‍රිතය මෙය ඔබ සොයන මූලද්‍රව්‍යය පිළිගන්නා උපයෝගිතා ශ්‍රිතයක් ඇමතීමට ඉඩ සලසයි.

function Utils() {

}

Utils.prototype = {
    constructor: Utils,
    isElementInView: function (element, fullyInView) {
        var pageTop = $(window).scrollTop();
        var pageBottom = pageTop + $(window).height();
        var elementTop = $(element).offset().top;
        var elementBottom = elementTop + $(element).height();

        if (fullyInView === true) {
            return ((pageTop < elementTop) && (pageBottom > elementBottom));
        } else {
            return ((elementTop <= pageBottom) && (elementBottom >= pageTop));
        }
    }
};

var Utils = new Utils();

භාවිතය

var isElementInView = Utils.isElementInView($('#flyout-left-container'), false);

if (isElementInView) {
    console.log('in view');
} else {
    console.log('out of view');
}

55
මෙය ක්‍රියාත්මක වන්නේ ලේඛනය අනුචලනය වන මූලද්‍රව්‍යය නම් පමණක් බව සලකන්න, එනම් ඔබ අනුචලන අභ්‍යන්තර කවුළුව තුළ කිසියම් මූලද්‍රව්‍යයක දෘශ්‍යතාව පරීක්ෂා නොකරයි.
ඇන්ඩ rew බී.

8
ටිකක් ඕෆ්සෙට් එකතු කරන්නේ කෙසේද?
ජර්ගන් පෝල්

5
වැඩ කළේ මා window.innerHeightඒ වෙනුවට භාවිතා කළ විට පමණි
ක්‍රිස්ටියන් ෂ්නෝර්

2
මක්නිසාද යත් elemTopමා භාවිතා කළ $(elem).position().topසහ elemBottomභාවිතා කළ නිසා ය elemTop + $(elem).outerHeight(true).
සාරා යාත්‍රා

13
සඳහා: "දර්ශනයේ ඇති ඕනෑම අංගයක්", මම භාවිතා කළේ: (((elemTop> = docViewTop) && (elemTop <= docViewBottom)) || ((elemBottom> = docViewTop) && (elemBottom <= docViewBottom))
ග්‍රිස්ලි

429

වැනිලා හි මෙම පිළිතුර :

function isScrolledIntoView(el) {
    var rect = el.getBoundingClientRect();
    var elemTop = rect.top;
    var elemBottom = rect.bottom;

    // Only completely visible elements return true:
    var isVisible = (elemTop >= 0) && (elemBottom <= window.innerHeight);
    // Partially visible elements return true:
    //isVisible = elemTop < window.innerHeight && elemBottom >= 0;
    return isVisible;
}

29
මෙය එසේ විය යුතු isVisible = elementTop < window.innerHeight && elementBottom >= 0නොවේද? එසේ නොමැතිනම් තිරයේ අඩක් මූලද්‍රව්‍යය අසත්‍ය වේ.
gman

8
නැත. පිටුවේ කිසියම් අංගයක් සම්පූර්ණයෙන් දැකිය හැකිදැයි මම පරීක්ෂා කරමි. ඔබට යම් කොටසක දෘශ්‍යතාව පරීක්ෂා කිරීමට අවශ්‍ය නම් - ඔබට මෙම ස්නිපටය රිසිකරණය කළ හැකිය.
නිර්භීත

16
තෝරාගත් පිළිතුරට වඩා හොඳින් ක්‍රියා කිරීමට මෙම පිළිතුර මට පෙනේ. සරලයි.
ඇඩම් වෙනිසියාව

13
අනුමත පිළිතුරට සාපේක්ෂව, මෙය මූලද්‍රව්‍ය සිය ගණනක් සමඟ වඩා හොඳින් ක්‍රියා කරයි.
ncla

5
මෙහි නිරූපණය කරන කුඩා ෆෙඩල් එකක්
upInCloud

123

යාවත්කාලීන කිරීම: IntersectionObserver භාවිතා කරන්න


මම මෙතෙක් සොයාගෙන ඇති හොඳම ක්‍රමය වන්නේ jQuery දර්ශණය වන ප්ලගිනයයි . චාම් එකක් වගේ වැඩ කරනවා.

අභිරුචි "දර්ශණය" සිදුවීමක් අනුකරණය කරයි, එය මූලද්‍රව්‍යයක් දර්ශනයට අනුචලනය වන විට හෝ පරිශීලකයාට පෙනෙන විට වෙඩි තබයි.

$('#foo').appear(function() {
  $(this).text('Hello world');
});

සැඟවී ඇති හෝ නැරඹිය හැකි ප්‍රදේශයෙන් පිටත අන්තර්ගතය සඳහා අනවශ්‍ය ඉල්ලීම් වලක්වා ගැනීමට මෙම ප්ලගිනය භාවිතා කළ හැකිය.


30
මෙය සිසිල් ප්ලගිනයකි, නිසැකවම, නමුත් ප්‍රශ්නයට පිළිතුරු සපයන්නේ නැත.
ජෝන් ඇඩම්ස්

5
JQuery-පෙනෙන ප්ලගිනය ප්‍රධාන පිටු ප්‍රදේශයේ අන්තර්ගතයට හොඳ වුවත්, අවාසනාවකට එය පිටාර ගැලීම සමඟ ස්ථාවර ප්‍රමාණයේ අනුචලන බෙදීම් සමඟ ගැටලු ඇත. බැඳී ඇති මූලද්‍රව්‍යය පිටුවේ නැරඹිය හැකි ප්‍රදේශය තුළ ඇති නමුත් ඩිව් හි දැකිය හැකි ප්‍රදේශයෙන් පිටත ඇති විට සිදුවීම අකාලයේ වෙඩි තැබිය හැකිය.
පීටර්

17
අතුරුදහන් ප්ලගිනයක් තිබේද?
ෂමූන්

3
Ha ෂමූන් සඳහා මූලාශ්‍රය පරික්ෂා කරන්න, appear pluginඔබට ප්ලගිනයක් !ලබා ගැනීම සඳහා කොතැනක හෝ එකතු කිරීමට අවශ්‍ය වනු ඇත disappear.
ලකී සෝනි

5
සටහනක් ලෙස, මෙය jQuery 1.11.X සමඟ ක්‍රියා නොකරයි github.com/morr/jquery.appear/issues/37
ජේසන් පර්හැම්

86

මෙන්න මගේ පිරිසිදු ජාවාස්ක්‍රිප්ට් විසඳුම එය අනුචලනය කළ හැකි බහාලුමක් තුළ සඟවා තිබේ නම් ක්‍රියා කරයි.

මෙහි නිරූපණය කරන්න (කවුළුව නැවත වෙනස් කිරීමට උත්සාහ කරන්න)

var visibleY = function(el){
  var rect = el.getBoundingClientRect(), top = rect.top, height = rect.height, 
    el = el.parentNode
  // Check if bottom of the element is off the page
  if (rect.bottom < 0) return false
  // Check its within the document viewport
  if (top > document.documentElement.clientHeight) return false
  do {
    rect = el.getBoundingClientRect()
    if (top <= rect.bottom === false) return false
    // Check if the element is out of view due to a container scrolling
    if ((top + height) <= rect.top) return false
    el = el.parentNode
  } while (el != document.body)
  return true
};

සංස්කරණය කරන්න 2016-03-26: මූලද්‍රව්‍යය පසුකර අනුචලනය කිරීම සඳහා මම විසඳුම යාවත්කාලීන කර ඇති බැවින් එය අනුචලනය කළ හැකි බහාලුම් මුදුනට ඉහළින් සැඟවී ඇත. සංස්කරණය කරන්න 2018-10-08: තිරයට ඉහළින් අනුචලනය වන විට හැසිරවීමට යාවත්කාලීන කරන ලදි.


ස්තූතියි, සමහර විට වඩා හොඳ විය හැකිය return top <= document.documentElement.clientHeight && top >= 0;
යූසෙෆ් සලිම්පූර්

16
+1 මූලද්‍රව්‍යවල පුනරාවර්තන ස්වභාවය සැලකිල්ලට ගන්නා එකම කේතගත (එනම් තෙවන පාර්ශවයක් නොවේ) පිළිතුර මෙයයි. තිරස්, සිරස් සහ පිටු අනුචලනය හැසිරවීමට මම පුළුල් කර ඇත්තෙමි: jsfiddle.net/9nuqpgqa
Pebbl

4
මෙම විසඳුම පරික්ෂා කරන්නේ මූලද්රව්යයේ ඉහළට පමණි. පළමු ඉහළ පික්සෙල් දෘශ්‍යමාන වන්නේ නම්, ඉතිරි අයිතමය නොපෙනුනත් එය සත්‍ය වේ. සම්පූර්ණ අංගය දෘශ්‍යමාන දැයි පරීක්ෂා කිරීම සඳහා, ඔබ පහළ දේපල ද පරීක්ෂා කළ යුතුය.
වොජ්චීක් ජකුබාස්

2
අයියෝ, පිළිවෙළකට! මෙම පිළිතුර ලිවීමට උදව් කිරීමට භාවිතා කරයි (js comment ලෙස ණය සහිතව).
රෝමර් -1888

අතුරුදහන්; ලූපයේ දෙවන "ආපසු බොරු" පසු
මිහායිල් රමෙන්ඩික්

55

IntersectionObserver භාවිතා කිරීම API (නවීන බ්රවුසරයන් ස්වදේශික)

නිරීක්ෂකයෙකු භාවිතා කිරීමෙන් මූලද්‍රව්‍යයක් දර්ශන තලයේ හෝ අනුචලනය කළ හැකි බහාලුමක දැකිය හැකිද යන්න තීරණය කිරීම පහසු සහ කාර්යක්ෂම වේ .

scrollසිදුවීමක් ඇමිණීමේ අවශ්‍යතාවය සහ සිදුවීම් නැවත කැඳවීම පිළිබඳව අතින් පරීක්ෂා කිරීම, එමඟින් කාර්යක්ෂමතාව:

// this is the target which is observed
var target = document.querySelector('div');

// configure the intersection observer instance
var intersectionObserverOptions = {
  root: null,
  rootMargin: '150px',
  threshold: 1.0
}
    
var observer = new IntersectionObserver(onIntersection, intersectionObserverOptions);

// provide the observer with a target
observer.observe(target);

function onIntersection(entries){
  entries.forEach(entry => {
    console.clear();
    console.log(entry.intersectionRatio)
    target.classList.toggle('visible', entry.intersectionRatio > 0);
    
    // Are we in viewport?
    if (entry.intersectionRatio > 0) {
      // Stop watching 
      // observer.unobserve(entry.target);
    }
  });
}
.box{ width:100px; height:100px; background:red; margin:1000px; }
.box.visible{ background:green; }
Scroll both Vertically & Horizontally...
<div class='box'></div>


බ්‍රව්සර් ආධාරක වගුව බලන්න (IE / Safari හි සහය නොදක්වයි)


4
ස්තූතියි! මෙය මට වැඩ කරන අතර එය IE11 හි github.com/w3c/IntersectionObserver
මැට් විල්සන්

බොහෝ දුරට හොඳම විසඳුම. පොලිෆිල් නොමැතිව IE11 හි වැඩ කළා!
ෆේබියන් වොන් එලර්ට්ස්

අවාසනාවකට මෙන්, මෙම STILL iOS / macOS Safari හි සහය නොදක්වන බව සලකන්න. ඔබ පොලිෆිල් කිරීමට තෝරා ගන්නේ නම් පරිපූර්ණ ගැටළු පරීක්ෂා කිරීමට වග බලා ගන්න, එය විශාල පරිශීලකයින් පිරිසක්
ලේලන්ඩ්

ELeland - එය ව්‍යාපෘති මත රඳා පවතී. මගේ සියලු ව්‍යාපෘති සඳහා මෙය නිරපේක්ෂ 0 පරිශීලක කණ්ඩායමකි. මම වෙබ් අඩවි ගොඩනඟන්නේ නැත, නමුත් වෙබ් පද්ධතිය;)
vsync

මම මෙය මූලද්‍රව්‍ය කිහිපයක් මත ලූපයකින් ධාවනය කිරීමට උත්සාහ කරමි, නමුත් එය ක්‍රියා නොකරයි. අදහස් තිබේද? මම එම ලූපය ඉලක්ක කර ගැනීමට මූලද්‍රව්‍යය එකතු කරමි.
සාෂා ග්‍රින්ඩෝ

42

jQuery වේපොයින්ට්ස් ප්ලගිනය මෙහි ඉතා හොඳයි.

$('.entry').waypoint(function() {
   alert('You have scrolled to an entry.');
});

ප්ලගිනයේ අඩවියේ උදාහරණ කිහිපයක් තිබේ .


3
මට නම් එය ක්‍රියා කළේ ඕෆ්සෙට් එකක් සමඟ පමණි $('#my-div').waypoint(function() { console.log('Hello there!'); }, { offset: '100%' });
ලෙමන්ක්ස්

21

කොහොමද

function isInView(elem){
   return $(elem).offset().top - $(window).scrollTop() < $(elem).height() ;
}

මූලද්‍රව්‍යය මේ ආකාරයෙන් බැලූ විට ඔබට අවශ්‍ය ඕනෑම දෙයක් අවුලුවාලිය හැකිය

$(window).scroll(function(){
   if (isInView($('.classOfDivToCheck')))
      //fire whatever you what 
      dothis();
})

ඒක මට වැඩක්


1
මෙය මට වැඩ කරයි, නමුත් මම භාවිතා කළේ, වඩාත් සම්පූර්ණ ලෙස පෙනෙන, ශ්‍රිතය stackoverflow.com/questions/487073/… හි ScrolledIntoView :) :)
Meetai.com

3
මම හිතන්නේ එය window (කවුළුව) විය යුතුය .scrollTop () <$ (elem) .offset (). ඉහළ + $ (elem). උස ();
තරුණ

මගේ වෙනස් කිරීම මෙසේ වනු ඇත: `ආපසු $ (කවුළුව) .scrollTop () + $ (කවුළුව). උස ()> $ (elem) .අෆ්සෙට් (). ඉහළ + $ (elem). උස (); `
බුබෙන්කෝඩ්

16

මගේ අවශ්‍යතාවය සඳහා ට්වීක් ස්කොට් ඩවුඩින්ගේ සිසිල් ක්‍රියාකාරිත්වය- මෙය මූලද්‍රව්‍යය තිරයට අනුචලනය වී ඇත්දැයි සොයා බැලීම සඳහා භාවිතා කරයි.

function isScrolledIntoView(elem)
{
    var docViewTop = $(window).scrollTop();
    var docViewBottom = docViewTop + $(window).height();
    var elemTop = $(elem).offset().top;
    return ((elemTop <= docViewBottom) && (elemTop >= docViewTop));
}

15

WebResourcesDepot කලකට පෙර jQuery භාවිතා කරන අනුචලනය කිරීමේදී පූරණය කිරීම සඳහා පිටපතක් ලිවීය . ඔබට ඔවුන්ගේ සජීවී නිරූපණය මෙතැනින් නැරඹිය හැකිය . ඔවුන්ගේ ක්‍රියාකාරීත්වයේ හරක් මස් මෙය විය:

$(window).scroll(function(){
  if  ($(window).scrollTop() == $(document).height() - $(window).height()){
    lastAddedLiveFunc();
  }
});

function lastAddedLiveFunc() { 
  $('div#lastPostsLoader').html('<img src="images/bigLoader.gif">');
  $.post("default.asp?action=getLastPosts&lastPostID="+$(".wrdLatest:last").attr("id"),
    function(data){
        if (data != "") {
          $(".wrdLatest:last").after(data);         
        }
      $('div#lastPostsLoader').empty();
    });
};

14

elඅනුචලනය කළ හැකි div ( holder) හි මූලද්‍රව්‍යය ( ) දෘශ්‍යමාන දැයි පරීක්ෂා කිරීමට සරල වැනිලා

function isElementVisible (el, holder) {
  holder = holder || document.body
  const { top, bottom, height } = el.getBoundingClientRect()
  const holderRect = holder.getBoundingClientRect()

  return top <= holderRect.top
    ? holderRect.top - top <= height
    : bottom - holderRect.bottom <= height
}

JQuery සමඟ භාවිතය:

var el = $('tr:last').get(0);
var holder = $('table').get(0);
var isVisible = isScrolledIntoView(el, holder);

3
තනි පිටු යෙදුම් වල මෙම යුගයේදී, කවුළුවක් හැරුණු විට වෙනත් මූලද්‍රව්‍යයක් තුළ මූලද්‍රව්‍යයක් දැකිය හැකිද යන්න පරීක්ෂා කිරීම වඩාත් සුලභ වී ඇත. ඒකයි මේ කෙනා මගේ උඩු යටිකුරු කරන්නේ.
එච් බල්ලා

8

isScrolledIntoView ඉතා අත්‍යවශ්‍ය කාර්යයකි, එබැවින් මම එය අත්හදා බැලුවෙමි, එය ක්‍රියාකරන්නේ දර්ශනපත්‍රයට වඩා බර නොවන මූලද්‍රව්‍ය සඳහා ය, නමුත් මූලද්‍රව්‍යය දර්ශනපත්‍රයට වඩා විශාල නම් එය ක්‍රියා නොකරයි. මෙය නිවැරදි කිරීම සඳහා තත්වය පහසුවෙන් වෙනස් කරන්න

return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));

මේ සඳහා:

return (docViewBottom >= elemTop && docViewTop <= elemBottom);

මෙහි නිරූපණය බලන්න: http://jsfiddle.net/RRSmQ/


8

මෙහි ඇති බොහෝ පිළිතුරු, මූලද්‍රව්‍යයක් සැඟවිය හැකි බව සැලකිල්ලට නොගන්නේ එය මුළු පිටුවේම පමණක් නොව, ඩිවි එකකින් නොපෙනී යන බැවිනි.

එම හැකියාව ආවරණය කිරීම සඳහා, මූලික වශයෙන් එහි එක් එක් දෙමව්පියන්ගේ සීමාවන් තුළ මූලද්‍රව්‍යය ස්ථානගත වී ඇත්දැයි පරීක්ෂා කළ යුතුය.

මෙම විසඳුම හරියටම එය කරයි:

function(element, percentX, percentY){
    var tolerance = 0.01;   //needed because the rects returned by getBoundingClientRect provide the position up to 10 decimals
    if(percentX == null){
        percentX = 100;
    }
    if(percentY == null){
        percentY = 100;
    }

    var elementRect = element.getBoundingClientRect();
    var parentRects = [];

    while(element.parentElement != null){
        parentRects.push(element.parentElement.getBoundingClientRect());
        element = element.parentElement;
    }

    var visibleInAllParents = parentRects.every(function(parentRect){
        var visiblePixelX = Math.min(elementRect.right, parentRect.right) - Math.max(elementRect.left, parentRect.left);
        var visiblePixelY = Math.min(elementRect.bottom, parentRect.bottom) - Math.max(elementRect.top, parentRect.top);
        var visiblePercentageX = visiblePixelX / elementRect.width * 100;
        var visiblePercentageY = visiblePixelY / elementRect.height * 100;
        return visiblePercentageX + tolerance > percentX && visiblePercentageY + tolerance > percentY;
    });
    return visibleInAllParents;
};

එය එක් එක් දිශාවට දෘශ්‍යමාන විය යුතු ප්‍රතිශතය නියම කිරීමට ද ඉඩ දෙයි.
වැනි වෙනත් සාධක නිසා එය සැඟවිය හැකි බවට එය ආවරණය නොකරයි display: hidden.

මෙය සියලුම ප්‍රධාන බ්‍රව්සර් වල ක්‍රියාත්මක විය යුතුය, මන්ද එය භාවිතා කරන getBoundingClientRectබැවිනි. මම එය ක්‍රෝම් සහ ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් 11 හි පුද්ගලිකව පරීක්ෂා කළෙමි.


මෙම කේතයට ස්තූතියි. ඔබට කූඩුවල අනුචලනය කළ හැකි මූලද්‍රව්‍ය කිහිපයක් ඇති මෙම අවස්ථාවෙහිදී සිදුවීම් ශ්‍රාවකයා අනුචලනය සඳහා එකතු කරන්නේ කෙසේදැයි මම කල්පනා කරමි. කවුළුවට සවන්දෙන්නන් එක් කිරීම පමණක් ප්‍රමාණවත් නොවන බව පෙනේ, සෑම අනුචලනය කළ හැකි බහාලුමකට සවන්දෙන්නන් එක් කිරීම සඳහා අපි ඉහළ මවුපියන් වෙත ආපසු යා යුතුද?
mr1031011

r mr1031011 හසුරුවන්නා කවුළුවට එක් කළ හැකි අතර පසුව අනුචලනය කළ බහාලුම හඳුනා ගැනීම සඳහා ඉලක්කය පරීක්ෂා කරන්න.
ඩොමීසි

හරි, එය @vanowm විසින් දෙන ලද ආදර්ශය සමඟ ක්‍රියා නොකරයි,
mr1031011

7
function isScrolledIntoView(elem) {
    var docViewTop = $(window).scrollTop(),
        docViewBottom = docViewTop + $(window).height(),
        elemTop = $(elem).offset().top,
     elemBottom = elemTop + $(elem).height();
   //Is more than half of the element visible
   return ((elemTop + ((elemBottom - elemTop)/2)) >= docViewTop && ((elemTop + ((elemBottom - elemTop)/2)) <= docViewBottom));
}

7

Http://web-profile.com.ua/ වෙතින් තවත් විසඳුමක් මෙන්න

<script type="text/javascript">
$.fn.is_on_screen = function(){
    var win = $(window);
    var viewport = {
        top : win.scrollTop(),
        left : win.scrollLeft()
    };
    viewport.right = viewport.left + win.width();
    viewport.bottom = viewport.top + win.height();

    var bounds = this.offset();
    bounds.right = bounds.left + this.outerWidth();
    bounds.bottom = bounds.top + this.outerHeight();

    return (!(viewport.right < bounds.left || viewport.left > bounds.right ||    viewport.bottom < bounds.top || viewport.top > bounds.bottom));
 };

if( $('.target').length > 0 ) { // if target element exists in DOM
    if( $('.target').is_on_screen() ) { // if target element is visible on screen after DOM loaded
        $('.log').html('<div class="alert alert-success">target element is visible on screen</div>'); // log info       
    } else {
        $('.log').html('<div class="alert">target element is not visible on screen</div>'); // log info
    }
}
$(window).scroll(function(){ // bind window scroll event
if( $('.target').length > 0 ) { // if target element exists in DOM
    if( $('.target').is_on_screen() ) { // if target element is visible on screen after DOM loaded
        $('.log').html('<div class="alert alert-success">target element is visible on screen</div>'); // log info
    } else {
        $('.log').html('<div class="alert">target element is not visible on screen</div>'); // log info
    }
}
});
</script>

එය JSFiddle හි බලන්න


7

මූලද්‍රව්‍යයේ ඇති ඕනෑම පැඩිං, මායිම් හෝ ආන්තිකය මෙන්ම දර්ශනපත්‍රයට වඩා විශාල මූලද්‍රව්‍යයන් ද මෙය සලකයි.

function inViewport($ele) {
    var lBound = $(window).scrollTop(),
        uBound = lBound + $(window).height(),
        top = $ele.offset().top,
        bottom = top + $ele.outerHeight(true);

    return (top > lBound && top < uBound)
        || (bottom > lBound && bottom < uBound)
        || (lBound >= top && lBound <= bottom)
        || (uBound >= top && uBound <= bottom);
}

එය ඇමතීමට මෙවැනි දෙයක් භාවිතා කරන්න:

var $myElement = $('#my-element'),
    canUserSeeIt = inViewport($myElement);

console.log(canUserSeeIt); // true, if element is visible; false otherwise

7

මෙම විශිෂ්ට පිළිතුරෙන් බැහැරව , ඔබට ES2015 + භාවිතයෙන් තව ටිකක් සරල කළ හැකිය:

function isScrolledIntoView(el) {
  const { top, bottom } = el.getBoundingClientRect()
  return top >= 0 && bottom <= window.innerHeight
}

ඉහළට කවුළුවෙන් පිටතට යාම ගැන ඔබ තැකීමක් නොකරන්නේ නම් සහ පතුල බැලූ බැල්මට සැලකිලිමත් වන්නේ නම්, මෙය සරල කළ හැකිය

function isSeen(el) {
  return el.getBoundingClientRect().bottom <= window.innerHeight
}

හෝ එක් ලයිනර් පවා

const isSeen = el => el.getBoundingClientRect().bottom <= window.innerHeight

7

ඒ නිසා එය නම් සඟවන්න සඳහා ප්ලගිනය inview නව "inview" උත්සවය එකතු වන.


සිදුවීම් භාවිතා නොකරන jQuery ප්ලගිනයක් සඳහා කේත කිහිපයක් මෙන්න:

$.extend($.expr[':'],{
    inView: function(a) {
        var st = (document.documentElement.scrollTop || document.body.scrollTop),
            ot = $(a).offset().top,
            wh = (window.innerHeight && window.innerHeight < $(window).height()) ? window.innerHeight : $(window).height();
        return ot > st && ($(a).height() + ot) < (st + wh);
    }
});

(function( $ ) {
    $.fn.inView = function() {
        var st = (document.documentElement.scrollTop || document.body.scrollTop),
        ot = $(this).offset().top,
        wh = (window.innerHeight && window.innerHeight < $(window).height()) ? window.innerHeight : $(window).height();

        return ot > st && ($(this).height() + ot) < (st + wh);
    };
})( jQuery );

මම මෙය මෙහි දැක්වූ අදහස් දැක්වීමකින් ( http://remysharp.com/2009/01/26/element-in-view-event-plugin/ ) ජේම්ස් නම් බ්ලොක් එකකින්


අහෝ, jQuery ආරාධනය තවදුරටත් නඩත්තු නොකරන අතර jQuery හි වර්තමාන අනුවාද සමඟ ක්‍රියා නොකරයි.
mikemaccana

1
JQuery 1 යනු පැරණි බ්‍රව්සර් සහාය සඳහා වන අතර, නව විශේෂාංග jQuery 2 හි ඇත.
mikemaccana

පිටුව යාවත්කාලීන කර ඇති බැවින් සබැඳිය උදාහරණය පෙන්වන්නේ නැත.
වැඩසටහන් මහාචාර්ය

6

අනුචලනය කළ හැකි ඩීඅයිවී බහාලුම් තුළ ඇති මූලද්‍රව්‍යවල දෘශ්‍යතාව පරීක්ෂා කිරීමට මට අවශ්‍ය විය

    //p = DIV container scrollable
    //e = element
    function visible_in_container(p, e) {
        var z = p.getBoundingClientRect();
        var r = e.getBoundingClientRect();

        // Check style visiblilty and off-limits
        return e.style.opacity > 0 && e.style.display !== 'none' &&
               e.style.visibility !== 'hidden' &&
               !(r.top > z.bottom || r.bottom < z.top ||
                 r.left > z.right || r.right < z.left);
    }

මම වෙනස් නම් මට මේ වැඩ e.style.opacity > 0කිරීමට (!e.style.opacity || e.style.opacity > 0)පෙරනිමියෙන් එය FF දී මා වෙනුවෙන් හිස් අගයක් නිසා.
බ්‍රෙට් සමීර්

4

ඔබ අනුචලනය කරන විට මූලද්‍රව්‍යය වර්තමාන දර්ශනපත්‍රයේ තිබේදැයි පරීක්ෂා කිරීමට ඔබට "onScreen" jquery ප්ලගිනය භාවිතා කළ හැකිය. ප්ලගිනය තේරීම් තිරයේ දිස්වන විට තේරීම්කරුගේ ": onScreen" සත්‍ය ලෙස සකසයි. ඔබේ ව්‍යාපෘතියට ඇතුළත් කළ හැකි ප්ලගිනය සඳහා සබැඳිය මෙයයි. " http://benpickles.github.io/onScreen/jquery.onscreen.min.js "

මට ප්‍රයෝජනවත් වන පහත උදාහරණය ඔබට උත්සාහ කළ හැකිය.

$(document).scroll(function() {
    if($("#div2").is(':onScreen')) {
        console.log("Element appeared on Screen");
        //do all your stuffs here when element is visible.
    }
    else {
        console.log("Element not on Screen");
        //do all your stuffs here when element is not visible.
    }
});

HTML කේතය:

<div id="div1" style="width: 400px; height: 1000px; padding-top: 20px; position: relative; top: 45px"></div> <br>
<hr /> <br>
<div id="div2" style="width: 400px; height: 200px"></div>

CSS:

#div1 {
    background-color: red;
}
#div2 {
    background-color: green;
}

3

මගේ යෙදුමේ එවැනි ක්‍රමයක් මා සතුව ඇත, නමුත් එය jQuery භාවිතා නොකරයි:

/* Get the TOP position of a given element. */
function getPositionTop(element){
    var offset = 0;
    while(element) {
        offset += element["offsetTop"];
        element = element.offsetParent;
    }
    return offset;
}

/* Is a given element is visible or not? */
function isElementVisible(eltId) {
    var elt = document.getElementById(eltId);
    if (!elt) {
        // Element not found.
        return false;
    }
    // Get the top and bottom position of the given element.
    var posTop = getPositionTop(elt);
    var posBottom = posTop + elt.offsetHeight;
    // Get the top and bottom position of the *visible* part of the window.
    var visibleTop = document.body.scrollTop;
    var visibleBottom = visibleTop + document.documentElement.offsetHeight;
    return ((posBottom >= visibleTop) && (posTop <= visibleBottom));
}

සංස්කරණය කරන්න: මෙම ක්‍රමය IE සඳහා හොඳින් ක්‍රියා කරයි (අවම වශයෙන් 6 අනුවාදය). FF සමඟ අනුකූල වීම සඳහා අදහස් කියවන්න.


2
කිසියම් හේතුවක් නිසා document.body.scrollTop සෑම විටම 0 (ff3 මත) ලබා දෙයි. එය var visualTop = (document.documentElement.scrollTop? Document.documentElement.scrollTop: document.body.scrollTop) ලෙස වෙනස් කරන්න;
yoavf

ඒකට සමාවෙන්න. මගේ යෙදුම ක්‍රියාත්මක විය යුත්තේ IE 6 හි පමණි (ඔව්, මම වාසනාවන්ත නොවේ :(), එබැවින් මම මෙය කිසි විටෙකත් FF හි අත්හදා බැලුවේ නැත ...
රොමේන් ලින්සෝලාස්

එය නිවැරදි නම් මෙහි හොඳම පිළිතුර වනු ඇත. මේ සඳහා ඔබගේ එක් පේළියක් නිවැරදි කරන්න: var visibleBottom = visibleTop + window.innerHeight;මම jQuery භාවිතා නොකරන අතර නිවැරදි පිළිතුර සොයා ගැනීමට ඔබ මට උදව් කළා.
බිටර්බ්ලූ

3

වෙනත් අංශයක් තුළ අයිතමය අනුචලනය කිරීම සඳහා ඔබට මෙය වෙනස් කිරීමට අවශ්‍ය නම්,

function isScrolledIntoView (elem, divID) 

{

    var docViewTop = $('#' + divID).scrollTop();


    var docViewBottom = docViewTop + $('#' + divID).height();

    var elemTop = $(elem).offset().top;
    var elemBottom = elemTop + $(elem).height();

    return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop)); 
}

3

පිළිගත් පිළිතුර වෙනස් කරන ලද අතර එමඟින් මූලද්‍රව්‍යයට එහි දර්ශන දේපල දෘශ්‍යමාන තත්ත්වයට “කිසිවක්” හැර වෙනත් දෙයකට සකසා තිබිය යුතුය.

function isScrolledIntoView(elem) {
   var docViewTop = $(window).scrollTop();
  var docViewBottom = docViewTop + $(window).height();

  var elemTop = $(elem).offset().top;
  var elemBottom = elemTop + $(elem).height();
  var elemDisplayNotNone = $(elem).css("display") !== "none";

  return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop) && elemDisplayNotNone);
}

3

තිරස්, සිරස් හෝ දෙකෙහිම මූටූල්ස් භාවිතා කරමින් එකම දේ සාක්ෂාත් කර ගැනීමේ ක්‍රමයක් මෙන්න.

Element.implement({
inVerticalView: function (full) {
    if (typeOf(full) === "null") {
        full = true;
    }

    if (this.getStyle('display') === 'none') {
        return false;
    }

    // Window Size and Scroll
    var windowScroll = window.getScroll();
    var windowSize = window.getSize();
    // Element Size and Scroll
    var elementPosition = this.getPosition();
    var elementSize = this.getSize();

    // Calculation Variables
    var docViewTop = windowScroll.y;
    var docViewBottom = docViewTop + windowSize.y;
    var elemTop = elementPosition.y;
    var elemBottom = elemTop + elementSize.y;

    if (full) {
        return ((elemBottom >= docViewTop) && (elemTop <= docViewBottom)
            && (elemBottom <= docViewBottom) && (elemTop >= docViewTop) );
    } else {
        return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
    }
},
inHorizontalView: function(full) {
    if (typeOf(full) === "null") {
        full = true;
    }

    if (this.getStyle('display') === 'none') {
        return false;
    }

    // Window Size and Scroll
    var windowScroll = window.getScroll();
    var windowSize = window.getSize();
    // Element Size and Scroll
    var elementPosition = this.getPosition();
    var elementSize = this.getSize();

    // Calculation Variables
    var docViewLeft = windowScroll.x;
    var docViewRight = docViewLeft + windowSize.x;
    var elemLeft = elementPosition.x;
    var elemRight = elemLeft + elementSize.x;

    if (full) {
        return ((elemRight >= docViewLeft) && (elemLeft <= docViewRight)
            && (elemRight <= docViewRight) && (elemLeft >= docViewLeft) );
    } else {
        return ((elemRight <= docViewRight) && (elemLeft >= docViewLeft));
    }
},
inView: function(full) {
    return this.inHorizontalView(full) && this.inVerticalView(full);
}});

3

මූලද්‍රව්‍යයක් 75% ක් දෘශ්‍යමාන දැයි පරීක්ෂා කිරීම සඳහා මෙම පිළිතුර පදනම් කරගත් උදාහරණයක් (එනම් 25% ට වඩා අඩු ප්‍රමාණයක් තිරයෙන් ඉවතට).

function isScrolledIntoView(el) {
  // check for 75% visible
  var percentVisible = 0.75;
  var elemTop = el.getBoundingClientRect().top;
  var elemBottom = el.getBoundingClientRect().bottom;
  var elemHeight = el.getBoundingClientRect().height;
  var overhang = elemHeight * (1 - percentVisible);

  var isVisible = (elemTop >= -overhang) && (elemBottom <= window.innerHeight + overhang);
  return isVisible;
}

3

මෙම ප්‍රශ්නයට පිළිතුරු 30 කට වඩා ඇති අතර, ඒ කිසිවක් මා භාවිතා කර ඇති පුදුමාකාර සරල, පිරිසිදු JS විසඳුම භාවිතා නොකරයි. තවත් බොහෝ අය තල්ලු කරමින් සිටින බැවින් මෙය විසඳීම සඳහා jQuery පැටවීම අවශ්‍ය නොවේ.

මූලද්‍රව්‍යය දර්ශනපත්‍රය තුළ තිබේදැයි පැවසීමට නම්, අපි මුලින්ම ශරීරය තුළ ඇති මූලද්‍රව්‍ය පිහිටීම තීරණය කළ යුතුය. මා වරක් සිතූ පරිදි මෙය පුනරාවර්තව කිරීමට අපට අවශ්‍ය නැත. ඒ වෙනුවට, අපට භාවිතා කළ හැකිය element.getBoundingClientRect().

pos = elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top;

මෙම අගය වස්තුවේ ඉහළ කොටස සහ ශරීරයේ ඉහළ කොටස අතර Y වෙනස වේ.

මූලද්රව්යය දෘෂ්ටියේ තිබේදැයි අපි පසුව පැවසිය යුතුය. බොහෝ ක්‍රියාත්මක කිරීම් අසන්නේ සම්පූර්ණ අංගය දර්ශනපත්‍රය තුළ තිබේද යන්නයි, එබැවින් අපි ආවරණය කළ යුත්තේ මෙයයි.

පළමුවෙන්ම, කවුළුවේ ඉහළ පිහිටීම : window.scrollY.

කවුළුවේ උස එහි ඉහළ ස්ථානයට එක් කිරීමෙන් අපට කවුළුවේ පහළ ස්ථානය ලබා ගත හැකිය:

var window_bottom_position = window.scrollY + window.innerHeight;

මූලද්රව්යයේ ඉහළම ස්ථානය ලබා ගැනීම සඳහා සරල කාර්යයක් නිර්මාණය කරමු:

function getElementWindowTop(elem){
    return elem && typeof elem.getBoundingClientRect === 'function' ? elem.getBoundingClientRect().top - document.body.getBoundingClientRect().top : 0;
}

මෙම ශ්‍රිතය මඟින් කවුළුව තුළ මූලද්‍රව්‍යයේ ඉහළම ස්ථානය ලබා දෙනු ඇත, නැතහොත් 0ඔබ එය සමඟ මූලද්‍රව්‍යයක් හැර වෙනත් දෙයක් සම්මත කළහොත් එය නැවත පැමිණේ.getBoundingClientRect() ක්‍රමය . මෙම ක්‍රමය දීර් time කාලයක් තිස්සේ පැවතුන බැවින් ඔබගේ බ්‍රව්සරය එයට සහාය නොදැක්වීම ගැන කරදර විය යුතු නැත.

දැන්, අපගේ මූලද්රව්යයේ ඉහළම ස්ථානය:

var element_top_position = getElementWindowTop(element);

සහ හෝ මූලද්රව්යයේ පහළ පිහිටීම:

var element_bottom_position = element_top_position + element.clientHeight;

මූලද්‍රව්‍යයේ පහළ පිහිටීම දර්ශනපත්‍රයේ ඉහළ ස්ථානයට වඩා අඩු දැයි පරීක්ෂා කිරීමෙන් සහ මූලද්‍රව්‍යයේ ඉහළ පිහිටීම දර්ශනපත්‍රයේ පහළ ස්ථානයට වඩා ඉහළ දැයි පරීක්ෂා කිරීමෙන් මූලද්‍රව්‍යය දර්ශනපත්‍රය තුළ තිබේදැයි දැන් අපට තීරණය කළ හැකිය:

if(element_bottom_position >= window.scrollY 
&& element_top_position <= window_bottom_position){
    //element is in view
else
    //element is not in view

එතැන් සිට, ඔබට එකතු කිරීමට හෝ ඉවත් කිරීමට තර්කනය කළ හැකිය in-view ඔබේ මූලද්‍රව්‍යය මත පන්තියක් කළ හැකි අතර, පසුව ඔබේ CSS හි සංක්‍රාන්ති බලපෑම් සමඟ හැසිරවිය හැකිය.

මම වෙනත් තැනක මෙම විසඳුම සොයා නොගැනීම ගැන මම පුදුම වෙමි, නමුත් මෙය වඩාත්ම පිරිසිදු හා effective ලදායී විසඳුම බව මම විශ්වාස කරමි, තවද ඔබට jQuery පැටවීම අවශ්‍ය නොවේ!


ඉතා හොඳ පැහැදිලි කිරීමක්! ඇලීගේ පිළිතුර
ඩොමීසි

1
Omy ඩොමීසි හ්ම්, මම කෙසේ හෝ එය මඟ හැරියෙමි. සාමාන්යයෙන් ප්රමාණවත්. එය පෙන්වා දීමට ස්තූතියි. මෙය වෙනත් ආකාරයකින් සිදු කිරීම සතුටක්.
WebWanderer

3

මෙම පිළිතුරේ වඩාත් කාර්යක්ෂම අනුවාදය :

 /**
 * Is element within visible region of a scrollable container
 * @param {HTMLElement} el - element to test
 * @returns {boolean} true if within visible region, otherwise false
 */
 function isScrolledIntoView(el) {
      var rect = el.getBoundingClientRect();
      return (rect.top >= 0) && (rect.bottom <= window.innerHeight);
 }

2

පිටුවේ මූලද්‍රව්‍යයේ කිසියම් කොටසක් දැකිය හැකි නම් මෙම ක්‍රමය සත්‍ය වේ. එය මගේ නඩුවේ වඩා හොඳින් ක්‍රියාත්මක වූ අතර වෙනත් කෙනෙකුට උදව් විය හැකිය.

function isOnScreen(element) {
  var elementOffsetTop = element.offset().top;
  var elementHeight = element.height();

  var screenScrollTop = $(window).scrollTop();
  var screenHeight = $(window).height();

  var scrollIsAboveElement = elementOffsetTop + elementHeight - screenScrollTop >= 0;
  var elementIsVisibleOnScreen = screenScrollTop + screenHeight - elementOffsetTop >= 0;

  return scrollIsAboveElement && elementIsVisibleOnScreen;
}

2

අනුචලනය කළ හැකි div (බහාලුම්) සඳහා සරල වෙනස් කිරීම

var isScrolledIntoView = function(elem, container) {
    var containerHeight = $(container).height();
    var elemTop = $(elem).position().top;
    var elemBottom = elemTop + $(elem).height();
    return (elemBottom > 0 && elemTop < containerHeight);
}

සටහන: අනුචලනය කළ හැකි අංශයට වඩා මූලද්‍රව්‍යය විශාල නම් මෙය ක්‍රියා නොකරයි.


2

ඔබට මෙම නිදහස් jQuery ක්‍රියාකාරී දිගුව අනුවර්තනය කරන ලදි, එය ඔබට භාවිතා කිරීමට නිදහස ඇත (MIT බලපත්‍රය).

/**
 * returns true if an element is visible, with decent performance
 * @param [scope] scope of the render-window instance; default: window
 * @returns {boolean}
 */
jQuery.fn.isOnScreen = function(scope){
    var element = this;
    if(!element){
        return;
    }
    var target = $(element);
    if(target.is(':visible') == false){
        return false;
    }
    scope = $(scope || window);
    var top = scope.scrollTop();
    var bot = top + scope.height();
    var elTop = target.offset().top;
    var elBot = elTop + target.height();

    return ((elBot <= bot) && (elTop >= top));
};

2

මා විසින් කාර්යය සඳහා සංරචකයක් ලියා ඇති අතර, මූලද්‍රව්‍ය විශාල සංඛ්‍යාවක් ඉතා වේගයෙන් හැසිරවීමට නිර්මාණය කර ඇත ( මන්දගාමී ජංගම දුරකථනයක මූලද්‍රව්‍ය 1000 ක් සඳහා <10ms දක්වා ).

කවුළුව, HTML අංග, කාවැද්දූ iframe, පැටව් ගසා දරුවා කවුළුව - - එය (හඳුනාගන්නා දේ ගැන ඉතා නම්යශීලී වේ එය ඔබ වෙත ප්රවේශ අනුචලන රුවනයකි සෑම වර්ගය සමග ක්රියාත්මක වන පූර්ණ හෝ අර්ධ සැඟවීම් , දේශ සීමා කොටුව හෝ අන්තර්ගත කොටුව , අභිරුචි ඉවසීම කලාපය , ආදිය ).

විශාල, බොහෝ දුරට ස්වයංක්‍රීයව ජනනය කරන ලද පරීක්ෂණ කට්ටලයක් එය ප්‍රචාරණය කළ හරස් බ්‍රව්සරයක් ලෙස ක්‍රියා කරන බව සහතික කරයි .

ඔබ කැමති නම් එයට පහරක් දෙන්න: jQuery.isInView . එසේ නැත්නම්, ඔබ ආශ්වාදයක් වූ මූල ෙක්ත, උදා: ඔබට සිතෙන්න පුළුවන් මෙතන .

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.