CSS下拉菜单被其他元素遮挡,如何修复?
解决下拉菜单被section遮挡的问题
问题原因
你的下拉菜单被showcase区块遮挡,核心是**层级堆叠顺序(z-index)**的问题:
showcase设置了position: relative,而你的下拉菜单.menu-sub虽为绝对定位,但未设置z-index,同时父元素.navbar也没有定位和层级设置,导致showcase的层级高于下拉菜单。- 另外,
.nav-middle li未设置position: relative,导致.menu-sub的绝对定位是相对于整个文档而非父级菜单项,位置也可能出现偏移。
修复步骤
- 给
.navbar添加定位和足够高的z-index,确保导航栏及其下拉菜单处于最上层:
.navbar { background-color: var(--color-1); height: 70px; position: relative; /* 新增 */ z-index: 100; /* 新增,值大于showcase的默认层级(0) */ }
- 给
.nav-middle li添加position: relative,让下拉菜单相对于父菜单项定位:
.nav-middle li { position: relative; /* 新增 */ }
- (可选)给
.menu-sub设置更高的z-index进一步确保层级,这一步在父元素层级足够时非必需:
.menu-sub { position: absolute; width: fit-content; display: none; background: #ddd; color: var(--color-2); height: 500px; z-index: 101; /* 可选新增 */ }
修改后的完整CSS代码
:root { --color-1: #ff8787; --color-2: #475569; } * { box-sizing: border-box; padding: 0; margin: 0; } body { font-family: "Roboto", sans-serif; color: var(--color-2); background: #ddd; } ul { list-style: none; } a { text-decoration: none; color: var(--color-2); } h1, h2 { font-weight: 300; line-height: 1.2; margin: 10px 0; } p { margin: 10px 0; } img { width: 100%; } /* Navbar */ .navbar { background-color: var(--color-1); height: 70px; position: relative; /* 新增 */ z-index: 100; /* 新增 */ } .navbar .flex { justify-content: space-between; } .nav-middle { display: flex; flex-direction: row; gap: 1rem; text-align: left; } .nav-middle li { position: relative; /* 新增 */ } .nav-middle a:hover { text-decoration: underline; } .nav-right { display: flex; flex-direction: row; gap: 1rem; } .login { font-size: 1.1rem; } .menu-sub { position: absolute; width: fit-content; display: none; background: #ddd; color: var(--color-2); height: 500px; z-index: 101; /* 可选新增 */ } .nav-middle li:hover .menu-sub, .nav-middle li:active .menu-sub { display: block; overflow: auto; } .menu-sub a { padding: 0; margin-bottom: 0.35em; } .menu-sub a:hover { text-decoration: underline; } .menu-category { margin: 2.5rem 0 0.5em; } .menu-category:first-of-type { margin-top: 0; } .menu-col-1 { display: grid; grid-template-columns: repeat(3, 1fr); } .menu-sub-left { background-color: #7950f2; padding: 1rem 1rem; } .menu-sub ul { padding: 1rem 1rem; } /* Showcase */ .showcase { height: 400px; background-color: var(--color-1); columns: var(--color-2); position: relative; } .showcase h1 { font-size: 3.5rem; text-align: center; font-weight: 500; margin-top: 3rem; } .showcase p { font-size: 2rem; margin: 1.5rem 0; text-align: center; } .showcase .showcase-text div { margin-top: 2rem; display: flex; flex-direction: row; gap: 1rem; justify-content: center; align-items: center; } /* Utilities */ .container { max-width: 1100px; margin: 0 auto; padding: 0 20px; overflow: auto; } .btn { display: inline-block; padding: 10px 30px; cursor: pointer; background: #845ef7; color: var(--color-2); border: none; border-radius: 5px; transition: all 0.5s; } .btn:hover { background-color: #7950f2; } .btn-outline { background-color: #ff8787; border: 1px solid var(--color-2); } .flex { display: flex; flex-direction: row; align-items: center; justify-content: center; }
说明
- 父元素设置
position: relative后,子元素的绝对定位会以该父元素为基准,避免下拉菜单位置偏移。 z-index控制元素堆叠顺序,值越大越靠上层,只要.navbar的z-index大于showcase的默认层级(0),就能保证下拉菜单不被遮挡。
内容的提问来源于stack exchange,提问作者Toby96
相关产品推荐
相关产品推荐

