Animieren Sie das Element mit jQuery auf automatische Höhe

171

Ich möchte eine <div>von 200pxbis autoHöhe animieren . Ich kann es aber nicht zum Laufen bringen. Weiß jemand wie?

Hier ist der Code:

$("div:first").click(function(){
  $("#first").animate({
    height: "auto"
  }, 1000 );
});
Daniel
quelle
14
Sie sollten die beste Antwort als akzeptiert markieren.
Kleinfreund
@ IanMackinnon diese Frage hat sicherlich bessere Antworten. Ich habe diese Frage als Duplikat davon geschlossen.
Madara Ghost

Antworten:

254
  1. Speichern Sie die aktuelle Höhe:

    var curHeight = $('#first').height();
  2. Schalten Sie die Höhe vorübergehend auf Auto:

    $('#first').css('height', 'auto');
  3. Holen Sie sich die automatische Höhe:

    var autoHeight = $('#first').height();
  4. Wechseln Sie zurück zu curHeightund animieren Sie zu autoHeight:

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

Und zusammen:

var el = $('#first'),
    curHeight = el.height(),
    autoHeight = el.css('height', 'auto').height();
el.height(curHeight).animate({height: autoHeight}, 1000);
David Tang
quelle
@ Daniel, wo ist dein JS-Code? Veröffentlichen Sie dieses Bit und auch Teile des HTML-Codes, die die Elemente anzeigen, auf die Sie verweisen.
David Tang
21
Dies funktioniert, aber ich habe einen Rückruf hinzugefügt, der das automatische Wachstum des Elements .animated({height: autoHeight}, 1000, function(){ el.height('auto'); });
wiederherstellt
Seien Sie vorsichtig beim Festlegen fester Höhen für reaktionsschnelle Designs. Es wird zu einem Durcheinander, wenn der Benutzer die Größe des Bildschirms ändert. Stellen Sie die Höhe am besten auf "Auto", wenn die Animation abgeschlossen ist.
Jonathan Tonge
4
Dies kann zu FOUC führen. Der Benutzer kann sehen, wie das Element vor dem Animieren für den Bruchteil einer Sekunde auf die volle Höhe springt.
Dingredient
1
Sie können die FOUC ("Flash of unstyled content") verhindern, indem Sie das Element zunächst opacity: 0; position: absolute;beim Messen angeben und diese entfernen, sobald Sie fertig sind.
JacobEvelyn
194

IMO ist dies die sauberste und einfachste Lösung:

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

Erläuterung: Das DOM weiß bereits beim ersten Rendern, welche Größe das erweiterte Div haben wird, wenn es auf die automatische Höhe eingestellt ist. Diese Eigenschaft wird im DOM-Knoten als gespeichert scrollHeight. Wir müssen nur das DOM-Element durch Aufrufen aus dem jQuery-Element abrufen get(0)und können dann auf die Eigenschaft zugreifen.

Das Hinzufügen einer Rückruffunktion zum Einstellen der Höhe auf Auto ermöglicht eine höhere Reaktionsfähigkeit, sobald die Animation abgeschlossen ist (Kredit Chris-Williams ):

$('#first').animate({
    height: $('#first').get(0).scrollHeight
}, 1000, function(){
    $(this).height('auto');
});
Liquinaut
quelle
2
Tolle! Laut developer.mozilla.org/en-US/docs/Web/API/Element.scrollHeight wird es sogar in IE8 unterstützt, verglichen mit dem clientHeight, was nicht unterstützt zu werden scheint: developer.mozilla.org/en-US/docs/Web/ API / Element.clientHeight
Sven
1
Der Rand ist per Definition des Box-Modells nicht Teil der Höhe eines Objekts. Sie können den Rand jedoch jederzeit selbst hinzufügen.
Liquinaut
22
Dies sollte die akzeptierte Antwort sein, da es am besten ohne Flackern funktioniert und die Arbeit wirklich gut macht
Einius
7
Ich denke auch, dass dies die beste Lösung ist. Ich würde eine Rückruffunktion hinzufügen, um die Höhe für mehr Reaktionsfähigkeit auf Auto zu setzen. $('#first').animate({ height: $('#first').get(0).scrollHeight }, 1000, function() { $(this).height('auto'); });
Chris Williams
1
Wow, das ist super elegant. Es funktioniert auch scrollWidthfür Breitenanimationen.
Null
24

