510 votes

Comment détecter le changement de dimension d'un DIV ?

J'ai l'exemple html suivant, il y a un DIV qui a une largeur de 100%. Il contient quelques éléments. Lors du redimensionnement de la fenêtre, les éléments internes peuvent être repositionnés, et la dimension de la division peut changer. Je me demande s'il est possible d'accrocher l'événement de changement de dimension de la division et comment le faire. Je lie actuellement la fonction de rappel à l'événement de redimensionnement de jQuery sur la division cible, mais aucun journal de console n'est affiché, voir ci-dessous :

Before Resizeenter image description here

<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>

11 votes

Cela ne fonctionnera pas car vous liez l'événement de redimensionnement à l'élément div spécifié. Mais l'événement de redimensionnement sera déclenché pour la fenêtre et non pour votre élément.

0 votes

Vous pourriez utiliser setInterval ici comme une solution possible. Vous pouvez toujours lier clearInterval à un clic de bouton pour arrêter la boucle une fois que votre travail est terminé.

10 votes

Depuis 2020, ResizeObserver fonctionne dans tous les principaux navigateurs (Chrome, Safari, Firefox, Edge) sauf IE. caniuse.com/#feat=resizeobserver

296voto

MArc Points 948

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é pour la détection du redimensionnement.
Il utilise une approche basée sur les événements, ce qui lui permet d'être très rapide et de ne pas gaspiller le temps du processeur.

Exemple :

new ResizeSensor(jQuery('#divId'), function(){ 
    console.log('content dimension changed');
});

Veuillez ne pas utiliser le Plugin jQuery onresize car il utilise setTimeout() en combinaison avec la lecture du DOM clientHeight / clientWidth dans une boucle pour vérifier les changements.
C'est incroyablement lent et imprécis puisqu'il provoque mise en page .

Divulgation : Je suis directement associé à cette bibliothèque.

1 votes

Allez-vous ajouter la prise en charge d'IE11 pour votre bibliothèque ResizeSensor.js ?

1 votes

@jake, je n'ai pas encore trouvé de solution basée sur les événements pour IE11. Vous pouvez voir plus d'informations ici github.com/marcj/css-element-queries/issues/7

8 votes

@jake, le support d'IE11 est maintenant implémenté.

30voto

Vous devez lier le resize sur l'événement window et non sur un élément html générique.

Vous pourriez alors utiliser ceci :

$(window).resize(function() {
    ...
});

et dans la fonction de rappel, vous pouvez vérifier la nouvelle largeur de votre div en appelant

$('.a-selector').width();

Donc, la réponse à votre question est pas de vous ne pouvez pas lier le resize à un div.

155 votes

Cette réponse n'est pas suffisante. des changements de taille peuvent se produire sans qu'il y ait un quelconque redimensionnement de la fenêtre. du tout.

9 votes

Par exemple, lorsque vous avez un élément de séparation ou que vous ajoutez simplement du texte ou un autre contenu à un élément.

0 votes

@anu pas vrai, vous pouvez avoir une modification du DOM via javascript qui fait que le CSS s'applique à la nouvelle structure résultant en une mise en page différente - taille de chaque conteneur.

11voto

Bharat Patil Points 622

Jetez un coup d'œil à ceci http://benalman.com/code/projects/jquery-resize/examples/resize/

Il contient plusieurs exemples. Essayez de redimensionner votre fenêtre et voyez comment les éléments à l'intérieur des éléments conteneurs s'ajustent.

Exemple avec js fiddle pour expliquer comment le faire fonctionner.
Jetez un coup d'œ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 fenêtre et dans le callback de redimensionnement de l'objet fenêtre, $('.test').resize() est appelé.

par exemple

$('#test_div').bind('resize', function(){
            console.log('resized');
});

$(window).resize(function(){
   $('#test_div').resize();
});

0 votes

Intéressant. Ce jsfiddle fait systématiquement planter Chrome lorsque l'inspecteur est ouvert et que je clique sur le lien "Ajouter plus de texte". Firefox envoie des erreurs "too much recursion".

3 votes

N'utilisez pas le plugin de redimensionnement de jQuery. Il est très lent et n'est pas précis non plus. Consultez ma réponse pour obtenir une meilleure solution.

24 votes

Cela ne détecte PAS directement les changements de dimension. C'est juste un sous-produit d'un écouteur d'événement de redimensionnement. Un changement de dimension peut se produire de nombreuses autres façons.

9voto

Pointy Points 172438

Seul l'objet fenêtre génère un événement "resize". La seule façon que je connaisse pour faire ce que vous voulez faire est d'exécuter un minuteur d'intervalle qui vérifie périodiquement la taille.

-1voto

rbtbar Points 1

Seulement Window.onResize existe dans la spécification, mais vous pouvez toujours utiliser l'option IFrame pour générer de nouveaux Window dans votre DIV.

Veuillez vérifier ceci réponse . Il y a un nouveau petit plugin jquery qui est portable et facile à utiliser. Vous pouvez toujours consulter le code source pour voir comment c'est fait.

<!-- (1) include plugin script in a page -->
<script src="/src/jquery-element-onresize.js"></script>

// (2) use the detectResizing plugin to monitor changes to the element's size:
$monitoredElement.detectResizing({ onResize: monitoredElement_onResize });

// (3) write a function to react on changes:
function monitoredElement_onResize() {    
    // logic here...
}

0 votes

Cette solution est très inefficace si vous avez des divs redimensionnables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X