You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core MVC中如何调整隔离CSS的作用范围以覆盖页面所有元素

ASP.NET Core MVC中如何调整隔离CSS的作用范围以覆盖页面所有元素

刚接触ASP.NET Core MVC的话,遇到CSS隔离的问题真的挺懵的,我当初第一次用布局页的隔离样式时也踩过完全一样的坑!咱们一步步拆解问题,找到顺手的解决方式。

问题根源

你遇到的核心问题是:布局页(_Layout.cshtml)的CSS隔离样式,默认会给布局里的原生HTML元素自动加上类似b-e6ny4ejk6j这样的隔离属性,但用Tag Helper(比如asp-controllerasp-action)生成的<a>标签,并不会被自动添加上这个隔离标识。

编译后你的.league-script-regular类会被处理成.league-script-regular[b-e6ny4ejk6j],但你的<a>标签没有这个属性,自然样式就不会生效了。

解决方法

1. 用::deep穿透隔离(推荐,官方认可的用法)

你觉得::deep不“正确”,但其实在布局页的场景下,它完全是官方推荐的用法之一!它的作用就是让隔离样式穿透到布局内的所有子元素(包括Tag Helper生成的元素)。

只需要修改你的_Layout.cshtml.css

::deep .league-script-regular {
  font-family: "League Script", cursive;
  font-weight: 400;
  font-style: normal;
}

编译后这个样式会变成[b-e6ny4ejk6j] .league-script-regular,只要父元素(比如<header><nav>)带有隔离标识,里面的<a>标签就算没有这个属性,样式也能正常生效。

2. 把样式放到全局CSS文件中

如果这个字体类是整个网站通用的,直接把.league-script-regular类放到wwwroot/css/site.css(或者你项目里的全局CSS文件)里就行,这样就不用受CSS隔离的限制,所有页面都能直接调用这个类。

3. 手动给Tag Helper元素添加隔离标识(进阶繁琐方案)

如果你非要不用::deep,可以手动给<a>标签加上布局页的隔离属性。首先在布局页的代码块里动态获取隔离ID:

@{
    var cssIsolationId = Context.Items["CssIsolationId"] as string;
}

然后给<a>标签添加上对应的属性:

<a class="navbar-brand league-script-regular" @(cssIsolationId != null ? $"b-{cssIsolationId}" : "") asp-area="" asp-controller="Home" asp-action="Index">TestWebsite</a>

这个方法能让你的隔离样式直接作用到<a>标签,但缺点是比较繁琐,日常开发中其实没必要这么折腾。

总结

不用纠结::deep“不正宗”,在布局页的CSS隔离场景下,它就是用来让样式覆盖内部所有元素的标准方式,官方文档里也明确提到了这个用法。日常开发中用::deep或者全局样式,是最高效的解决途径。

内容来源于stack exchange

火山引擎 最新活动