user7673447
user7673447

Reputation:

Pure CSS Accordion Feature

I have code below for a pure CSS accordion list. I was wondering if its possible to have the text under the heading sort of fly in like the example here: http://codepen.io/pirrera/pen/KwzMGZ ,but using pure CSS only? Anything helps, cheers.

.wrapper {
  max-width: 960px;
  margin: 0 auto;
}
/* Acordeon styles */
.tab {
  position: relative;
  margin-bottom: 1px;
  width: 100%;
  color: #005bab;
  overflow: hidden;
}
.input {
  position: absolute;
  opacity: 0;
  z-index: -1;
}
.label {
  position: relative;
  text-align:center;
  display: block;
  padding: 0 0 0 1em;
  background: #e2ecf6;
  font-size:14px;
  font-family:Verdana;
  font-weight: bold;
  line-height: 6;
  cursor: pointer;
}
.tab-content {
  max-height: 0;
  overflow: hidden;
  background: #f4f8fc;
  -webkit-transition: max-height .5s;
  -o-transition: max-height .5s;
  transition: max-height .5s;
}
.tab-content p {
  margin: 1em;
}
/* :checked */
.input:checked ~ .tab-content {
  max-height: 10em;
}
/* Icon */
.label::after {
  position: absolute;
  left: 0;
  top: 0;
  display: block;
  width: 3em;
  height: 3em;
  line-height: 3;
  text-align: center;
  -webkit-transition: all .35s;
  -o-transition: all .35s;
  transition: all .35s;
}
.input[type=checkbox] + .label::after {
  content: "+";
}
.input[type=radio] + .label::after {
  content: "";
}
.input[type=checkbox]:checked + .label::after {
  transform: rotate(315deg);
}
.input[type=radio]:checked + .label::after {
  transform: rotateX(180deg);
}
.bottombar{
       content: "";
       display:block;
       height:1em;
       width:100%;
       background-color:#00688B;
}
<div class="wrapper">
      <div class="tab">
         <input name="tabs" class="input" id="tab-one" type="checkbox"/>
         <label class="label" for="tab-one">Label One</label>
         <div class="tab-content">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, architecto, explicabo perferendis nostrum, maxime impedit atque odit sunt pariatur illo obcaecati soluta molestias iure facere dolorum adipisci eum? Saepe, itaque.</p>
         </div>
      </div>
      <div class="tab">
         <input name="tabs" class="input" id="tab-two" type="checkbox"/>
         <label class="label" for="tab-two">Label Two</label>
         <div class="tab-content">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, architecto, explicabo perferendis nostrum, maxime impedit atque odit sunt pariatur illo obcaecati soluta molestias iure facere dolorum adipisci eum? Saepe, itaque.</p>
         </div>
      </div>
      <div class="tab">
         <input name="tabs" class="input" id="tab-three" type="checkbox"/>
         <label class="label" for="tab-three">Label Three</label>
         <div class="tab-content">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, architecto, explicabo perferendis nostrum, maxime impedit atque odit sunt pariatur illo obcaecati soluta molestias iure facere dolorum adipisci eum? Saepe, itaque.</p>
         </div>
      </div>
     <div class="bottombar"></div>
</div>

Upvotes: 1

Views: 177

Answers (4)

Chiller
Chiller

Reputation: 9738

You can animate the scale of the paragraph when checkbox is checked

.input:checked~.tab-content p {
  transform: scale(1);
}

see code below:

.wrapper {
  max-width: 960px;
  margin: 0 auto;
}


/* Acordeon styles */

.tab {
  position: relative;
  margin-bottom: 1px;
  width: 100%;
  color: #005bab;
  overflow: hidden;
}

.input {
  position: absolute;
  opacity: 0;
  z-index: -1;
}

.label {
  position: relative;
  text-align: center;
  display: block;
  padding: 0 0 0 1em;
  background: #e2ecf6;
  font-size: 14px;
  font-family: Verdana;
  font-weight: bold;
  line-height: 6;
  cursor: pointer;
}

