J'essaie de faire une <ul>
diapositive en utilisant des transitions CSS.
Le <ul>
commence à height: 0;
. En vol stationnaire, la hauteur est définie sur height:auto;
. Cependant, cela le fait simplement apparaître, pas une transition,
Si je le fais de height: 40px;
à height: auto;
, alors il glissera jusqu'à height: 0;
, puis sautera soudainement à la bonne hauteur.
Sinon, comment pourrais-je faire cela sans utiliser JavaScript?
#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;
}
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>
css
css-transitions
Hailwood
la source
la source
height:auto/max-height
solution ne fonctionnera que si vous agrandissez la zone est supérieure à celle queheight
vous souhaitez restreindre. Si vous avez unmax-height
de300px
, mais une liste déroulante de zone de liste déroulante, qui peut retourner50px
, puismax-height
ne vous aidera pas,50px
est variable en fonction du nombre d'éléments, vous pouvez arriver à une situation impossible où je ne peux pas le réparer parce que leheight
n'est pas fixe,height:auto
était la solution, mais je ne peux pas utiliser de transitions avec cela.Réponses:
Utilisez
max-height
dans la transition et nonheight
. Et définissez une valeur surmax-height
quelque chose de plus grand que votre boîte ne pourra jamais obtenir.Voir la démo JSFiddle fournie par Chris Jordan dans une autre réponse ici.
la source
Vous devriez utiliser scaleY à la place.
J'ai créé une version préfixée par le vendeur du code ci-dessus sur jsfiddle et changé votre jsfiddle pour utiliser scaleY au lieu de height.
la source
Vous ne pouvez pas actuellement animer en hauteur lorsque l'une des hauteurs impliquées est
auto
, vous devez définir deux hauteurs explicites.la source
this.$element[dimension](this.$element[dimension]())[0].offsetHeight
auto
...La solution que je l' ai toujours utilisé était d'abord hors de fondu, puis rétrécir les
font-size
,padding
et lesmargin
valeurs. Il ne ressemble pas à une lingette, mais il fonctionne sans statiqueheight
oumax-height
.Exemple de travail:
la source
*
et en appliquant d'autres modifications. Les boutons auraient dû être affectés par mon code ci-dessus, s'ils étaient correctement stylisés avecem
.line-height: 0;
etborder-width: 0;
line-height
si vous évitez correctement les unités sur la valeur: developer.mozilla.org/en-US/docs/Web/CSS/…Je sais que c'est la trentaine de réponse à cette question, mais je pense que ça vaut le coup, alors voilà. Il s'agit d'une solution CSS uniquement avec les propriétés suivantes:
transform: scaleY(0)
), donc cela fait la bonne chose s'il y a du contenu après l'élément pliable.height: auto
), tout le contenu a toujours la bonne hauteur (contrairement par exemple si vous choisissez unmax-height
qui se révèle être trop bas). Et à l'état replié, la hauteur est nulle comme il se doit.Démo
Voici une démo avec trois éléments pliables, tous de hauteurs différentes, qui utilisent tous le même CSS. Vous voudrez peut-être cliquer sur "pleine page" après avoir cliqué sur "exécuter l'extrait". Notez que le JavaScript ne fait que basculer la
collapsed
classe CSS, aucune mesure n'est impliquée. (Vous pouvez faire cette démonstration exacte sans aucun JavaScript en utilisant une case à cocher ou:target
). Notez également que la partie du CSS responsable de la transition est assez courte et que le HTML ne nécessite qu'un seul élément wrapper supplémentaire.Comment ça marche?
Il y a en fait deux transitions impliquées pour que cela se produise. L'un d'eux transite
margin-bottom
de 0px (à l'état développé) à-2000px
l'état réduit (similaire à cette réponse ). Le 2000 ici est le premier chiffre magique, il est basé sur l'hypothèse que votre boîte ne sera pas plus élevée que cela (2000 pixels semble être un choix raisonnable).L'utilisation
margin-bottom
seule de la transition pose deux problèmes:margin-bottom: -2000px
tout ne sera pas caché - il y aura des choses visibles même dans le cas replié. Il s'agit d'une correction mineure que nous ferons plus tard.La correction de ce deuxième problème est là où la deuxième transition entre en jeu, et cette transition cible conceptuellement la hauteur minimale de l'encapsuleur ("conceptuellement" parce que nous n'utilisons pas réellement la
min-height
propriété pour cela; plus à ce sujet plus tard).Voici une animation qui montre comment la combinaison de la transition de la marge inférieure avec la transition de la hauteur minimale, toutes deux de durée égale, nous donne une transition combinée de la pleine hauteur à la hauteur zéro qui a la même durée.
La barre de gauche montre comment la marge inférieure négative pousse le bas vers le haut, réduisant la hauteur visible. La barre du milieu montre comment la hauteur minimale garantit que dans le cas de la fermeture, la transition ne se termine pas tôt et dans le cas en expansion, la transition ne commence pas tard. La barre de droite montre comment la combinaison des deux fait passer la boîte de la pleine hauteur à la hauteur zéro dans le bon laps de temps.
Pour ma démo, j'ai choisi 50px comme valeur de hauteur minimale supérieure. Il s'agit du deuxième nombre magique, et il devrait être inférieur à la hauteur de la boîte. 50px semble également raisonnable; il semble peu probable que vous souhaitiez très souvent rendre un élément pliable qui n'a même pas 50 pixels de haut en premier lieu.
Comme vous pouvez le voir dans l'animation, la transition résultante est continue, mais elle n'est pas différenciable - au moment où la hauteur minimale est égale à la hauteur totale ajustée par la marge inférieure, il y a un changement soudain de vitesse. Ceci est très visible dans l'animation car elle utilise une fonction de synchronisation linéaire pour les deux transitions et parce que la transition entière est très lente. Dans le cas réel (ma démo en haut), la transition ne prend que 300 ms et la transition de la marge inférieure n'est pas linéaire. J'ai joué avec de nombreuses fonctions de synchronisation différentes pour les deux transitions, et celles avec lesquelles je me suis retrouvé me semblaient fonctionner le mieux pour la plus grande variété de cas.
Deux problèmes restent à résoudre:
Nous résolvons le premier problème en donnant à l'élément conteneur un
max-height: 0
dans le cas réduit, avec une0s 0.3s
transition. Cela signifie que ce n'est pas vraiment une transition, mais quemax-height
c'est appliqué avec un retard; il ne s'applique qu'une fois la transition terminée. Pour que cela fonctionne correctement, nous devons également choisir une valeur numériquemax-height
pour l'état opposé, non effondré. Mais contrairement au cas 2000px, où le choix d'un nombre trop important affecte la qualité de la transition, dans ce cas, cela n'a vraiment pas d'importance. Nous pouvons donc simplement choisir un nombre si élevé que nous savons qu'aucune hauteur ne pourra jamais s'en approcher. J'ai choisi un million de pixels. Si vous pensez que vous devrez peut-être prendre en charge un contenu d'une hauteur de plus d'un million de pixels, alors 1) je suis désolé et 2) ajoutez simplement quelques zéros.Le deuxième problème est la raison pour laquelle nous n'utilisons pas réellement
min-height
pour la transition de hauteur minimale. Au lieu de cela, il y a un::after
pseudo-élément dans le conteneur avec unheight
qui passe de 50px à zéro. Cela a le même effet qu'unmin-height
: il ne laissera pas le conteneur rétrécir en dessous de la hauteur actuelle du pseudo-élément. Mais parce que nous utilisonsheight
, nonmin-height
, nous pouvons maintenant utilisermax-height
(une fois de plus appliqué avec un retard) pour définir la hauteur réelle du pseudo-élément à zéro une fois la transition terminée, garantissant qu'au moins en dehors de la transition, même les petits éléments ont le hauteur correcte. Parce quemin-height
est plus fort quemax-height
, cela ne fonctionnerait pas si nous utilisions le conteneur aumin-height
lieu du pseudo-élémentheight
. Tout commemax-height
dans le paragraphe précédent, celamax-height
nécessite également une valeur pour l'extrémité opposée de la transition. Mais dans ce cas, nous pouvons simplement choisir le 50px.Testé dans Chrome (Win, Mac, Android, iOS), Firefox (Win, Mac, Android), Edge, IE11 (à l'exception d'un problème de mise en page flexbox avec ma démo que je n'ai pas pris la peine de déboguer) et Safari (Mac, iOS ). En parlant de flexbox, il devrait être possible de faire ce travail sans utiliser de flexbox; en fait, je pense que vous pourriez faire fonctionner presque tout dans IE7 - à l'exception du fait que vous n'aurez pas de transitions CSS, ce qui en fait un exercice plutôt inutile.
la source
collapsible-wrapper
a une position absolue. Leoverflow: hidden
sur le parent est requis pour la transition mais interfère avec les éléments absolument positionnés.clip-path: polygon(...)
au lieu deoverflow: hidden
, car contrairement au dernier, vous pouvez faire la transition du premier. Pour remplacer les anciens navigateurs, j'ai utilisé une transformation de mise à l'échelle supplémentaire. Voir le commentaire en haut de github.com/StackExchange/Stacks/blob/develop/lib/css/components/…Vous pouvez, avec un peu de jiggery-pokery non sémantique. Mon approche habituelle consiste à animer la hauteur d'un DIV externe qui a un seul enfant qui est un DIV sans style utilisé uniquement pour mesurer la hauteur du contenu.
On aimerait juste pouvoir se passer de
.measuringWrapper
et régler la hauteur du DIV sur auto et avoir cette animation, mais cela ne semble pas fonctionner (la hauteur est définie, mais aucune animation ne se produit).Mon interprétation est qu'une hauteur explicite est nécessaire pour que l'animation s'exécute. Vous ne pouvez pas obtenir une animation sur la hauteur lorsque la hauteur (la hauteur de début ou de fin) est
auto
.la source
max-height
, pas besoinauto
, et surtout pas besoin de Javascript !! Juste deux déclarations simplesmargin-top
(etmargin-bottom
) sont relatifs à la largeur lorsqu'ils sont définis en pourcentages, oui, c'est stupide, mais cela explique également pourquoi les temporisations d'animation d'ouverture et de fermeture sont complètement différentes - c'est la même chose que vous voyez dans la réponse la mieux notée, en spécifiant un dur -hauteur max codée. Pourquoi est-ce si difficile à faire correctement?Une solution visuelle pour animer la hauteur à l'aide de transitions CSS3 consiste à animer le remplissage à la place.
Vous n'obtenez pas tout à fait l'effet d'effacement complet, mais jouer avec la durée de transition et les valeurs de remplissage devrait vous rapprocher suffisamment. Si vous ne voulez pas définir explicitement hauteur / hauteur maximale, cela devrait être ce que vous recherchez.
http://jsfiddle.net/catharsis/n5XfG/17/ (riffed au-dessus de stephband's jsFiddle)
la source
Ma solution consiste à faire passer la hauteur maximale à la hauteur exacte du contenu pour une animation fluide et agréable, puis à utiliser un rappel transitionEnd pour définir la hauteur maximale à 9999 pixels afin que le contenu puisse être redimensionné librement.
la source
.stop
fait l'affaire pour le problème de boucle d'animation plutôt complexe. Maintenant, lorsque vous animez la hauteur et la couleur mais que vous souhaitez interrompre uniquement l'animation de la hauteur, les choses deviennent un peu plus délicates ... Je comprends votre point.La réponse acceptée fonctionne dans la plupart des cas, mais elle ne fonctionne pas bien lorsque votre
div
hauteur peut varier considérablement - la vitesse d'animation ne dépend pas de la hauteur réelle du contenu et peut sembler saccadée.Vous pouvez toujours effectuer l'animation réelle avec CSS, mais vous devez utiliser JavaScript pour calculer la hauteur des éléments, au lieu d'essayer d'utiliser
auto
. Aucune jQuery n'est requise, bien que vous deviez peut-être la modifier un peu si vous souhaitez la compatibilité (fonctionne dans la dernière version de Chrome :)).la source
document.getElementById('mydiv')
ou$('#mydiv').get()
), et la fonction bascule entre le masquer / l'afficher. Si vous configurez des transitions CSS, l'élément s'animera automatiquement.min-height
comme dans la réponse attendue entraîne des problèmes de vitesse d'animation lorsque la taille de la liste peut varier considérablement).Il y avait peu de mention de la
Element.scrollHeight
propriété qui peut être utile ici et peut toujours être utilisée avec une transition CSS pure. La propriété contient toujours la hauteur "complète" d'un élément, indépendamment du fait que son contenu déborde ou non en raison de la hauteur réduite (par exempleheight: 0
).En tant que tel, pour un
height: 0
élément (effectivement complètement effondré), sa hauteur "normale" ou "pleine" est toujours facilement disponible grâce à sascrollHeight
valeur (invariablement une longueur de pixel ).Pour un tel élément, en supposant qu'il a déjà la transition configurée comme par exemple (en utilisant
ul
selon la question d'origine):Nous pouvons déclencher "l'expansion" animée souhaitée de la hauteur, en utilisant uniquement CSS, avec quelque chose comme ce qui suit (ici en supposant que la
ul
variable se réfère à la liste):C'est ça. Si vous devez réduire la liste, l'une des deux instructions suivantes fera l'affaire:
Mon cas d'utilisation particulier tournait autour de l'animation de listes de longueurs inconnues et souvent considérables, donc je n'étais pas à l'aise de m'installer sur une "assez grande"
height
ou unemax-height
spécification arbitraire et de risquer le contenu coupé ou le contenu que vous devez soudainement faire défiler (sioverflow: auto
, par exemple) . De plus, l'assouplissement et le timing sont rompus avec lesmax-height
solutions basées sur les bases, car la hauteur utilisée peut atteindre sa valeur maximale beaucoup plus tôt qu'elle ne le faudrait pour l'max-height
atteindre9999px
. Et à mesure que les résolutions d'écran augmentent, les longueurs de pixels comme9999px
laissent un mauvais goût dans ma bouche. Cette solution particulière résout le problème d'une manière élégante, à mon avis.Enfin, nous espérons que les futures révisions des adresses CSS devront faire ce genre de choses encore plus élégamment - revisiter la notion de valeurs "calculées" vs "utilisées" et "résolues", et examiner si les transitions devraient s'appliquer aux données calculées valeurs, y compris les transitions avec
width
etheight
(qui bénéficient actuellement d'un traitement spécial).la source
Element.scrollHeight
propriété nécessite JavaScript et, comme l'indique clairement la question, ils veulent le faire sans JavaScript.Utilisation
max-height
avec un assouplissement et un délai de transition différents pour chaque état.HTML:
CSS:
Voir l'exemple: http://jsfiddle.net/0hnjehjc/1/
la source
999999px
. Cela, en revanche, décale votre animation, car les images sont calculées à partir de cette valeur. Vous pourriez donc vous retrouver avec un "retard" d'animation dans un sens et une fin très rapide dans l'autre sens (corr: timing-functions)Pas de valeurs codées en dur.
Pas de JavaScript.
Aucune approximation.
L'astuce consiste à utiliser un caché et dupliqué
div
pour que le navigateur comprenne ce que signifie 100%.Cette méthode convient chaque fois que vous pouvez dupliquer le DOM de l'élément que vous souhaitez animer.
la source
transform: scaleY(1)
, car cette transition ne supprime pas l'espace.Alors que je poste ceci, il y a déjà plus de 30 réponses, mais je pense que ma réponse améliore la réponse déjà acceptée par jake.
Je n'étais pas satisfait du problème qui résulte de la simple utilisation des
max-height
transitions CSS3, car comme de nombreux commentateurs l'ont noté, vous devez définir votremax-height
valeur très près de la hauteur réelle ou vous obtiendrez un retard. Voir ce JSFiddle pour un exemple de ce problème.Pour contourner cela (tout en n'utilisant pas de JavaScript), j'ai ajouté un autre élément HTML qui transite la
transform: translateY
valeur CSS.Ce moyen à la fois
max-height
ettranslateY
sont utilisés:max-height
permet à l'élément de pousser vers le bas des éléments ci - dessous, tout entranslateY
donne l'effet « instantané » nous voulons. Le problème avecmax-height
existe toujours, mais son effet est atténué. Cela signifie que vous pouvez définir une hauteur beaucoup plus grande pour votremax-height
valeur et vous en soucier moins.L'avantage général est que lors de la transition de retour (l'effondrement), l'utilisateur voit
translateY
immédiatement l' animation, donc peu importe le temps que celamax-height
prend.Solution en tant que violon
la source
translateY
plusscale
parce que je ne l' ai pas comme la façon dontscale
a donné cet effet de compression.Ok, donc je pense que j'ai trouvé une réponse super simple ... non
max-height
, utilise lerelative
positionnement, travaille sur lesli
éléments, et c'est du pur CSS. Je n'ai testé rien d'autre que Firefox, bien qu'à en juger par le CSS, il devrait fonctionner sur tous les navigateurs.FIDDLE: http://jsfiddle.net/n5XfG/2596/
CSS
HTML
la source
EDIT: faites défiler vers le bas pour la réponse mise à jour
Je faisais une liste déroulante et j'ai vu ce message ... beaucoup de réponses différentes mais je décide de partager ma liste déroulante aussi, ... Ce n'est pas parfait mais au moins il n'utilisera que du CSS pour menu déroulant! J'ai utilisé transform: translateY (y) pour transformer la liste en vue ...
Vous pouvez en voir plus dans le test
http://jsfiddle.net/BVEpc/4/
J'ai placé div derrière chaque li parce que mon la liste déroulante vient de haut et pour leur montrer correctement c'était nécessaire, mon code div est:
et planer est:
et parce que ul height est réglé sur le contenu, il peut dépasser le contenu de votre corps, c'est pourquoi j'ai fait cela pour ul:
et survoler:
la deuxième fois après la transition est un retard et il sera caché après la fermeture animée de ma liste déroulante ...
J'espère que quelqu'un bénéficiera de celle-ci plus tard.
EDIT: Je ne peux pas croire que ppl utilise réellement ce prototype! ce menu déroulant est uniquement pour un sous-menu et c'est tout !! J'ai mis à jour un meilleur qui peut avoir deux sous-menus pour la direction ltr et rtl avec le support IE 8.
Fiddle for LTR
Fiddle for RTL
j'espère que quelqu'un trouvera cela utile à l'avenir.
la source
Vous pouvez passer de la hauteur: 0 à la hauteur: auto à condition de fournir également la hauteur minimale et la hauteur maximale.
la source
Solution Flexbox
Avantages:
Les inconvénients:
La façon dont cela fonctionne consiste à toujours avoir flex-base: auto sur l'élément avec le contenu, et à la place la transition flex-grow et flex-shrink.
Edit: Amélioration de JS Fiddle inspiré par l'interface Xbox One.
JS Fiddle
la source
En développant la réponse de @ jake, la transition ira jusqu'à la valeur de hauteur maximale, provoquant une animation extrêmement rapide - si vous définissez les transitions pour les deux: survolez et éteignez, vous pouvez alors contrôler un peu plus la vitesse folle.
Ainsi, le li: hover est lorsque la souris entre dans l'état, puis la transition sur la propriété non survolée sera le congé de la souris.
J'espère que cela vous sera utile.
par exemple:
Voici un violon: http://jsfiddle.net/BukwJ/
la source
Je pense avoir trouvé une solution vraiment solide
D'ACCORD! Je sais que ce problème est aussi ancien qu'Internet mais je pense avoir une solution que j'ai transformée en un plugin appelé mutant-transition . Ma solution définit les
style=""
attributs des éléments suivis chaque fois qu'il y a un changement dans le DOM. le résultat final est que vous pouvez utiliser un bon vieux CSS pour vos transitions et ne pas utiliser de correctifs hacky ou de javascript spécial. La seule chose que vous avez à faire est de définir ce que vous souhaitez suivre sur l'élément en question à l'aidedata-mutant-attributes="X"
.C'est ça! Cette solution utilise MutationObserver pour suivre les changements dans le DOM. Pour cette raison, vous n'avez pas vraiment besoin de configurer quoi que ce soit ou d'utiliser javascript pour animer manuellement les choses. Les modifications sont suivies automatiquement. Cependant, car il utilise MutationObserver, cela ne fera que la transition dans IE11 +.
Fiddles!
height: auto
àheight: 100%
height: auto
lors de l'ajout d'enfantsla source
Voici un moyen de passer de n'importe quelle hauteur de départ, y compris 0, à auto (pleine taille et flexible) sans nécessiter de code défini sur une base par nœud ou de code utilisateur pour initialiser: https://github.com/csuwildcat / transition-auto . C'est fondamentalement le Saint Graal pour ce que vous voulez, je crois -> http://codepen.io/csuwldcat/pen/kwsdF . Insérez simplement le fichier JS suivant dans votre page, et tout ce que vous devez faire après cela est d'ajouter / supprimer un seul attribut booléen -
reveal=""
- des nœuds que vous souhaitez développer et contracter.Voici tout ce que vous devez faire en tant qu'utilisateur, une fois que vous avez inclus le bloc de code situé sous l'exemple de code:
Voici le bloc de code à inclure dans votre page, après cela, c'est toute la sauce:
Déposez ce fichier JS dans votre page - tout cela fonctionne correctement ™
/ * Code de hauteur: auto; transition * /
/ * Code pour DEMO * /
la source
clip
comme déclencheur de propriété factice, et pour une raison quelconque, IE a cessé d'autoriser l'animation du clip. Je suis passé à l'opacité, et tout fonctionne à nouveau: codepen.io/csuwldcat/pen/FpzGa . J'ai mis à jour le code dans la réponse pour qu'il corresponde.La réponse de Jake pour animer la hauteur maximale est excellente, mais j'ai trouvé le retard causé par la définition d'une grande hauteur maximale ennuyeux.
On pourrait déplacer le contenu pliable dans une div intérieure et calculer la hauteur maximale en obtenant la hauteur de la div intérieure (via JQuery ce serait le externeHeight ()).
Voici un lien jsfiddle: http://jsfiddle.net/pbatey/duZpT
Voici un jsfiddle avec la quantité minimale absolue de code requise: http://jsfiddle.net/8ncjjxh8/
la source
Je me rends compte que ce fil vieillit, mais il occupe un rang élevé dans certaines recherches Google, donc je pense qu'il vaut la peine d'être mis à jour.
Vous obtenez également / définissez simplement la hauteur de l'élément:
Vous devez vider ce Javascript immédiatement après la balise de fermeture de target_box dans une balise de script en ligne.
la source
J'ai pu faire ça. J'ai un
.child
& un.parent
div. Le div enfant s'intègre parfaitement dans la largeur / hauteur du parent avec leabsolute
positionnement. J'anime ensuite latranslate
propriété pour faireY
baisser sa valeur100%
. Son animation très fluide, sans pépins ni inconvénients comme toute autre solution ici.Quelque chose comme ça, pseudo-code
Vous spécifiez un
height
sur.parent
, danspx
,%
ou congé commeauto
. Ce div masque ensuite le.child
div lorsqu'il glisse vers le bas.la source
J'ai posté une réponse avec du JavaScript et j'ai été rétrogradé, alors j'ai été ennuyé et j'ai essayé à nouveau, et je l'ai craqué avec CSS uniquement!
Cette solution utilise quelques «techniques»:
padding-bottom:100%
'hack' où les pourcentages sont définis en termes de largeur actuelle de l'élément. Plus d'informations sur cette technique.Le résultat est que nous obtenons une transition performante en utilisant uniquement CSS, et une seule fonction de transition pour réaliser la transition en douceur; le Saint-Graal!
Bien sûr, il y a un inconvénient! Je ne peux pas déterminer comment contrôler la largeur à laquelle le contenu est coupé (
overflow:hidden
); en raison du hack de rembourrage, la largeur et la hauteur sont intimement liées. Il y a peut-être un moyen, alors j'y reviendrai.https://jsfiddle.net/EoghanM/n1rp3zb4/28/
la source
input[type="checkbox"]:checked
au lieu de:hover
si vous le souhaitez (c'est-à-dire que vous ne voulez pas utiliser JavaScript pour ajouter des classes)Voici une solution que je viens d'utiliser en combinaison avec jQuery. Cela fonctionne pour la structure HTML suivante:
et la fonction:
Vous pouvez ensuite utiliser une fonction de clic pour définir et supprimer la hauteur à l'aide
css()
CSS:
la source
J'ai récemment effectué la transition
max-height
sur lesli
éléments plutôt que sur l'emballageul
.Le raisonnement est que le délai pour les petits
max-heights
est beaucoup moins perceptible (voire pas du tout) par rapport aux grandsmax-heights
, et je peux également définir mamax-height
valeur par rapport àfont-size
lali
plutôt qu'à un nombre énorme arbitraire en utilisantems
ourems
.Si ma taille de police est
1rem
, je vais définir monmax-height
quelque chose comme3rem
(pour accueillir le texte enveloppé). Vous pouvez voir un exemple ici:http://codepen.io/mindfullsilence/pen/DtzjE
la source
Je n'ai pas tout lu en détail mais j'ai eu ce problème récemment et j'ai fait ce qui suit:
Cela vous permet d'avoir un div qui affiche d'abord du contenu jusqu'à 200px de hauteur et en vol stationnaire, sa taille devient au moins aussi élevée que le contenu entier du div. La Div ne devient pas 3000px mais 3000px est la limite que j'impose. Assurez-vous d'avoir la transition sur le non: hover, sinon vous pourriez obtenir un rendu étrange. De cette façon, le: hover hérite du non: hover.
La transition ne fonctionne pas du format px vers% ou vers auto. Vous devez utiliser la même unité de mesure. Cela fonctionne bien pour moi. L'utilisation de HTML5 le rend parfait ....
N'oubliez pas qu'il y a toujours un travail à faire ...; )
J'espère que quelqu'un trouve cela utile
la source
La solution de hauteur maximale de Jake fonctionne bien si la valeur de hauteur maximale codée en dur fournie n'est pas beaucoup plus grande que la hauteur réelle (car sinon il y a des retards indésirables et des problèmes de synchronisation). D'un autre côté, si la valeur codée en dur n'est pas accidentellement plus grande que la hauteur réelle, l'élément ne s'ouvrira pas complètement.
La solution CSS uniquement suivante nécessite également une taille codée en dur qui doit être supérieure à la plupart des tailles réelles présentes. Cependant, cette solution fonctionne également si la taille réelle est dans certains cas plus grande que la taille codée en dur. Dans ce cas, la transition pourrait sauter un peu, mais elle ne laissera jamais un élément partiellement visible. Cette solution pourrait donc également être utilisée pour du contenu inconnu, par exemple à partir d'une base de données, où vous savez simplement que le contenu n'est généralement pas plus grand que x pixels, mais il y a des exceptions.
L'idée est d'utiliser une valeur négative pour margin-bottom (ou margin-top pour une animation légèrement différente) et de placer l'élément de contenu dans un élément central avec débordement: caché. La marge négative de l'élément de contenu réduit ainsi la hauteur de l'élément central.
Le code suivant utilise une transition sur margin-bottom de -150px à 0px. Cela seul fonctionne très bien tant que l'élément de contenu n'est pas supérieur à 150 px. De plus, il utilise une transition sur max-height pour l'élément central de 0px à 100%. Cela masque finalement l'élément central si l'élément de contenu est supérieur à 150 px. Pour la hauteur maximale, la transition est juste utilisée pour retarder son application d'une seconde lors de la fermeture, pas pour un effet visuel fluide (et donc elle peut aller de 0px à 100%).
CSS:
HTML:
La valeur de margin bottom doit être négative et aussi proche que possible de la hauteur réelle de l'élément de contenu. Si elle (la valeur d'absoute) est plus grande, il existe des problèmes de retard et de synchronisation similaires à ceux des solutions de hauteur maximale, qui peuvent cependant être limités tant que la taille codée en dur n'est pas beaucoup plus grande que la vraie. Si la valeur absolue de margin-bottom est inférieure à la hauteur réelle, la transition saute un peu. Dans tous les cas, après la transition, l'élément de contenu est entièrement affiché ou entièrement supprimé.
Pour plus de détails, voir mon article de blog http://www.taccgl.org/blog/css_transition_display.html#combined_height
la source
Vous pouvez le faire en créant une animation inverse (repliée) avec clip-path.
la source
Ce n'est pas exactement une «solution» au problème, mais plutôt une solution de contournement. Il fonctionne uniquement comme écrit avec du texte, mais peut être modifié pour fonctionner avec d'autres éléments selon les besoins, je suis sûr.
Voici un exemple: http://codepen.io/overthemike/pen/wzjRKa
Essentiellement, vous définissez la taille de la police sur 0 et effectuez la transition au lieu de la hauteur, ou la hauteur maximale, ou scaleY (), etc. à un rythme suffisamment rapide pour que la hauteur se transforme en ce que vous voulez. Transformer la hauteur réelle avec CSS en auto n'est actuellement pas possible, mais la transformation du contenu à l'intérieur l'est, d'où la transition de la taille de la police.
la source