Dies ist im Grunde der gleiche Ansatz wie die Antwort von Box9, aber ich habe ihn in ein nettes JQuery-Plugin eingewickelt , das dieselben Argumente wie ein reguläres Animieren verwendet , wenn Sie mehr animierte Parameter benötigen und es leid sind, denselben Code immer wieder zu wiederholen ::

;(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: jetzt verkettbar und sauberer

w0ps
quelle
23

Eine bessere Lösung würde nicht darauf beruhen, dass JS die Höhe Ihres Elements festlegt. Das Folgende ist eine Lösung, die ein Element mit fester Höhe auf volle ("automatische") Höhe animiert:

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

Tim Hettler
quelle
2
Dieser Oneliner ist nicht leicht zu verstehen, vielleicht würde das Schreiben mehrerer Zeilen anderen etwas besser helfen.
Jaap
Dies ist die beste Lösung, da sich die automatische Höhe ändern kann, wenn der Benutzer die Fenstergröße anpasst. Siehe Folgendes: // animiert die Höhe der Filterfunktion toggleSlider () {if ($ ('# Filter'). Height ()! = 0) {$ ('# Filter'). Animieren ({Höhe: '0 '}); } else {var $ selector = $ ('# Filter'); $ 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'); }
Ricky
Funktioniert, um das Div zu öffnen, animiert jedoch nicht über 400 ms. Vielleicht habe ich etwas anderes anders eingestellt, aber es öffnet sich blitzschnell.
ntgCleaner
Funktioniert aber dies setzt heightauf einen festen Wert (zB 122px). Mein Element änderte nach einer Weile die Höhe, so dass ich das Durationsargument (400) durch Optionen ersetzen musste{duration: 400, complete: function() {$selector.css('height', 'auto');}}
jsruok
12

Dies funktioniert und es ist einfacher als Lösungen vor:

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");
        }

    })
});

Hinweis: Für diese Lösung ist die jQuery-Benutzeroberfläche erforderlich

czLukasss
quelle
1
Es sollte erwähnt werden, dass dies das Jquery UI Plugin erfordert, während die ursprüngliche Frage nur jquery betraf. Wenn Sie jedoch die Jquery-Benutzeroberfläche verwenden, funktioniert dies.
user56reinstatemonica8
4
Sie können auch $ (this) .toggleClass ('max', 250) verwenden. anstatt die if-Anweisung zu verwenden
Antoine Hedgecock
1
Warum fügen Sie dem .addClassund einen zweiten Wert hinzu .removeClass?
Bowl0stu
9
var h = document.getElementById('First').scrollHeight;
$('#First').animate({ height : h+'px' },300);
Ignacio Martínez
quelle
7

Sie können die untergeordneten Elemente von #first jederzeit umbrechen und die Höhe des Wrappers als Variable speichern. Dies ist vielleicht nicht die schönste oder effizienteste Antwort, aber es macht den Trick.

Hier ist eine Geige, bei der ich einen Reset eingefügt habe.

Aber für Ihre Zwecke ist hier das Fleisch und die Kartoffeln:

$(function(){
//wrap everything inside #first
$('#first').children().wrapAll('<div class="wrapper"></div>');
//get the height of the wrapper 
var expandedHeight = $('.wrapper').height();
//get the height of first (set to 200px however you choose)
var collapsedHeight = $('#first').height();
//when you click the element of your choice (a button in my case) #first will animate to height auto
$('button').click(function(){
    $("#first").animate({
        height: expandedHeight            
    })
});
});​
Usha
quelle
5

Verwenden Sie slideDown und slideUp

$("div:first").click(function(){ $("#first").slideDown(1000); });
Ronny Sherer
quelle
1
Dies löst die height: auto-Funktion nicht, da slideUp das div vollständig zusammenbricht.
Jaap
5

Ich habe es geschafft, das Problem zu beheben: Hier ist der Code.

var divh = document.getElementById('first').offsetHeight;
$("#first").css('height', '100px');
$("div:first").click(function() {
  $("#first").animate({
    height: divh
  }, 1000);
});
Daniel
quelle
4

Sie können die Antwort von Liquinaut auf Änderungen der Fenstergröße reagieren lassen, indem Sie einen Rückruf hinzufügen, der die Höhe auf automatisch zurücksetzt.