.tab-content {
  max-height: 0;
  overflow: hidden;
  padding: 0px;
  -webkit-transition: max-height .5s;
  -o-transition: max-height .5s;
  transition: max-height .5s;
  padding-left: 20px;
  background: #c3d7ea;
}

.tab-content .container {
  padding: 1em;
  margin: 0;
  transform: scale(0.6);
  -webkit-transition: transform .5s;
  -o-transition: transform .5s;
  transition: transform .5s;
  background: #f4f8fc;
}


/* :checked */

.input:checked~.tab-content {
  max-height: 10em;
}

.input:checked~.tab-content .container {
  transform: scale(1);
}


/* Icon */

.label::after {
  position: absolute;
  left: 0;
  top: 0;
  display: block;
  width: 3em;
  height: 3em;
  line-height: 3;
  text-align: center;
  -webkit-transition: all .35s;
  -o-transition: all .35s;
  transition: all .35s;
}

.input[type=checkbox]+.label::after {
  content: "+";
}

.input[type=radio]+.label::after {
  content: "";
}

.input[type=checkbox]:checked+.label::after {
  transform: rotate(315deg);
}

.input[type=radio]:checked+.label::after {
  transform: rotateX(180deg);
}

.bottombar {
  content: "";
  display: block;
  height: 1em;
  width: 100%;
  background-color: #00688B;
}
<div class="wrapper">
  <div class="tab">
    <input name="tabs" class="input" id="tab-one" type="checkbox" />
    <label class="label" for="tab-one">Label One</label>
    <div class="tab-content">
      <div class="container">
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, architecto, explicabo perferendis nostrum, maxime impedit atque odit sunt pariatur illo obcaecati soluta molestias iure facere dolorum adipisci eum? Saepe, itaque.</p>
        <div>this is another div</div>
      </div>
    </div>
  </div>
  <div class="tab">
    <input name="tabs" class="input" id="tab-two" type="checkbox" />
    <label class="label" for="tab-two">Label Two</label>
    <div class="tab-content">
      <div class="container">
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, architecto, explicabo perferendis nostrum, maxime impedit atque odit sunt pariatur illo obcaecati soluta molestias iure facere dolorum adipisci eum? Saepe, itaque.</p>
      </div>
    </div>
  </div>
  <div class="tab">
    <input name="tabs" class="input" id="tab-three" type="checkbox" />
    <label class="label" for="tab-three">Label Three</label>
    <div class="tab-content">
      <div class="container">
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, architecto, explicabo perferendis nostrum, maxime impedit atque odit sunt pariatur illo obcaecati soluta molestias iure facere dolorum adipisci eum? Saepe, itaque.</p>
      </div>
    </div>
  </div>
  <div class="bottombar"></div>
</div>

Upvotes: 1

Pablo Darde
Pablo Darde

Reputation: 6402

EDITED

This is a simple and functional example: However, you can't simulate an "onclick" event with css. You also can check this post for more clarification: Can I have an onclick effect in CSS?

If you do not mind having a little bit of pure JavaScript in your code, see this example:

https://jsfiddle.net/8xs83phb/

If you want an "hover" event based accordion, see the below code.

ul {
  margin: 0;
  padding: 0;
}

ul li {
  list-style-type: none;
}

h2 {
  margin: 0;
  text-align: center;
  font: normal 22px Arial, Verdana;
}

.box {
  width: 200px;
  max-height: 40px;
  padding: 10px 0;
  background: #fdfdfd;
  box-sizing: border-box;
  overflow: hidden;
  cursor: pointer;
  border-bottom: 1px solid black;
  transition: all 0.5s;
}

.box:hover {
  max-height: 300px;
}
<ul>
  <li>
    <div class='box'>
      <h2>Item One</h2>
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, architecto, explicabo perferendis nostrum, maxime impedit atque odit sunt pariatur illo obcaecati soluta molestias iure facere dolorum adipisci eum? Saepe, itaque.</p>
    </div>
  </li>
  <li>
    <div class='box'>
      <h2>Item Two</h2>
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, architecto, explicabo perferendis nostrum, maxime impedit atque odit sunt pariatur illo obcaecati soluta molestias iure facere dolorum adipisci eum? Saepe, itaque.</p>
    </div>
  </li>
  <li>
    <div class='box'>
      <h2>Item Three</h2>
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, architecto, explicabo perferendis nostrum, maxime impedit atque odit sunt pariatur illo obcaecati soluta molestias iure facere dolorum adipisci eum? Saepe, itaque.</p>
    </div>
  </li>
