Esta pregunta se está haciendo un poco vieja, pero así es como lo resolví usando jQuery básico, en caso de que alguien más necesite una solución simple.
En mi caso, tengo una lista de entradas de blog que primero se procesan en la página con un max-height
que solo muestra las primeras 4 líneas de texto, el resto es overflow: hidden
. Tengo un botón para expandir/colapsar que alterna el artículo de su forma contraída a expandido (completamente visualizado) y viceversa.
Al principio intenté animar la propiedad de altura máxima directamente y, como has descubierto anteriormente, esto no funcionará. También probé esto con transiciones CSS con el mismo resultado decepcionante.
También intenté configurarlo en un número muy grande como '1000em', pero esto hizo que las animaciones se vieran tontas ya que literalmente se estaba interpolando a un valor tan grande (como era de esperar).
Mi solución utiliza scrollHeight, que se utiliza para determinar la altura natural de cada historia una vez que se carga la página de la siguiente manera:
$(function(){ // DOM LOADED
// For each story, determine its natural height and store it as data.
// This is encapsulated into a self-executing function to isolate the
// variables from other things in my script.
(function(){
// First I grab the collapsed height that was set in the css for later use
var collapsedHeight = $('article .story').css('maxHeight');
// Now for each story, grab the scrollHeight property and store it as data 'natural'
$('article .story').each(function(){
var $this = $(this);
$this.data('natural', $this[0].scrollHeight);
});
// Now, set-up the handler for the toggle buttons
$('.expand').bind('click', function(){
var $story = $(this).parent().siblings('.story').eq(0),
duration = 250; // animation duration
// I use a class 'expanded' as a flag to know what state it is in,
// and to make style changes, as required.
if ($story.hasClass('expanded')) {
// If it is already expanded, then collapse it using the css figure as
// collected above and remove the expanded class
$story.animate({'maxHeight': collapsedHeight}, duration);
$story.removeClass('expanded');
}
else {
// If it is not expanded now, then animate the max-height to the natural
// height as stored in data, then add the 'expanded' class
$story.animate({'maxHeight': $story.data('natural')}, duration);
$story.addClass('expanded');
}
});
})(); // end anonymous, self-executing function
});
a hacer lo mismo con las imágenes, sólo les envuelva en una combinación externa div, que es en lo que configurará max-height
y overflow:hidden
, tal como utilicé div.story anteriormente.
Alguien ha preguntado y ha resuelto este mismo problema http://stackoverflow.com/questions/4901643/animate-max-width-on-img-jquery – Craig