$("#first").animate({height: $("#first").get(0).scrollHeight}, 1000, function() {$("#first").css({height: "auto"});});
Zyl
quelle
4

Grundsätzlich steht Ihnen die Höhenautomatik erst zur Verfügung, nachdem das Element gerendert wurde. Wenn Sie eine feste Höhe festlegen oder wenn Ihr Element nicht angezeigt wird, können Sie ohne Tricks nicht darauf zugreifen.

Zum Glück gibt es einige Tricks, die Sie verwenden können.

Klonen Sie das Element, zeigen Sie es außerhalb der Ansicht an. Geben Sie ihm automatisch die Höhe. Sie können es aus dem Klon nehmen und später für das Hauptelement verwenden. Ich benutze diese Funktion und scheint gut zu funktionieren.

jQuery.fn.animateAuto = function(prop, speed, callback){
    var elem, height, width;

    return this.each(function(i, el){
        el = jQuery(el), elem =    el.clone().css({"height":"auto","width":"auto"}).appendTo("body");
        height = elem.css("height"),
        width = elem.css("width"),
        elem.remove();

        if(prop === "height")
            el.animate({"height":height}, speed, callback);
        else if(prop === "width")
            el.animate({"width":width}, speed, callback);  
        else if(prop === "both")
            el.animate({"width":width,"height":height}, speed, callback);
    });   
}

VERWENDUNG:

$(".animateHeight").bind("click", function(e){
    $(".test").animateAuto("height", 1000); 
});

$(".animateWidth").bind("click", function(e){
    $(".test").animateAuto("width", 1000);  
});

$(".animateBoth").bind("click", function(e){
    $(".test").animateAuto("both", 1000); 
});
Stan George
quelle
1
Wenn Sie diese Funktion nicht verwenden möchten, gehen Sie einfach wie folgt vor: var clone = element.clone () clone.appendTo ('body') clone.css ('height', 'auto') var itemHeight = clone.outerHeight ( ); clone.remove () Jetzt haben Sie die Höhe Ihres Elements in der Variablen itemHeight, sodass Sie sie nicht nur für Animationen verwenden können.
Stan George
3

Sie können dies immer tun:

jQuery.fn.animateAuto = function(prop, speed, callback){
var elem, height, width;
return this.each(function(i, el){
    el = jQuery(el), elem = el.clone().css({"height":"auto","width":"auto"}).appendTo("body");
    height = elem.css("height"),
    width = elem.css("width"),
    elem.remove();

    if(prop === "height")
        el.animate({"height":height}, speed, callback);
    else if(prop === "width")
        el.animate({"width":width}, speed, callback);  
    else if(prop === "both")
        el.animate({"width":width,"height":height}, speed, callback);
});  
}

Hier ist eine Geige: http://jsfiddle.net/Zuriel/faE9w/2/

Zuriel
quelle
1
Sie können ersetzen: .appendTo("body")durch.appendTo(el.parent())
Steffi
2

Ihre Selektoren scheinen nicht übereinzustimmen. Hat Ihr Element die ID 'first' oder ist es das erste Element in jedem Div?

Eine sicherere Lösung wäre, "dies" zu verwenden:

// assuming the div you want to animate has an ID of first
$('#first').click(function() {
  $(this).animate({ height : 'auto' }, 1000);
});
EMMERICH
quelle
1
Ah. Nun, anscheinend haben Sie die Lösung gefunden. Aus Sicherheitsgründen würde ich immer noch $(this)in Ihrem Click-Handler verwenden.
EMMERICH
10
animate({height: 'auto'})hat keine Wirkung. Zumindest nicht mit jQuery 1.6.4.
Jānis Elmeris
2

Probier diese ,

var height;
$(document).ready(function(){
    $('#first').css('height','auto');
    height = $('#first').height();
    $('#first').css('height','200px');
})

 $("div:first").click(function(){
  $("#first").animate({
    height: height
  }, 1000 );
});
Prakash
quelle
Dies wird nicht funktionieren. Ihre Var-Höhe ist nur innerhalb der Ready-Funktion zugänglich.
Meo
Definieren Sie die Höhe vor der Bereitschaftsfunktion und verwenden Sie nur die Höhe als var height. Auf diese Weise kann es funktionieren. Daniel
Prakash
2

Hier ist eine, die mit BORDER-BOX funktioniert ...

