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

<style> 特性 CSS 功能 - 单文件组合(SFC)

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

特性 CSS 功能

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

.example {
    color: red;
} 
hi

转换为:

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


子组件的根元素

在带有scoped的时候,父组件的样式将不会泄露到子组件当中。不过,子组件的根节点会同时被父组件的作用域样式和子组件的作用域样式影响。这是有意为之的,这样父组件就可以设置子组件根节点的样式,以达到调整布局的目的。


深度选择器

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

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

上面的代码会被编译成:

.a[data-v-f3f3eg9] .b {
  /* ... */
}
通过v-html创建的 DOM 内容不会被作用域样式影响,但你仍然可以使用深度选择器来设置其样式。


插槽选择器

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

:slotted(div) {
  color: red;
} 

全局选择器

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

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


混合使用局部与全局样式

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

 /* global styles */



  /* local styles */ 


作用域样式提示

  • 作用域样式并没有消除对 CSS 类的需求。由于浏览器渲染各种各样 CSS 选择器的方式,p{color: red}结合作用域样式使用时会慢很多倍(即,当与 attribute 选择器组合使用的时候)。如果使用 class 或者 id 来替代,例如.example{color: red},那你几乎就可以避免这个性能的损失。
  • 小心递归组件中的后代选择器。对于一个使用了.a .b选择器的样式规则来说,如果匹配到.a的元素包含了一个递归的子组件,那么所有的在那个子组件中的.b都会匹配到这条样式规则。



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

 

This should be red

.red { color: red; }

对生成的类做hash计算以避免冲突,实现了和scope CSS 一样将 CSS 仅作用于当前组件的效果。

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


自定义注入名称

<style> 特性 CSS 功能 - 单文件组合(SFC)

你可以通过给module attribute 一个值来自定义注入的类对象的property键:

 

red

.red { color: red; }


与组合式 API 一同使用

注入的类可以通过useCssModule API 在setup().text { color: v-bind(color); }

这个语法同样也适用于

hello

p { color: v-bind('theme.color'); }

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

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

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

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

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