javascript - Hvordan få en elements topposisjon i forhold til nettleserens viewport?
Jeg vil få posisjonen til et element i forhold til nettleserens visningsområde (visningsområdet der siden vises, ikke hele siden). Hvordan kan dette gjøres i JavaScript?
Mange takk
Svar #1
De eksisterende svarene er nå utdaterte. Den innebygde getBoundingClientRect()-metoden har eksistert en god stund nå, og gjør akkurat det spørsmålet ber om. I tillegg støttes den i alle nettlesere (inkludert IE 5, ser det ut til!)
Fra MDN-side:
Den returnerte verdien er et TextRectangle-objekt, som inneholder skrivebeskyttede left, top, right og bottom-egenskaper som beskriver border-boksen, i piksler, med øverste venstre relativt til øverste venstre hjørne av visningsområdet.
Du bruker det slik:
var viewportOffset = el.getBoundingClientRect();
// these are relative to the viewport, i.e. the window
var top = viewportOffset.top;
var left = viewportOffset.left;
Svar #2
I mitt tilfelle, bare for å være sikker når det gjelder scrolling, la jeg til window.scroll i ligningen:
var element = document.getElementById('myElement');
var topPos = element.getBoundingClientRect().top + window.scrollY;
var leftPos = element.getBoundingClientRect().left + window.scrollX;
Det lar meg få den faktiske relative posisjonen til elementet på dokumentet, selv om det har blitt rullet.
Svar #3
var element = document.querySelector('selector');
var bodyRect = document.body.getBoundingClientRect(),
elemRect = element.getBoundingClientRect(),
offset = elemRect.top - bodyRect.top;
Svar #4
Rediger: Legg til litt kode for å ta hensyn til at siden ruller.
function findPos(id) {
var node = document.getElementById(id);
var curtop = 0;
var curtopscroll = 0;
if (node.offsetParent) {
do {
curtop += node.offsetTop;
curtopscroll += node.offsetParent ? node.offsetParent.scrollTop : 0;
} while (node = node.offsetParent);
alert(curtop - curtopscroll);
}
}
Argumentet id er id-en til elementet hvis offset du ønsker. Tilpasset fra et innlegg på QuirksMode.
Svar #5
jQuery implementerer dette ganske elegant. Hvis du ser på koden for jQuerys offset, vil du finne at dette i utgangspunktet er hvordan det er implementert:
var rect = elem.getBoundingClientRect();
var win = elem.ownerDocument.defaultView;
return {
top: rect.top + win.pageYOffset,
left: rect.left + win.pageXOffset
};
