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>
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.
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.
For animated effects like sliding there's .slideUp/Down/Toggle()
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()
.
.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>