Как добавить и удалить активный класс к элементу в чистом JavaScript
Я пытаюсь сделать меню навигации я сделал все HTML и CSS когда пришел к javascript я поражен в середине я могу добавить класс к элементу, но я не в состоянии удалить класс оставшиеся элементы. Пожалуйста, помоги мне с этим.
вот мой код
<!DOCTYPE html>
<html>
<head>
<title>Navigation class Toggling</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
header {
width: 100%;
height: auto;
max-width: 600px;
margin: 0 auto;
}
nav {
width: 100%;
height: 40px;
background-color: cornflowerblue;
}
ul {
list-style-type: none;
}
li {
display: inline-block;
}
a {
text-decoration: none;
padding: 8px 15px;
display: block;
text-transform: capitalize;
background-color: darkgray;
color: #fff;
}
a.active {
background-color: cornflowerblue;
}
</style>
</head>
<body>
<header>
<nav>
<ul onclick="myFunction(event)">
<li><a href="#">home</a></li>
<li><a href="#">about</a></li>
<li><a href="#">service</a></li>
<li><a href="#">profile</a></li>
<li><a href="#">portfolio</a></li>
<li><a href="#">contact</a></li>
</ul>
</nav>
</header>
<script type="text/javascript">
function myFunction(e) {
e.target.className = "active";
}
</script>
</body>
</html>
И вот мой Codepen
9 ответов:
Используйте
document.querySelectorAll, чтобы найти элемент, который в данный момент имеет классactive, Затем вы можете удалить этот класс.function myFunction(e) { var elems = document.querySelectorAll(".active"); [].forEach.call(elems, function(el) { el.classList.remove("active"); }); e.target.className = "active"; }JSFIDDLE
Вместо
document.querySelectorAllможно также использоватьdocument.querySelectorfunction myFunction(e) { var elems = document.querySelector(".active"); if(elems !==null){ elems.classList.remove("active"); } e.target.className = "active"; }JSFIDDLE 2
Edit
Вместо перебора всей коллекции вы можете выбрать элемент, который имеет класс
active, используя документ.queryselector. Также предоставьтеidк ul так, чтобы вы могли нацелиться на определенный элемент
function myFunction(e) { if (document.querySelector('#navList a.active') !== null) { document.querySelector('#navList a.active').classList.remove('active'); } e.target.className = "active"; }<style type="text/css">* { margin: 0; padding: 0; box-sizing: border-box; } header { width: 100%; height: auto; max-width: 600px; margin: 0 auto; } nav { width: 100%; height: 40px; background-color: cornflowerblue; } ul { list-style-type: none; } li { display: inline-block; } a { text-decoration: none; padding: 8px 15px; display: block; text-transform: capitalize; background-color: darkgray; color: #fff; } a.active { background-color: cornflowerblue; }<title>Navigation class Toggling</title> <header> <nav> <ul onclick="myFunction(event)" id='navList'> <li><a href="#">home</a></li> <li><a href="#">about</a></li> <li><a href="#">service</a></li> <li><a href="#">profile</a></li> <li><a href="#">portfolio</a></li> <li><a href="#">contact</a></li> </ul> </nav> </header>
Вы могли бы использовать
classListметоды, чтобыadd,remove, илиtoggle.Сначала удалите имя класса из предыдущего:
// assuming there's only one with such class name // otherwise you need querySelectorAll and a loop document.querySelector('.active').classList.remove('active')Затем добавьте его к новому элементу:
e.target.classList.add('active')
Вы можете использовать "чистый" JavaScript
Element.classListдля добавления и удаления класса из вашего элемента DOM.
add: Добавьте указанные значения класса. Если эти классы уже существуют в атрибуте элемента, то они игнорируются.
remove: удалить указанные значения класса.Используйте
Document.querySelectorAll()для возврата элементов в документе, соответствующих указанной группе CSS-селекторов.Подробнее at:
Https://developer.mozilla.org/en/docs/Web/API/Element/classList
Https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll
Что касается вашего кода, Вы можете отметить как активный ваш элемент, когда пользователь нажимает на него, используя следующий код:
window.myFunction = function(event) { // reset all menu items document.querySelectorAll('ul li a.active').forEach(function(item) { item.classList.remove('active'); }) // mark as active selected menu item event.target.classList.add("active"); };* { margin: 0; padding: 0; box-sizing: border-box; } header { width: 100%; height: auto; max-width: 600px; margin: 0 auto; } nav { width: 100%; height: 40px; background-color: cornflowerblue; } ul { list-style-type: none; } li { display: inline-block; } a { text-decoration: none; padding: 8px 15px; display: block; text-transform: capitalize; background-color: darkgray; color: #fff; } a.active { background-color: cornflowerblue; } .active { ackground-color: red; }<header> <nav> <ul onclick="window.myFunction(event)"> <li><a href="#">home</a></li> <li><a href="#">about</a></li> <li><a href="#">service</a></li> <li><a href="#">profile</a></li> <li><a href="#">portfolio</a></li> <li><a href="#">contact</a></li> </ul> </nav> </header>
HTML
<div class="container"> <nav> <ul class="nav"> <li class="nav__item"><a class="nav__link active" href="#">Home</a></li> <li class="nav__item"><a class="nav__link" href="#">Item 1</a></li> <li class="nav__item"><a class="nav__link" href="#">Item 2</a></li> <li class="nav__item"><a class="nav__link" href="#">Item 3</a></li> <li class="nav__item"><a class="nav__link" href="#">Item 4</a></li> <li class="nav__item"><a class="nav__link" href="#">Item 5</a></li> </ul> </nav> </div>CSS
* { margin: 0; padding: 0; box-sizing: border-box; } *::before, *::after { box-sizing: border-box; } .container { width: 100%; max-width: 1024px; display: block; margin: 30px auto; } ul { list-style: none; } a { text-decoration: none; } .nav { display: flex; flex-direction: row; justify-content: space-around; align-items: center; } .nav__item { padding: 1rem; } .nav__link { display: block; padding: .3125rem 1.5rem; text-transform: uppercase; } .nav__link.active { border: 1px solid #ff4b4c; color: #ff4b4c; }JS
document.addEventListener('DOMContentLoaded', function() { const selector = '.nav__link'; const elems = Array.from(document.querySelectorAll(selector)); const navigation = document.querySelector('nav'); function makeActive(evt) { const target = evt.target; if (!target || !target.matches(selector)) { return; } elems.forEach(elem => elem.classList.remove('active')); evt.target.classList.add('active'); }; navigation.addEventListener('mousedown', makeActive); });Кстати: отличное решение здесь: https://gomakethings.com/getting-all-sibling-elements-when-a-link-or-button-is-clicked-with-vanilla-js/
Вы можете сделать это в чистом javascript
function myFunction(e,ev) { for(var i=0;i<e.children.length;i++) { e.children[i].childNodes[0].className = ""; } ev.target.className = "active"; }<!DOCTYPE html> <html> <head> <title>Navigation class Toggling</title> <style type="text/css"> * { margin: 0; padding: 0; box-sizing: border-box; } header { width: 100%; height: auto; max-width: 600px; margin: 0 auto; } nav { width: 100%; height: 40px; background-color: cornflowerblue; } ul { list-style-type: none; } li { display: inline-block; } a { text-decoration: none; padding: 8px 15px; display: block; text-transform: capitalize; background-color: darkgray; color: #fff; } a.active { background-color: cornflowerblue; } </style> </head> <body> <header> <nav> <ul onclick="myFunction(this,event)"> <li><a href="#">home</a></li> <li><a href="#">about</a></li> <li><a href="#">service</a></li> <li><a href="#">profile</a></li> <li><a href="#">portfolio</a></li> <li><a href="#">contact</a></li> </ul> </nav> </header> <script type="text/javascript"> </script> </body> </html>
Лично я бы придерживался метода
Пожалуйста, имейте в виду, что использованиеdocument.querySelector. querySelector принимает CSS-подобный запрос, который мы будем использовать для поиска активного класса на странице. Если он существует (операторif), Удалите его и примените новый класс к целевому объекту.className = ""приведет к удалению всех классов. Было бы более аккуратно использоватьclassListдля всего.
function myFunction(e) { var el = document.querySelector('.active'); // Check if the element exists to avoid a null syntax error on the removal if(el) { el.classList.remove('active'); } e.target.classList.add('active'); }
JS
var targets = document.querySelectorAll('.some-class'); targets.onclick = function(evt) { evt.classList.toggle('{your-class}'); };Для лучшей поддержки браузера:
targets.onclick = function(evt) { var el = evt.target; var classes = el.className.split(" "); var classIndex = classes.indexOf('{your-class}'); if (classIndex >= 0) { classes.splice(1, classIndex); } else { classes.push('{your-clas}'); } el.className = classes.join(" "); });
window.myFunction = function(event) { var elms = document.querySelectorAll('ul li a'); // reset all you menu items for (var i = 0, len = elms.length; i < len; i++) { elms[i].classList.remove('active'); } // mark as active clicked menu item event.target.classList.add("active"); };* { margin: 0; padding: 0; box-sizing: border-box; } header { width: 100%; height: auto; max-width: 600px; margin: 0 auto; } nav { width: 100%; height: 40px; background-color: cornflowerblue; } ul { list-style-type: none; } li { display: inline-block; } a { text-decoration: none; padding: 8px 15px; display: block; text-transform: capitalize; background-color: pink; color: #fff; } a.active { background-color: blue; } .active { ackground-color: red; }<header> <nav> <ul onclick="window.myFunction(event)"> <li><a href="#">home</a></li> <li><a href="#">about</a></li> <li><a href="#">service</a></li> <li><a href="#">profile</a></li> <li><a href="#">portfolio</a></li> <li><a href="#">contact</a></li> </ul> </nav> </header>
Ниже должно помочь.
//Remove all classes by ID document.getElementById("elementIdHere").className = ""; //If you wish to keep some classes on the element, use below document.getElementById("elementIdHere").className = "keepClass";
Comments