You are max-height animations, not height . The max-height animation is a trick that is used to animate the height of elements with an unknown height. You specify a very large max-height , and while the unknown height is less than the maximum height, it works. The only drawback is that since your animation process is larger than your actual height, it will have a delay. In this case, your max-height is 500 pixels, and the height (including indentation) is only 220 pixels, which means that more than the time (~ 1.1 sec), it simply reduces the maximum height to 220 pixels, and when it goes there gets the visual starts to revive.
If, like this example, you know the actual height of the element (220 = padding 10 + innerBody height 200), you can animate the exact height.
If you donβt know the height in advance, try lowering the max-height estimates and use acceleration that starts quickly, such as ease-out , or use javascript to set the height of the beginning and end.
Known height: 220px (watch in full screen ):
var heading = document.getElementById('heading'), body = document.getElementById('body'); heading.addEventListener('click', hide); body.addEventListener('transitionend', hideCallback); function hide() { body.className = 'hide'; } function hideCallback(e) { console.log(e.propertyName); }
#wrapper { margin: auto; background-color: blue; width: 470px; text-align: center; overflow: hidden; box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.17); max-height: 400px; max-width: 600px; padding: 0; } #buttonContainer { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; align-content: center; flex-direction: column; margin: auto; width: 100px; height: 100px; color: white; } #buttonIcon { width: 36px; height: 36px; line-height: 36px; font-size: 35px; font-weight: bold; display: inline-block; } #buttonLabel { font-size: 20px; } #content { width: 100%; height: 100%; text-align: left; transform: translateY(0px); } #heading { color: white; text-align: right; margin: 10px; font-size: 17px; } #body { color: #000; color: rgba(0, 0, 0, 0.87); background-color: #FFF; width: 100%; height: 220px; padding: 10px 0; box-sizing: border-box; } #body.hide { transition: height 2s ease-in-out; height: 0; } #innerBody { height: 200px; background-color: orange; }
<div id="wrapper"> <div id="buttonContainer"><span id="buttonIcon">My</span><span id="buttonLabel">self</span> </div> <div id="content"> <div id="heading">Press Me</div> <div id="body"> <div id="innerBody"></div> </div> </div> </div>
Unknown height with javascript - set the actual height before starting the animation, wait for the next frame and change it to 0 (see in full screen mode ):
var heading = document.getElementById('heading'), body = document.getElementById('body'); heading.addEventListener('click', hide); body.addEventListener('transitionend', hideCallback); function hide() { body.style.height = body.scrollHeight + 'px'; requestAnimationFrame(function() {
#wrapper { margin: auto; background-color: blue; width: 470px; text-align: center; overflow: hidden; box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.17); max-height: 400px; max-width: 600px; padding: 0; } #buttonContainer { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; align-content: center; flex-direction: column; margin: auto; width: 100px; height: 100px; color: white; } #buttonIcon { width: 36px; height: 36px; line-height: 36px; font-size: 35px; font-weight: bold; display: inline-block; } #buttonLabel { font-size: 20px; } #content { width: 100%; height: 100%; text-align: left; transform: translateY(0px); } #heading { color: white; text-align: right; margin: 10px; font-size: 17px; } #body { color: #000; color: rgba(0, 0, 0, 0.87); background-color: #FFF; width: 100%; padding: 10px 0; box-sizing: border-box; transition: height 2s ease-in-out; } #innerBody { height: 200px; background-color: orange; }
<div id="wrapper"> <div id="buttonContainer"><span id="buttonIcon">My</span><span id="buttonLabel">self</span> </div> <div id="content"> <div id="heading">Press Me</div> <div id="body"> <div id="innerBody"></div> </div> </div> </div>
source share