Hallo Leute. Hier ist ein jQuery - Plugin Ich schrieb das gleiche zu tun, sondern auch erklären die Höhenunterschiede , die auftreten, wenn Sie haben box-sizingzu setzen border-box.

Ich habe auch ein "yShrinkOut" -Plugin eingefügt, das das Element verbirgt, indem es entlang der y-Achse verkleinert wird.


// -------------------------------------------------------------------
// Function to show an object by allowing it to grow to the given height value.
// -------------------------------------------------------------------
$.fn.yGrowIn = function (growTo, duration, whenComplete) {

    var f = whenComplete || function () { }, // default function is empty
        obj = this,
        h = growTo || 'calc', // default is to calculate height
        bbox = (obj.css('box-sizing') == 'border-box'), // check box-sizing
        d = duration || 200; // default duration is 200 ms

    obj.css('height', '0px').removeClass('hidden invisible');
    var padTop = 0 + parseInt(getComputedStyle(obj[0], null).paddingTop), // get the starting padding-top
        padBottom = 0 + parseInt(getComputedStyle(obj[0], null).paddingBottom), // get the starting padding-bottom
        padLeft = 0 + parseInt(getComputedStyle(obj[0], null).paddingLeft), // get the starting padding-left
        padRight = 0 + parseInt(getComputedStyle(obj[0], null).paddingRight); // get the starting padding-right
    obj.css('padding-top', '0px').css('padding-bottom', '0px'); // Set the padding to 0;

    // If no height was given, then calculate what the height should be.
    if(h=='calc'){ 
        var p = obj.css('position'); // get the starting object "position" style. 
        obj.css('opacity', '0'); // Set the opacity to 0 so the next actions aren't seen.
        var cssW = obj.css('width') || 'auto'; // get the CSS width if it exists.
        var w = parseInt(getComputedStyle(obj[0], null).width || 0) // calculate the computed inner-width with regard to box-sizing.
            + (!bbox ? parseInt((getComputedStyle(obj[0], null).borderRightWidth || 0)) : 0) // remove these values if using border-box.
            + (!bbox ? parseInt((getComputedStyle(obj[0], null).borderLeftWidth || 0)) : 0) // remove these values if using border-box.
            + (!bbox ? (padLeft + padRight) : 0); // remove these values if using border-box.
        obj.css('position', 'fixed'); // remove the object from the flow of the document.
        obj.css('width', w); // make sure the width remains the same. This prevents content from throwing off the height.
        obj.css('height', 'auto'); // set the height to auto for calculation.
        h = parseInt(0); // calculate the auto-height
        h += obj[0].clientHeight // calculate the computed height with regard to box-sizing.
            + (bbox ? parseInt((getComputedStyle(obj[0], null).borderTopWidth || 0)) : 0) // add these values if using border-box.
            + (bbox ? parseInt((getComputedStyle(obj[0], null).borderBottomWidth || 0)) : 0) // add these values if using border-box.
            + (bbox ? (padTop + padBottom) : 0); // add these values if using border-box.
        obj.css('height', '0px').css('position', p).css('opacity','1'); // reset the height, position, and opacity.
    };

    // animate the box. 
    //  Note: the actual duration of the animation will change depending on the box-sizing.
    //      e.g., the duration will be shorter when using padding and borders in box-sizing because
    //      the animation thread is growing (or shrinking) all three components simultaneously.
    //      This can be avoided by retrieving the calculated "duration per pixel" based on the box-sizing type,
    //      but it really isn't worth the effort.
    obj.animate({ 'height': h, 'padding-top': padTop, 'padding-bottom': padBottom }, d, 'linear', (f)());
};

// -------------------------------------------------------------------
// Function to hide an object by shrinking its height to zero.
// -------------------------------------------------------------------
$.fn.yShrinkOut = function (d,whenComplete) {
    var f = whenComplete || function () { },
        obj = this,
        padTop = 0 + parseInt(getComputedStyle(obj[0], null).paddingTop),
        padBottom = 0 + parseInt(getComputedStyle(obj[0], null).paddingBottom),
        begHeight = 0 + parseInt(obj.css('height'));

    obj.animate({ 'height': '0px', 'padding-top': 0, 'padding-bottom': 0 }, d, 'linear', function () {
            obj.addClass('hidden')
                .css('height', 0)
                .css('padding-top', padTop)
                .css('padding-bottom', padBottom);
            (f)();
        });
};