</ul>

Upvotes: 0

Michael Coker
Michael Coker

Reputation: 53664

Yeah, you can shrink the content using transform: scale() and hide it using opacity: 0, then transition those to normal values when the label/input are :checked

.wrapper {
  max-width: 960px;
  margin: 0 auto;
}

/* Acordeon styles */
.tab {
  position: relative;
  margin-bottom: 1px;
  width: 100%;
  color: #005bab;
  overflow: hidden;
}

.input {
  position: absolute;
  opacity: 0;
  z-index: -1;
}

.label {
  position: relative;
  text-align: center;
  display: block;
  padding: 0 0 0 1em;
  background: #e2ecf6;
  font-size: 14px;
  font-family: Verdana;
  font-weight: bold;
  line-height: 6;
  cursor: pointer;
}

.tab-content {
  max-height: 0;
  overflow: hidden;
  background: white;
}

.tab-content p {
  padding: 1em;
  margin: 0 0 0 2em;
  background: #f4f8fc;
}

/* :checked */
.input:checked ~ .tab-content {
  max-height: 10em;
}

/* Icon */
.label::after {
  position: absolute;
  left: 0;
  top: 0;
  display: block;
  width: 3em;
  height: 3em;
  line-height: 3;
  text-align: center;
  -webkit-transition: all .35s;
  transition: all .35s;
}

.input[type=checkbox] + .label::after {
  content: "+";
}

.input[type=radio] + .label::after {
  content: "";
}

.input[type=checkbox]:checked + .label::after {
  -webkit-transform: rotate(315deg);
          transform: rotate(315deg);
}

.input[type=radio]:checked + .label::after {
  -webkit-transform: rotateX(180deg);
          transform: rotateX(180deg);
}

.bottombar {
  content: "";
  display: block;
  height: 1em;
  width: 100%;
  background-color: #00688B;
}

.tab-content {
  transform: scale(0.5);
  opacity: 0;
  transition: transform .5s, opacity .5s, -webkit-transform .5s, max-height .5s;
}

input:checked ~ .tab-content {
  -webkit-transform: scale(1);
          transform: scale(1);
  opacity: 1;
}
<div class="wrapper">
      <div class="tab">
         <input name="tabs" class="input" id="tab-one" type="checkbox"/>
         <label class="label" for="tab-one">Label One</label>
         <div class="tab-content">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, architecto, explicabo perferendis nostrum, maxime impedit atque odit sunt pariatur illo obcaecati soluta molestias iure facere dolorum adipisci eum? Saepe, itaque.</p>
         </div>
      </div>
      <div class="tab">
         <input name="tabs" class="input" id="tab-two" type="checkbox"/>
         <label class="label" for="tab-two">Label Two</label>
         <div class="tab-content">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, architecto, explicabo perferendis nostrum, maxime impedit atque odit sunt pariatur illo obcaecati soluta molestias iure facere dolorum adipisci eum? Saepe, itaque.</p>
         </div>
      </div>
      <div class="tab">
         <input name="tabs" class="input" id="tab-three" type="checkbox"/>
         <label class="label" for="tab-three">Label Three</label>
         <div class="tab-content">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tenetur, architecto, explicabo perferendis nostrum, maxime impedit atque odit sunt pariatur illo obcaecati soluta molestias iure facere dolorum adipisci eum? Saepe, itaque.</p>
         </div>
      </div>
     <div class="bottombar"></div>
</div>

Upvotes: 1

Kyle Thomson
Kyle Thomson

Reputation: 26

Use transform: scale() to "grow"/"shrink" the content, and transition for the effect.

Pen: https://codepen.io/kjkta/pen/MmLewZ

I've added:

.tab-content {
    transition: .5s transform;
    transform: scale(.1);
}
.input:checked ~ .tab-content {
    transform: scale(1);
}

Upvotes: 0

Related Questions