¿Cómo obtener el desplazamiento correcto de un elemento? - jQuery


86

Esta es probablemente una pregunta realmente simple, pero ¿cómo puedo obtener el desplazamiento correcto de un elemento en jQuery?

Puedo hacer:

$("#whatever").offset().left;

y es válido.

Pero parece que:

$("#whatever").offset().right 

es indefinido.

Entonces, ¿cómo se logra esto en jQuery?

¡¡Gracias!!

Respuestas:


161

Alex, Gary:

Según lo solicitado, aquí está mi comentario publicado como respuesta:

var rt = ($(window).width() - ($whatever.offset().left + $whatever.outerWidth()));

Gracias por hacérmelo saber.

En pseudocódigo que se puede expresar como:

El desplazamiento correcto es:

El ancho de la ventana MENOS
(el desplazamiento a la izquierda del elemento MÁS el ancho exterior del elemento )


esto no funciona con las transformaciones CSS, el desplazamiento se verá afectado por la transformación, pero el ancho exterior (y el ancho) no.
Jonathan.

2
Este es el desplazamiento desde el lado derecho de la ventana. Para el desplazamiento desde el lado izquierdo de la ventana, vea la respuesta de cdZ .
Codificación

el borde más a la derecha de un elemento se puede encontrar de forma más "nativa" $whatever[0].getBoundingClientRect().right. esto es relativo al borde izquierdo de la ventana.
pstanton

Gracias brendon. Respuesta útil.

29
var $whatever        = $('#whatever');
var ending_right     = ($(window).width() - ($whatever.offset().left + $whatever.outerWidth()));

Referencia: .outerWidth ()


1
Creo que necesito agregarlos y luego menos 1. Si el ancho es 2, entonces la izquierda está en 10, y la derecha no está en 12 sino en 11.
polaridad

31
Esta es una respuesta incorrecta. En CSS, "izquierda" implica "el desplazamiento del punto más a la izquierda del elemento desde la izquierda de la ventana / padre", y "derecha" implica "el desplazamiento del punto más a la derecha del elemento desde la derecha de la ventana / padre" ". Entonces, la respuesta correcta sería:var rt = ($(window).width() - ($whatever.offset().left + $whatever.outerWidth()));
Brendon Crawford

5
@BrendonCrawford Deberías mover ese comentario a una respuesta.
Gary

3
Una nota para todos los que vengan: la respuesta anterior se ha editado para reflejar correctamente el comentario hecho por Brendon.
Chris Marasti-Georg

16

Tal vez no haya entendido bien su pregunta, pero se supone que el desplazamiento le da dos variables: una horizontal y una vertical. Esto define la posición del elemento. Entonces, lo que estás buscando es:

$("#whatever").offset().left

y

$("#whatever").offset().top

Si necesita saber dónde está el límite correcto de su elemento, entonces debe usar:

$("#whatever").offset().left + $("#whatever").outerWidth()

9

Solo una adición a lo que dijo Greg:

$ ("# lo que sea"). offset (). left + $ ("# lo que sea"). outerWidth ()

Este código obtendrá la posición correcta en relación con el lado izquierdo. Si la intención era obtener la posición del lado derecho en relación con el derecho (como cuando se usa la rightpropiedad CSS ), entonces es necesaria una adición al código de la siguiente manera:

$ ("# parent_container"). innerWidth () - ($ ("# lo que sea"). offset (). left + $ ("# lo que sea"). outerWidth ())

Este código es útil en animaciones en las que debe establecer el lado derecho como un ancla fija cuando inicialmente no puede establecer la rightpropiedad en CSS.


6

En realidad, estos solo funcionan cuando la ventana no se desplaza en absoluto desde la posición superior izquierda.
Debe restar los valores de desplazamiento de la ventana para obtener un desplazamiento que sea útil para reposicionar elementos para que permanezcan en la página:

var offset = $('#whatever').offset();

offset.right = ($(window).width() + $(window).scrollLeft()) - (offset.left + $('#whatever').outerWidth(true));
offset.bottom = ($(window).height() + $(window).scrollTop()) - (offset.top + $('#whatever').outerHeight(true));

5

Hay una API DOM nativa que logra esto de inmediato getBoundingClientRect:

document.querySelector("#whatever").getBoundingClientRect().right

2
Pero getBoundingClientRect devuelve en relación con la ventana gráfica, no en relación con el documento, que es lo que proporciona offset ().
Sai Dubbaka

4

Brendon Crawford tuvo la mejor respuesta aquí (en el comentario), así que lo moveré a una respuesta hasta que lo haga (y tal vez lo amplíe un poco).

var offset = $('#whatever').offset();

offset.right = $(window).width() - (offset.left + $('#whatever').outerWidth(true));
offset.bottom = $(window).height() - (offset.top + $('#whatever').outerHeight(true));

2

Conseguir el punto de anclaje de div/table (left) = $("#whatever").offset().left;... ¡ok!

Para obtener el punto de anclaje de un div/table (right), puede usar el siguiente código.

 $("#whatever").width();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.