这个 CSS 特性,可能终结样式冲突

我最近刷到一个即将改变组件样式管理方式的 CSS 能力。如果你经常被组件样式互相“串味”困扰,它也许就是那个无需再引入 JS 库、还能保持样式清爽分离的解法。

用传统方式写 CSS,样式默认是全局生效的。两个组件只要元素类型或类名“撞车”,很容易互相覆盖。

我最近刷到一个即将改变组件样式管理方式的 CSS 能力。

如果你经常被组件样式互相“串味”困扰,它也许就是那个无需再引入 JS 库、还能保持样式清爽分离的解法。

让我们直接看它怎么用。

样式外泄与复杂度

现代 Web 基本都是组件化 UI。每个组件都有自己的“皮肤”。而传统 CSS 在这方面经常拖后腿:

  • 样式默认全局,非常容易出现“样式外泄”与互相冲突
  • 我在做 React 时长期用 CSS-in-JS,确实好使,但会带来运行时开销包体变大

为什么 @scope 是拐点

CSS @scope 可以为样式划定边界,把组件级的隔离原生化,不再依赖 JS。

直白讲:你在 @scope 中写规则,并给它一个容器选择器。浏览器会自动把这些规则限制在容器的子树内

示例:

<!DOCTYPE html>
<html>
<head>
  <style>
    @scope (.profile-card) {
      h2 {
        color: darkblue;
        font-weight: bold;
      }
      button {
        background-color: lightblue;
        border: none;
        padding: 8px 16px;
        border-radius: 5px;
      }
    }
  </style>
</head>
<body>
  <div class="profile-card">
    <h2>John Doe</h2>
    <button>Follow</button>
  </div>
  <button>Unstyled</button>
</body>
</html>

@scope 内的规则只影响.profile-card 里的元素。上面 <h2> 与 <button> 只在卡片内生效,外面的 <button> 完全不受影响。

你也可以一次指定多个作用域,在不同 DOM 层级复用同一套样式:

<!DOCTYPE html>
<html>
<head>
  <style>
    @scope (.card, .section) {
      h2 {
        color: green;
        font-size: 20px;
      }
    }
  </style>
</head>
<body>
  <h2>Unstyled</h2>
  <div class="card">
    <h2>Card</h2>
  </div>
  <div class="section">
    <h2>Section</h2>
  </div>
  <div class="body">
    <h2>Unstyled</h2>
  </div>
</body>
</html>

工作原理:作用域根与边界

@scope 会定义一个(比如 .my-component),并把规则限制在这棵子树中。

它也支持边界限制,用于处理嵌套比较复杂的场景。比如有嵌套组件、类名还重名时,你可以声明在哪些节点处停止作用,避免深入套娃。

<!DOCTYPE html>
<html>
<head>
  <style>
    @scope (.card) to (.footer, .additional) {
      h2 {
        color: green;
        font-size: 20px;
      }
    }
  </style>
</head>
<body>
  <div class="card">
    <div class="header">
      <h2>Header</h2>
    </div>
    <div class="body">
      <h2>Body</h2>
    </div>
    <div class="additional">
      <h2>Additional content</h2>
    </div>
    <div class="footer">
      <h2>Footer</h2>
    </div>
  </div>
</body>
</html>

上面的 to (.footer, .additional) 就是作用域边界h2 的样式仅在 .card 内生效,但不会进入.footer 与 .additional

什么时候用 @scope

适合以下场景:

  • 原生、轻量的样式隔离,不增加 JS 与构建复杂度;
  • 更可读、自动局部化的 CSS,天然待在组件边界内;
  • 避免 CSS-in-JS 或样式库带来的包体与运行时成本
  • 构建设计系统或可复用组件时,保证风格互不干扰
  • 无论 vanilla JS 还是 React,都能无缝集成,无需更换工具链。

不太适合:

  • 样式需要强动态(基于运行时状态/props 深度分支);
  • 需要 CSS-in-JS 擅长的主题化、变体系统直接在 JS 中编排。

纯隔离而言,@scope 是一个干净且前瞻的答案。

浏览器支持

现代浏览器支持情况整体不错:

  • Chrome / Edge:118+(2023 年 10 月起稳定)
  • Safari:17.4+(2024 年 3 月起稳定)
  • Opera:106+(2023 年底起稳定)
  • Firefox:稳定版暂未支持

整体兼容度约 47% 左右:覆盖了多数用户,但 Firefox 用户暂时缺席。

参考资料

这个特性不止“作用域与边界”这么简单。想继续深挖,建议查阅 MDN 文档 获取更完整的能力介绍与规范细节。

AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseInject(string.Empty); // 配置Swagger-Knife4UI(路由前缀一致代表独立,不同则代表共存) app.UseKnife4UI(options => { options.RoutePrefix = "kapi"; foreach (var groupInfo in SpecificationDocumentBuilder.GetOpenApiGroups()) { options.SwaggerEndpoint("/" + groupInfo.RouteTemplate, groupInfo.Title); } }); // 配置文件服务 var staticRoot = Path.Combine(AppContext.BaseDirectory, "uploads"); if(!Directory.Exists(staticRoot)) Directory.CreateDirectory(staticRoot); app.UseFileServer(new FileServerOptions { RequestPath="/uploads", FileProvider=new PhysicalFileProvider(staticRoot) }); // 动态文件检测中间件(解决子目录刷新问题) app.Use(async (context, next) => { var path = context.Request.Path; if (path.StartsWithSegments("/ops-docs") && !Path.HasExtension(path.Value) && !File.Exists(Path.Combine(AppContext.BaseDirectory, "wwwroot", "ops-docs", path.Value.TrimStart('/')))) { var newPath = path + "/index.html"; context.Request.Path = newPath; } await next(); }); //读取配置静态文件服务 var staticFilesPath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "ops-docs"); app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(staticFilesPath), RequestPath = "/ops-docs" }); app.UseAuthentication(); app.UseRouting(); app.UseCorsAccessor(); app.UseAuthorization(); app.UseInject(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapFallbackToFile("/ops-docs/{*path:nonfile}", "index.html"); }); }分析
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值