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

相关推荐
KaMeidebaby19 小时前
卡梅德生物技术快报|噬菌体肽库展示技术构建 Mhp168‑Hsp70 定向随机肽库:流程、质控与数据结果
前端·数据库·其他·百度·新浪微博
lchcy19 小时前
前端实现单点登录(SSO登录)
前端
卷帘依旧20 小时前
SPA下的路由模式详解
前端
环信20 小时前
2026年开发者选择即时通讯厂商应注意的几点
前端
卷帘依旧20 小时前
Generator 全面解析 + async/await 深度对比
前端·javascript
yqcoder21 小时前
数据劫持的双雄:深入解析 Object.defineProperty 与 Proxy
开发语言·前端·javascript
lichenyang45321 小时前
鸿蒙聊天 Demo 练习 03:接入 Next.js 后端接口,实现真机前后端联调
前端
小三金21 小时前
EXPO+RN echarts图表库,以及如何使用
前端·javascript·react.js
ZFSS21 小时前
Midjourney Shorten API 的集成与使用
java·前端·数据库·人工智能·ai·midjourney·ai编程
Pu_Nine_91 天前
IntersectionObserver 详解:封装 Vue 指令实现图片懒加载
前端·javascript·vue.js·性能优化