Bestimmen Sie den Abstand vom oberen Rand eines Div zum oberen Rand des Fensters mit Javascript

127

Wie bestimme ich den Abstand zwischen dem oberen Rand eines Div und dem oberen Rand des aktuellen Bildschirms? Ich möchte nur den Pixelabstand zum oberen Rand des aktuellen Bildschirms und nicht zum oberen Rand des Dokuments. Ich habe ein paar Dinge wie .offset()und ausprobiert .offsetHeight, aber ich kann mein Gehirn einfach nicht darum wickeln. Vielen Dank!

Joel Eckroth
quelle
2
Vielleicht möchten Sie dies überprüfen
Joseph
7
el.getBoundingClientRect().top+window.scrollY
Caub
3
@caub Eh, es ist nur el.getBoundingClientRect().top. Durch Hinzufügen der Bildlaufposition wird der Abstand zum oberen Rand des Dokuments erhöht. developer.mozilla.org/de/docs/Web/API/Element/…
Luchs
ja richtig, wollte nur unjquerify
caub

Antworten:

239

Sie können .offset()den Versatz im Vergleich zum documentElement abrufen und dann mithilfe der scrollTopEigenschaft des windowElements ermitteln, wie weit der Benutzer auf der Seite gescrollt hat:

var scrollTop     = $(window).scrollTop(),
    elementOffset = $('#my-element').offset().top,
    distance      = (elementOffset - scrollTop);

Die distanceVariable enthält jetzt den Abstand von der Oberseite des #my-elementElements und der oberen Falte.

Hier ist eine Demo: http://jsfiddle.net/Rxs2m/

Beachten Sie, dass negative Werte bedeuten, dass sich das Element über der oberen Falte befindet.

Jaspis
quelle
Wie kann ich überprüfen, ob die Entfernung eine bestimmte Zahl ist? Ich möchte ein Element klebrig machen, wenn es 120px von der Spitze entfernt ist
Thessa Verbruggen
@ThessaVerbruggen Sie können die distanceVariable überprüfen, um festzustellen , ob ihr Wert ist, 120aber ich würde empfehlen, nach einem Bereich anstelle einer genauen Zahl zu suchen . Wenn Sie beispielsweise mit einem Mausrad scrollen, können Sie sehr gut 120 überspringen. Wenn Sie also versuchen, CSS oder etwas anderes anzuwenden, wenn sich das Element innerhalb von 120 Pixel von der oberen Falte befindet, verwenden Sie möglicherweise if (distance < 120) { /* do something */}. Hier ist eine aktualisierte Demo: jsfiddle.net/na5qL91o
Jasper
Ein Problem, wenn ich das mache: Der klebrige Teil blinkt, wenn ich scrolle. Ich denke, weil es beim Scrollen neu berechnet wird. Irgendeine Idee, wie man das behebt? Mein Code: $ (Fenster) .on ('scroll', function () {var scrollTop = $ (Fenster) .scrollTop (), elementOffset = $ ('# sekundär'). Offset (). Oben, Abstand = (elementOffset - scrollTop); if (Abstand <120) {$ ('# sekundär'). addClass ('klebrig');} else {$ ('# sekundär'). removeClass ('klebrig');}});
Thessa Verbruggen
60

Vanille:

window.addEventListener('scroll', function(ev) {

   var someDiv = document.getElementById('someDiv');
   var distanceToTop = someDiv.getBoundingClientRect().top;

   console.log(distanceToTop);
});

Öffnen Sie Ihre Browserkonsole und scrollen Sie auf Ihrer Seite, um die Entfernung anzuzeigen.

horahore
quelle
14
Dies funktioniert nur, wenn der Benutzer die Seite nicht gescrollt hat. Andernfalls ist die distanceToTopRückgabe relativ (kann sogar negativ sein, wenn der Benutzer einen Bildlauf durchgeführt hat). Um dies zu berücksichtigen, verwenden Siewindow.pageYOffset + someDiv.getBoundingClientRect().top
ty.
2
@ty Das OP sucht nach dem Abstand zum oberen Bildschirmrand, nicht zum oberen Rand des Dokuments - ein negativer Wert wäre in diesem Fall gültig
Drenai
16

