Tengo el siguiente html de muestra, hay un DIV que tiene un ancho del 100%. Contiene algunos elementos. Mientras se realiza el cambio de tamaño de las ventanas, los elementos internos pueden ser reubicados y la dimensión del div puede cambiar. Estoy preguntando si es posible conectar el evento de cambio de dimensión del div. ¿y como hacer eso? Actualmente asocio la función de devolución de llamada al evento jQuery resize en el DIV de destino, sin embargo, no se genera ningún registro de consola, consulte a continuación:
<html>
<head>
<script type="text/javascript" language="javascript" src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
<script type="text/javascript" language="javascript">
$('#test_div').bind('resize', function(){
console.log('resized');
});
</script>
</head>
<body>
<div id="test_div" style="width: 100%; min-height: 30px; border: 1px dashed pink;">
<input type="button" value="button 1" />
<input type="button" value="button 2" />
<input type="button" value="button 3" />
</div>
</body>
</html>
javascript
jquery
html
William Choi
fuente
fuente
setInterval
aquí como una posible solución. Siempre puede vincularseclearInterval
a un clic de botón para detener el ciclo una vez que haya terminado su trabajo.Respuestas:
Hay un método muy eficiente para determinar si se ha cambiado el tamaño de un elemento.
http://marcj.github.io/css-element-queries/
Esta biblioteca tiene una clase
ResizeSensor
que se puede usar para la detección de cambio de tamaño.Utiliza un enfoque basado en eventos, por lo que es muy rápido y no pierde el tiempo de la CPU.
Ejemplo:
No use el complemento jQuery onresize, ya que se usa
setTimeout()
en combinación con la lectura de DOMclientHeight
/clientWidth
propiedades en un bucle para verificar los cambios.Esto es increíblemente lento e inexacto, ya que causa un cambio de diseño .
Divulgación: estoy directamente asociado con esta biblioteca.
fuente
requestAnimationFrame
vssetTimeout
es irrelevante, esta biblioteca no se repite .requestAnimationFrame
solo se usa para eliminar la frecuencia de aceleración de las llamadas de devolución de llamada, no sondea . MutationObserver teóricamente podría usarse con un efecto similar, pero no en navegadores antiguos, a diferencia de esto. Esto es excepcionalmente inteligente.Un nuevo estándar para esto es la API Resize Observer, disponible en Chrome 64.
Observador de cambio de tamaño
Especificaciones: https://wicg.github.io/ResizeObserver
Polyfills: https://github.com/WICG/ResizeObserver/issues/3
Problema de Firefox: https://bugzil.la/1272409
Problema de Safari: http://wkb.ug/157743
Soporte actual: http://caniuse.com/#feat=resizeobserver
fuente
Tienes que vincular el
resize
evento en elwindow
objeto, no en un elemento html genérico.Entonces podrías usar esto:
y dentro de la función de devolución de llamada puede verificar el nuevo ancho de su
div
llamadaEntonces, la respuesta a su pregunta es no , no puede vincular el
resize
evento a un div.fuente
A largo plazo, podrá utilizar ResizeObserver .
Lamentablemente, actualmente no es compatible de forma predeterminada en muchos navegadores.
Mientras tanto, puede usar funciones como las siguientes. Dado que, la mayoría de los cambios en el tamaño del elemento vendrán del cambio de tamaño de la ventana o de cambiar algo en el DOM. Se puede escuchar el redimensionamiento de la ventana con el cambio de tamaño del evento y se puede escuchar a DOM cambia usando MutationObserver .
Aquí hay un ejemplo de una función que le devolverá la llamada cuando el tamaño del elemento proporcionado cambie como resultado de cualquiera de esos eventos:
fuente
body
como en este ejemplo, puedes mirar un elemento directamente. Eso es en realidad más eficiente y eficiente que mirar todo el cuerpo.ResizeSensor.js es parte de una gran biblioteca, pero reduje su funcionalidad a ESTO :
Cómo usarlo:
fuente
parseInt( getComputedStyle(element) )
¡NO recomiendo
setTimeout()
hackear ya que ralentiza el rendimiento! En su lugar, puede usar observadores de mutación DOM para escuchar el cambio de tamaño Div.JS:
HTML:
Aquí está el violín
Intenta cambiar el tamaño del div.
Puede ajustar aún más su método en el
debounce
método para mejorar la eficiencia.debounce
activará su método cada x milisegundos en lugar de activar cada milisegundo que se cambia el tamaño del DIV.fuente
La mejor solución sería utilizar las llamadas consultas de elementos . Sin embargo, no son estándar, no existe una especificación, y la única opción es utilizar uno de los polyfills / bibliotecas disponibles, si desea seguir este camino.
La idea detrás de las consultas de elementos es permitir que un determinado contenedor de la página responda al espacio que se le proporciona. Esto permitirá escribir un componente una vez y luego soltarlo en cualquier lugar de la página, mientras ajusta su contenido a su tamaño actual. No importa el tamaño de la ventana. Esta es la primera diferencia que vemos entre las consultas de elementos y las consultas de medios. Todos esperan que en algún momento se cree una especificación que estandarice las consultas de elementos (o algo que logre el mismo objetivo) y las haga nativas, limpias, simples y robustas. La mayoría de la gente está de acuerdo en que las consultas de medios son bastante limitadas y no ayudan para el diseño modular y la verdadera capacidad de respuesta.
Hay algunos polyfills / bibliotecas que resuelven el problema de diferentes maneras (sin embargo, podrían llamarse soluciones alternativas en lugar de soluciones):
He visto otras soluciones a problemas similares propuestos. Por lo general, usan temporizadores o el tamaño de ventana / ventana debajo del capó, lo que no es una solución real. Además, creo que idealmente esto debería resolverse principalmente en CSS, y no en javascript o html.
fuente
Encontré que esta biblioteca funcionaba cuando la solución de MarcJ no lo hizo:
https://github.com/sdecima/javascript-detect-element-resize
Es muy ligero y detecta incluso los cambios de tamaño naturales a través de CSS o simplemente la carga / representación HTML.
Ejemplo de código (tomado del enlace):
fuente
Echa un vistazo a este http://benalman.com/code/projects/jquery-resize/examples/resize/
Tiene varios ejemplos. Intente cambiar el tamaño de su ventana y vea cómo se ajustan los elementos dentro de los elementos del contenedor.
Ejemplo con js fiddle para explicar cómo hacer que funcione.
Echa un vistazo a este violín http://jsfiddle.net/sgsqJ/4/
En ese evento resize () está vinculado a elementos que tienen la clase "test" y también al objeto de ventana y en el cambio de tamaño de devolución de llamada del objeto de ventana $ ('. Test'). Se llama a resize ().
p.ej
fuente
Puede usar
iframe
oobject
usarcontentWindow
ocontentDocument
cambiar el tamaño. SinsetInterval
osetTimeout
Los pasos:
relative
IFRAME.contentWindow
-onresize
eventoUn ejemplo de HTML:
El Javascript:
Ejecutando ejemplo
JsFiddle: https://jsfiddle.net/qq8p470d/
Ver más:
element-resize-event
fuente
IFRAME.contentWindow
no está disponible hasta que elonload
evento se active en el iframe. Además, es posible que desee agregar el estilovisibility:hidden;
, ya que el iframe puede bloquear la entrada del mouse a los elementos detrás de él (parece estar "flotando" en IE al menos).display
propiedad del elemento.Solo el objeto de ventana genera un evento de "cambio de tamaño". La única forma en que sé hacer lo que quieres hacer es ejecutar un temporizador de intervalos que verifique periódicamente el tamaño.
fuente
fuente
Sorprendentemente tan antiguo como es este problema, sigue siendo un problema en la mayoría de los navegadores.
Como otros han dicho, Chrome 64+ ahora viene con Resize Observes de forma nativa, sin embargo, la especificación aún se está ajustando y Chrome está actualmente (a partir del 2019-01-29) detrás de la última edición de la especificación .
He visto un par de buenos rellenos ResizeObserver en la naturaleza, sin embargo, algunos no siguen la especificación de cerca y otros tienen algunos problemas de cálculo.
Necesitaba desesperadamente este comportamiento para crear algunos componentes web receptivos que pudieran usarse en cualquier aplicación. Para que funcionen bien, necesitan conocer sus dimensiones en todo momento, por lo que ResizeObservers sonaba ideal y decidí crear un polyfill que siguiera la especificación lo más cerca posible.
Repo: https://github.com/juggle/resize-observer
Demostración: https://codesandbox.io/s/myqzvpmmy9
fuente
Usando Clay.js ( https://github.com/zzarcon/clay ) es bastante simple detectar cambios en el tamaño del elemento:
fuente
Esta publicación de blog me ayudó a detectar de manera eficiente los cambios de tamaño en los elementos DOM.
http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/
Cómo usar este código ...
Código empaquetado utilizado por el ejemplo ...
Nota: AppConfig es un espacio de nombres / objeto que uso para organizar funciones reutilizables. Siéntase libre de buscar y reemplazar el nombre con cualquier cosa que desee.
fuente
Mi complemento jQuery habilita el evento "redimensionar" en todos los elementos, no solo en el
window
.https://github.com/dustinpoissant/ResizeTriggering
fuente
Puede probar el código en el siguiente fragmento, que cubre sus necesidades utilizando JavaScript simple. ( ejecute el fragmento de código y haga clic en el enlace de la página completa para activar la alerta de que el div cambia de tamaño si desea probarlo ).
Puedes comprobar el violín también
ACTUALIZAR
Fiddle actualizado
fuente
Esta es más o menos una copia exacta de la respuesta principal, pero en lugar de un enlace, lo que importa es solo la parte del código, traducida para que sea IMO más legible y más fácil de entender. Algunos otros pequeños cambios incluyen el uso de cloneNode () y no poner html en una cadena js. Cosas pequeñas, pero puedes copiar y pegar esto como está y funcionará.
La forma en que funciona es haciendo que dos divisiones invisibles llenen el elemento que está viendo, y luego poniendo un gatillo en cada uno, y estableciendo una posición de desplazamiento que conducirá a activar un cambio de desplazamiento si cambia el tamaño.
Todo el crédito real va a Marc J, pero si solo está buscando el código relevante, aquí está:
fuente
Solución Javascript pura, pero solo funciona si el elemento se redimensiona con el botón de cambio de tamaño CSS :
offsetWidth
y losoffsetHeight
valores almacenados, y si es diferente, haga lo que quiera y actualice estos valores.fuente
Aquí hay una versión simplificada de la solución de @nkron, aplicable a un solo elemento (en lugar de una matriz de elementos en la respuesta de @ nkron, complejidad que no necesitaba).
El oyente y el observador del evento pueden eliminarse mediante:
fuente
fuente
usando la respuesta de Bharat Patil, simplemente devuelva falso dentro de la devolución de llamada de su enlace para evitar el error de pila máxima, vea el siguiente ejemplo:
fuente
Esta es una pregunta muy antigua, pero pensé que publicaría mi solución a esto.
Traté de usarlo
ResizeSensor
ya que todo el mundo parecía estar bastante enamorado de él. Sin embargo, después de implementar, me di cuenta de que, bajo el capó, la consulta de elementos requiere que el elemento en cuestión tenga una posiciónrelative
o se leabsolute
aplique, lo que no funcionó para mi situación.Terminé manejando esto con un Rxjs en
interval
lugar de una implementación anterior directasetTimeout
orequestAnimationFrame
similar.Lo bueno del sabor observable de un intervalo es que puedes modificar la transmisión, sin embargo, cualquier otro observable puede ser manejado. Para mí, una implementación básica era suficiente, pero podría volverse loco y hacer todo tipo de fusiones, etc.
En el siguiente ejemplo, estoy rastreando los cambios de ancho del div (verde) interno. Tiene un ancho establecido en 50%, pero un ancho máximo de 200 px. Al arrastrar el control deslizante, se afecta el ancho del contenedor (gris) div. Puedes ver que lo observable solo se dispara cuando cambia el ancho del div interno, lo que solo sucede si el ancho del div externo es menor que 400px.
fuente
Solo
Window.onResize
existe en la especificación, pero siempre puede utilizarloIFrame
para generar un nuevoWindow
objeto dentro de su DIV.Por favor revisa esta respuesta . Hay un nuevo pequeño complemento jquery , que es portátil y fácil de usar. Siempre puede verificar el código fuente para ver cómo se hace.
fuente
pensé que no se podía hacer, pero luego lo pensé, puedes cambiar el tamaño manualmente de un div a través de style = "resize: both;" para hacer eso, debe hacer clic en él, por lo que agregó una función onclick para verificar la altura y el ancho del elemento y funcionó. Con solo 5 líneas de javascript puro (seguro que podría ser aún más corto) http://codepen.io/anon/pen/eNyyVN
fuente