J'ai l'exemple html suivant, il y a un DIV qui a 100% de largeur. Il contient quelques éléments. Lors du redimensionnement des fenêtres, les éléments intérieurs peuvent être repositionnés et la dimension du div peut changer. Je demande s'il est possible d'accrocher l'événement de changement de dimension de la div? et comment faire ça? Je lie actuellement la fonction de rappel à l'événement jQuery resize sur le DIV cible, cependant, aucun journal de console n'est sorti, voir ci-dessous:
<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
la source
la source
setInterval
ici comme solution possible. Vous pouvez toujours vous lierclearInterval
à un clic de bouton pour arrêter la boucle une fois votre travail terminé.Réponses:
Il existe une méthode très efficace pour déterminer si la taille d'un élément a été modifiée.
http://marcj.github.io/css-element-queries/
Cette bibliothèque possède une classe
ResizeSensor
qui peut être utilisée pour la détection de redimensionnement.Il utilise une approche basée sur les événements, il est donc extrêmement rapide et ne perd pas de temps CPU.
Exemple:
Veuillez ne pas utiliser le plugin jQuery onresize car il utilise
setTimeout()
en combinaison avec la lecture du DOMclientHeight
/clientWidth
propriétés dans une boucle pour vérifier les changements.C'est incroyablement lent et inexact, car cela provoque un thrash de mise en page .
Divulgation: je suis directement associé à cette bibliothèque.
la source
requestAnimationFrame
vssetTimeout
n'est pas pertinent, cette bibliothèque ne fait pas de boucle .requestAnimationFrame
n'est utilisé que pour anti-rebond / limitation de la fréquence d'appels de vos rappels, il n'interroge pas . Contrairement à cela, MutationObserver pourrait théoriquement être utilisé avec un effet similaire, mais pas dans les navigateurs plus anciens. C'est extrêmement intelligent.Une nouvelle norme pour cela est l'API Resize Observer, disponible dans Chrome 64.
Redimensionner l'observateur
Spec: https://wicg.github.io/ResizeObserver
Polyfills: https://github.com/WICG/ResizeObserver/issues/3
Problème avec Firefox: https://bugzil.la/1272409
Problème de Safari: http://wkb.ug/157743
Assistance actuelle: http://caniuse.com/#feat=resizeobserver
la source
Vous devez lier l'
resize
événement à l'window
objet, pas à un élément html générique.Vous pouvez ensuite utiliser ceci:
et dans la fonction de rappel, vous pouvez vérifier la nouvelle largeur de votre
div
appelDonc, la réponse à votre question est non , vous ne pouvez pas lier l'
resize
événement à un div.la source
À long terme, vous pourrez utiliser ResizeObserver .
Malheureusement, il n'est actuellement pas pris en charge par défaut dans de nombreux navigateurs.
En attendant, vous pouvez utiliser des fonctions comme les suivantes. Depuis, la majorité des changements de taille des éléments proviendront du redimensionnement de la fenêtre ou de la modification de quelque chose dans le DOM. Vous pouvez écouter la fenêtre de redimensionnement de la fenêtre avec Redimensionner l'événement et vous pouvez écouter les changements DOM en utilisant MutationObserver .
Voici un exemple de fonction qui vous rappellera lorsque la taille de l'élément fourni change à la suite de l'un de ces événements:
la source
body
comme dans cet exemple, vous pouvez regarder un élément directement. C'est en fait plus performant et efficace que de regarder tout le corps.ResizeSensor.js fait partie d'une immense bibliothèque, mais j'ai réduit sa fonctionnalité à CECI :
Comment l'utiliser:
la source
parseInt( getComputedStyle(element) )
Je ne recommande pas de
setTimeout()
pirater car cela ralentit les performances! Au lieu de cela, vous pouvez utiliser des observateurs de mutation DOM pour écouter le changement de taille Div.JS:
HTML:
Voici le violon
Essayez de changer la taille de div.
Vous pouvez envelopper davantage votre méthode dans la
debounce
méthode pour améliorer l'efficacité.debounce
déclenchera votre méthode toutes les x millisecondes au lieu de déclencher toutes les millisecondes le DIV est redimensionné.la source
La meilleure solution serait d'utiliser ce que l'on appelle les requêtes d'éléments . Cependant, ils ne sont pas standard, aucune spécification n'existe - et la seule option est d'utiliser l'une des polyfills / bibliothèques disponibles, si vous voulez procéder de cette façon.
L'idée derrière les requêtes d'éléments est de permettre à un certain conteneur sur la page de répondre à l'espace qui lui est fourni. Cela permettra d'écrire un composant une fois puis de le déposer n'importe où sur la page, tout en ajustant son contenu à sa taille actuelle. Quelle que soit la taille de la fenêtre. C'est la première différence que nous voyons entre les requêtes d'élément et les requêtes de média. Tout le monde espère qu'à un moment donné, une spécification sera créée qui normalisera les requêtes d'éléments (ou quelque chose qui atteint le même objectif) et les rendra natives, propres, simples et robustes. La plupart des gens conviennent que les requêtes médias sont assez limitées et n'aident pas à la conception modulaire et à la vraie réactivité.
Il existe quelques polyfills / bibliothèques qui résolvent le problème de différentes manières (pourraient être appelées solutions de contournement au lieu de solutions):
J'ai vu d'autres solutions à des problèmes similaires proposées. Habituellement, ils utilisent des minuteries ou la taille de la fenêtre / fenêtre sous le capot, ce qui n'est pas une vraie solution. De plus, je pense que, idéalement, cela devrait être résolu principalement en CSS, et non en javascript ou en html.
la source
J'ai trouvé que cette bibliothèque fonctionnait lorsque la solution de MarcJ n'a pas:
https://github.com/sdecima/javascript-detect-element-resize
Il est très léger et détecte même les redimensionnements naturels via CSS ou simplement le chargement / rendu HTML.
Échantillon de code (extrait du lien):
la source
Jetez un œil à ce http://benalman.com/code/projects/jquery-resize/examples/resize/
Il a plusieurs exemples. Essayez de redimensionner votre fenêtre et voyez comment les éléments à l'intérieur des éléments du conteneur ont été ajustés.
Exemple avec js violon pour expliquer comment le faire fonctionner.
Jetez un œil à ce violon http://jsfiddle.net/sgsqJ/4/
Dans cet événement resize () est lié à un élément ayant la classe "test" et aussi à l'objet window et dans le rappel de redimensionnement de l'objet window $ ('. Test'). Resize () est appelé.
par exemple
la source
Vous pouvez utiliser
iframe
ouobject
utilisercontentWindow
oucontentDocument
sur redimensionner. SanssetInterval
ousetTimeout
Les marches:
relative
IFRAME.contentWindow
-onresize
événementUn exemple de HTML:
Le Javascript:
Exemple d'exécution
JsFiddle: https://jsfiddle.net/qq8p470d/
Voir plus:
element-resize-event
la source
IFRAME.contentWindow
n'est pas disponible jusqu'à ce que l'onload
événement se déclenche sur l'iframe. En outre, vous voudrez peut-être ajouter le stylevisibility:hidden;
, car l'iframe peut bloquer l'entrée de la souris sur les éléments derrière lui (semble au moins "flottant" dans IE).display
propriété de l'élément.Seul l'objet fenêtre génère un événement "redimensionner". La seule façon que je sache de faire ce que vous voulez faire est d'exécuter une minuterie d'intervalle qui vérifie périodiquement la taille.
la source
la source
Aussi vieux que soit ce problème, c'est toujours un problème dans la plupart des navigateurs.
Comme d'autres l'ont dit, Chrome 64+ est désormais livré avec Resize Observes en mode natif, cependant, la spécification est toujours affinée et Chrome est actuellement (à partir du 2019-01-29) derrière la dernière édition de la spécification .
J'ai vu quelques bons polyfills ResizeObserver dans la nature, cependant, certains ne suivent pas la spécification de près et d'autres ont des problèmes de calcul.
J'avais désespérément besoin de ce comportement pour créer des composants Web réactifs pouvant être utilisés dans n'importe quelle application. Pour les faire fonctionner correctement, ils ont besoin de connaître leurs dimensions à tout moment, donc ResizeObservers semblait idéal et j'ai décidé de créer un polyfill qui suivait la spécification aussi près que possible.
Repo: https://github.com/juggle/resize-observer
Démo: https://codesandbox.io/s/myqzvpmmy9
la source
En utilisant Clay.js ( https://github.com/zzarcon/clay ), il est assez simple de détecter les changements de taille d'élément:
la source
Ce billet de blog m'a aidé à détecter efficacement les changements de taille des éléments DOM.
http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/
Comment utiliser ce code ...
Code packagé utilisé par l'exemple ...
Remarque: AppConfig est un espace de nom / objet que j'utilise pour organiser des fonctions réutilisables. N'hésitez pas à rechercher et à remplacer le nom par tout ce que vous souhaitez.
la source
Mon plugin jQuery active l'événement "resize" sur tous les éléments et pas seulement
window
.https://github.com/dustinpoissant/ResizeTriggering
la source
Vous pouvez essayer le code dans l'extrait de code suivant, il couvre vos besoins en utilisant du javascript simple. ( exécutez l'extrait de code et cliquez sur le lien de la page complète pour déclencher l'alerte que le div est redimensionné si vous souhaitez le tester. ).
Vous pouvez vérifier le violon aussi
MISE À JOUR
Fiddle mis à jour
la source
C'est à peu près une copie exacte de la première réponse, mais au lieu d'un lien, c'est juste la partie du code qui compte, traduite pour être IMO plus lisible et plus facile à comprendre. Quelques autres petites modifications incluent l'utilisation de cloneNode () et la non mise en html dans une chaîne js. Petit truc, mais vous pouvez copier et coller cela tel quel et cela fonctionnera.
La façon dont cela fonctionne est de faire en sorte que deux divs invisibles remplissent l'élément que vous regardez, puis de mettre un déclencheur dans chacun, et de définir une position de défilement qui entraînera le déclenchement d'un changement de défilement si la taille change.
Tout le mérite revient à Marc J, mais si vous cherchez juste le code pertinent, le voici:
la source
Solution Javascript pure, mais ne fonctionne que si l'élément est redimensionné avec le bouton de redimensionnement css :
offsetWidth
etoffsetHeight
les valeurs stockées, et si elles sont différentes, faites ce que vous voulez et mettez à jour ces valeurs.la source
Voici une version simplifiée de la solution de @nkron, applicable à un seul élément (au lieu d'un tableau d'éléments dans la réponse de @ nkron, complexité dont je n'avais pas besoin).
L'auditeur et l'observateur d'événements peuvent être supprimés par:
la source
la source
en utilisant la réponse Bharat Patil, renvoyez simplement false à l'intérieur de votre rappel de liaison pour éviter une erreur de pile maximale, voir l'exemple ci-dessous:
la source
C'est une très vieille question, mais j'ai pensé que je publierais ma solution à cela.
J'ai essayé d'utiliser
ResizeSensor
car tout le monde semblait avoir un gros coup de cœur. Après la mise en œuvre, j'ai réalisé que sous le capot, la requête d'élément nécessite que l'élément en question ait une positionrelative
ouabsolute
appliqué, ce qui n'a pas fonctionné pour ma situation.J'ai fini par gérer cela avec un Rxjs
interval
au lieu d'une implémentation droitesetTimeout
ourequestAnimationFrame
similaire.Ce qui est bien avec la saveur observable d'un intervalle, c'est que vous pouvez modifier le flux, mais tout autre observable peut être géré. Pour moi, une implémentation de base était suffisante, mais vous pourriez devenir fou et faire toutes sortes de fusions, etc.
Dans l'exemple ci-dessous, je suis le suivi des changements de largeur de la div intérieure (verte). Il a une largeur définie à 50%, mais une largeur maximale de 200 pixels. Faire glisser le curseur affecte la largeur du div wrapper (gris). Vous pouvez voir que l'observable ne se déclenche que lorsque la largeur de la div intérieure change, ce qui ne se produit que si la largeur de la div extérieure est inférieure à 400 pixels.
la source
Window.onResize
Existe uniquement dans la spécification, mais vous pouvez toujours l'utiliserIFrame
pour générer un nouvelWindow
objet à l'intérieur de votre DIV.Veuillez vérifier cette réponse . Il existe un nouveau petit plugin jquery , portable et facile à utiliser. Vous pouvez toujours vérifier le code source pour voir comment cela se fait.
la source
je pensais que cela ne pouvait pas être fait mais ensuite j'y ai pensé, vous pouvez redimensionner manuellement un div via style = "resize: both;" pour ce faire, vous pouvez cliquer dessus, donc vous avez ajouté une fonction onclick pour vérifier la hauteur et la largeur de l'élément et cela a fonctionné. Avec seulement 5 lignes de javascript pur (bien sûr, il pourrait être encore plus court) http://codepen.io/anon/pen/eNyyVN
la source