Добавление активного класса к текущему элементу

Я хочу добавить класс активных элементов в свою текущую панель навигации, но в настоящее время борюсь.

Я попробовал метод w3schools, но, возможно, я неправильно его реализовал.

КОД:

// Get the container element
var btnContainer = document.getElementsByClassName("tab");

// Get all buttons with class = "btn" inside the container
var btns = btnContainer.getElementsByClassName("link");

// Loop through the buttons and add the active class to the current/clicked button
for (var i = 0; i < btns.length; i++) {
  btns[i].addEventListener("click", function() {
    var current = document.getElementsByClassName("active");
    current[0].className = current[0].className.replace(" active", "");
    this.className += " active";
  });
}
#navbar {
  position: absolute;
  text-align: right;
  top: 3.5em;
  right: 3.5em;
  z-index: 2;
}

.tab {
  background-color: white;
  opacity: 0.3;
  height: 3.5em;
  width: 0.2em;
  margin-bottom: 1em;
}

.tab:hover{
  opacity:1;
  transition:0.7s ease;
}

.link:hover > .text {
  opacity:1;
  transition:0.7s ease;
}

.active, .tab:hover {
  opacity:1;
  transition:0.7s ease;
}

.active, .text:hover > .text {
  opacity:1;
  transition:0.7s ease;
}
<div id = "navbar">

	<div class = "tab">

		<a class = "link active" href = "#home">
			<div class = "text">Home</div>
		</a></div>

	<div class = "tab">

		<a class = "link" href = "#work">
			<div class = "text">Work</div>
	</a></div>
	
	<div class = "tab">
		
		<a class = "link" href = "#about">
			<div class = "text">About</div>
	</a></div>
</div>

Панель навигации в настоящее время работает, но активного элемента нет. Я бы хотел, чтобы вкладка была непрозрачной: 1, когда она активна.

tab это не id, это класс, getElementById не подойдет
Calvin Nunes 30.01.2019 19:55

@CalvinNunes я изменил «getElementById» на «getElementsByClassName», но все равно не работает. Есть идеи?

Nathan Wilson 30.01.2019 20:00

«активный» вы имеете в виду, наведя курсор на элемент или щелкнув его?

Calvin Nunes 30.01.2019 20:01

@CalvinNunes Я имею в виду, нажав на нее :)

Nathan Wilson 30.01.2019 20:02

Почему в комментарии написано 'Получить все кнопки с class = "btn" внутри контейнера', но вместо этого вы получаете те, у которых есть класс «ссылка»?

PeterKA 30.01.2019 20:02

@PeterKA извините, это код из w3schools

Nathan Wilson 30.01.2019 20:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
2 240
3

Ответы 3

Во-первых, вам нужно добавить класс в родительский div, а не ссылку, так как это родитель имеет непрозрачность, установленную на 0,3. Теперь я сделал это на jQuery, так как это намного проще. Надеюсь, это не проблема.

$('.link').on('click', function() {
  $('.link').parent().removeClass('active');
  $(this).parent().addClass('active');
});
#navbar {
  position: absolute;
  text-align: right;
  top: 3.5em;
  right: 3.5em;
  z-index: 2;
}

.tab {
  background-color: white;
  opacity: 0.3;
  height: 3.5em;
  width: 0.2em;
  margin-bottom: 1em;
}

.tab:hover{
  opacity:1;
  transition:0.7s ease;
}

.link:hover > .text {
  opacity:1;
  transition:0.7s ease;
}

.active, .tab:hover {
  opacity:1;
  transition:0.7s ease;
}

