如何阻止响应式导航下拉菜单元素hover时左移
解决导航栏下拉菜单hover偏移问题
问题原因
下拉菜单项(如About下的Our Story)hover时向左偏移,根源是这段CSS规则:
nav ul li ul li:hover, nav ul li:hover { background: #34cc99; color: #FFF; width: max-content; padding: 0%; text-align: center; }
该规则同时作用于顶级导航li和下拉菜单li,给下拉li设置的padding: 0%会覆盖nav a原本的内边距,直接导致内容偏移;另外width: max-content也会干扰下拉列表的布局逻辑。
修复方案
拆分选择器,分别给顶级导航li和下拉菜单li设置合适的hover样式,移除下拉li的不必要属性:
修改后的关键CSS片段
/* 仅对顶级导航li应用hover样式 */ nav ul li:hover { background: #34cc99; color: #FFF; width: max-content; text-align: center; } /* 下拉菜单li的hover样式单独设置,保留内边距 */ nav ul li ul li:hover { background: #34cc99; color: #FFF; text-align: center; }
完整修复后的代码
HTML部分
<nav> <div id="logo">GETUWIRED</div> <label for="drop" class="toggle">Menu</label> <input type="checkbox" id="drop" /> <ul class="menu"> <li> <label for="drop-1" class="toggle">WordPress +</label> <a href="#" id="title">ABOUT</a> <input type="checkbox" id="drop-1" /> <ul> <li><a href="#">OUR STORY</a></li> <li><a href="#">OUR COMMITMENT TO YOU</a></li> </ul> </li> <li> <label for="drop-2" class="toggle">Web Design +</label> <a href="#" id="title">LOCATIONS</a> <input type="checkbox" id="drop-2" /> <ul> <li><a href="#">AUSTIN, TX</a></li> <li><a href="#">ATLANTA, GA</a></li> <li><a href="#">SEATTLE, WA</a></li> <li><a href="#">PORTLAND, OR</a></li> </ul> </li> <li> <label for="drop-1" class="toggle">WordPress +</label> <a href="#" id="title">PRODUCTS</a> <input type="checkbox" id="drop-3" /> <ul> <li><a href="#">NEW ARRIVALS</a></li> <li><a href="#">FEATURED</a></li> <li><a href="#">TOP RATED</a></li> <li><a href="#">HIS</a></li> <li><a href="#">HERS</a></li> <li><a href="#">KIDS</a></li> <li><a href="#">ACCESSORIES</a></li> <li><a href="#">SPRING CATALOG</a></li> <li><a href="#">THE ESSENTIALS</a></li> <li><a href="#">SALE</a></li> </ul> </li> <li><a href="#" id="title">BLOG</a></li> <li><a href="#" id="title">CONTACT</a></li> </ul> </nav>
CSS部分
body { background-image: url(http://www.getuwired.com/devtest/Death_to_stock_photography_Vibrant.jpg); background-size: cover; background-repeat: no-repeat; font-size: 22px; line-height: 32px; color: #000; margin: 0; padding: 0; word-wrap: break-word !important; font-family: 'Roboto', sans-serif; } h1 { font-size: 60px; text-align: center; color: #FFF; } h3 { font-size: 30px; line-height: 34px; text-align: center; color: #FFF; } h3 a { color: #FFF; } a { color: #FFF; } h1 { margin-top: 100px; text-align: center; font-size: 60px; line-height: 70px; font-family: 'Bree Serif', 'serif'; } #title { color: #000; text-shadow: none; } #container { margin: 0 auto; max-width: 890px; } p { text-align: center; } .toggle, [id^=drop] { display: none; } nav { margin: 0; padding: 1em; background-color: #FFF; } #logo { display: block; padding: 0 30px; float: left; font-size: 40px; font-weight: 700; line-height: 60px; } nav:after { content: ""; display: table; clear: both; } nav ul { float: right; padding: 0; margin: 0; list-style: none; position: relative; background-color: #34cc99; } nav ul li { margin: 0px; display: inline-block; float: left; background-color: #FFF; } nav a { display: inline-block; padding: 14px 20px; color: #fff; font-size: 20px; text-decoration: none; white-space: nowrap; text-align: center; } /* 拆分选择器,分别设置顶级和下拉li的hover样式 */ nav ul li:hover { background: #34cc99; color: #FFF; width: max-content; text-align: center; } nav ul li ul li:hover { background: #34cc99; color: #FFF; text-align: center; } nav:hover { border-bottom: #34cc99 5px solid; } nav a:hover { background-color: #019966; color: #ffffff; text-shadow: 1px 1px lightgray; width: auto; } nav ul ul { display: none; position: absolute; top: 60px; } nav ul li:hover>ul { display: inherit; background-color: #019966; color: #FFF; text-align: center; width: max-content; } nav ul ul li { width: auto; float: none; display: list-item; position: relative; background-color: #34cc99; color: #FFF; } nav ul ul ul li { position: relative; top: -60px; left: 170px; } li>a:after { content: ' '; } li>a:only-child:after { content: ''; } @media all and (max-width: 768px) { #logo { display: block; padding: 0; width: 100%; text-align: center; float: none; } nav { margin: 0; } .toggle+a, .menu { display: none; } .toggle { display: block; background-color: #254441; padding: 14px 20px; color: #FFF; font-size: 17px; text-decoration: none; border: none; } .toggle:hover { background-color: #000000; } [id^=drop]:checked+ul { display: block; } nav ul li { display: block; width: 100%; } nav ul ul .toggle, nav ul ul a { padding: 0 40px; } nav ul ul ul a { padding: 0 80px; } nav a:hover, nav ul ul ul a { background-color: #000000; color: #FFF; } nav ul li ul li .toggle, nav ul ul a, nav ul ul ul a { padding: 14px 20px; color: #FFF; font-size: 12px; } nav ul li ul li .toggle, nav ul ul a { background-color: #212121; } nav ul ul { float: none; position: static; color: #ffffff; } nav ul ul li:hover>ul, nav ul li:hover>ul { display: none; } nav ul ul li { display: block; width: 100%; } nav ul ul ul li { position: static; } } @media all and (max-width: 330px) { nav ul li { display: block; width: 94%; } }
额外说明
拆分选择器后,下拉菜单的li不再被设置padding:0%,保留了nav a的内边距,彻底避免偏移问题;同时下拉列表的hover样式只保留必要的背景色和文字对齐,不干扰原有布局逻辑。
内容的提问来源于stack exchange,提问作者Dorestt Development
相关产品推荐
相关产品推荐

