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

相关推荐
萧行之1 小时前
可视化技术复盘:从图形语法看 D3、Vega-Lite、ECharts、Observable Plot
前端·学习·数据可视化
尾善爱看海9 小时前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
驳是9 小时前
一个组件,提升 react-router 开发的幸福感
前端·preact
GreenTea9 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
星云API技术支持9 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
京东云开发者10 小时前
81.8 秒的视频,我们改了 15 个版本:一次纯 Codex 驱动的 AI-native 视频实践
前端·aigc
Csvn10 小时前
TypeScript 大型项目架构:从单体 tsconfig 到分层可扩展的工程
前端
计算机魔术师12 小时前
Dario Amodei 发文呼吁为前沿 AI 降速并提出三点计划
前端
计算机魔术师12 小时前
OpenAI的AI代理偷偷给RubyGems下毒,我们却毫无察觉
前端
甲维斯12 小时前
0代码,0建模,3句话开发一个3D游戏!
前端·游戏·游戏开发