css排除样式:not:has

文章目录

同样都是.hljs元素,但是需要根据是否含有某子class来设置不同样式

javascript 复制代码
    <div class="hljs" style="margin: 50px;">
      含有某class子元素的.hljs当前元素样式
      <span class="modified">子元素</span>
    </div>
    <div class="hljs" style="margin: 50px;">
      不含有某class子元素的.hljs当前元素样式
    </div>


/* 给没有.modified子元素的.hljs元素设置红色 */
.hljs:not(:has(.modified)) {
  color: red;
}

/* 给有.modified子元素的.hljs元素设置青色 */
.hljs:has(.modified) {
  color: cyan;
}

你可以通过几种CSS选择器组合来实现这个需求:

方法1:使用 :not():has() 选择器(现代浏览器)

css 复制代码
/* 给没有.modified子元素的.hljs元素设置红色 */
.hljs:not(:has(.modified)) {
  color: red;
}

/* 给有.modified子元素的.hljs元素设置青色 */
.hljs:has(.modified) {
  color: cyan;
}

方法2:使用兄弟选择器(兼容性更好)

如果HTML结构可以调整,给modified添加特定标记:

html 复制代码
<div class="hljs">
  11
  <span class="modified">22</span>
  <span class="modified-indicator"></span> <!-- 添加标记 -->
</div>
<div class="hljs">
  33
  <!-- 没有标记 -->
</div>
css 复制代码
/* 默认所有hljs为红色 */
.hljs {
  color: red;
}

/* 有modified-indicator的hljs改为青色 */
.hljs:has(.modified-indicator) {
  color: cyan;
}

方法3:通过修改HTML结构实现

如果可以直接修改HTML,添加不同的类名会更简单:

html 复制代码
<div class="hljs with-modified">
  11
  <span class="modified">22</span>
</div>
<div class="hljs">
  33
</div>
css 复制代码
.hljs {
  color: red;
}

.hljs.with-modified {
  color: cyan;
}

方法4:使用数据属性

html 复制代码
<div class="hljs" data-has-modified="true">
  11
  <span class="modified">22</span>
</div>
<div class="hljs">
  33
</div>
css 复制代码
.hljs {
  color: red;
}

.hljs[data-has-modified="true"] {
  color: cyan;
}

方法5:JavaScript辅助(如果必须动态检测)

javascript 复制代码
// 检测并添加类名
document.querySelectorAll('.hljs').forEach(el => {
  if (el.querySelector('.modified')) {
    el.classList.add('has-modified');
  }
});
css 复制代码
.hljs {
  color: red;
}

.hljs.has-modified {
  color: cyan;
}

推荐方案

如果不需要支持旧浏览器,方法1 (使用:has())是最简洁的。如果需要更好的兼容性,建议使用方法3方法4,通过添加标记来区分。

注意事项

  • :has() 选择器在现代浏览器中支持良好(Chrome 105+、Safari 15.4+、Firefox 121+)
  • 如果使用了:has(),需要确保浏览器版本较新
  • 如果颜色需要继承给所有子元素,确保没有子元素覆盖颜色

根据你的浏览器支持需求和能否修改HTML,选择最适合的方案即可。

相关推荐
奔跑的web.8 小时前
TypeScript Enum 类型入门:从基础到实战
前端·javascript·typescript
盐真卿8 小时前
python2
java·前端·javascript
梦梦代码精8 小时前
BuildingAI vs Dify vs 扣子:三大开源智能体平台架构风格对比
开发语言·前端·数据库·后端·架构·开源·推荐算法
seabirdssss9 小时前
《bootstrap is not defined 导致“获取配置详情失败”?一次前端踩坑实录》
前端·bootstrap·html
kgduu9 小时前
js之表单
开发语言·前端·javascript
谢尔登11 小时前
Vue3 响应式系统——computed 和 watch
前端·架构
愚公移码11 小时前
蓝凌EKP产品:主文档权限机制浅析
java·前端·数据库·蓝凌
我是伪码农11 小时前
轮播图案例
css·html·css3
欣然~13 小时前
法律案例 PDF 批量转 TXT 工具代码
linux·前端·python
一个小废渣13 小时前
Flutter Web端网络请求跨域错误解决方法
前端·flutter