响应式下拉导航:设置display:none的列表项为何仍占用空间?
响应式下拉导航菜单隐藏项仍占空间的问题
我开发了一款响应式下拉导航菜单,需求是:屏幕宽度大于1100px时,Book A Table列表项不显示在中间nav区域;宽度小于1100px时,显示在下拉菜单中。但设置display:none后,该元素所在位置仍有占位的绿色线条,用Chrome审查元素能看到这个问题。
相关代码
HTML代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Dropdown Menu</title> <link href="styles.css" rel="stylesheet"> <link href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css' rel='stylesheet'> </head> <body> <header class="header"> <div class="toggle-button" onclick="myFunction();"> <span class="bar1"></span> <span class="bar2"></span> <span class="bar3"></span> </div> <div class="logo"> <a href="index.html"><img src="darklogo.png" alt=""></a> </div> <nav id="nav"> <ul> <li><a href="#">Home</a></li> <li><a href="#">Menu</a></li> <li><a href="#">About Us</a></li> <li><a href="#">Contact Us</a></li> <li><a href="#" class="bookatabledd">Book A Table</a></li> </ul> </nav> <div class="bookatable">Book A Table   ></div> </header> <script src="main.js"></script> </body> </html>
CSS代码
* { margin: 0; padding: 0; box-sizing: border-box; font-family: Arial, Helvetica, sans-serif; } header { display: flex; text-align: center; justify-content: space-between; align-items: center; width: 100%; padding: 5px 60px; background-color: #212223; position: relative; } .logo img { width: 190px; } .bookatabledd { display: none; } nav ul li { display: inline-block; padding: 5px 25px; } nav ul li a{ display: inline-block; font-weight: bold; font-size: 20px; list-style-type: none; } nav ul li a:hover { color: rgb(174, 17, 174); } nav ul li a{ text-decoration: none; display: inline-block; color: white; font-weight: 600; } .toggle-button{ width: 35px; position: absolute; right: 40px; top: 45px; display: none; cursor: pointer; } .toggle-button span { display: inline-block; width: 100%; height: 2px; background-color: white; float: left; margin-bottom: 8px; } .bookatable { color: #fff; background-color: #555556; border-radius: 6px; text-transform: uppercase; font-weight: 600; font-size: 18px; line-height: 1; text-align: center; padding: 9px 6px 8px 8px; transition-duration: 0.6s; transition-timing-function: ease-in-out; letter-spacing: -.3px; cursor: pointer; } .bookatable:hover { cursor: pointer; background-color: #909092; color: white; } /* ---- BREAKPOINTS ---- */ @media (max-width: 1100px) { header { display: flex; flex-direction: column; text-align: center; position: relative; justify-content: space-between; padding: 5px 20px 5px; } .logo { align-self: flex-start; } .toggle-button{ display: block; } nav{ display: none; width: 100%; border-top: 1px solid white; padding-top: 20px 0; margin-top: 30px; } nav ul li{ padding: 15px 0px; width: 100%; } nav ul { text-align: center; } nav.show{ display: flex; flex-direction: column; flex-wrap: nowrap; } .bookatable { display: none; } .bookatabledd { display: block; } }
问题原因与解决方法
你现在只隐藏了<a>标签(.bookatabledd),但它的父元素<li>还是display:inline-block状态,会占据页面空间,也就是你看到的绿色占位线。
具体修复步骤:
- 给包含
.bookatabledd的<li>加一个专属类,比如book-table-li:
<li class="book-table-li"><a href="#" class="bookatabledd">Book A Table</a></li>
- 在全局CSS里隐藏这个
<li>,替换原来隐藏<a>的代码:
/* 删掉原来的 .bookatabledd { display: none; } */ .book-table-li { display: none; }
- 在
max-width:1100px的媒体查询中,设置这个<li>显示:
@media (max-width: 1100px) { /* 保留原有其他样式 */ .book-table-li { display: block; } /* 可删掉原来的 .bookatabledd { display: block; },父元素显示后子元素自然会显示 */ }
这样就能让这个列表项在大屏时彻底不占空间,小屏时正常出现在下拉菜单里了。
内容的提问来源于stack exchange,提问作者mdot
相关产品推荐
相关产品推荐

