กำหนดระยะห่างจากด้านบนสุดของ div ถึงด้านบนของหน้าต่างด้วย javascript


127

ฉันจะกำหนดระยะห่างระหว่างด้านบนสุดของ div ถึงด้านบนสุดของหน้าจอปัจจุบันได้อย่างไร ฉันแค่ต้องการให้ระยะพิกเซลอยู่ด้านบนสุดของหน้าจอปัจจุบันไม่ใช่ด้านบนของเอกสาร ฉันได้ลองทำหลายอย่างเช่น.offset()และ.offsetHeightแต่ฉันไม่สามารถห่อสมองของฉันไปรอบ ๆ ได้ ขอบคุณ!


2
คุณอาจต้องการตรวจสอบ
โจเซฟ

7
el.getBoundingClientRect().top+window.scrollY
caub

3
@caub เอ๊ะมันเฉยๆel.getBoundingClientRect().top. การเพิ่มตำแหน่งการเลื่อนจะเพิ่มระยะทางไปยังด้านบนสุดของเอกสาร developer.mozilla.org/de/docs/Web/API/Element/…
lynx

ใช่แล้วแค่อยากจะปลดหนี้
caub

คำตอบ:


239

คุณสามารถใช้.offset()เพื่อรับค่าชดเชยเมื่อเทียบกับdocumentองค์ประกอบจากนั้นใช้scrollTopคุณสมบัติของwindowองค์ประกอบเพื่อค้นหาว่าผู้ใช้เลื่อนหน้าเว็บไปไกลแค่ไหน:

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

distanceตัวแปรตอนนี้ถือระยะทางจากด้านบนของที่#my-elementองค์ประกอบและด้านบนพับ

นี่คือการสาธิต: http://jsfiddle.net/Rxs2m/

โปรดทราบว่าค่าลบหมายความว่าองค์ประกอบนั้นอยู่เหนือครึ่งหน้าบน


ฉันจะตรวจสอบได้อย่างไรว่าระยะทางเป็นตัวเลขเฉพาะหรือไม่? ฉันต้องการทำให้องค์ประกอบเหนียวถ้าอยู่ห่างจากด้านบน 120px
Thessa Verbruggen

@ThessaVerbruggen คุณสามารถตรวจสอบdistanceตัวแปรเพื่อดูว่าเป็นค่าหรือไม่120แต่ขอแนะนำให้ตรวจสอบช่วงแทนที่จะเป็นตัวเลขที่แน่นอน ถ้าเช่นคุณเลื่อนเมาส์ล้อคุณเป็นอย่างดีอาจจะข้าม 120 ดังนั้นถ้าคุณกำลังพยายามที่จะใช้ CSS บางส่วนหรือบางสิ่งบางอย่างเมื่อองค์ประกอบอยู่ภายใน 120px if (distance < 120) { /* do something */}ด้านบนพับแล้วบางทีการใช้งาน นี่คือการสาธิตที่อัปเดต: jsfiddle.net/na5qL91o
Jasper

ปัญหาอย่างหนึ่งถ้าฉันทำสิ่งนี้: ส่วนที่เหนียวกระพริบเมื่อฉันเลื่อน ฉันเดาว่าเพราะมันคำนวณใหม่เมื่อฉันเลื่อน มีความคิดอย่างไรที่จะแก้ไขปัญหานี้ รหัสของฉัน: $ (window) .on ('scroll', function () {var scrollTop = $ (window) .scrollTop (), elementOffset = $ ('# secondary'). offset (). top, distance = (elementOffset - scrollTop); if (distance <120) {$ ('# secondary'). addClass ('sticky');} else {$ ('# secondary'). removeClass ('sticky');}});
Thessa Verbruggen

60

วนิลา:

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

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

   console.log(distanceToTop);
});

เปิดคอนโซลเบราว์เซอร์ของคุณและเลื่อนหน้าของคุณเพื่อดูระยะทาง


14
วิธีนี้ใช้ได้เฉพาะเมื่อผู้ใช้ไม่ได้เลื่อนหน้า มิฉะนั้นการdistanceToTopส่งคืนจะสัมพันธ์กัน (อาจเป็นค่าลบได้หากผู้ใช้เลื่อนผ่านมา) ในการพิจารณาเรื่องนี้ให้ใช้window.pageYOffset + someDiv.getBoundingClientRect().top
ty

2
@ty OP กำลังมองหาระยะทางไปที่ด้านบนสุดของหน้าจอไม่ใช่ด้านบนของเอกสาร - ค่าลบจะใช้ได้ในกรณีนี้
Drenai

16

สิ่งนี้สามารถทำได้ด้วย JavaScript ล้วนๆJavaScript

ฉันเห็นคำตอบที่ฉันต้องการเขียนได้รับคำตอบจากแมวป่าชนิดหนึ่งในความคิดเห็นของคำถาม

แต่ฉันจะเขียนคำตอบอยู่ดีเพราะเหมือนฉันบางครั้งคนลืมอ่านความคิดเห็น

ดังนั้นหากคุณต้องการเพียงแค่ได้ระยะขององค์ประกอบ (เป็นพิกเซล) จากด้านบนของหน้าต่างหน้าจอคุณต้องทำดังนี้

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

ใช้getBoundingClientRect ()

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

แค่นั้นแหละ!

หวังว่านี่จะช่วยใครสักคน :)


1
getBoundingClient () ไม่ทำงานแทน. getBoundingClientRect ()
Elnoor

@Elnoor ขอบคุณสำหรับคำแนะนำ :) ฉันได้ทำการเปลี่ยนแปลงที่เหมาะสมแล้ว
Furqan Rahamath

สุดยอดมาก @MohammedFurqanRahamathM ขอบคุณมากสำหรับคำตอบ :) มันใช้ได้เหมือนมีเสน่ห์ !! :)
Merianos Nikos

1
@MerianosNikos ขอบคุณครับ ฉันดีใจที่ได้รับความช่วยเหลือ :)
Furqan Rahamath

1
แต่จะใช้ได้ก็ต่อเมื่อคุณไม่ได้โหลดซ้ำตรงกลางหน้าใช่ไหม
Sagive SEO

7

ฉันใช้สิ่งนี้:

                              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

รหัส:

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);
    });
    */

+1 สำหรับแสดง element.offsetTop นั้นอยู่ element.getBoundingClientRect (). top ทำให้ฉันมีพฤติกรรมแปลก ๆ ฉันต้องการระยะห่างจากด้านบนของหน้าเว็บจนถึงส่วนบนสุดขององค์ประกอบ
alexandre1985

0

ฉันใช้ฟังก์ชันนี้เพื่อตรวจสอบว่าองค์ประกอบสามารถมองเห็นได้ในพอร์ตมุมมองหรือไม่

รหัส:

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');
}
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.