[英]How do I hide the dropdown of a navbar when a user clicks elsewhere?
我正在使用带有下拉菜单的导航栏构建一个新网站,并且希望在单击另一个按钮或网站的其他部分时使下拉菜单消失。 我该如何编码?
下面的代码是我试图让它工作的最新实验。 当它是一个按钮时它工作得很好,但我无法将它扩展到多个按钮。 我对此很陌生,并正在努力学习。
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.navbar {
overflow: hidden;
background-color: #333;
font-family: Arial, Helvetica, sans-serif;
}
.navbar a {
float: left;
font-size: 16px;
color: white;
text-align: center;
padding: 14px 16px;
text-decoration: none;
}
.dropdown {
float: left;
overflow: hidden;
}
.dropdown .dropbtn {
cursor: pointer;
font-size: 16px;
border: none;
outline: none;
color: white;
padding: 14px 16px;
background-color: inherit;
font-family: inherit;
margin: 0;
}
.navbar a:hover, .dropdown:hover .dropbtn, .dropbtn:focus {
background-color: red;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f9f9f9;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 1;
}
.dropdown-content a {
float: none;
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
text-align: left;
}
.dropdown-content a:hover {
background-color: #ddd;
}
.show {
display: block;
}
.wrapper {
min-width: 800px;
margin: auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="navbar">
<a href="#home">Company name</a>
<div class="dropdown">
<button class="dropbtn" onclick="myFunction(1)">Our Methods
<i class="fa fa-caret-down"></i>
</button>
<div class="dropdown-content" id="myDropdown1">
<a href="#link">Insurance</a>
<a href="#link">Divorce</a>
<a href="#link">Financial Planning</a>
<a href="#link">Mortgage</a>
<a href="#link">Stocks</a>
<a href="#link">Pension</a>
</div>
</div>
<div class="dropdown">
<button class="dropbtn" onclick="myFunction(2)">Who we are
<i class="fa fa-caret-down"></i>
</button>
<div class="dropdown-content" id="myDropdown2">
<a href="#link">About the Team</a>
<a href="#link">Awards</a>
<a href="#link">Interesting articles</a>
</div>
</div>
<div class="dropdown">
<button class="dropbtn" onclick="myFunction(3)">Business info
<i class="fa fa-caret-down"></i>
</button>
<div class="dropdown-content" id="myDropdown3">
<a href="#link">Prices</a>
<a href="#link">Privacy</a>
<a href="#link">Methods</a>
</div>
</div>
<a href="#home">Recommendations</a>
<div class="dropdown">
<button class="dropbtn" onclick="myFunction(4)">Advice Evenings
<i class="fa fa-caret-down"></i>
</button>
<div class="dropdown-content" id="myDropdown4">
<a href="#link">Succesful Pensions</a>
<a href="#link">Casestudie Pension</a>
<a href="#link">Business Contacts</a>
</div>
</div>
</div>
</div>
<script>
/* When the user clicks on the button,
toggle between hiding and showing the dropdown content */
function myFunction(num) {
document.getElementById("myDropdown" + num).classList.toggle("show");
}
// Close the dropdown if the user clicks outside of it
window.onclick = function(e) {
if (!e.target.matches('.dropbtn')) {
var myDropdown1 = document.getElementById("myDropdown1");
if (myDropdown1.classList.contains('show')) {
myDropdown1.classList.remove('show');
}
var myDropdown2 = document.getElementById("myDropdown2");
if (myDropdown2.classList.contains('show')) {
myDropdown2.classList.remove('show');
}
var myDropdown3 = document.getElementById("myDropdown3");
if (myDropdown3.classList.contains('show')) {
myDropdown3.classList.remove('show');
}
var myDropdown4 = document.getElementById("myDropdown4");
if (myDropdown4.classList.contains('show')) {
myDropdown4.classList.remove('show');
}
}
}
</script>
</body>
</html>
当我单击其他地方时,我希望所有按钮都被隐藏,但不知何故这并没有发生。 (您可以在此处查看实际代码: http://growtricks.com/dropdown/dropdown4.html )。
我尝试在 MyFunction 的开头包含这一行:
document.getElementsByClassName('dropdown-content').forEach(function(dropdown) { dropdown.classList.remove('show'); });
但这只是完全停止显示下拉内容。
有多种方法。 我有点喜欢有单独的 function 变量来清除以前的操作:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.navbar {
overflow: hidden;
background-color: #333;
font-family: Arial, Helvetica, sans-serif;
}
.navbar a {
float: left;
font-size: 16px;
color: white;
text-align: center;
padding: 14px 16px;
text-decoration: none;
}
.dropdown {
float: left;
overflow: hidden;
}
.dropdown .dropbtn {
cursor: pointer;
font-size: 16px;
border: none;
outline: none;
color: white;
padding: 14px 16px;
background-color: inherit;
font-family: inherit;
margin: 0;
}
.navbar a:hover, .dropdown:hover .dropbtn, .dropbtn:focus {
background-color: red;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #f9f9f9;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 1;
}
.dropdown-content a {
float: none;
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
text-align: left;
}
.dropdown-content a:hover {
background-color: #ddd;
}
.show {
display: block;
}
.wrapper {
min-width: 800px;
margin: auto;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="navbar">
<a href="#home" onclick="myFunction('home')">Company name</a>
<div class="dropdown">
<button class="dropbtn" onclick="myFunction(1)">Our Methods
<i class="fa fa-caret-down"></i>
</button>
<div class="dropdown-content" id="myDropdown1">
<a href="#link">Insurance</a>
<a href="#link">Divorce</a>
<a href="#link">Financial Planning</a>
<a href="#link">Mortgage</a>
<a href="#link">Stocks</a>
<a href="#link">Pension</a>
</div>
</div>
<div class="dropdown">
<button class="dropbtn" onclick="myFunction(2)">Who we are
<i class="fa fa-caret-down"></i>
</button>
<div class="dropdown-content" id="myDropdown2">
<a href="#link">About the Team</a>
<a href="#link">Awards</a>
<a href="#link">Interesting articles</a>
</div>
</div>
<div class="dropdown">
<button class="dropbtn" onclick="myFunction(3)">Business info
<i class="fa fa-caret-down"></i>
</button>
<div class="dropdown-content" id="myDropdown3">
<a href="#link">Prices</a>
<a href="#link">Privacy</a>
<a href="#link">Methods</a>
</div>
</div>
<a href="#home" onclick="myFunction('home')">Recommendations</a>
<div class="dropdown">
<button class="dropbtn" onclick="myFunction(4)">Advice Evenings
<i class="fa fa-caret-down"></i>
</button>
<div class="dropdown-content" id="myDropdown4">
<a href="#link">Succesful Pensions</a>
<a href="#link">Casestudie Pension</a>
<a href="#link">Business Contacts</a>
</div>
</div>
</div>
</div>
<script>
/* When the user clicks on the button,
toggle between hiding and showing the dropdown content */
let closeDropdown = function() {
}
function myFunction(num) {
closeDropdown();
let el = document.getElementById("myDropdown" + num);
if (el) {
el.classList.toggle("show");
closeDropdown = function() {
el.classList.remove("show");
}
} else {
closeDropdown = function() {
}
}
}
</script>
</body>
</html>
另一个答案没有解决的一件事是,如果单击页面上的其他位置,如何也隐藏下拉列表。 我发现添加下面的代码解决了这个问题:
window.onclick = function(event) {
if (!event.target.matches('.dropbtn')) {
var dropdowns = document.getElementsByClassName("dropdown-content");
var i;
for (i = 0; i < dropdowns.length; i++) {
var openDropdown = dropdowns[i];
if (openDropdown.classList.contains('show')) {
openDropdown.classList.remove('show');
}
}
}
}
已经给出了 css 解决方案。 下面给出的是我的 javascript 解决方案。 只需用我的代码替换您的 javascript 代码即可。
<script>
/* When the user clicks on the button,
toggle between hiding and showing the dropdown content */
let closeDropdown = function() {
}
var oldselection = 0;
function myFunction(num) {
if(oldselection != 0){
document.getElementById('myDropdown'+oldselection).classList.remove("show");
// hiding the old dropdown
}
closeDropdown();
let el = document.getElementById("myDropdown" + num);
if (el) {
el.classList.toggle("show");
closeDropdown = function() {
el.classList.remove("show");
}
} else {
closeDropdown = function() {
}
}
oldselection = num;
}
</script>
在这段代码中,我刚刚添加了 1 个名为“oldselection”的变量,并存储了先前选择的下拉列表“num”值。 在下一次选择期间,我只是使用旧的选定值来隐藏其相关内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.