Posición de Div en relación con la parte superior de la ventana gráfica

4 minutos de lectura

avatar de usuario
PF1

Me pregunto cómo puedo obtener la cantidad de píxeles (o medidas en general) desde un div hasta la parte superior de la ventana en Javascript. No estoy buscando un desplazamiento y en relación con el documento, simplemente en la parte superior de donde se muestra el navegador. Probé la solución “respondida” aquí: ¿Es posible obtener la posición de div dentro de la ventana del navegador? No dentro del documento. Dentro de la ventana, pero al menos en Safari, me encuentro con un problema en el que devuelve el mismo número sin importar dónde estén realmente los div.

¡Gracias por cualquier ayuda!

  • Recomendar nuevo título: “Posición de div relativa a la parte superior de la mirador

    – Matchú

    25 de diciembre de 2009 a las 0:54

  • Gracias Matchu: he actualizado el título.

    – PF1

    25 de diciembre de 2009 a las 1:01

  • Matchu significaba VerPuerto (que es un sinónimo de la ventana del navegador).

    – Peka

    25 de diciembre de 2009 a las 1:06

  • Hola Pekka: Ups, lo corregí al título correcto.

    – PF1

    25 de diciembre de 2009 a las 1:20

Las respuestas existentes ahora están desactualizadas. los getBoundingClientRect() El método ha existido durante bastante tiempo y hace exactamente lo que pide esta pregunta. Además, es compatible con todos los navegadores.

De este página MDN:

El valor devuelto es un objeto TextRectangle, que contiene propiedades izquierda, superior, derecha e inferior de solo lectura que describen el cuadro de borde, en píxeles, con la parte superior izquierda en relación con la parte superior izquierda de la ventana gráfica.

Lo usas así:

var viewportOffset = el.getBoundingClientRect();
// these are relative to the viewport
var top = viewportOffset.top;
var left = viewportOffset.left;

  • Esto es mucho, mucho mejor. ¡Gracias!

    – Codificador

    19 de diciembre de 2013 a las 14:41

  • @HimanshuP: las cosas de MDN son apenas comprensibles (aunque no estoy seguro de si es su culpa) y su ejemplo de código no muestra un ejemplo que ilustre cómo podría funcionar esto en un entorno del mundo real.

    – serraosays

    2 de marzo de 2016 a las 16:57

  • Que hace el ¿representar? como se usa top y left para colocar el div? respuesta incompleta

    – Andrés

    26 mayo 2017 a las 19:24

  • ¡Excelente! Esto es genial, realmente útil 🙂

    – Darragh Enright

    25 de septiembre de 2019 a las 23:07

//Primero obtenga la geometría correcta para el navegador

(function(){
 Run= window.Run || {};
 if(window.pageYOffset!= undefined){
  Run.topLeftScroll= function(hoo){
   var wo= [window.pageXOffset, window.pageYOffset]
   if(hoo && hoo.nodeType== 1){
    hoo= mr(hoo);
    var T= 0, L= 0;
    while(hoo){
     L+= hoo.offsetLeft;
     T+= hoo.offsetTop;
     hoo= hoo.offsetParent;
    }
    wo= [L, T, wo[0], wo[1]];
   }
   return wo;
  }
 }
 else if(document.body.scrollTop!== undefined){
  Run.topLeftScroll= function(hoo){
   var B= document.body;
   var D= document.documentElement;
   D= (D.clientHeight)? D: B;
   wo= [D.scrollLeft, D.scrollTop];
   if(hoo && hoo.nodeType== 1){
    hoo= mr(hoo);
    var T= 0, L= 0;
    while(hoo){
     L+= hoo.offsetLeft;
     T+= hoo.offsetTop;
     hoo= hoo.offsetParent;
    }
    wo= [L, T, wo[0], wo[1]];
   }
   return wo;
  }
 }
})()

// función de atajo

if(window.Run && Run.topLeftScroll){
 Run.getPosition= function(who, wch){
  var A= Run.topLeftScroll(who);
  if(!wch) return A;
  switch(wch.toUpperCase()){
   case 'X': return A[0];// element Left in document
   case 'Y': return A[1];// element Top in document
   case 'L': return A[0]-A[2];// Left minus scroll
   case 'T': return A[1]-A[3];// Top minus scroll
   case 'SL': return A[2];// scroll Left
   case 'ST': return A[3];// scroll Top
   default: return 0;
  }
  // all returns are integers (pixels)
 }
}

avatar de usuario
Peka

Vea lo que JS Frameworks tiene para ofrecer. En su mayoría, han resuelto todos, o al menos la mayoría, de los problemas y especialidades específicos del navegador.

En Prototype, están los DesplazamientoDesplazamiento() funciones No estoy lo suficientemente familiarizado con JQuery para indicarle la página correcta del manual, pero aquí hay una pregunta que parece ir en la dirección correcta.

  • No creo que haya una sola función jQuery para devolver este valor, pero las matemáticas simples con $(‘#my-div’).offset().top y $(document).scrollTop() deberían hacer el truco.

    – Matchú

    25 de diciembre de 2009 a las 0:52

He esquilado un poco y encontré esto:

 function getOffsetPosition(el_id, side){
 element = document.getElementById(el_id);

 newNode = document.createElement("div");
 newNode.innerHTML = "<div style=\"height: 12px;\"></div>";
 element.insertBefore(newNode, element.firstChild);

 iVal = 0;
 oObj = element;
 var sType = "oObj.offset"+side;
 while (oObj && oObj.tagName != "html") {
 iVal += eval(sType);
 oObj = oObj.offsetParent;
 }
 element.removeChild(newNode);
 return iVal;
 } 

Si eso te puede ayudar ^^

avatar de usuario
ricardo h

Esta respuesta le dice cómo obtener las coordenadas x e y de un elemento con respecto al origen (arriba a la izquierda) de un documento. Solo necesita agregar el valor .scrollTop a la coord y para obtener la distancia en píxeles desde div hasta la parte superior de la ventana gráfica.

  • También debe restar window.pageXOffset y window.pageYOffset, como en la respuesta de @kennebec.

    – Sean el Frijol

    26 de abril de 2012 a las 14:12

  • También debe restar window.pageXOffset y window.pageYOffset, como en la respuesta de @kennebec.

    – Sean el Frijol

    26 de abril de 2012 a las 14:12

¿Ha sido útil esta solución?