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 );
});
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 );
});
Enregistrer la hauteur actuelle :
var curHeight = $('#first').height();
Passer temporairement la hauteur en auto :
$('#first').css('height', 'auto');
Obtenir la hauteur auto :
var autoHeight = $('#first').height();
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);
@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.
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'); });
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.
À 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');
});
Incroyable! Selon developer.mozilla.org/en-US/docs/Web/API/Element.scrollHeight 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.clientHeight
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.
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
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);
Ce one-liner n'est pas facile à comprendre, écrire sur plusieurs lignes pourrait aider les autres un peu mieux.
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'); }
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.
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
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.
Vous pourriez aussi utiliser $(this).toggleClass('max', 250); au lieu d'utiliser l'instruction if
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.
14 votes
Vous devriez marquer la meilleure réponse comme acceptée.
0 votes
Possible duplicate de Comment puis-je animer un élément jusqu'à sa hauteur naturelle en utilisant jQuery
0 votes
@IanMackinnon cette question a certainement de meilleures réponses. J'ai fermé cette question comme un doublon de celle-ci.