如何基于父元素前兄弟的子元素属性选择元素?CSS按属性隐藏锚点
问题解答
一、基于父元素前一个兄弟的子元素属性选择目标元素
CSS中可以通过**:has()伪类 + 兄弟选择器**实现这个需求,核心逻辑是先定位到包含符合属性子元素的前一个兄弟父元素,再选中目标元素所在的父元素,最后定位目标元素:
实现逻辑
- 用
:has()伪类筛选出包含指定属性子元素的前一个兄弟元素(父元素的前兄弟) - 用相邻兄弟选择器
+或通用兄弟选择器~选中目标元素的父元素 - 结合后代选择器定位到目标元素
示例代码
假设HTML结构如下:
<ul> <!-- 前一个兄弟元素,其子元素a包含目标属性 --> <li><a href="?isInternalUser=true">内部用户入口</a></li> <!-- 目标元素所在的父元素 --> <li><span class="target">需要选中的元素</span></li> </ul>
对应的CSS选择器:
/* 选中前一个兄弟li(包含符合属性的a)后面的li里的.target元素 */ li:has(> a[href*="isInternalUser=true"]) + li .target { color: red; }
⚠️ 注意::has()是CSS Selectors Level 4特性,仅支持Chrome 105+、Firefox 121+、Safari 15.4+等现代浏览器,旧浏览器(如IE)不兼容。
二、基于第一个的isInternalUser=true属性隐藏同
这个需求完全可以用CSS实现,有两种方案适配不同场景:
方案1:相邻兄弟选择器(适用于a连续排列的场景)
如果
+直接选中目标a:/* 选中符合属性的a后面的第一个和第二个相邻a */ .nav>li>[href*="isInternalUser=true"]+a, .nav>li>[href*="isInternalUser=true"]+a+a { display: none; }
这个选择器的逻辑是:找到.nav下li内的、包含isInternalUser=true的a,然后选中它后面紧跟的第一个a,以及这个a后面的下一个a,将它们隐藏。
方案2::has() + :nth-child()(更灵活的通用场景)
如果
:has()结合:nth-child():/* 先筛选出第一个子元素a符合属性的li,再选中该li内的第2、3个a */ .nav>li:has(> a:first-child[href*="isInternalUser=true"]) > a:nth-child(2), .nav>li:has(> a:first-child[href*="isInternalUser=true"]) > a:nth-child(3) { display: none; } /* 如果是下拉菜单内的li,调整选择器如下 */ .nav .dropdown-menu>li:has(> a:first-child[href*="isInternalUser=true"]) > a:nth-child(2), .nav .dropdown-menu>li:has(> a:first-child[href*="isInternalUser=true"]) > a:nth-child(3) { display: none; }
完整示例代码
HTML
<ul class="nav nav-pills"> <li><a href="https://www.sapsfdemojobs.com/?isInternalUser=true" title="Home Page">Home Page</a></li> <li><a href="https://www.sapsfdemojobs.com/careers" title="CMC Careers" target="_blank">CMC Careers</a></li> <li><a href="https://www.sapsfdemojobs.com/home" title="Veterans" target="_blank">Veterans</a></li> <li class="dropdown"><a class="dropdown-toggle" role="button" data-toggle="dropdown" href="#" aria-haspopup="true" aria-expanded="false" title="Find a Job" aria-controls="header1top3"> Find a Job <b class="caret"></b> </a> <ul class="dropdown-menu company-dropdown headerdropdown" id="header1top3"> <li><a title="View All Jobs">View All Jobs</a></li> <li><a href="https://sapsfdemojobs.com/content/CMC-Steel-Arizona-2nd-Micro-Mill/?locale=en_US&isInternalUser=true" title="Opportunities in Arizona">Opportunities in Arizona</a></li> <li><a title="Business Support Jobs">Business Support</a></li> <li><a href="https://sapsfdemojobs.com/content/Core-Career-Path/?locale=en_US&isInternalUser=true" title="Core Career Path">Core Career Path</a></li> <li><a title="Drivers Jobs">Drivers</a></li> <li><a title="Maintenance Jobs">Maintenance</a></li> <li><a title="Operations Jobs">Operations</a></li> <li><a title="Sales Jobs">Sales</a></li> <li><a title="Students">Sudents </a></li> <li><a title="Technology Jobs">Technology</a></li> </ul> </li> </ul>
内容的提问来源于stack exchange,提问作者Sanju R
相关产品推荐
相关产品推荐

