181 votes

Animer l'élément à la hauteur automatique avec jQuery

Je veux animer un

de 200px à une hauteur auto. Mais je n'arrive pas à le faire fonctionner. Est-ce que quelqu'un sait comment faire ?

Voici le code :

$("div:first").click(function(){
  $("#first").animate({
    height: "auto"
  }, 1000 );
});

14 votes

Vous devriez marquer la meilleure réponse comme acceptée.

0 votes

0 votes

@IanMackinnon cette question a certainement de meilleures réponses. J'ai fermé cette question comme un doublon de celle-ci.

268voto

Box9 Points 41987
  1. Enregistrer la hauteur actuelle :

    var curHeight = $('#first').height();
  2. Passer temporairement la hauteur en auto :

    $('#first').css('height', 'auto');
  3. Obtenir la hauteur auto :

    var autoHeight = $('#first').height();
  4. Repasser à la hauteur curHeight et animer jusqu'à autoHeight :

    $('#first').height(curHeight).animate({height: autoHeight}, 1000);

Et ensemble :

var el = $('#first'),
    curHeight = el.height(),
    autoHeight = el.css('height', 'auto').height();
el.height(curHeight).animate({height: autoHeight}, 1000);

0 votes

@Daniel, où est votre code JS? Postez cette partie, ainsi que des parties du HTML qui montrent les éléments auxquels vous faites référence.

21 votes

Cela fonctionne, mais j'ai ajouté un rappel qui restaure le comportement de l'augmentation automatique à l'élément .animated({height: autoHeight}, 1000, function(){ el.height('auto'); });

0 votes

Faites attention à définir des hauteurs fixes sur les conceptions réactives. Cela devient un désordre si l'utilisateur redimensionne l'écran. Il est préférable de définir la hauteur sur 'auto' une fois que l'animation est terminée.

205voto

Liquinaut Points 203

À mon avis, c'est la solution la plus propre et la plus simple :

$("#first").animate({height: $("#first").get(0).scrollHeight}, 1000 );

Explication : Le DOM sait déjà quelle taille aura la div agrandie lorsque sa hauteur est définie sur auto. Cette propriété est stockée dans le nœud du DOM en tant que scrollHeight. Il suffit de récupérer l'élément DOM de l'élément jQuery en appelant get(0) et ensuite nous pouvons accéder à la propriété.

Ajouter une fonction de rappel pour définir la hauteur sur auto permet une plus grande réactivité une fois l'animation terminée (crédit chris-williams) :

$('#first').animate({
    height: $('#first').get(0).scrollHeight
}, 1000, function(){
    $(this).height('auto');
});

2 votes

Incroyable! Selon developer.mozilla.org/en-US/docs/Web/API/Element.scrollHeigh‌​t c'est même supporté dans IE8, contrairement à clientHeight, qui semble ne pas être pris en charge: developer.mozilla.org/en-US/docs/Web/API/Element.clientHeigh‌​t

0 votes

Cela ne semble pas prendre en compte les marges

1 votes

La marge est, par définition du modèle de la boîte, pas partie de la hauteur d'un objet. Vous pourriez toujours ajouter la marge vous-même, cependant.

24voto

w0ps Points 231

Il s'agit essentiellement de la même approche que la réponse de Box9 mais je l'ai enveloppée dans un plugin jquery agréable qui prend les mêmes arguments qu'une animation régulière, pour quand vous avez besoin d'avoir plus de paramètres animés et que vous en avez marre de répéter le même code encore et encore :

;(function($)
{
  $.fn.animateToAutoHeight = function(){
  var curHeight = this.css('height'),
      height = this.css('height','auto').height(),
      duration = 200,
      easing = 'swing',
      callback = $.noop,
      parameters = { height: height };
  this.css('height', curHeight);
  for (var i in arguments) {
    switch (typeof arguments[i]) {
      case 'object':
        parameters = arguments[i];
        parameters.height = height;
        break;
      case 'string':
        if (arguments[i] == 'slow' || arguments[i] == 'fast') duration = arguments[i];
        else easing = arguments[i];
        break;
      case 'number': duration = arguments[i]; break;
      case 'function': callback = arguments[i]; break;
    }
  }
  this.animate(parameters, duration, easing, function() {
    $(this).css('height', 'auto');
    callback.call(this, arguments);
  });
  return this;
  }
})(jQuery);

edit: maintenant en chaîne et plus propre

23voto

Tim Hettler Points 631

Une meilleure solution ne devrait pas dépendre de JS pour définir la hauteur de votre élément. Voici une solution qui anime un élément de hauteur fixe pour le mettre à la hauteur complète ("auto") :

var $selector = $('div');
$selector
    .data('oHeight',$selector.height())
    .css('height','auto')
    .data('nHeight',$selector.height())
    .height($selector.data('oHeight'))
    .animate({height: $selector.data('nHeight')},400);

https://gist.github.com/2023150

2 votes

Ce one-liner n'est pas facile à comprendre, écrire sur plusieurs lignes pourrait aider les autres un peu mieux.

0 votes

Voici la meilleure solution car la hauteur automatique peut changer si l'utilisateur ajuste la taille de la fenêtre. Voir ce qui suit : //anime la hauteur des filtres function toggleSlider(){ if ($('#filters').height() != 0) { $('#filters').animate({height:'0'}); } else{ var $selector = $('#filters'); $selector .data('oHeight',$selector.height()) .css('height','auto') .data('nHeight',$selector.height()) .height($selector.data('oHeight')) .animate({height: $selector.data('nHeight')},400); }; console.log('agg'); }

0 votes

Fonctionne pour ouvrir la div, mais n'anime pas au-dessus de 400ms. Peut-être que j'ai quelque chose d'autre défini différemment, mais cela s'ouvre juste en un clin d'œil.

12voto

czLukasss Points 179

Ceci fonctionne et c'est plus simple que les solutions précédentes :

CSS:

#container{
  height:143px;  
}

.max{
  height: auto;
  min-height: 143px;
}

JS:

$(document).ready(function() {
    $("#container").click(function() {      
        if($(this).hasClass("max")) {
            $(this).removeClass("max");
        } else {
            $(this).addClass("max");
        }

    })
});

Note: Cette solution nécessite jQuery UI

1 votes

Il convient de mentionner que cela nécessite le plugin Jquery UI, alors que la question initiale portait sur jQuery seul. Mais si vous utilisez Jquery UI, cela fonctionne.

4 votes

Vous pourriez aussi utiliser $(this).toggleClass('max', 250); au lieu d'utiliser l'instruction if

1 votes

Pourquoi incluez-vous une deuxième valeur avec .addClass et .removeClass ?

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