Animación de altura máxima con transiciones CSS


Quiero crear una animación expand/collapse que solo funcione con classnames (javascript se usa para alternar los classnames).

Estoy dando una clase max-height: 4em; overflow: hidden;

Y el otro max-height: 255em; (también probé el valor none, que no animar a todos)

Esto para animar: transition: max-height 0.50s ease-in-out;

Usé transiciones CSS para cambiar entre ellas, pero el navegador parece estar animando todas esas em adicionales, por lo que crea un retraso en el efecto de colapso.

Hay una manera de hacerlo (en el mismo espíritu-con css classnames) que no tiene ese efecto secundario (puedo poner un menor número de píxeles, pero que obviamente tiene inconvenientes, ya que podría cortar el texto legítimo - esa es la razón del gran valor, por lo que no corta el texto largo legítimo, solo ridículamente largos)

Ver el jsFiddle - http://jsfiddle.net/wCzHV/1 / (haga clic en el contenedor de texto)

Author: Madd0g, 2013-04-16

4 answers

Solución de retardo fija:

Ponga cubic-bezier(0, 1, 0, 1) función de transición para el elemento.

.text {
  overflow: hidden;
  max-height: 0;
  transition: max-height 0.5s cubic-bezier(0, 1, 0, 1);
  &.full {
    max-height: 1000px;
    transition: max-height 1s ease-in-out;
}
 36
Author: egor.xyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-23 14:17:25

Esta es una vieja pregunta, pero acabo de encontrar una manera de hacerlo y quería pegarlo en algún lugar para saber dónde encontrarlo si lo necesito de nuevo: o)

Así que necesitaba un acordeón con divs "sectionHeading" clicables que revelaran/ocultaran divs "sectionContent" correspondientes. Los divs de contenido de sección tienen alturas variables, lo que crea un problema ya que no puede animar la altura al 100%. He visto otras respuestas que sugieren animar la altura máxima en su lugar, pero esto significa que a veces se producen retrasos cuando la altura máxima que utiliza es mayor que la altura real.

La idea es usar jQuery on load para buscar y establecer explícitamente las alturas de los divs "sectionContent". Luego agregue una clase css 'noHeight' a cada manejador de clics para alternarlo:

$(document).ready(function() {
    $('.sectionContent').each(function() {
        var h = $(this).height();
        $(this).height(h).addClass('noHeight');
    });
    $('.sectionHeader').click(function() {
        $(this).next('.sectionContent').toggleClass('noHeight');
    });
});

Para completar, las clases CSS relevantes:

.sectionContent {
    overflow: hidden;
    -webkit-transition: all 0.3s ease-in;
    -moz-transition: all 0.3s ease-in;
    -o-transition: all 0.3s ease-in;
    transition: all 0.3s ease-in;
}
.noHeight {
        height: 0px !important;
}

Ahora las transiciones de altura funcionan sin retrasos.

 8
Author: Will Jenkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 20:09:34

En caso de que alguien esté leyendo esto, no he encontrado una solución y fui con un efecto de solo expansión (que se logró moviendo el estilo transition a la definición de clase expandida)

 3
Author: Madd0g,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-17 08:14:50

Puedes lograr esto bien usando jQuery Transit :

$(function () {
    $(".paragraph").click(function () {
        var expanded = $(this).is(".expanded");
        if (expanded) 
        {
            $(this).transition({ 'max-height': '4em', overflow: 'hidden' }, 500, 'in', function () {$(this).removeClass("expanded"); });
        } 
        else 
        {
            $(this).transition({ 'max-height': $(this).get(0).scrollHeight, overflow: ''}, 500, 'out', function () { $(this).addClass("expanded"); });
        }
    });
});

Definitivamente puedes ordenarlo un poco a tu gusto, pero eso debería hacer lo que quieras.

JS Fiddle Demo

 -2
Author: ROFLwTIME,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-19 12:50:40