#javascript #html #css #flexbox
#javascript #HTML #css #flexbox
Вопрос:
Я хочу создать выпадающее меню с функцией js, щелкнув по одному из пунктов меню. Я пытался добиться этого с помощью функции, приведенной ниже, но она не работает. Не могли бы вы сказать мне, в чем моя ошибка? Я хочу использовать чистый javascript, и я использую SASS, если это что-то меняет.
Вот код:
let home = document.getElementById('home');
let underhome = document.querySelector('under-home');
home.addEventListener('click', function() {
underhome.classList.toggle('open');
});
.navbar .slider .hammburger-links {
padding: 0 1.250em;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
}
.navbar .slider .hammburger-links a {
padding: 0 1.500em;
text-decoration: none;
font-family: "Helvetica", Arial;
font-size: 11px;
color: #a6adb4;
}
.navbar .slider .hammburger-links .under-home {
position: absolute;
top: 5%;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
background: #F6F8F9;
min-width: 12.5em;
min-height: 12.5em;
z-index: 1;
display: none;
}
.navbar .slider .hammburger-links .under-home a {
margin: 10px 0;
}
.navbar .slider .hammburger-links .open {
display: inline;
<div class="navbar">
<div class="slider">
<div class="hammburger-links">
<a href="" id="home">HOME</a>
<div class="under-home">
<a href="">WORLD NEWS</a>
<a href="">TRAVEL</a>
<a href="">TECHNOLOGY</a>
<a href="">CITY</a>
<a href="">CULTURE</a>
<a href="">MORE...</a>
</div>
<a href="">DISCOVERY</a>
<a href="">PHOTOS</a>
<a href="">CONTACT</a>
<img src="images/navbar-img.png" alt="">
</div>
</div>
</div>
Комментарии:
1. Если то, чего вы пытаетесь достичь, — это выпадающий список с
onchange
событием, это неправильный способ сделать это2. Нет элемента, которому
under-home
соответствовал бы селектор.3. каков правильный путь, чем?
Ответ №1:
Есть довольно много изменений — основные из них описаны ниже:
- прежде всего, добавлена
navbar
оболочка, отсутствующая в вашем фрагменте, а в вашем.querySelector('under-home')
отсутствовал.
(селектор класса), - добавлено
position: relative
.hammburger-links
, чтобы подменю располагалось абсолютно относительно этого элемента, - добавлено
e.preventDefault()
в ваш EventListener, чтобы действие по умолчанию при нажатии на гиперссылку было отключено (мы хотим, чтобы меню переключалось здесь справа), - при
.open
использованииdisplay: flex
вместоdisplay: inline
,
Смотрите демонстрацию ниже:
let home = document.getElementById('home');
let underhome = document.querySelector('.under-home');
home.addEventListener('click', function(e) {
e.preventDefault(); /* prevent default hyperlink action */
underhome.classList.toggle('open');
});
.navbar .slider .hammburger-links {
padding: 0 1.250em;
display: flex;
align-items: center;
position: relative; /* added */
}
.navbar .slider .hammburger-links a {
padding: 0 1.500em;
text-decoration: none;
font-family: "Helvetica", Arial;
font-size: 11px;
color: #a6adb4;
}
.navbar .slider .hammburger-links .under-home {
position: absolute;
top: 1.5em; /* adjusted */
display: flex;
flex-direction: column;
background: #F6F8F9;
min-width: 12.5em;
min-height: 12.5em;
z-index: 1;
display: none;
}
.navbar .slider .hammburger-links .under-home a {
margin: 10px 0;
}
.navbar .slider .hammburger-links .open {
display: flex; /* changed */
}
<div class="navbar">
<div class="slider">
<div class="hammburger-links">
<a href="" id="home">HOME</a>
<div class="under-home">
<a href="">WORLD NEWS</a>
<a href="">TRAVEL</a>
<a href="">TECHNOLOGY</a>
<a href="">CITY</a>
<a href="">CULTURE</a>
<a href="">MORE...</a>
</div>
<a href="">DISCOVERY</a>
<a href="">PHOTOS</a>
<a href="">CONTACT</a>
<img src="https://via.placeholder.it/200" alt="">
</div>
</div>
</div>
Ответ №2:
Попробуйте это
let home = document.getElementById('home');
home.addEventListener('click', function() {
var element = document.getElementById('under_home');
element.classList.toggle("open");
});
.navbar .slider .hammburger-links {
padding: 0 1.250em;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
}
.navbar .slider .hammburger-links a {
padding: 0 1.500em;
text-decoration: none;
font-family: "Helvetica", Arial;
font-size: 11px;
color: #a6adb4;
}
.navbar .slider .hammburger-links .under-home {
position: absolute;
top: 14%;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
background: #F6F8F9;
min-width: 12.5em;
min-height: 12.5em;
z-index: 1;
display: none;
}
.navbar .slider .hammburger-links .under-home a {
margin: 10px 0;
}
.navbar .slider .hammburger-links .open {
display: inline;
}
<div class="navbar">
<div class="slider">
<div class="hammburger-links">
<a href="" id="home">HOME</a>
<div class="under-home" id="under_home">
<a href="">WORLD NEWS</a>
<a href="">TRAVEL</a>
<a href="">TECHNOLOGY</a>
<a href="">CITY</a>
<a href="">CULTURE</a>
<a href="">MORE...</a>
</div>
<a href="">DISCOVERY</a>
<a href="">PHOTOS</a>
<a href="">CONTACT</a>
<img src="images/navbar-img.png" alt="">
</div>
</div>
</div>