w3school not edteam javascript getboundingclientrect

not - GetBoundingClientRect() de JavaScript cambia durante el desplazamiento



getboundingclientrect scroll (2)

Quiero tener la distancia exacta entre la coordenada Y de un elemento y el valor Y = 0, que considero como la parte superior del documento.

myElement.getBoundingClientRect().top;

Pero el valor de getBoundingClientRect () parece cambiar durante el desplazamiento. ¿Cómo puedo obtener la distancia real entre myElement y la coordenada Y = 0 (parte superior del documento)?


Esto se debe a que getBoundingClientRect() obtiene valores con respecto a la window (solo la parte visible actual de la página), no el document (página completa).
Por lo tanto, también tiene en cuenta el desplazamiento al calcular sus valores
Básicamente, document = window + scroll

Entonces, para obtener la distancia entre myElement y la coordenada Y = 0 (parte superior del documento), también debería agregar el valor de desplazamiento vertical:

myElement.getBoundingClientRect().top + window.scrollY;

Fuente: https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect


getBoundingClientRect necesita un poco más de cuidado para evitar errores en scrollY / pageYOffset:

function absolutePosition(el) { var found, left = 0, top = 0, width = 0, height = 0, offsetBase = absolutePosition.offsetBase; if (!offsetBase && document.body) { offsetBase = absolutePosition.offsetBase = document.createElement(''div''); offsetBase.style.cssText = ''position:absolute;left:0;top:0''; document.body.appendChild(offsetBase); } if (el && el.ownerDocument === document && ''getBoundingClientRect'' in el && offsetBase) { var boundingRect = el.getBoundingClientRect(); var baseRect = offsetBase.getBoundingClientRect(); found = true; left = boundingRect.left - baseRect.left; top = boundingRect.top - baseRect.top; width = boundingRect.right - boundingRect.left; height = boundingRect.bottom - boundingRect.top; } return { found: found, left: left, top: top, width: width, height: height, right: left + width, bottom: top + height }; }

Los errores a evitar son:

  • desplazarse en Android Chrome ya que Chrome Mobile 43 tiene valores incorrectos para desplazamientoY / páginaYOffset (especialmente cuando se muestra el teclado y se desplaza).

  • Pinch-zoom en Microsoft IE o Edge causa valores incorrectos para scrollY / pageYOffset.

  • Algunos navegadores (obsoletos) no tienen una altura / ancho, por ejemplo, IE8

Editar: el código anterior se puede simplificar mucho simplemente usando document.body.getBoundingClientRect() lugar de agregar un div; sin embargo, no lo he probado, así que dejo mi respuesta tal como está. También el cuerpo necesita margin:0 (reset.css generalmente hace esto). ¡Esta respuesta simplifica mucho el código, al tiempo que evita los errores en jQuery.offset ()!

Edición 2: Chrome 61 introdujo window.visualViewport para proporcionar valores correctos para la ventana window.visualViewport real, que probablemente sea otra forma de solucionar problemas; pero tenga en cuenta que Android Chrome 66 todavía presentaba errores si se Settings -> Accessability -> Force enable zoom (errores con cambio de orientación, entradas enfocadas, ventana emergente posicionada absolutamente más ancha que la ventana gráfica).