百科狗-知识改变命运!
--

单文件组件 CSS 功能 ​

百变鹏仔1年前 (2023-11-21)阅读数 26#技术干货
文章标签组件

单文件组件 CSS 功能 ​

组件作用域 CSS ​

标签带有 scoped attribute 的时候,它的 CSS 只会影响当前组件的元素,和 Shadow DOM 中的样式封装类似。使用时有一些注意事项,不过好处是不需要任何的 polyfill。它的实现方式是通过 PostCSS 将以下内容:

vue
.example { color: red;} hi

单文件组件 CSS 功能 ​

转换为:

vue
.example[data-v-f3f3eg9] { color: red;} hi

子组件的根元素 ​

使用 scoped 后,父组件的样式将不会渗透到子组件中。不过,子组件的根节点会同时被父组件的作用域样式和子组件的作用域样式影响。这样设计是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式。

深度选择器 ​

处于 scoped 样式中的选择器如果想要做更“深度”的选择,也即:影响到子组件,可以使用 :deep() 这个伪类:

vue
.a :deep(.b) { /* ... */}

上面的代码会被编译成:

css
.a[data-v-f3f3eg9] .b { /* ... */}

TIP

通过 v-html 创建的 DOM 内容不会被作用域样式影响,但你仍然可以使用深度选择器来设置其样式。

插槽选择器 ​

默认情况下,作用域样式不会影响到 渲染出来的内容,因为它们被认为是父组件所持有并传递进来的。使用 :slotted 伪类以明确地将插槽内容作为选择器的目标:

vue
:slotted(div) { color: red;}

全局选择器 ​

如果想让其中一个样式规则应用到全局,比起另外创建一个 ,可以使用 :global 伪类来实现 (看下面的代码):

vue
:global(.red) { color: red;}

混合使用局部与全局样式 ​

你也可以在同一个组件中同时包含作用域样式和非作用域样式:

vue
/* 全局样式 *//* 局部样式 */

作用域样式须知 ​

  • 作用域样式并没有消除对 class 的需求。由于浏览器渲染各种各样 CSS 选择器的方式,p { color: red } 结合作用域样式使用时 (即当与 attribute 选择器组合的时候) 会慢很多倍。如果你使用 class 或者 id 来替代,例如 .example { color: red },那你几乎就可以避免性能的损失。

  • 小心递归组件中的后代选择器!对于一个使用了 .a .b 选择器的样式规则来说,如果匹配到 .a 的元素包含了一个递归的子组件,那么所有的在那个子组件中的 .b 都会匹配到这条样式规则。

CSS Modules ​

一个 标签会被编译为 CSS Modules 并且将生成的 CSS class 作为 $style 对象暴露给组件:

vue
 This should be red.red { color: red;}

得出的 class 将被哈希化以避免冲突,实现了同样的将 CSS 仅作用于当前组件的效果。

参考 CSS Modules spec 以查看更多详情,例如 global exceptions 和 composition。

自定义注入名称 ​

你可以通过给 module attribute 一个值来自定义注入 class 对象的属性名:

vue
 red.red { color: red;}

与组合式 API 一同使用 ​

可以通过 useCssModule API 在 setup() 中访问注入的 class。对于使用了自定义注入名称的 块,useCssModule 接收一个匹配的 module attribute 值作为第一个参数:

js
import { useCssModule } from 'vue'// 在 setup() 作用域中...// 默认情况下, 返回  的 classuseCssModule()// 具名情况下, 返回  的 classuseCssModule('classes')

CSS 中的 v-bind()

单文件组件的 标签支持使用 v-bind CSS 函数将 CSS 的值链接到动态的组件状态:

vue
 helloexport default { data() { return { color: 'red' } }}.text { color: v-bind(color);}

这个语法同样也适用于 ,且支持 JavaScript 表达式 (需要用引号包裹起来):

vue
const theme = { color: 'red'} hellop { color: v-bind('theme.color');}

实际的值会被编译成哈希化的 CSS 自定义属性,因此 CSS 本身仍然是静态的。自定义属性会通过内联样式的方式应用到组件的根元素上,并且在源值变更的时候响应式地更新。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)