.active, .text:hover > .text {
  opacity:1;
  transition:0.7s ease;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id = "navbar">

	<div class = "tab active">

		<a class = "link" href = "#home">
			<div class = "text">Home</div>
		</a></div>

	<div class = "tab">

		<a class = "link" href = "#work">
			<div class = "text">Work</div>
	</a></div>
	
	<div class = "tab">
		
		<a class = "link" href = "#about">
			<div class = "text">About</div>
	</a></div>
</div>

Привет, Ален, я только что попробовал этот метод, и мне все еще не повезло, но он работает, когда я запускаю его через ваш фрагмент кода.

Nathan Wilson 30.01.2019 20:08

Вы добавили библиотеку jQuery в свой проект?

Alain Cruz 30.01.2019 20:11

Я сделал! Не уверен, почему есть проблема

Nathan Wilson 30.01.2019 20:12

Странно :(, а ты кэш в браузере чистил после изменений?

Alain Cruz 30.01.2019 20:13

В Javascript вы можете использовать .querySelectorAll():

document.querySelectorAll('.tab .link').forEach(function(ele, idx) {
    ele.addEventListener("click", function(e) {
        e.preventDefault();
        document.querySelectorAll('.tab.active').forEach(ele => ele.classList.remove('active'));
        ele.parentNode.classList.toggle('active');
    });
});
#navbar {
  position: absolute;
  text-align: right;
  top: 3.5em;
  right: 3.5em;
  z-index: 2;
}

.tab {
  background-color: white;
  opacity: 0.3;
  height: 3.5em;
  width: 0.2em;
  margin-bottom: 1em;
}

.tab:hover{
  opacity:1;
  transition:0.7s ease;
}

.link:hover > .text {
  opacity:1;
  transition:0.7s ease;
}

.active, .tab:hover {
  opacity:1;
  transition:0.7s ease;
}

.active, .text:hover > .text {
  opacity:1;
  transition:0.7s ease;
}
<div id = "navbar">
    <div class = "tab">
        <a class = "link active" href = "#home">
            <div class = "text">Home</div>
        </a></div>
    <div class = "tab">
        <a class = "link" href = "#work">
            <div class = "text">Work</div>
        </a></div>
    <div class = "tab">
        <a class = "link" href = "#about">
            <div class = "text">About</div>
        </a></div>
</div>

Посмотрите быстрое решение jQuery ниже, используя следующие методы:

  • .на()
  • .ближайший()
  • .addClass() и
  • .удалитькласс()

$(function() {
    var links = $('.tab > .link');
    links.on('click', function() {
        links.removeClass('active').closest('.tab').removeClass('active');
        $(this).addClass('active').closest('.tab').addClass('active');
    })
    .first().click();
});
#navbar {
  position: absolute;
  text-align: right;
  top: 3.5em;
  right: 3.5em;
  z-index: 2;
}

.tab {
  background-color: white;
  opacity: 0.3;
  height: 3.5em;
  width: 0.2em;
  margin-bottom: 1em;
}

.tab:hover{
  opacity:1;
  transition:0.7s ease;
}

.link:hover > .text {
  opacity:1;
  transition:0.7s ease;
}

.active, .tab:hover {
  opacity:1;
  transition:0.7s ease;
}

.active, .text:hover > .text {
  opacity:1;
  transition:0.7s ease;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id = "navbar">

	<div class = "tab">

		<a class = "link active" href = "#home">
			<div class = "text">Home</div>
		</a></div>

	<div class = "tab">

		<a class = "link" href = "#work">
			<div class = "text">Work</div>
	</a></div>
	
	<div class = "tab">
		
		<a class = "link" href = "#about">
			<div class = "text">About</div>
	</a></div>
</div>

Привет, Питер, это сработало! - Единственное решение здесь, которое сработало и для меня. Однако теперь он, кажется, начинается с неактивного состояния, когда я хочу, чтобы «Домашняя» страница начиналась активной. «Текст» также не остается активным, только «Вкладка» - Вот код, чтобы вам было легче понять (codepen.io/JustNayWillo/pen/aXpKbb) - Спасибо!

Nathan Wilson 31.01.2019 13:29

Чтобы сделать Home start off активным, вы можете добавить .first().click(), как показано, или просто добавить класс active к первому элементу .tab в html. Чтобы сделать Text активным, просто внесите показанные изменения .removeClass() и addClass().

PeterKA 31.01.2019 14:35

Другие вопросы по теме