Vous devriez utiliser scaleY.
ul { background-color: #eee; transform: scaleY(0); transform-origin: top; transition: transform 0.26s ease; } p:hover ~ ul { transform: scaleY(1); }
<p>Hover This</p> <ul> <li>Coffee</li> <li>Tea</li> <li>Milk</li> </ul>
J'ai créé une version préfixée par le fournisseur du code ci-dessus sur jsfiddle et j'ai modifié votre jsfiddle pour utiliser scaleY au lieu de height.
Modifier
Certaines personnes n'aiment pas scaleY
轉(zhuǎn)換內(nèi)容的方式。如果這是一個(gè)問(wèn)題,那么我建議使用 clip
à la place.
ul { clip: rect(auto, auto, 0, auto); position: absolute; margin: -1rem 0; padding: .5rem; color: white; background-color: rgba(0, 0, 0, 0.8); transition-property: clip; transition-duration: 0.5s; transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); } h3:hover ~ ul, h3:active ~ ul, ul:hover { clip: rect(auto, auto, 10rem, auto); }
<h3>Hover here</h3> <ul> <li>This list</li> <li>is clipped.</li> <li>A clip transition</li> <li>will show it</li> </ul> <p> Some text... </p>
Utilisez max-height
,而不是height
。并將 max-height
dans la transition et définissez la valeur sur une valeur supérieure à celle de votre bo?te.
Voir la réponse de Chris Jordan ici dans une autre démo JSFiddle /stackoverflow.com/a/20226830/18706">
#menu #list { max-height: 0; transition: max-height 0.15s ease-out; overflow: hidden; background: #d5d5d5; } #menu:hover #list { max-height: 500px; transition: max-height 0.25s ease-in; }
<div id="menu"> <a>hover me</a> <ul id="list"> <!-- Create a bunch, or not a bunch, of li's to see the timing. --> <li>item</li> <li>item</li> <li>item</li> <li>item</li> <li>item</li> </ul> </div>