#javascript #html #css
Вопрос:
Я должен сделать такую навигационную панель с помощью VanillaJS.
Стиль и проект заданы, но я не могу заставить раскрывающийся список оставаться открытым при наведении мыши на внутренние элементы. После перемещения за пределы кнопки она закрывается.
Вот желаемый результат: gif
const categoriesLink = document.querySelector('.categories__link');
const categoriesList = document.querySelector('.categories__wrapper');
function categoriesVisible() {
categoriesList.style.display = 'block';
}
function categoriesHidden() {
categoriesList.style.display = 'none';
}
categoriesLink.addEventListener('mouseover', categoriesVisible);
categoriesLink.addEventListener('mouseout', categoriesHidden);
.header__nav {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.nav {
position: relative;
}
.categories__link {
color: #000000;
cursor: pointer;
}
.categories__link:hover {
color: #2F80ED;
}
.categories__wrapper {
display: none;
position: absolute;
top: 30px;
left: -100px;
}
.categories__content {
position: relative;
box-shadow: 0px 0px 4px #BDBDBD;
border-radius: 5px;
background: #FFFFFF;
}
.categories__content::after {
z-index: -10;
content: "";
position: absolute;
width: 0;
height: 0;
top: -5px;
left: 50%;
border: 5px solid transparent;
transform-origin: 0 0;
transform: rotate(45deg);
box-shadow: 0px 0px 4px #BDBDBD;
}
.categories__content::before {
z-index: 10;
content: "";
position: absolute;
width: 0;
height: 0;
top: -5px;
left: 50%;
border: 5px solid #fff;
transform-origin: 0 0;
transform: rotate(45deg);
}
.categories__list {
display: flex;
padding: 14px 30px;
}
.list__link {
line-height: 150%;
color: #000000;
}
.list__link:hover {
color: #2F80ED;
}
<div class="header__nav">
<nav class="nav">
<span class="categories__link">Categories</span>
<div class="categories__wrapper">
<div class="categories__content">
<div class="categories__list">
<ul class="left__list">
<li><a class="list__link" href="" #>Sport</a></li>
<li><a class="list__link" href="" #>World</a></li>
<li><a class="list__link" href="" #>Covid</a></li>
<li><a class="list__link" href="" #>Business</a></li>
</ul>
<ul class="right__list">
<li><a class="list__link" href="" #>Politics</a></li>
<li><a class="list__link" href="" #>Sciense</a></li>
<li><a class="list__link" href="" #>Religion</a></li>
<li><a class="list__link" href="" #>Health</a></li>
</ul>
</div>
</div>
</div>
</nav>
<div class="header__burger">
<span></span>
</div>
</div>
Мой код на Codepen https://codepen.io/sennarion/pen/dyRKBxK
Комментарии:
1. Пожалуйста, пишите на английском языке
2. Пожалуйста, напишите свой вопрос на английском языке Для получения дополнительной информации
3. Что это за язык такой? Персонажи в нем выглядят красиво 🙂
4. когда вы говорите: «Стиль и проект заданы», вы имеете в виду, что не можете изменить css и html? Является ли использование javascript вашим единственным вариантом?
Ответ №1:
Если вы можете изменить css и html, вы могли бы сделать это так:
сначала потеряйте javascript. добавьте в css следующее:
.nav__item {
position: relative;
}
.nav__item:hover > .categories__wrapper {
display: block;
}
затем переместите свойство top из .categories__обертка в .categories__содержимое и установите значение top на .categories__обертка в 0
.categories__wrapper {
display: none;
position: absolute;
top: 0;
left: -100px;
}
.categories__content {
position: relative;
top: 30px;
box-shadow: 0px 0px 4px #BDBDBD;
border-radius: 5px;
background: #FFFFFF;
}
и, наконец, оберните категории в элемент навигации с классом=»nav__item», как это:
<nav class="nav">
<div class="nav__item">
<span class="categories__link">Categories</span>
<div class="categories__wrapper">
...
</div>
</div>
</nav>
.header__nav {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.nav {
position: relative;
}
.nav__item {
position: relative;
}
.nav__item:hover > .categories__wrapper {
display: block;
}
.categories__link {
color: #000000;
cursor: pointer;
}
.categories__link:hover {
color: #2F80ED;
}
.categories__wrapper {
display: none;
position: absolute;
top: 0;
left: -100px;
}
.categories__content {
position: relative;
top: 30px;
box-shadow: 0px 0px 4px #BDBDBD;
border-radius: 5px;
background: #FFFFFF;
}
.categories__content::after {
z-index: -10;
content: "";
position: absolute;
width: 0;
height: 0;
top: -5px;
left: 50%;
border: 5px solid transparent;
transform-origin: 0 0;
transform: rotate(45deg);
box-shadow: 0px 0px 4px #BDBDBD;
}
.categories__content::before {
z-index: 10;
content: "";
position: absolute;
width: 0;
height: 0;
top: -5px;
left: 50%;
border: 5px solid #fff;
transform-origin: 0 0;
transform: rotate(45deg);
}
.categories__list {
display: flex;
padding: 14px 30px;
}
.list__link {
line-height: 150%;
color: #000000;
}
.list__link:hover {
color: #2F80ED;
}
<div class="header__nav">
<nav class="nav">
<div class="nav__item">
<span class="categories__link">Categories</span>
<div class="categories__wrapper">
<div class="categories__content">
<div class="categories__list">
<ul class="left__list">
<li><a class="list__link" href="" #>Sport</a></li>
<li><a class="list__link" href="" #>World</a></li>
<li><a class="list__link" href="" #>Covid</a></li>
<li><a class="list__link" href="" #>Business</a></li>
</ul>
<ul class="right__list">
<li><a class="list__link" href="" #>Politics</a></li>
<li><a class="list__link" href="" #>Sciense</a></li>
<li><a class="list__link" href="" #>Religion</a></li>
<li><a class="list__link" href="" #>Health</a></li>
</ul>
</div>
</div>
</div>
</div>
</nav>
<div class="header__burger">
<span></span>
</div>
</div>