Wie kann ich den übergang height: 0; auf height: auto; Verwendung von CSS?
Ich versuche, eine <ul>
nach unten schieben, mit CSS-übergängen.
Den <ul>
beginnt bei height: 0;
. Auf schweben, die Höhe ist festgelegt height:auto;
. Dies ist jedoch verursachen, dass es zu einfach erscheinen, nicht übergang,
Wenn ich es von height: 40px;
zu height: auto;
, dann wird es oben schieben, um height: 0;
, und dann plötzlich springen Sie auf die richtige Höhe.
Wie könnte ich sonst tun, ohne JavaScript zu verwenden?
CSS:
#child0 {
height: 0;
overflow: hidden;
background-color: #dedede;
-moz-transition: height 1s ease;
-webkit-transition: height 1s ease;
-o-transition: height 1s ease;
transition: height 1s ease;
}
#parent0:hover #child0 {
height: auto;
}
#child40 {
height: 40px;
overflow: hidden;
background-color: #dedede;
-moz-transition: height 1s ease;
-webkit-transition: height 1s ease;
-o-transition: height 1s ease;
transition: height 1s ease;
}
#parent40:hover #child40 {
height: auto;
}
h1 {
font-weight: bold;
}
HTML:
The only difference between the two snippets of CSS is one has height: 0, the other height: 40.
<hr>
<div id="parent0">
<h1>Hover me (height: 0)</h1>
<div id="child0">Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>
</div>
</div>
<hr>
<div id="parent40">
<h1>Hover me (height: 40)</h1>
<div id="child40">Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>
</div>
</div>
- Ich glaube, die
height:auto/max-height
Lösung wird nur funktionieren, wenn Sie sind wachsende Bereich ist größer als derheight
Sie einschränken möchten. Wenn Sie einemax-height
von300px
, aber ein Kombinationsfeld, dropdown, die Rückkehr50px
, dannmax-height
wird dir nicht helfen,50px
ist variabel und hängt von der Anzahl der Elemente, die Sie können kommen, um eine Unmögliche situation ich kann es nicht reparieren, weil dieheight
ist nicht festgelegt,height:auto
war die Lösung, aber ich kann nicht verwenden Sie übergänge mit dieser. - OP versucht für css-Lösung, nicht js, sonst könnten Sie Sie nur verwenden, überlauf und animieren
- Aber die inneren div ' s -100% margin-top erhält die Breite des wrapper-div, nicht die Höhe. Also diese Lösung hat die gleiche Art von problem, dass die max-Höhe-Lösung. Außerdem, wenn die Breite kleiner ist als die Höhe der Inhalte, alle Inhalte sind nicht versteckt, die von -100% margin-top. Das ist also eine falsche Lösung.
- Siehe github.com/w3c/csswg-drafts/issues/626 für die Diskussion um die Spezifikation und Implementierung einer geeigneten Lösung
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
max-height
in der transformation und nichtheight
. Und legen Sie einen Wert aufmax-height
etwas größer als die box jemals bekommen.Sehen JSFiddle demo zur Verfügung gestellt von Chris Jordan in einem anderen Antwort hier.
CSS:
HTML:
overflow:hidden
zu halten, das text von außerhalb des Containers. So diese version von Ihrem fiddle funktioniertmax-height
ist zu groß. Um das zu beheben, nutzencubic-bezier(0,1,0,1)
stattease-in
undcubic-bezier(1,0,1,0)
stattease-out
Sollten Sie verwenden, scaleY statt.
HTML:
CSS:
Habe ich eine vendor-Präfix-version der oben genannten code auf jsfiddle, http://jsfiddle.net/dotnetCarpenter/PhyQc/9/ und verändert Ihre jsfiddle zu verwenden, scaleY, statt Höhe, http://jsfiddle.net/dotnetCarpenter/7cnfc/206/.
margin-top: 100%;
ist, dass die prozentuale Marge wird gemäß der Breite des umschließenden Blocks. Wenn der block ist schmal und es gibt eine Menge von versteckten text,margin-top: 100%;
nicht verstecken der gesamte textinner
. In anderen Worten,margin-top: 100%;
hat nicht Mittelwert 100% der block Höhe.max-height
undscaleY
mit einemtransition-delay
aufmax-height
? Ich denke, es ist näher an, was der OP will jsfiddle.net/bnuudn44/2Können Sie derzeit nicht animieren, auf die Höhe, wenn man von den Höhen beteiligt ist
auto
Sie haben zwei explizite Höhen..collapsing { position: relative; height: 0; overflow: hidden; .transition-property(~"height, visibility"); .transition-duration(.35s); .transition-timing-function(ease); }
this.$element[dimension](this.$element[dimension]())[0].offsetHeight
auto
...Die Lösung, die ich schon immer verwendet wurde, um erste fade-out, dann schrumpfen die
font-size
,padding
undmargin
Werte. Es sieht nicht so aus wie ein Tuch, aber es funktioniert ohne statischeheight
odermax-height
.Beispiel:
CSS:
HTML:
*
und einiger anderer änderungen. Tasten haben sollte, beeinflusst wurde von meinem obigen code, aber, wenn Sie richtig gestylt mitem
.line-height: 0;
undborder-width: 0;
line-height
wenn Sie richtig vermeiden Sie die Einheiten auf den Wert: "developer.mozilla.org/en-US/docs/Web/CSS/...Ich weiß, das ist die dreißig-somethingth Antwort auf diese Frage, aber ich denke, es lohnt sich, so hier geht. Dies ist ein CSS-nur Lösung mit den folgenden Eigenschaften:
transform: scaleY(0)
), so ist es nicht das richtige, wenn es Inhalte nach dem Reduzierbare element.height: auto
) Staat, der ganze Inhalt hat immer die richtige Höhe (im Gegensatz zu z.B., wenn Sie wählen Sie einemax-height
stellt sich heraus, dass zu niedrig). Und im eingeklappten Zustand, die Höhe ist null, wie es sollte.Demo
Hier ist eine demo mit drei zusammenklappbaren Elementen, die alle verschiedene Höhen, die alle verwenden die gleichen CSS. Sie möchten möglicherweise klicken Sie auf "ganze Seite" nach Klick auf "run snippet". Beachten Sie, dass das JavaScript nur schaltet die
collapsed
CSS-Klasse, es gibt keine Messgeräte beteiligt. (Sie könnten tun genau dieses demo ohne JavaScript durch die Verwendung einer checkbox oder:target
). Beachten Sie auch, dass der Teil des CSS, das ist verantwortlich für den übergang ist ziemlich kurz, und die HTML-erfordert nur einen einzigen zusätzlichen wrapper-element.JS:
CSS:
HTML:
Wie funktioniert es?
Gibt es in der Tat zwei übergänge daran beteiligt, dass dies geschieht. Einer von Ihnen übergänge der
margin-bottom
von 0px (im expandierten Zustand) zu-2000px
im eingeklappten Zustand (ähnlich diese Antwort). Die 2000 hier ist die erste Magische Zahl, es basiert auf der Annahme, dass deine box nicht höher sein als diese (2000 Pixel scheint wie eine vernünftige Wahl).Mithilfe der
margin-bottom
übergang allein selbst hat zwei Probleme:margin-bottom: -2000px
nicht alles verstecken -- es werde sichtbar sein Zeug auch im reduzierten Fall. Dies ist ein kleineres Update, das wir später auch tun werden.Befestigung dieser zweiten Ausgabe ist, wobei der zweite übergang, und dieser übergang konzeptionell Ziele der wrapper ist mindestens Höhe ("konzeptionell" da wir uns nicht wirklich mit der
min-height
- Eigenschaft für dieses; dazu später mehr).Hier ist eine animation, die zeigt, wie die Kombination der unteren Rand-übergang mit der Mindesthöhe übergang, beide von gleicher Dauer, gibt uns eine kombinierte übergang von der vollen Höhe auf null Höhe, das dieselbe Dauer hat.
Die linke Leiste zeigt an, wie den negativen unteren Rand schiebt den unteren nach oben, die Verringerung der sichtbaren Höhe. Der Balken in der Mitte zeigt, wie die minimale Höhe gewährleistet, dass in der zerfallenden Fall, den übergang nicht zu Ende zu früh, und in der Erweiterung Fall, der übergang beginnt nicht zu spät. Der Rechte Balken zeigt, wie die Kombination von beiden bewirkt, dass die box, um den übergang von der vollen Höhe auf null Höhe, in der richtigen Menge Zeit.
Für mein demo ich mich eingelebt habe auf 50px als die oberen Mindesthöhe Wert. Dies ist der zweite Magische Zahl, und es sollte kleiner sein als das Feld' Höhe würde schon werden. 50px scheint angemessener als gut; es scheint unwahrscheinlich, dass Sie würde sehr oft wollen, dass ein element zusammenklappbar, dass nicht einmal 50 Pixel hoch in den ersten Platz.
Wie man sehen kann in der animation, der daraus resultierende übergang ist stetig, aber nicht differenzierbar -- in dem moment, wenn die minimale Höhe ist gleich der vollen Höhe angepasst, indem der untere Rand, gibt es eine plötzliche änderung in der Geschwindigkeit. Dies ist sehr Auffällig in der animation, da es verwendet eine lineare timing-Funktion für beide übergänge, und weil der ganze übergang ist sehr langsam. In dem konkreten Fall (mein demo-oben), der übergang dauert nur 300ms, und der untere Rand im übergang ist nicht linear. Ich habe gespielt, um mit einer Menge von verschiedenen timing-Funktionen für beide übergänge, und diejenigen, die am Ende hatte ich das Gefühl, Sie arbeitete am besten für die unterschiedlichsten Fälle.
Zwei Probleme zu lösen:
Wir lösen das erste problem, indem Sie das container-element ein
max-height: 0
im reduzierten Fall mit einem0s 0.3s
übergang. Dies bedeutet, dass es nicht wirklich eine Umstellung, aber diemax-height
angewendet wird, mit einer Verzögerung; es gilt nur, sobald die übergangsphase vorbei ist. Damit dies korrekt funktioniert, benötigen wir auch, um eine numerischemax-height
für das Gegenteil, non-collapsed state. Aber anders als in den 2000px Fall, wo die Kommissionierung zu große Zahl ist, wirkt sich auf die Qualität des übergangs, in diesem Fall, es spielt wirklich keine Rolle. So können wir wählen Sie einfach eine Zahl, die so hoch ist, dass wir wissen, dass keine Höhe wird je eine diesem nahe kommen. Ich nahm eine million Pixel. Wenn Sie das Gefühl müssen Sie möglicherweise zur Unterstützung von Inhalten, von einer Höhe von mehr als einer million Pixel, dann 1) tut mir Leid, und 2) fügen Sie einfach ein paar Nullen.Das zweite problem ist der Grund, warum wir uns nicht wirklich mit
min-height
für die minimale Höhe übergang. Stattdessen gibt es eine::after
pseudo-element in den container mit einemheight
dass die übergänge von 50px auf null. Dies hat die gleiche Wirkung wie einmin-height
: Es wird nicht lassen Sie den Behälter unterschritten, was die Höhe der pseudo-element, das Sie aktuell hat. Aber da sind wir mitheight
, nichtmin-height
, wir können jetztmax-height
(wieder einmal angewendet mit einer Verzögerung), um die pseudo-element die aktuelle Höhe auf null, sobald die übergangsphase vorbei ist, sicherzustellen, dass zumindest außerhalb der übergang, selbst kleine Elemente haben die richtige Höhe. Damin-height
ist stärker alsmax-height
, würde dies nicht funktionieren, wenn wir den containermin-height
statt des pseudo-Elementsheight
. Genau wie diemax-height
im vorigen Absatz diesesmax-height
muss auch ein Wert für die gegenüberliegende Ende des übergangs. Aber wir können in diesem Fall wählen Sie nur die 50px.Getestet in Chrome (Win, Mac, Android, iOS), Firefox (Win, Mac, Android), Edge, IE11 (mit Ausnahme des flexbox-layout-Problem mit meinem demo, ich wollte nicht stören, debugging), und Safari (Mac, iOS). Apropos flexbox, sollte es möglich sein, diese Arbeit zu machen, ohne flexbox; in der Tat, ich glaube, Sie könnte fast alles funktioniert im IE7 – außer der Tatsache, dass Sie nicht haben, CSS-übergänge, so dass es eine eher sinnlose übung.
Können Sie, mit ein wenig von der nicht-semantischen jiggery-pokery. Meine übliche Vorgehensweise animiert die Höhe des äußeren DIV die hat ein einziges Kind, die ein Stil-weniger DIV wird nur für die Messung der content-Höhe.
JS:
CSS:
HTML:
Möchte man nur in der Lage sein zu verzichten, mit der
.measuringWrapper
und nur die DIV die Höhe auf auto und animieren, aber das scheint nicht zu funktionieren (die Höhe festgelegt wird, aber keine animation statt).JS:
CSS:
HTML:
Meine interpretation ist, dass eine explizite Höhe ist nötig, um die animation zu laufen. Sie können nicht erhalten Sie eine animation auf der Höhe, wenn entweder die Höhe (die start-oder end-Höhe) ist
auto
.replaceChild
- Methode und die Folgen-Technik, um das hinzufügen der wrapper-div ohne Unterbrechung alle bestehenden DOM-element references: stackoverflow.com/questions/6938248/.... Auch habe ich nicht wie, wie ich konnte nicht öffnen Sie eine schließende div-midstream, so fügte ich ein isOpening Boolesche Eigenschaft, um das DOM-Objekt, und klicken Sie dann verwendet, um zu sagen, ob die div wurde geöffnet oder geschlossen. Das gab mir eine viel bessere Kontrolle für ein Akkordeon-Modul habe ich gebaut. Trotzdem, nochmals vielen Dank. Super Antwort!max-height
, keine Notwendigkeit fürauto
, und vor allem keine Notwendigkeit für Javascript!! Nur zwei einfache Erklärungenmargin-top
(undmargin-bottom
) sind relativ zur Breite, wenn definiert in Prozenten, ja, dass ist dumm, aber es erklärt auch, warum das öffnen und schließen Animationen sind völlig unterschiedlich-es ist die gleiche Sache, die Sie sehen in den top-bewerteten Antwort, die Angabe eines hart-codiert max-Höhe. Warum ist das so schwer, das richtige zu tun?overflow: hidden
ist wichtig. Mabye, die Sie Bearbeiten könnten Ihre awnser und fügen Sie den Hinweis.Visual Abhilfe zu animieren Höhe mit CSS3 übergänge animieren die Polsterung statt.
Du nicht Recht bekommen, die full-wipe-Effekt, aber das Spiel mit den übergangs -, Dauer-und padding-Werte sollten erhalten Sie nah genug. Wenn Sie nicht wollen, um explizit festzulegen Höhe/max-Höhe, das sollte sein was du suchst.
http://jsfiddle.net/catharsis/n5XfG/17/ (riffed off stephband über jsFiddle)
Mein workaround ist, um den übergang max-Höhe an den exakten Inhalt Höhe für eine schöne glatte animation, dann verwenden Sie ein transitionEnd-Rückruf setzen max-height zu 9999px so den Inhalt können die Größe frei.
JS:
CSS:
HTML:
max-height
-einzige Lösung! Die Inhalte, die ich bin, zu animieren, ist nicht, dass der flexible trotzdem 🙂.slideUp
,.slideDown
, und.slideToggle
Methode, nicht um die statische Höhe. Versuchen Sie diese. Es ist im Grunde nur eine einzige Zeile, macht der genau das gleiche und seine Ausweitung auf den Punkt, wo es animiert auch, wenn Sie erweitern Sie den Inhalt sollte nicht zu viel von einer Herausforderung. Da man sich mit jQuery schon sowieso....stop
funktioniert der trick für das Recht komplexe animation loop problem. Nun, wenn Sie zu animieren, Höhe und Farbe, aber wollen, unterbrechen Sie die Höhe der animation nur, die Dinge ein wenig schwieriger... ich bekomme Ihren Punkt.addEventListener
und Einstellungheight
stattmax-height
ich denke immer noch, dies als eine bessere Antwort. Sie können auch die Arbeit mit multi-level-collapsibles durch das zurücksetzen derheight
zuauto
und entfernen Sie den Ereignis-listener nach dem es erledigt seinen " jobDie akzeptierte Antwort, die funktioniert für die meisten Fälle, aber es funktioniert nicht gut, wenn Ihr
div
kann stark variieren in der Höhe — die animation Geschwindigkeit ist nicht abhängig von der tatsächlichen Höhe des Inhalts, und es Aussehen kann, abgehackt.Dennoch können Sie die eigentliche animation mit CSS, aber müssen Sie die Verwendung von JavaScript zur Berechnung der Höhe der Elemente, anstatt zu versuchen, zu verwenden
auto
. Kein jQuery erforderlich ist, obwohl Sie möglicherweise ändern Sie das noch ein bisschen wenn Sie wollen-Kompatibilität (funktioniert in der neuesten version von Chrome :)).JS:
CSS:
HTML:
document.getElementById('mydiv')
oder$('#mydiv').get()
), und die Funktion schaltet zwischen verstecken/zeigen. Wenn Sie die CSS-übergänge, wird das element automatisch animieren.min-height
als in die erwartete Antwort führt zu Problemen mit der animation die Geschwindigkeit, wenn die Größe der Liste kann stark variieren)..offsetHeight
ist nicht einschließlich Ränder, so dass Sie würde haben, um eine mehr komplexe Berechnung, um herauszufinden, wie viel tatsächliche Platz Ihrer Kinder einnehmen wird.Verwenden
max-height
mit verschiedenen übergang zu erleichtern und Verzögerung für jeden Staat.HTML:
CSS:
Siehe Beispiel: http://jsfiddle.net/0hnjehjc/1/
999999px
. Diese, auf der anderen Seite, wird die Verschiebung der animation, weil die frames errechnet sich aus diesem Wert. So können Sie am Ende mit animation "Verzögerung" in die eine Richtung und ein wirklich schnelles Ende in die andere Richtung (corr: timing-Funktionen)Hartcodierte Werte.
Kein JavaScript.
Keine Annäherungen.
Der trick ist, verwenden Sie eine versteckte & dupliziert
div
man dem browser zu verstehen, was 100% bedeutet.Diese Methode ist immer dann geeignet, wenn Sie sind in der Lage, duplizieren Sie das DOM des element Sie zu animieren.
CSS:
HTML:
Gab es wenig Erwähnung der
- Element.scrollHeight
Eigenschaft, die nützlich sein können hier und kann noch immer verwendet werden, mit einer reinen CSS-übergang. Die Eigenschaft enthält immer die "volle" Höhe " eines Elements, unabhängig davon, ob und wie seine Inhalte überläufe als Folge des kollabierten Höhe (z.B.height: 0
).Als solche, für die eine
height: 0
(effektiv vollständig zusammengebrochen) element, seine "normalen" oder "vollständigen" Höhe ist weiterhin verfügbar, durch seinescrollHeight
Wert (immer ein pixel Länge).Für ein solches element, vorausgesetzt, es hat bereits den übergang einrichten, wie z.B. (mit
ul
pro original-Frage):Können wir auslösen gewünschte animierte "Erweiterung" der Höhe, die Verwendung von CSS, nur, wie so etwas wie die folgenden (hier unter der Annahme
ul
variable bezieht sich auf die Liste):Das ist es. Wenn Sie brauchen, um die Liste zu minimieren, sind die beiden folgenden Aussagen machen:
Meinem speziellen Anwendungsfall ging es um Animation von Listen der unbekannten und oft beträchtliche Längen, so dass ich nicht vertraut war, die sich auf einer beliebigen "groß genug"
height
odermax-height
Spezifikation und riskieren cut-off-Inhalte oder Inhalte, die Sie plötzlich benötigen, um zu Blättern (wennoverflow: auto
zum Beispiel). Zusätzlich ist die Beschleunigung und das timing ist gebrochen mitmax-height
-basierten Lösungen, weil die verwendeten Höhe erreicht seinen maximalen Wert viel schneller als es dauern würde, fürmax-height
zu erreichen9999px
. Und als Bildschirm-Auflösungen wachsen, die pixelangaben wie9999px
verlassen einen schlechten Geschmack in meinem Mund. Diese Lösung löst das problem auf eine elegante Art und Weise, meiner Meinung nach.Schließlich, hier ist der Hoffnung, dass zukünftige Versionen von CSS Anschrift der Autoren müssen, das zu tun diese Art von Sachen, die noch mehr aus -- überdenken der Begriff der "berechnete" vs "verwendet" und "gelöst" - Werte, und zu prüfen, ob übergänge sollten für berechnete Werte, einschließlich der übergänge mit
width
undheight
(die derzeit ein bisschen eine spezielle Behandlung).Element.scrollHeight
Eigenschaft erfordert JavaScript und ist, wie die Frage eindeutig, Sie wollen, dies zu tun ohne JavaScript.scrollHeight
durch eine gründlichere Suche nach dieser Zeit, obwohl der code mit scheint es eher verworren und definitiv more JavaScript als heute notwendig. Wie auch immer, ich nehme an, Sie sind direkt am Punkt mit dem nicht-JavaScript, aber ohne Javascript Sie sind beschränkt auf die:active
und:focus
und vielleicht ein paar andere pseudo-Klassen, so dass ich mich Frage, was genau ist gemeint mit "Kein JavaScript". Als im "reinen" CSS-animation"? Da Sie einen Stil in JavaScript ist noch rein und abbaubar CSS-animation.:hover
? Das ist one. Und das ist es. Viel Glück auslösende übergänge auf touch oder click-events ohne JavaScript. Das heißt, ich habe nie gesagt, halte ich meine Antwort korrigieren, ich bin nur debattieren, seine Nützlichkeit unter "hacks" mitmax-height: 9999px
. Ich bin auch völlig bewusst, dass es JavaScript ist oft nicht lebensfähig oder aktiviert werden, in der Tat, ich bin eher konservativ über es selbst und nicht einer von den gung-ho-full-stack Reagieren / Winkel-cowboys.:hover
in seinem Stil snippet, instrumental für die Lösung. nächste mit einer funktionierenden Lösung nicht so gut. Könnten Sie bitte einen link auf die Antwort, die Sie sich beziehen? Auch, meine Antwort, funktioniert genauso gut mitmax-height
als mitheight
, es ist ohne Bedeutung für die Lösung und war nie ein Punkt diskutiert.Als ich diese post gibt es mehr als 30 Antworten schon, aber ich fühle, dass meine Antwort verbessert, die auf den bereits akzeptierte Antwort von jake.
Ich war nicht zufrieden mit der Frage, die sich stellt, einfach mit
max-height
- und CSS3-übergänge, da Sie so viele Kommentatoren angemerkt haben, müssen Sie Ihremax-height
Wert sehr nahe an der tatsächlichen Höhe, oder du wirst eine Verzögerung. Sehen Sie diese JSFiddle ein Beispiel für dieses problem.Dies zu umgehen, (während Sie immer noch kein JavaScript), ich fügte hinzu, ein anderes HTML-element, das die übergänge der
transform: translateY
CSS-Wert.Dies bedeutet, dass sowohl
max-height
undtranslateY
verwendet werden:max-height
ermöglicht das element zu push-down-Elemente unter ihm, währendtranslateY
gibt die "sofortige" Wirkung, die wir wollen. Das Problem mitmax-height
noch vorhanden ist, aber seine Wirkung ist abgeschwächt.Dies bedeutet, dass Sie festlegen können, eine viel größere Höhe für Ihr
max-height
Wert und sorgen weniger.Den Allgemeinen Vorteil ist, dass auf den übergang zurück in (der Zusammenbruch), der Benutzer sieht die
translateY
animation sofort, also ist es eigentlich egal, wie lange diemax-height
nimmt.Lösung als Fiddle
CSS:
HTML:
translateY
überscale
weil ich Sie nicht mochte, wiescale
gab, die Kompressions-Effekt.Ok, so denke ich, kam ich auf eine super einfache Antwort...
keine
max-height
verwendetrelative
Positionierung, arbeiten Sie aufli
Elemente, & ist Reine CSS-Dateien.Habe ich nicht getestet, in nichts aber Firefox, obwohl die Beurteilung durch die CSS, sollte es auf allen Browsern.
FIDDLE: http://jsfiddle.net/n5XfG/2596/
CSS
HTML
EDIT: Scrollen Sie nach unten, um aktualisierte Antwort
Ich war dabei, ein drop-down-Liste aus und sah diesen Beitrag ... viele verschiedene Antworten, aber ich entscheiden, zu teilen, mein drop-down-Liste zu, ... Es ist nicht perfekt, aber zumindest wird es mit nur css für die Dropdown! Ich habe mit transform:translateY(y) transformieren Sie die Liste, um die Ansicht ...
Sie können sehen, mehr in den test
http://jsfiddle.net/BVEpc/4/
Ich habe div hinter jedem li, weil mein drop-down-Liste aus, und zeigen Sie Ihnen, richtig, dies war notwendig, meine div-code:
schweben ist :
ist und da die ul-Höhe eingestellt ist, um die Inhalte bekommt, die er über Ihren Körper Inhalte, die ist, warum ich Tat dies für ul:
schweben:
zweiten mal nach transition-delay-und es wird ausgeblendet, nachdem mein drop-down-Liste geschlossen wurde animately ...
Hoffe noch jemand profitieren von dieser.
EDIT: ich kann einfach nicht glauben, dass die Leute tatsächlich mit diesem Prototyp! dieses Dropdown Menü ist nur für ein sub-Menü und das war ' s!!
Ich habe aktualisiert eine bessere haben kann, dass die beiden sub-Menü sowohl für ltr und rtl Richtungen mit IE-8-Unterstützung.
Fiddle für LTR
Fiddle für RTL
ich hoffe, jemand findet das nützlich in der Zukunft.
Können Sie den übergang von der Höhe:0 bis height:auto vorausgesetzt, Sie bieten auch min-height und max-height.
Flexbox-Lösung
Vorteile:
Nachteile:
Die Weise, die es funktioniert, ist durch immer mit flex-basis: auto für das element mit Inhalt, und den übergang von flex-grow und flex-shrink statt.
Edit: Verbesserte JS-Fiddle inspiriert von der Xbox One-Oberfläche.
CSS:
HTML:
JS Fiddle
Ich glaube, ich kam mit einem wirklich solide Lösung
OK! Ich weiß, dieses problem ist so alt wie das internet aber ich denke ich habe eine Lösung, die ich verwandelte sich in ein plugin namens mutant-übergang. Meine Lösung setzt die
style=""
Attribute für verfolgte Elemente, wenn es gibt eine änderung in der DOM. das Endergebnis ist, dass Sie verwenden können, good ole CSS für Ihre übergänge und nicht hacky-Updates oder spezielle javascript. Das einzige, was Sie tun müssen, ist gesetzt, was Sie wollen, zu verfolgen, auf das element in Frage, mitdata-mutant-attributes="X"
.Thats it! Diese Lösung verwendet MutationObserver zu Folgen änderungen in den DOM. Weil dieses, die Sie nicht wirklich haben zu setzen, etwas nach oben oder javascript verwenden, um manuell animieren Dinge. Änderungen werden automatisch erfasst. Jedoch, weil es nutzt MutationObserver, wird dies nur der übergang in IE11+.
Geigen!
height: auto
zuheight: 100%
height: auto
beim hinzufügen KinderHier ist ein Weg, um den übergang von einen beliebigen Startpunkt Höhe, einschließlich 0, auto (in voller Größe und flexibel), ohne dass die hard-code einstellen, der auf einer pro-Knoten-basis oder auf einer Benutzer-code zu initialisieren: https://github.com/csuwildcat/transition-auto. Dies ist im Grunde der Heilige Gral für das, was Sie wollen, ich glaube --> http://codepen.io/csuwldcat/pen/kwsdF. Nur schlagen das folgende JS-Datei in Ihre Seite, und alles, was Sie tun müssen, ist hinzufügen/entfernen einer einzelnen boolean-Attribut -
reveal=""
- aus den Knoten, die Sie möchten, zu erweitern und Vertrag.Hier ist alles, was Sie tun müssen, wie der Benutzer, sobald Sie fügen Sie den code-block finden Sie unten im Beispiel code:
Hier ist der code-block in der Seite, nach, dass, es ist alles Soße:
Fallen diese JS-Datei in Ihre Seite - es Funktioniert Einfach™
/* Code height: auto; übergang */
/* Code für die DEMO */
clip
als meine dummy-Eigenschaft auslösen, und aus irgendeinem Grund den IE gestoppt, so dass der clip animiert werden. Ich wechselte zu der Deckkraft, und es funktioniert alles wieder: codepen.io/csuwldcat/pen/FpzGa. Ich habe aktualisiert, der code in der Antwort zu entsprechen.Jake ' s Antwort zu animieren, die max-Höhe ist groß, aber ich fand die Verzögerung durch Einstellung einer großen max-height ärgerlich.
Einen bewegen könnte, die auch zerlegbar Inhalte in einen inneren div und berechnen Sie die maximale Höhe, indem man die Höhe des inneren div (per JQuery wäre es die outerHeight()).
Hier ein jsfiddle link: http://jsfiddle.net/pbatey/duZpT
Hier ein jsfiddle mit dem absoluten minimalen Menge an code erforderlich: http://jsfiddle.net/8ncjjxh8/
Weiter geht 's mit @jake' s Antwort, der übergang wird den ganzen Weg gehen, um die max Höhe erreicht, wodurch eine extrem schnelle animation - wenn Sie die übergänge für beide :hover-und ausschalten Sie können dann Steuern Sie die verrückte Geschwindigkeit ein wenig mehr.
Also die li:hover ist wenn die Maus betritt der Staat und dann der übergang auf den non-hovered-Eigenschaft wird mit der Maus verlassen.
Hoffentlich wird dies eine Hilfe sein.
e.g:
Hier ist ein Turnschuh: http://jsfiddle.net/BukwJ/
Ich merke, dieser thread ist alt, aber es zählt hoch auf bestimmten Google-Suchanfragen, so dass ich vermute, es lohnt sich zu aktualisieren.
Sie auch einfach nur get - /set-element der eigenen Höhe:
Sollten Sie dump das Javascript sofort nach target_box schließenden-tag, in einem inline-Skript-tag.
War ich in der Lage, dies zu tun. Ich habe eine
.child
& ein.parent
div. Das Kind div passt perfekt innerhalb des übergeordneten Elements Breite/Höhe mitabsolute
Positionierung. Ich animieren Sie dann dietranslate
Eigenschaft zu schieben istY
Wert nach unten100%
. Seine sehr glatte animation, keine Pannen oder unten Seiten wie jede andere Lösung.Etwas wie dieses, pseudo-code
Geben Sie ein
height
auf.parent
impx
,%
, oder lassen Sie alsauto
. Dieses div dann Masken aus der.child
div, wenn es nach unten gleitet.Hier ist eine Lösung, die ich nur in Kombination mit jQuery. Dies funktioniert für die folgende HTML-Struktur:
und die Funktion:
Könnte man dann verwenden Sie eine Klick-Funktion zum setzen und entfernen der Höhe mit
css()
CSS:
Ich habe seit kurzem den übergang der
max-height
auf dieli
Elemente eher als die Verpackungul
.Die Argumentation ist, dass die Verzögerung für kleine
max-heights
ist weit weniger Auffällig (wenn überhaupt) im Vergleich zu großenmax-heights
, und ich kann auch meinemax-height
Wert relativ zu derfont-size
desli
anstatt eine beliebige große Anzahl von mitems
oderrems
.Wenn meine Schriftgröße ist
1rem
, ich werde meinemax-height
etwas wie3rem
(um Platz für umbrochenen text). Sie können sehen, ein Beispiel hier:http://codepen.io/mindfullsilence/pen/DtzjE
Ich habe nicht alles im detail, aber ich hatte dieses problem vor kurzem und ich Tat, was folgt:
Somit haben Sie ein div-Element, das auf den ersten zeigt der Inhalt bis auf 200px Höhe und schweben, es ist eine Größe wird mindestens so hoch wie der gesamte Inhalt der div. Das Div wird nicht 3000px aber 3000px ist die Grenze, dass ich imposant. Stellen Sie sicher, dass der übergang auf den non :hover, sonst erhalten Sie möglicherweise einige seltsame rendering. Auf diese Weise wird der :hover erbt von der non :hover.
Übergang funktioniert nicht, form px % oder auto. Sie müssen dieselbe Maßeinheit.
Dies funktioniert gut für mich. Mit HTML5 macht es perfekt....
Daran erinnern, dass es immer eine Arbeit um... ; )
Hoffe jemand findet das nützlich
Dies ist nicht wirklich eine "Lösung" für das problem, sondern eher ein workaround. Es funktioniert nur, wie geschrieben, mit text, kann aber geändert werden, um andere Elemente benötigt, bin ich mir sicher.
Hier ist ein Beispiel: http://codepen.io/overthemike/pen/wzjRKa
Im wesentlichen stellen Sie die font-size auf 0 und der übergang statt von der Höhe und max-Höhe, oder scaleY() etc. bei einer schnell genug Tempo, um die Höhe zu verwandeln, was Sie wollen. Für die Transformation der tatsächlichen Höhe mit CSS auf auto ist derzeit nicht möglich, aber die Umwandlung der Inhalte in ist, daher auch der font-size übergang.
Verstehe ich die Frage fragt nach einer Lösung ohne JavaScript. Aber für Interessierte hier meine Lösung, die mit nur ein wenig JS.
ok, also das element, css, deren Höhe ändert ist standardmäßig
height: 0;
und beim öffnenheight: auto;
. Es hat auchtransition: height .25s ease-out;
. Aber natürlich ist das problem ist, dass es nicht den übergang zu oder vonheight: auto;
Also, was ich getan habe, ist beim öffnen oder schließen stellen Sie die Höhe der
scrollHeight
- Eigenschaft des Elements. Dieser neue inline-Stil haben eine höhere Spezifität und überschreiben sowohlheight: auto;
undheight: 0;
und der übergang verläuft.Beim öffnen füge ich ein
transitionend
Ereignis-listener, die laufen nur einmal, dann entfernen Sie den inline-style-Einstellung zurückheight: auto;
wodurch das element zum ändern der Größe, wenn nötig, wie in diesem komplexeren Beispiel mit sub-Menüs https://codepen.io/ninjabonsai/pen/GzYyVeBeim schließen Entferne ich die inline-style-rechts nach der nächsten Ereignis-Schleife Zyklus durch die Verwendung von setTimeout und ohne Verzögerung. Dies bedeutet
height: auto;
ist vorübergehend außer Kraft gesetzt, die ermöglicht den übergang zurück zuheight 0;
JS:
CSS:
HTML:
setTimeout
keine Verzögerung würde manchmal dazu führen, den übergang nicht passieren (das element, gehen auf null Höhe sofort), vermutlich, weil der DOM noch nicht aktualisiert wurde, mit der festen Höhe. Hinzufügen einer Verzögerung von sogar etwas ziemlich klein, wie50
es fest für mich.Des max-Höhe-Lösung von Jake funktioniert gut, wenn die hard-codiert
max-height-Wert geliefert wird, ist nicht viel größer als die Reale Höhe
(weil sonst gibt es unerwünschten Verzögerungen und timing-Probleme).
Auf der anderen Seite, wenn die hart-kodierten Wert versehentlich geändert wird
nicht größer als die wirkliche Höhe des Elements nicht öffnen vollständig.
Den folgenden CSS-Lösung erfordert auch eine hart-codierte Größe
sollte größer sein, als die meisten der auftretenden realen Größen. Doch diese
die Lösung funktioniert auch, wenn die echte Größe ist in manchen Situationen größer als
die hart-codierte Größe. In diesem Fall ist die Umstellung vielleicht ein bisschen springen,
aber es wird nie verlassen ein teilweise sichtbares element.
Also diese Lösung kann auch verwendet werden, für unbekannte Inhalte, z.B. von
eine Datenbank, wo Sie wissen, dass nur der Inhalt ist in der Regel nicht größer
als x Pixel, aber es gibt Ausnahmen.
Idee ist, verwenden Sie einen negativen Wert für margin-bottom (oder Marge-top für eine
leicht diffenrent animation) und das content-element in eine
mittlere element mit overflow:hidden. Die negative Marge aus dem Inhalt
element, so reduziert sich die Höhe des mittleren Elements.
Der folgende code verwendet ein übergang auf den margin-bottom von 150px zu
0px. Allein dies funktioniert gut, solange der content-element nicht
höher als 150px. Zusätzlich verwendet es eine Umstellung auf max-Höhe für die
mittlere element von 0px auf 100%. Diese schließlich blendet das mittlere element
wenn das content-element ist höher als 150px.
Für die max-Höhe, der übergang ist nur zu verzögern Ihre Anwendung
von einem zweiten, beim schließen, nicht für eine glatte visiual-Effekt (
und deshalb kann es laufen von 0px bis 100%).
CSS:
HTML:
Den Wert für margin-bottom sollte negativ sein und so nah wie
möglichen zum wirklichen Höhe des content-element. Wenn's absoute
Wert) größer ist, gibt es ähnliche Verzögerung und timing-Probleme, wie mit
die max-Höhe-Lösungen, die aber beschränkt werden kann, solange die
hart codierte Größe ist nicht viel größer als die Reale. Wenn der absolute
Wert für margin-bottom kleiner ist als die Reale Höhe der
tansition springt ein bisschen. In jedem Fall nach dem übergang der
content-element entweder vollständig sichtbar oder vollständig entfernt.
Für mehr details siehe mein blog-post http://www.taccgl.org/blog/css_transition_display.html#combined_height
Scheint es keine richtige Lösung.
max-height
Ansatz ist ganz gut, aber nicht gut für die Haut-phase - wird es zu einer merklichen Verzögerung, es sei denn, Sie wissen, die Höhe des Inhalts.Ich denke, der beste Weg ist die Verwendung
max-height
aber nur für die show-phase. Und nicht, um die animation zu verstecken. Für die meisten Fälle sollte es nicht entscheidend sein.max-height
sollte einen ganz großen Wert, um sicherzustellen, dass Inhalt passt. Animation kann die Geschwindigkeit gesteuert werden, mittransition
Dauer (speed = max-height /duration
). Die Geschwindigkeit hängt nicht von der Größe des Inhalts ist. Die Zeit, die es dauert, um zu zeigen, der gesamte Inhalt wird abhängig von seiner Größe.JS:
CSS:
HTML:
Legen Sie die height auf auto und den übergang des max-Höhe.
Getestet auf Chrome v17
Dies ist regelmäßiges problem hab ich gelöst, wie dies
http://jsfiddle.net/ipeshev/d1dfr0jz/
Versuchen, die Verzögerung der Status "geschlossen", um einige negative Zahl, und spielen Sie ein wenig mit dem Wert. Sie werden den Unterschied sehen.Es lassen sich fast zu liegen, das menschliche Auge ;).
Funktioniert es in den wichtigsten Browsern, aber gut genug für mich.
Es ist seltsam, aber geben Sie einige Ergebnisse.
Habe ich diese Arbeit durch das max-Höhe keine, immer die Höhe, re-legen Sie die maximale Höhe der berechneten Höhe. Funktioniert prefectly für mich. Ich habe diese Arbeit für ein Akkordeon-Menü, mit
<h5>
's als die toggler ausbau der<div>
innerhalb der<div>
.JS:
WENIGER:
WENIG JAVASCRIPT + SCSS LÖSUNG
Normalerweise verwende ich eine ganz andere Sichtweise und ein (sehr) kleines javascript. Die Sache ist die:
was wir wirklich wollen, ist die Veränderung der Höhe
Die Höhe ist die Summe aller Listenelemente innerhalb der Untermenüs
Wir wissen in der Regel die Höhe eines Listenelements, da wir stylen es
Also meine Lösung gilt für "normale" Untermenüs in denen die Gegenstände Namen haben nur 1 Zeile. Trotzdem, mit ein wenig mehr js könnte man unterbringen, die sogar mehr als 1 Zeile Namen.
Im Grunde, was ich Tue, ist einfach die Anzahl der Untermenüs Elemente und anwenden bestimmter Klassen entsprechend. Dann den ball auf (s)css. So zum Beispiel:
Können Sie jede Klasse/Selektor -, natürlich. An dieser Stelle haben wir die Untermenüs wie diese:
Und unser css wie dieses:
Wir haben auch einige scss Variablen, wie z.B. diese (willkürliches Beispiel):
Zu diesem Zeitpunkt davon ausgegangen, dass geöffnet Hauptmenüpunkte erhalten eine Klasse wie "geöffnet" oder ähnliches (Ihr implemetations..) können wir tun so etwas wie dieses:
Oder zu verkürzen bis:
Für die meisten der Zeit, dies wird den job tun. Hoffe, es hilft!
Für eine Reine CSS-Lösung, die animiert
max-height
, der nicht über eine massive Verspätung würde ich erwägen eine vernünftigemax-height
auf schweben, irgendwo um 500 Pixel oder rund um oder geringfügig größer als die Höhe der die meisten Elemente, die Sie animieren möchten, und haben größere Inhalte scrollen Sie durch die Einstellungoverflow-y
zuauto
nachdem die animation ist komplett mit einem 0,5 s Verzögerung.Dann festlegen, dass Ihr übergang, um Sie etwas rund um 0,3 s (oder etwas langsamer, wenn die Erweiterung am Ende verschieben andere Inhalte, um Sie auf Ihre Seite) mit einem exponentiellen Leichtigkeit-out-cubic-bezier-Kurve zu öffnen, und eine Leichtigkeit-in cubic-bezier-Kurve und etwas schneller auf schließen, etwa 0,15 s, wenn die Leute entlassen, etwas von der Seite, Sie in der Regel nicht wirklich wollen, warten, um zu sehen Sie gehen Weg.
Diese schnelle Animationen werden immer noch sichtbar für den Benutzer, und minimieren die Wirkung von max-height Verzögerung verursacht Ihrer Seite fühlen sich träge.
Würde der code wie folgt Aussehen:
Habe ich dieses Problem für eine Weile und heute kam auf diese Lösung:
Max-Höhe und dynamisch legen Sie die max-Höhe, basierend auf der berechneten Höhe der den Inhalt des Containers
animieren, um in voller Größe:
animieren zu kleiner Größe:
verwenden CSS3 transition:max-Höhe;
Diese Weise vermeiden Sie die glitchy auf der Suche animation von Weg-zu groß die Höhe UND Sie nicht laufen das Risiko von clipping Ihre Inhalte.
Ich habe dieses problem und mein workaround gefunden.
Erstens habe ich versucht zu verwenden
max-height
. Aber es gibt zwei Probleme:max-height
, da ich den ausbau eine unbekannte Länge-text-block.max-height
zu groß ist, gibt es eine große Verzögerung, wenn es kollabiert.Dann, mein workaround:
Den scss:
Kurzen code-Beispiel:
Check-out mein post auf eine etwas Verwandte Frage stellen.
Grundsätzlich beginnen bei
height: 0px;
, und lassen Sie es die Umstellung auf eine genaue Höhe berechnet wird, indem JavaScript.Wenn die Seite geladen/geändert, das element mit der Klasse
info
seinenh
- Attribut aktualisiert. Dann eine Schaltfläche löst diestyle="height: __"
zu finden, die zuvor eingestellth
Wert.Hier ist das styling für die
info
Klasse.Styling möglicherweise nicht unterstützt cross-browser. Hier ist das lebende Beispiel für diesen code:
CodePen
Sondern die Höhe, Sie verwenden so etwas wie unter einer
Funktioniert auch Super. Bitte fügen Sie Präfixe. Hoffe, das jemand hilft.
PS: wenn Sie noch brauchen, Höhe 0 bis Höhe etwas schwarze Magie, die Sie hinzufügen können
height: 0;
zu#child0
und fügen Sieheight: inherit
zu#parent0:hover #child0
. Gleichzeitig können Sie hinzufügen übergang in der Höhe individuell oder einfach nur Sie alle.Dies ist was für mich funktioniert:
müssen Sie Sie in all Ihren Kinder-Komponente und wechseln Sie mit jQuery oder Reagieren Staat, hier mein Fall (mit next.js und Stil-Komponenten): https://codesandbox.io/s/ol3kl56q9q
Habe ich das auch gemacht mit jQuery. In meinem Fall wollte ich ein bisschen von den anderen Menü (10px). Damit dies funktioniert ohne Javascript (aber kein übergang auch).
Dies ist mein js:
Hoffe, das jemand hilft 🙂
Lösungen, die javascript verwendet, aber es ist sehr trivial und es funktioniert ganz gut.
HTML:
CSS:
Javascript:
http://jsfiddle.net/r109uz7m/ (enthält einen workaround, um den Nachteil, erklärte unten):
Der einzige Nachteil ist, müssen Sie aktualisieren Sie die Größe des Behälters, wenn der Inhalt sich ändert. In den meisten Fällen verwenden, können Sie diese Einschränkung umgehen (genauso, wie es ist getan in der jsfiddle).
dies ist, was ich benutzt habe.
Grundsätzlich bekomme ich alle Kinder-Elemente, Höhe, zusammenfassen, und legen Sie dann die max-height für das element, das überschreiben der Klasse (Sie können stellen Sie eine eigene Klasse, so können Sie mehrere Instanzen).
Check it out.