Search code examples
jqueryhtmlcssuser-interfaceuser-experience

How can I stop this CSS accordion from scrolling down automatically?


I'm using an accordion made with CSS and jQuery for a site I'm making. The site also uses Bootstrap to style other parts of it.

Every time I open or close a tab the page scrolls down automatically for some reason, what should I change? Thank you all in advance.

$(document).ready(function() {
  $("a.accordion__trigger").click(function() {
    $(this).parent().find(".accordion__content").toggleClass("accordion__content__hidden");
  });
});
.final__accordion {
  position: relative;
  display: block;
  border: 1px solid #e0e0e0;
  font-size: 0.8rem;
}

.final__accordion .accordion__item {
  display: block;
  margin-top: 5px;
}

.final__accordion .accordion__content {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  background-color: rgba(255, 255, 255, 0.5);
  overflow: hidden;
  height: 0;
  -webkit-transition: height 1s ease, padding 0.3s linear;
  -o-transition: height 1s ease, padding 0.3s linear;
  transition: height 1s ease, padding 0.3s linear;
}

.final__accordion .accordion__content p {
  padding: 20px;
  margin: 0;
  text-align: left;
  max-width: initial;
}

.accordion__item .accordion__content {
  overflow: hidden;
  box-sizing: content-box;
  -moz-box-sizing: content-box;
}

.final__accordion .accordion__content__hidden:target {
  /*CHANGED TARGET ON TOGGLE CLASSNAME*/
  height: 150px;
  text-align: left;
}

.accordion__content__hidden {
  height: 0;
}

.final__accordion .accordion__trigger {
  text-decoration: none;
}

.final__accordion .accordion__title {
  position: relative;
  display: block;
  margin: 0;
  padding: 10px;
  font-size: 1em;
  background-color: rgb(234, 10, 42);
  color: #FFFFFF;
  border: 1px solid red;
  cursor: pointer;
}

.final__accordion .accordion__title:hover {
  background-color: red;
}

.final__accordion .accordion__title:after {
  position: absolute;
  top: calc(50% - 12px);
  right: 20px;
  width: 15px;
  height: 15px;
  border-left: 1px solid #FFFFFF;
  border-bottom: 1px solid #FFFFFF;
  -webkit-transform: rotate(-45deg);
  transform: rotate(-45deg);
  content: "";
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="final__accordion" id="#accordion">
  <div class="accordion__item">
    <a href="#final__tab1" class="accordion__trigger accordion__title">Accordion 1</a>
    <div id="final__tab1" class="accordion__content">
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor laborum, rerum quasi rem placeat quo ratione qui.</p>
    </div>
  </div>
  <div class="accordion__item">
    <a href="#final__tab2" class="accordion__trigger accordion__title">Accordion 2</a>
    <div id="final__tab2" class="accordion__content">
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor laborum, rerum quasi rem placeat quo ratione qui.</p>
    </div>
  </div>
  <div class="accordion__item">
    <a href="#final__tab3" class="accordion__trigger accordion__title">Accordion 3</a>
    <div id="final__tab3" class="accordion__content">
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor laborum, rerum quasi rem placeat quo ratione qui.</p>
    </div>
  </div>
  <div class="accordion__item">
    <a href="#final__tab4" class="accordion__trigger accordion__title">Accordion 4</a>
    <div id="final__tab4" class="accordion__content">
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor laborum, rerum quasi rem placeat quo ratione qui.</p>
    </div>
  </div>
  <div class="accordion__item">
    <a href="#final__tab5" class="accordion__trigger accordion__title">Accordion 5</a>
    <div id="final__tab5" class="accordion__content">
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor laborum, rerum quasi rem placeat quo ratione qui.</p>
    </div>
  </div>
  <div class="accordion__item">
    <a href="#final__tab6" class="accordion__trigger accordion__title">Accordion 6</a>
    <div id="final__tab6" class="accordion__content">
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor laborum, rerum quasi rem placeat quo ratione qui.</p>
    </div>
  </div>
</div>


Solution

    1. When clicking an <a>nchor tag the default behavior is to jump to the location determined by href value. So all <a> have href="#/" which essentially prevents that jumping behavior.

    2. When using jQuery you'll need to use #id .01% of the time and .class 99.99% of the time. So all #id are removed.

    3. For animated effects like sliding there's .slideUp/Down/Toggle()

    4. An accordion's behavior is only one section can be open at a time. So all .content except the .content that follows the clicked .trigger (ie. $(this)) will .slideUp(). Then the .content that follows the clicked .trigger will .slideToggle().

    5. .open is .toggleClass() on .title to animate the arrow.

    BTW I removed the .accordion__ part from all classes to save my sanity, feel free to clutter it up with .accordion__ if you want.

    $(".trigger").on('click', function(e) {
      $('.title').not($(this)).removeClass('open');
      $(this).toggleClass('open');
      $('.content').not($(this).next('.content')).slideUp();
      $(this).next('.content').slideToggle();
    });
    body {
      overflow-y: scroll
    }
    
    .accordion {
      position: relative;
      border: 1px solid #e0e0e0;
      font-size: 0.8rem;
    }
    
    .accordion .item {
      margin-top: 5px;
    }
    
    .accordion .content {
      display: flex;
      align-items: center;
      background-color: rgba(255, 255, 255, 0.5);
      overflow: hidden;
      box-sizing: content-box;
      height: 150px;
    }
    
    .accordion .content p {
      padding: 20px;
      margin: 0;
      text-align: left;
      max-width: initial;
    }
    
    .content.hidden {
      display: none;
    }
    
    .accordion .trigger {
      text-decoration: none;
    }
    
    .accordion .title {
      position: relative;
      display: block;
      margin: 0;
      padding: 10px;
      font-size: 1em;
      background-color: rgb(234, 10, 42);
      color: #FFFFFF;
      border: 1px solid red;
      cursor: pointer;
    }
    
    .accordion .title:hover {
      background-color: red;
    }
    
    .accordion .title::after {
      position: absolute;
      top: calc(50% - 12px);
      right: 20px;
      width: 15px;
      height: 15px;
      border-left: 1px solid #FFFFFF;
      border-bottom: 1px solid #FFFFFF;
      transform: rotate(-135deg);
      transition: 0.7s;
      content: "";
    }
    
    .accordion .title.open::after {
      transform: rotate(-45deg);
      transition: 0.7s;
    }
    <div class="accordion">
      <div class="item">
        <a href="#/" class="trigger title">Accordion 1</a>
        <div class="content hidden">
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor laborum, rerum quasi rem placeat quo ratione qui.</p>
        </div>
      </div>
      <div class="item">
        <a href="#/" class="trigger title">Accordion 2</a>
        <div class="content hidden">
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor laborum, rerum quasi rem placeat quo ratione qui.</p>
        </div>
      </div>
      <div class="item">
        <a href="#/" class="trigger title">Accordion 3</a>
        <div class="content hidden">
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor laborum, rerum quasi rem placeat quo ratione qui.</p>
        </div>
      </div>
      <div class="item">
        <a href="#/" class="trigger title">Accordion 4</a>
        <div class="content hidden">
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor laborum, rerum quasi rem placeat quo ratione qui.</p>
        </div>
      </div>
      <div class="item">
        <a href="#/" class="trigger title">Accordion 5</a>
        <div class="content hidden">
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor laborum, rerum quasi rem placeat quo ratione qui.</p>
        </div>
      </div>
      <div class="item">
        <a href="#/" class="trigger title">Accordion 6</a>
        <div class="content hidden">
          <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor laborum, rerum quasi rem placeat quo ratione qui.</p>
        </div>
      </div>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>