Jeder der von mir verwendeten Parameter kann weggelassen oder auf null gesetzt werden, um Standardwerte zu akzeptieren. Die Parameter, die ich verwendet habe:

  • growTo: Wenn Sie alle Berechnungen überschreiben und die CSS-Höhe festlegen möchten, auf die das Objekt wachsen soll, verwenden Sie diesen Parameter.
  • Dauer: Die Dauer der Animation ( offensichtlich ).
  • whenComplete: Eine Funktion, die ausgeführt wird, wenn die Animation abgeschlossen ist.
Schief
quelle
2

Folie umschalten (Antwort von Box9 erweitert)

$("#click-me").click(function() {
  var el = $('#first'),
  curHeight = el.height(),
  autoHeight = el.css('height', 'auto').height(),
  finHeight = $('#first').data('click') == 1 ? "20px" : autoHeight;
  $('#first').data('click', $(this).data('click') == 1 ? false : true);
  el.height(curHeight).animate({height: finHeight});
});
#first {width: 100%;height: 20px;overflow:hidden;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="first">
  <div id="click-me">Lorem ipsum dolor sit amet, consectetur adipiscing elit</div>
  Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
</div>

che-azeh
quelle
1

Ich poste diese Antwort, obwohl dieser Thread alt ist. Ich konnte die akzeptierte Antwort nicht bekommen, um für mich zu arbeiten. Dieser funktioniert gut und ist ziemlich einfach.

Ich lade die Höhe jedes gewünschten Divs in die Daten

$('div').each(function(){
    $(this).data('height',$(this).css('height'));
    $(this).css('height','20px');
});

Dann benutze ich das einfach beim Animieren per Klick.

$('div').click(function(){
    $(this).css('height',$(this).data('height'));
});

Ich verwende den CSS-Übergang, daher verwende ich nicht die jQuery-Animation, aber Sie können die Animation trotzdem ausführen.

Leeish
quelle
1

Sie können es in einem Datenattribut speichern.

$('.colapsable').each(function(){
    $(this).attr('data-oheight',$(this).height());
    $(this).height(100);
});

$('.colapsable h2:first-child').click(function(){
    $(this).parent('.colapsable').animate({
            height: $(this).parent('.colapsible').data('oheight')
        },500);
    }
});
definierte Medien
quelle
Im Wesentlichen das gleiche wie Hettlers Einzeiler, aber leichter zu verstehen.
Timothy Groote
1

Ich brauchte diese Funktionalität für mehrere Lesebereiche auf einer Seite, um dies in einen Wordpress-Shortcode zu implementieren, bei dem ich auf dasselbe Problem gestoßen bin.

Technisch gesehen haben alle auf der Seite gelesenen Bereiche eine feste Höhe. Und ich wollte sie mit einem Knebel separat auf eine automatische Höhe erweitern können. Erster Klick: 'Auf volle Höhe der Textspanne erweitern', zweiter Klick: 'Auf Standardhöhe von 70px zurückklappen'

Html

 <span class="read-more" data-base="70" data-height="null">
     /* Lots of text determining the height of this span */
 </span>
 <button data-target='read-more'>Read more</button>

CSS

span.read-more {
    position:relative;
    display:block;
    overflow:hidden;
}

Daher sieht das data-baseAttribut, das ich zum Einstellen der erforderlichen festen Höhe benötige, sehr einfach aus . Das data-heightAttribut, mit dem ich die tatsächliche (dynamische) Höhe des Elements gespeichert habe.

Der jQuery-Teil

jQuery(document).ready(function($){

  $.fn.clickToggle = function(func1, func2) {
      var funcs = [func1, func2];
      this.data('toggleclicked', 0);
      this.click(function() {
          var data = $(this).data();
          var tc = data.toggleclicked;
          $.proxy(funcs[tc], this)();
          data.toggleclicked = (tc + 1) % 2;
      });
      return this;
  };

    function setAttr_height(key) {
        $(key).each(function(){
            var setNormalHeight = $(this).height();
            $(this).attr('data-height', setNormalHeight);
            $(this).css('height', $(this).attr('data-base') + 'px' );
        });
    }
    setAttr_height('.read-more');

    $('[data-target]').clickToggle(function(){
        $(this).prev().animate({height: $(this).prev().attr('data-height')}, 200);
    }, function(){
        $(this).prev().animate({height: $(this).prev().attr('data-base')}, 200);
    });

});

