CSS Grid Layout Header内下拉菜单无法覆盖Content行的问题
看起来你遇到的核心问题是下拉框被父容器的overflow: hidden属性裁剪了,这也是为什么设置z-index没用的原因——内容已经被容器边界截断,层级再高也无法显示超出部分。咱们一步步来解决:
问题根源分析
看你的CSS代码,.login-topnav这个导航栏容器设置了overflow: hidden,这个属性会强制把所有超出容器范围的内容(包括你绝对定位的下拉框)裁剪掉。虽然下拉框用了position: absolute,但它的父级链里有这个overflow: hidden的容器,所以只能在Header行范围内显示。
解决方案步骤
1. 移除导航栏的overflow: hidden
把.login-topnav里的overflow: hidden改成overflow: visible(或者直接删掉这个属性),这样超出导航栏的下拉框就不会被裁剪了:
.login-topnav { list-style-type: none; position: relative; margin: 0; padding: 2px 0 1px 0; overflow: visible; /* 替换原来的overflow: hidden */ display: block; background-color: rgb(50,53,57,0.2); }
2. 给下拉框父元素设置定位参考
给.login-dropdown添加position: relative,让绝对定位的下拉框以这个登录按钮容器为参考点,避免定位错位:
.login-dropdown { display: block; float: right; color: white; text-align: center; text-decoration: none; position: relative; /* 添加这个属性 */ }
3. 调整下拉框和箭头的定位
现在下拉框的定位参考是.login-dropdown,所以修改.login-dropdown-content的位置,让它刚好显示在登录按钮下方:
.login-dropdown-content { position: absolute; width: 300px; height: 100px; right: 0; /* 对齐父元素右侧 */ top: 100%; /* 紧贴父元素底部 */ background-color: #fff; box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); padding: 1px; z-index: 100; /* 确保层级足够高,覆盖Content区域 */ }
同时调整下拉箭头的位置,让它对应到下拉框的顶部:
.dropdown-arrow { width: 0; height: 0; position: absolute; border-left: 20px solid transparent; border-right: 20px solid transparent; border-bottom: 20px solid #fff; right: 29px; top: calc(100% - 20px); /* 调整到父元素底部上方 */ }
为什么之前的z-index没用?
z-index只在有定位属性(position不为static)的元素之间生效,而且如果父容器设置了overflow: hidden,不管子元素的z-index多高,都会被容器裁剪掉。所以解决裁剪问题是第一步,之后再设置z-index才能让下拉框覆盖Content区域。
修改完这些后,你的登录下拉框应该就能正常显示在Header之外,覆盖Content区域了。
内容的提问来源于stack exchange,提问作者Hmerman6006

