Я работаю над разделом заголовка в HTML и решил изучить JavaScript в этом проекте. Я также использую TailwindCSS, но некоторые особенности я включил в другой файл .css.
Я получил код JS от w3schools и адаптировал его под свою текущую настройку.
Я не совсем понимаю, почему меню не открывается при нажатии кнопки.
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel = "stylesheet" href = "output.css">
<link rel = "stylesheet" href = "alt.css">
</head>
<body style = "background-color: #171614;">
<script>
function menudd() {
document.getElementById(menu-main).classList.toggle("show");
}
window.onclick = function(event) {
if (!event.target.matches('.menub')) {
var dropdowns = document.getElementsByClassName("ddcontent");
var i;
for (i = 0; i < dropdowns.length; i++) {
var openDropdown = dropdowns[i];
if (openDropdown.classList.contains('show')) {
openDropdown.classList.remove('show');
}
}
}
}
</script>
<div class = "flex bg-prim py-1">
<button onclick = "menudd()" class = "menub p-2 ml-2"><img src = "./content/logowhite.png" width = "50" height = "50"></button>
<div id = "menu-main" class = "ddcontent absolute bg-sec-orange mx-5 min-w-40 z-1">
<ul>
<li class = "px-12 py-2 block text-center nav-button cursor-pointer">a</li>
<li class = "px-12 py-2 block text-center nav-button cursor-pointer">b</li>
<li class = "px-12 py-2 block text-center nav-button cursor-pointer">c</li>
</ul>
</div>
<div class = "relative hidden lg:flex items-center ml-auto pr-6">
<nav class = "text-sm leading-6 font-semibold text-bone">
<ul class = "ddcontent flex space-x-8">
<li><a class = "bg-sec-orange rounded-full p-3 hover:cursor-pointer nav-button">Artists</a></li>
<li><a class = "bg-sec-orange rounded-full p-3 hover:cursor-pointer nav-button">Contact Us</a></li>
</ul>
</nav>
</div>
</div>
</body>
</html>
И вот alt.css
.bg-prim {
background-color: #7a1d00;
}
.bg-sec-orange {
background-color: #ba3f1d;
}
.bg-sec-grey {
background-color: #545f71;
}
.text-bone {
color: #ece2d0;
}
.nav-button:hover {background-color: #7A1D00; transition: background-color 100ms ease-in-out;}
#menu-main {
display: none;
}
.show {display: block;}
Я пробовал много разных вещей, например, экспериментировал с Tailwind и даже вводил свои собственные строки CSS, однако я не совсем уверен, что мне нужно, чтобы все работало так, как задумано.
Вы неправильно импортируете id
, используйте двойные или одинарные кавычки, например ("menu-main")
.
В вашем коде есть несколько проблем. вам нужен упрощенный и лучший способ сделать это или по какой-то причине вы хотите, чтобы ваш собственный код был исправлен? Я отвечу соответственно.
Я только что импортировал ваши значения CSS в HTML-файл внутри тега стиля . Позже вы также можете использовать его в отдельном файле. Чтобы было понятно, я оставляю весь код, как объяснил в КОММЕНТАРИЯХ. Важные правила, которые вам следует знать: Специфика CSS , !important , Выбор идентификатора
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel = "stylesheet" href = "output.css">
<link rel = "stylesheet" href = "alt.css">
<style>
.bg-prim {
background-color: #7a1d00;
}
.bg-sec-orange {
background-color: #ba3f1d;
}
.bg-sec-grey {
background-color: #545f71;
}
.text-bone {
color: #ece2d0;
}
.nav-button:hover {background-color: #7A1D00; transition: background-color 100ms ease-in-out;}
#menu-main {
display: none; /* YOU ARE GIVING VALUE FOR ID SELECTOR WHICH OVERRIDES VALUES OF CLASS, EVEN IF THEY ARE ADDED LATER(IN YOUR CASE 'show')*/
}
.show {display: block !important;} /* BUT ONLY WAY YOU CAN USE '!important' TO OVERRIDE ANY PREVIOUS STYLES*/
</style>
</head>
<body style = "background-color: #171614;">
<script>
function menudd() {
document.getElementById('menu-main').classList.toggle("show");
//PAY ATTENTION WHEN YOU SELECT. THEY SHOULD BE SELECTED INSIDE QUOTATION MARKS "" OR ''.
}
// window.onclick = function(event) {
// if (!event.target.matches('.menub')) {
// var dropdowns = document.getElementsByClassName("ddcontent");
// var i;
// for (i = 0; i < dropdowns.length; i++) {
// var openDropdown = dropdowns[i];
// if (openDropdown.classList.contains('show')) {
// openDropdown.classList.remove('show');
// }
// }
// }
// } WE DO NOT NEED TO CREATE THIS
</script>
<div class = "flex bg-prim py-1">
<button onclick = "menudd()" class = "menub p-2 ml-2"><img src = "./content/logowhite.png" width = "50" height = "50"></button>
<div id = "menu-main" class = "ddcontent absolute bg-sec-orange mx-5 min-w-40 z-1">
<ul>
<li class = "px-12 py-2 block text-center nav-button cursor-pointer">a</li>
<li class = "px-12 py-2 block text-center nav-button cursor-pointer">b</li>
<li class = "px-12 py-2 block text-center nav-button cursor-pointer">c</li>
</ul>
</div>
<div class = "relative hidden lg:flex items-center ml-auto pr-6">
<nav class = "text-sm leading-6 font-semibold text-bone">
<ul class = "ddcontent flex space-x-8">
<li><a class = "bg-sec-orange rounded-full p-3 hover:cursor-pointer nav-button">Artists</a></li>
<li><a class = "bg-sec-orange rounded-full p-3 hover:cursor-pointer nav-button">Contact Us</a></li>
</ul>
</nav>
</div>
</div>
**Wrong**
document.getElementById(menu-main).classList.toggle("show");
**Right**
document.getElementById('menu-main').classList.toggle("show");
// menu-main must be in double quotes "menu-main"
Я вставил ваш код в один html-файл и заметил, что вы пропустили кавычки в функции.
document.getElementById("menu-main").classList.toggle("показать");
Другое дело, что я меняю ваш код, возьмите конец страницы с JavaScript и удалите это событие onclik, оно работает хорошо. Когда вы нажимаете кнопку, активируется функция меню, добавляется класс показа, а событие щелчка окна возвращает его обратно. Итак, это работает, но вы не можете видеть.
<div class = "flex bg-prim py-1">
<button onclick = "javascript:menudd()" class = "menub p-2 ml-2"><img src = "./content/logowhite.png" width = "50" height = "50"></button>
<div id = "menu-main" class = "ddcontent absolute bg-sec-orange mx-5 min-w-40 z-1">
<ul>
<li class = "px-12 py-2 block text-center nav-button cursor-pointer">a</li>
<li class = "px-12 py-2 block text-center nav-button cursor-pointer">b</li>
<li class = "px-12 py-2 block text-center nav-button cursor-pointer">c</li>
</ul>
</div>
<div class = "relative hidden lg:flex items-center ml-auto pr-6">
<nav class = "text-sm leading-6 font-semibold text-bone">
<ul class = "ddcontent flex space-x-8">
<li><a class = "bg-sec-orange rounded-full p-3 hover:cursor-pointer nav-button">Artists</a></li>
<li><a class = "bg-sec-orange rounded-full p-3 hover:cursor-pointer nav-button">Contact Us</a></li>
</ul>
</nav>
</div>
</div>
<script>
function menudd() {
var elem = document.getElementById("menu-main");
elem.classList.toggle("show");
}
</script>
Ваш код не работает, потому что #main-menu
имеет более высокую специфичность, чем .show
, поскольку id selectors
более специфичен, чем class selectors
. См. Специфика W3 School-CSS
Что вам нужно сделать, так это использовать более конкретный селектор, чтобы переопределить свойство display:none
объекта #menu-main
. Просто используйте #menu-main.show
вместо .show
.
Кроме того, в коде if (!event.target.matches('.menub'))
вы соответствуете .menub
, но поскольку ваша кнопка имеет дочернее изображение, нажатие на изображение не откроет меню. Используйте .menub, .menub *
там. Это выделит кнопку и все, что находится внутри кнопки.
Наконец, вы пропустили кавычки в document.getElementById()
.bg-prim {
background-color: #7a1d00;
}
.bg-sec-orange {
background-color: #ba3f1d;
}
.bg-sec-grey {
background-color: #545f71;
}
.text-bone {
color: #ece2d0;
}
.nav-button:hover {
background-color: #7A1D00;
transition: background-color 100ms ease-in-out;
}
#menu-main {
display: none;
}
#menu-main.show {
display: block;
}
<body style = "background-color: #171614;">
<div class = "flex bg-prim py-1">
<button onclick = "menudd()" class = "menub p-2 ml-2"><img src = "./content/logowhite.png" width = "50" height = "50"></button>
<div id = "menu-main" class = "ddcontent absolute bg-sec-orange mx-5 min-w-40 z-1">
<ul>
<li class = "px-12 py-2 block text-center nav-button cursor-pointer">a</li>
<li class = "px-12 py-2 block text-center nav-button cursor-pointer">b</li>
<li class = "px-12 py-2 block text-center nav-button cursor-pointer">c</li>
</ul>
</div>
<div class = "relative hidden lg:flex items-center ml-auto pr-6">
<nav class = "text-sm leading-6 font-semibold text-bone">
<ul class = "ddcontent flex space-x-8">
<li><a class = "bg-sec-orange rounded-full p-3 hover:cursor-pointer nav-button">Artists</a></li>
<li><a class = "bg-sec-orange rounded-full p-3 hover:cursor-pointer nav-button">Contact Us</a></li>
</ul>
</nav>
</div>
</div>
<script>
function menudd() {
document.getElementById("menu-main").classList.toggle("show");
}
window.onclick = function(event) {
if (!event.target.matches('.menub, .menub *')) {
var dropdowns = document.getElementsByClassName("ddcontent");
var i;
for (i = 0; i < dropdowns.length; i++) {
var openDropdown = dropdowns[i];
if (openDropdown.classList.contains('show')) {
openDropdown.classList.remove('show');
}
}
}
}
</script>
</body>
у вас появляется ошибка
document.getElementById(menu-main)....etc
? Вам следует