Zuerst habe ich eine clickToggle-Funktion für meinen ersten und zweiten Klick verwendet. Die zweite Funktion ist wichtiger: Bei setAttr_height()allen .read-moreElementen werden die tatsächlichen Höhen beim Laden der Seite im base-heightAttribut festgelegt. Danach wird die Basishöhe über die Funktion jquery css eingestellt.

Wenn beide Attribute festgelegt sind, können wir jetzt reibungslos zwischen ihnen wechseln. Nur chang die data-baseauf die gewünschte (fest) Höhe und schalten Sie die .lesen-Klasse mehr für die eigene ID

Sie können alle sehen, wie es in einem Fiddle FIDDLE funktioniert

Keine jQuery-Benutzeroberfläche erforderlich

Paul
quelle
1

Wenn Sie nur ein Div ein- und ausblenden möchten, können Sie mit diesem Code jQuery animieren. Sie können jQuery den größten Teil der gewünschten Höhe animieren lassen oder Sie können die Animation animieren, indem Sie sie auf 0px animieren. jQuery benötigt nur eine von jQuery festgelegte Höhe, um sie in auto zu konvertieren. Das .animate fügt dem Element, das .css (height: auto) konvertiert, den style = "" hinzu.

Die sauberste Art und Weise, wie ich diese Arbeit gesehen habe, besteht darin, auf die erwartete Höhe zu animieren und sie dann automatisch einstellen zu lassen. Wenn sie richtig ausgeführt wird, kann sie sehr nahtlos aussehen. Sie können sogar über das hinaus animieren, was Sie erwarten, und es wird zurückschnappen. Beim Animieren auf 0px mit einer Dauer von 0 wird die Elementhöhe einfach auf die automatische Höhe gesenkt. Für das menschliche Auge sieht es trotzdem animiert aus. Genießen..

    jQuery("div").animate({
         height: "0px"/*or height of your choice*/
    }, {
         duration: 0,/*or speed of your choice*/
         queue: false, 
         specialEasing: {
             height: "easeInCirc"
        },
         complete: function() {
             jQuery(this).css({height:"auto"});
        }
    });

Es tut mir leid, dass ich weiß, dass dies ein alter Beitrag ist, aber ich hatte das Gefühl, dass dies für Benutzer relevant ist, die diese Funktionalität noch bei jQuery suchen und auf diesen Beitrag stoßen.

designdrumm
quelle
0

Ich habe etwas zusammengestellt, das genau das tut, wonach ich gesucht habe und das großartig aussieht. Wenn Sie die scrollHeight eines Elements verwenden, erhalten Sie die Höhe, zu der es in das DOM geladen wurde.

 var clickers = document.querySelectorAll('.clicker');
    clickers.forEach(clicker => {
        clicker.addEventListener('click', function (e) {
            var node = e.target.parentNode.childNodes[5];
            if (node.style.height == "0px" || node.style.height == "") {
                $(node).animate({ height: node.scrollHeight });
            }
            else {
                $(node).animate({ height: 0 });
            }
        });
    });
.answer{
        font-size:15px;
        color:blue;
        height:0px;
        overflow:hidden;
       
    }
 <div class="row" style="padding-top:20px;">
                <div class="row" style="border-color:black;border-style:solid;border-radius:4px;border-width:4px;">
                    <h1>This is an animation tester?</h1>
                    <span class="clicker">click me</span>
                    <p class="answer">
                        I will be using this to display FAQ's on a website and figure you would like this.  The javascript will allow this to work on all of the FAQ divs made by my razor code.  the Scrollheight is the height of the answer element on the DOM load.  Happy Coding :)
                         Lorem ipsum dolor sit amet, mea an quis vidit autem. No mea vide inani efficiantur, mollis admodum accusata id has, eam dolore nemore eu. Mutat partiendo ea usu, pri duis vulputate eu. Vis mazim noluisse oportere id. Cum porro labore in, est accumsan euripidis scripserit ei. Albucius scaevola elaboraret usu eu. Ad sed vivendo persecuti, harum movet instructior eam ei.
                    </p>
                </div>
            </div>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

JimmyTwoShoes
quelle