i have a multi section landing page project and i want to add an icon of hambuger in a specific media query when i click on it it displays the navbar elements in a block and when i click it again it disappears >>> my proplem is when i use toggle class method it doesnt toggle class and it doesnt work even when i test it in my console
#My Code#
function myfunction() {
const lis = document.querySelectorAll("li");
const ul = document.querySelector("ul");
const icon=document.querySelector("fa fa-bars");
icon.addEventListener("click",()=>{
lis.classList.toggle("lessSize");
})
}
**Note: idont wanna use the library jQuery in this iwant to make it without it **
classList.toggle() will work fine. Your code is not working for two reasons.
Firstly, fa fa-bars is not a valid selector. I would presume you mean to use document.querySelector('.fa.fa-bars') instead.
Secondly, querySelectorAll() returns a NodeList, not a single element. As such you need to loop through them and call classList.toggle() on each individual element.
With those changes made the correct code should look like this:
function myfunction() {
const lis = document.querySelectorAll("li");
const ul = document.querySelector("ul");
const icon = document.querySelector(".fa.fa-bars");
icon.addEventListener("click", () => {
lis.forEach(li => li.classList.toggle('lessSize'));
})
}
Note that this example is assuming your use of querySelector() to retrieve the .fa-bars element is correct, and that there is only 1 of those elements in the DOM. If there is multiple then you will need another loop there too.
Apart from the answer from the comment, this will not work because you are targeting many list items with
const lis = document.querySelectorAll("li");
so this class will be toggled only on the first list item found, you should loop over them like so:
lis.forEeach(li => {
li.classList.toggle("lessSize")
})