#javascript #html #css
#javascript #HTML #css
Вопрос:
я пытаюсь изменить цвет фона моей панели навигации при прокрутке, но он продолжает выдавать мне эту ошибку: ‘Uncaught TypeError: не удается прочитать свойство ‘add’ of undefined’ так в чем проблема или как я могу это применить? это мой список классов CSS, который я пытаюсь удалить после прокрутки первой страницы:
.navbar {
background: transparent !important;
z-index: 10;
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
position: fixed;
width: 100%;
}
и это список классов CSS, который я пытаюсь добавить после прокрутки на вторую страницу или за ее пределы:
.navbar-active{
position: fixed;
background-color: rgba(0, 0, 0, .692) !important;
box-shadow: 0 3px 1rem rgba(0, 0, 0, .1);
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
}
и, наконец, это мой JS-код для замены списков классов:
const navbar = document.getElementsByClassName('navbar');
window.onscroll = function(){
const top = window.scrollY;
if(top >= 693){
navbar.classList.add('.navbar-active');
} else {
navbar.classList.remove('.navbar-active');
}
}
Комментарии:
1. Не ставьте
.
в строку класса, которую вы передаетеclassList.add()
2. Вы должны изменить это, чтобы это работало
const navbar = document.getElementsByClassName('navbar')[0];
3. @MosiaThabo да, ваш ответ сработал, большое вам спасибо!
Ответ №1:
Вы неправильно обращаетесь к панели навигации, вы должны получить к ней доступ либо с помощью:
Первое: const navbar = document.getElementsByClassName('navbar')[0];
Помните, что getElementsByClassName возвращает список элементов с этим именем класса
или
Два: const navbar = document.querySelector('.navbar');
Ваша вторая ошибка здесь: navbar.classList.add('.navbar-active')
, не ставьте .
в строку вашего параметра.
Просто передайте это так:
navbar.classList.add('navbar-active')
Комментарии:
1. Это правда, но это не главная проблема или причина появления сообщения об ошибке.
2. Вы можете проверить еще раз, я решил еще одну проблему, о которой раньше не догадывался. Способ, которым вы получили доступ к своему
navbar
с помощьюgetElementsByClassName
3. Действительно, я начал писать свой ответ, как только я сделал свой комментарий, но вижу, что я был слишком медленным…
Ответ №2:
Проблема возникает из-за того, что document.getElementsByClassName('navbar')
возвращает объект HTMLCollection classList
, а у этого нет никакого не-свойства. Все это должно иметь смысл, когда вы думаете об этом — несколько элементов могут иметь определенный класс, и нет смысла говорить о списке классов целого набора элементов, а не только одного.
Очевидно, что вы хотите добавить или удалить класс только из одного элемента — поэтому, предполагая, что у вас есть только один элемент с class "navbar"
, вы можете сделать либо это:
const navbar = document.getElementsByClassName('navbar')[0];`
который получает первый (и, предположительно, единственный) элемент с классом navbar, или
const navbar = document.querySelector('.navbar');
который всегда возвращает первый элемент с заданным селектором. Обе эти альтернативы возвращают отдельный элемент, который имеет classList
свойство, которое вы ожидаете.
Другим способом было бы использовать I’D, а не класс — что более логично, если вы знаете, что будете использовать его только один раз. document.getElementById('navbarId')
также работает, потому что в документе должен быть только один элемент с заданным идентификатором.
Кроме того, как указывает @MosiaThabo в своем ответе / комментарии, у вас есть посторонняя точка в начале имени класса, которое вы пытаетесь добавить.
Комментарии:
1. теперь я понял, большое вам спасибо за объяснение, это помогло мне понять 🙂
Ответ №3:
В classlist вы пишете только имена классов, поэтому вам не нужно писать точку (.) Итак, ваш код должен быть:
navbar.classList.add('navbar-active');
Но я настоятельно рекомендую использовать ID в качестве селектора вместо класса:
#navbar {
background: transparent !important;
z-index: 10;
border-bottom: 1px solid rgba(255, 255, 255, 0.3);
position: fixed;
width: 100%;
}
затем в JS вы можете легко выбрать:
const navbar = document.getElementById('navbar');
Это более эффективный способ с точки зрения производительности.