Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CSS transition auto height not working [duplicate]

I have a website, and I decided to replace the jquery based toggle boxes with pure CSS snippets. When I use fixed height value for the transition (last lines of the CSS), it works well, but with the auto value, the animation is missing, only the height change has an effect!

Is there a way to use this with auto value? I would like to use variable texts and no scripts.

.ac-container{    width: 400px;    margin: 10px auto 30px auto;    text-align: left;  }  .ac-container label{    font-family: 'BebasNeueRegular', 'Arial Narrow', Arial, sans-serif;    padding: 5px 20px;    position: relative;    z-index: 20;    display: block;    height: 30px;    cursor: pointer;    color: #777;    text-shadow: 1px 1px 1px rgba(255,255,255,0.8);    line-height: 33px;    font-size: 19px;    background: #ffffff;    background: -moz-linear-gradient(top, #ffffff 1%, #eaeaea 100%);    background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,#ffffff), color-stop(100%,#eaeaea));    background: -webkit-linear-gradient(top, #ffffff 1%,#eaeaea 100%);    background: -o-linear-gradient(top, #ffffff 1%,#eaeaea 100%);    background: -ms-linear-gradient(top, #ffffff 1%,#eaeaea 100%);    background: linear-gradient(top, #ffffff 1%,#eaeaea 100%);    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eaeaea',GradientType=0 );    box-shadow:       0px 0px 0px 1px rgba(155,155,155,0.3),       1px 0px 0px 0px rgba(255,255,255,0.9) inset,       0px 2px 2px rgba(0,0,0,0.1);  }  .ac-container label:hover{    background: #fff;  }  .ac-container input:checked + label,  .ac-container input:checked + label:hover{    background: #c6e1ec;    color: #3d7489;    text-shadow: 0px 1px 1px rgba(255,255,255, 0.6);    box-shadow:       0px 0px 0px 1px rgba(155,155,155,0.3),       0px 2px 2px rgba(0,0,0,0.1);  }    .ac-container input{    display: none;  }  .ac-container section{    background: rgba(255, 255, 255, 0.5);    margin-top: -1px;    overflow: hidden;    height: 0px;    position: relative;    z-index: 10;    -webkit-transition: height 0.3s ease-in-out, box-shadow 0.6s linear;    -moz-transition: height 0.3s ease-in-out, box-shadow 0.6s linear;    -o-transition: height 0.3s ease-in-out, box-shadow 0.6s linear;    -ms-transition: height 0.3s ease-in-out, box-shadow 0.6s linear;    transition: height 0.3s ease-in-out, box-shadow 0.6s linear;  }  .ac-container section p{    font-style: italic;    color: #777;    line-height: 23px;    font-size: 14px;    padding: 20px;    text-shadow: 1px 1px 1px rgba(255,255,255,0.8);  }  .ac-container input:checked ~ section{    -webkit-transition: height 0.5s ease-in-out, box-shadow 0.1s linear;    -moz-transition: height 0.5s ease-in-out, box-shadow 0.1s linear;    -o-transition: height 0.5s ease-in-out, box-shadow 0.1s linear;    -ms-transition: height 0.5s ease-in-out, box-shadow 0.1s linear;    transition: height 0.5s ease-in-out, box-shadow 0.1s linear;    box-shadow: 0px 0px 0px 1px rgba(155,155,155,0.3);  }  .ac-container input:checked ~ section.ac-small{    height: 120px; /*auto*/  }
<div class="ac-container">    <div>        <input id="ac-1" name="accordion-1" type="checkbox" />      <section class="ac-small">        <p>Some content... </p>      </section>      <label for="ac-1">About us</label>      </div>	      <div>	      <input id="ac-2" name="accordion-2" type="checkbox" />      <section class="ac-small">        <p>Some content... </p>      </section>      <label for="ac-2">About us</label>    </div>  </div>
like image 821
Just me Avatar asked Dec 18 '12 17:12

Just me


People also ask

Does transition auto height work?

If you were to transition an element into a height of auto , the browser would have to perform a reflow for every stage of that animation, to determine how all the other elements should move.

How do you add height to transition in CSS?

For animate the "height" of element with CSS Transitions you need use "max-height". If use the "height: auto", the effect not works. Is necessary some value for the CSS create a CSS animate, and you can use "max-height" with a great value for emulate this effect.

What triggers CSS transition?

Triggering transitions You can trigger CSS transitions directly with pseudo classes like :hover (activates when the mouse goes over an element), :focus (activates when a user tabs onto an element, or when a user clicks into an input element), or :active (activates when user clicks on the element).


1 Answers

One solution if you just want to use CSS is to transition max-height instead of height and set it to something greater than it will ever get ...

Here's a DEMO

You will need to tweek the speed of the transition a bit, but at least the example gives you an idea on how it can be done. Don't forget to change the property in your transition as well. From transition: height 0.5s; to transition: max-height 0.5s;.

Hope this helps!

.ac-container{      width: 400px;      margin: 10px auto 30px auto;      text-align: left;  }  .ac-container label{      font-family: 'BebasNeueRegular', 'Arial Narrow', Arial, sans-serif;      padding: 5px 20px;      position: relative;      z-index: 20;      display: block;      height: 30px;      cursor: pointer;      color: #777;      text-shadow: 1px 1px 1px rgba(255,255,255,0.8);      line-height: 33px;      font-size: 19px;      background: #ffffff;      background: -moz-linear-gradient(top, #ffffff 1%, #eaeaea 100%);      background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,#ffffff), color-stop(100%,#eaeaea));      background: -webkit-linear-gradient(top, #ffffff 1%,#eaeaea 100%);      background: -o-linear-gradient(top, #ffffff 1%,#eaeaea 100%);      background: -ms-linear-gradient(top, #ffffff 1%,#eaeaea 100%);      background: linear-gradient(top, #ffffff 1%,#eaeaea 100%);      filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eaeaea',GradientType=0 );      box-shadow:           0px 0px 0px 1px rgba(155,155,155,0.3),           1px 0px 0px 0px rgba(255,255,255,0.9) inset,           0px 2px 2px rgba(0,0,0,0.1);  }  .ac-container label:hover{      background: #fff;  }  .ac-container input:checked + label,  .ac-container input:checked + label:hover{      background: #c6e1ec;      color: #3d7489;      text-shadow: 0px 1px 1px rgba(255,255,255, 0.6);      box-shadow:           0px 0px 0px 1px rgba(155,155,155,0.3),           0px 2px 2px rgba(0,0,0,0.1);  }    .ac-container input{      display: none;  }  .ac-container section{      background: rgba(255, 255, 255, 0.5);      margin-top: -1px;      overflow: hidden;      max-height: 0px;      position: relative;      z-index: 10;      -webkit-transition: max-height 0.3s ease-in-out, box-shadow 0.6s linear;      -moz-transition: max-height 0.3s ease-in-out, box-shadow 0.6s linear;      -o-transition: max-height 0.3s ease-in-out, box-shadow 0.6s linear;      -ms-transition: max-height 0.3s ease-in-out, box-shadow 0.6s linear;      transition: max-height 0.3s ease-in-out, box-shadow 0.6s linear;  }  .ac-container section p{      font-style: italic;      color: #777;      line-height: 23px;      font-size: 14px;      padding: 20px;      text-shadow: 1px 1px 1px rgba(255,255,255,0.8);  }  .ac-container input:checked ~ section{      -webkit-transition: max-height 0.5s ease-in-out, box-shadow 0.1s linear;      -moz-transition: max-height 0.5s ease-in-out, box-shadow 0.1s linear;      -o-transition: max-height 0.5s ease-in-out, box-shadow 0.1s linear;      -ms-transition: max-height 0.5s ease-in-out, box-shadow 0.1s linear;      transition: max-height 0.5s ease-in-out, box-shadow 0.1s linear;      box-shadow: 0px 0px 0px 1px rgba(155,155,155,0.3);  }  .ac-container input:checked ~ section.ac-small{      max-height: 500px; /*auto*/  }
<div class="ac-container">      <div>                    <input id="ac-1" name="accordion-1" type="checkbox" />          <section class="ac-small">              <p>Some content...Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content... Some content...  </p>          </section>          <label for="ac-1">About us</label>                </div>        <div>              <input id="ac-2" name="accordion-2" type="checkbox" />          <section class="ac-small">              <p>Some content... </p>          </section>          <label for="ac-2">About us</label>  </div>  </div>
like image 76
Christofer Vilander Avatar answered Oct 12 '22 12:10

Christofer Vilander