Dies kann nur mit JavaScript erreicht werden .

Ich sehe, dass die Antwort, die ich schreiben wollte, von Luchs in Kommentaren zu der Frage beantwortet wurde .

Aber ich werde trotzdem eine Antwort schreiben, weil die Leute genau wie ich manchmal vergessen, die Kommentare zu lesen.

Wenn Sie also nur den Abstand eines Elements (in Pixel) vom oberen Rand Ihres Bildschirmfensters abrufen möchten, müssen Sie Folgendes tun:

// Fetch the element
var el = document.getElementById("someElement");  

benutze getBoundingClientRect ()

// Use the 'top' property of 'getBoundingClientRect()' to get the distance from top
var distanceFromTop = el.getBoundingClientRect().top; 

Das ist es!

Hoffe das hilft jemandem :)

Furqan Rahamath
quelle
1
getBoundingClient () funktioniert nicht, stattdessen .getBoundingClientRect ()
Elnoor
@ Elnoor Danke für den Vorschlag :) Ich habe entsprechende Änderungen vorgenommen.
Furqan Rahamath
Einfach tolle Arbeit @MohammedFurqanRahamathM. Vielen Dank für Ihre Antwort :) Es funktioniert wie ein Zauber! :)
Merianos Nikos
1
@ MerianosNikos Danke. Ich bin froh, dass es hilfreich war :)
Furqan Rahamath
1
Aber das würde nur funktionieren, wenn Sie nicht in der Mitte der Seite neu geladen haben, oder?
Sagive SEO
7

Ich habe das benutzt:

                              myElement = document.getElemenById("xyz");
Get_Offset_From_Start       ( myElement );  // returns positions from website's start position
Get_Offset_From_CurrentView ( myElement );  // returns positions from current scrolled view's TOP and LEFT

Code:

function Get_Offset_From_Start (object, offset) { 
    offset = offset || {x : 0, y : 0};
    offset.x += object.offsetLeft;       offset.y += object.offsetTop;
    if(object.offsetParent) {
        offset = Get_Offset_From_Start (object.offsetParent, offset);
    }
    return offset;
}

function Get_Offset_From_CurrentView (myElement) {
    if (!myElement) return;
    var offset = Get_Offset_From_Start (myElement);
    var scrolled = GetScrolled (myElement.parentNode);
    var posX = offset.x - scrolled.x;   var posY = offset.y - scrolled.y;
    return {lefttt: posX , toppp: posY };
}
//helper
function GetScrolled (object, scrolled) {
    scrolled = scrolled || {x : 0, y : 0};
    scrolled.x += object.scrollLeft;    scrolled.y += object.scrollTop;
    if (object.tagName.toLowerCase () != "html" && object.parentNode) { scrolled=GetScrolled (object.parentNode, scrolled); }
    return scrolled;
}

    /*
    // live monitoring
    window.addEventListener('scroll', function (evt) {
        var Positionsss =  Get_Offset_From_CurrentView(myElement);  
        console.log(Positionsss);
    });
    */
T.Todua
quelle
+1 für die Anzeige, dass element.offsetTop vorhanden ist. element.getBoundingClientRect (). top gibt mir seltsames Verhalten. Ich habe versucht, den Abstand vom oberen Rand der Webseite bis zum oberen Rand des Elements zu ermitteln.
Alexandre1985
0

Ich habe diese Funktion verwendet, um festzustellen, ob das Element im Ansichtsfenster sichtbar ist

Code:

const vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);
$(window).scroll(function(){
var scrollTop     = $(window).scrollTop(),
elementOffset = $('.for-scroll').offset().top,
distance      = (elementOffset - scrollTop);
if(distance < vh){
    console.log('in view');
}
else{
    console.log('not in view');
}
});
Moutasim Ahmad
quelle