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,选择最适合的方案即可。

相关推荐
风骏时光牛马28 分钟前
大模型底层架构与推理流程AI源码深度剖析
前端
Setsuna_F_Seiei10 小时前
前端转型 Agent 开发 06 之 Agent Memory 记忆系统(让 Agent 更智能,更懂你)
前端·agent·ai编程
zhangzeyuaaa10 小时前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
默_笙11 小时前
🌊 向量库和 ES 都查不出"关系",我只好给奶茶建了一张人脉网
前端·javascript
优选资讯11 小时前
标签打印软件怎么对接 Excel 数据
前端·excel
一个风轻云淡12 小时前
GCC 和 GDB命令简单解读
java·linux·前端
u01110267513 小时前
图片处理接口如何统一错误信息 前端提示与后端错误码设计
前端·状态模式
福兮说13 小时前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic
libokaifa13 小时前
把语音模型塞进手机:sherpa-onnx 在 Android 上的 ASR / TTS
前端
deli00714 小时前
DLA 枝晶生长实测:5000 个粒子集体停摆之后,分形维数收敛到 1.70
前端