单文件组件 CSS 功能
单文件组件 CSS 功能
组件作用域 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 { /* ... */}
TIP
通过 v-html
创建的 DOM 内容不会被作用域样式影响,但你仍然可以使用深度选择器来设置其样式。
插槽选择器
默认情况下,作用域样式不会影响到 渲染出来的内容,因为它们被认为是父组件所持有并传递进来的。使用
:slotted
伪类以明确地将插槽内容作为选择器的目标:
:slotted(div) { color: red;}
全局选择器
如果想让其中一个样式规则应用到全局,比起另外创建一个 ,可以使用
:global
伪类来实现 (看下面的代码):
:global(.red) { color: red;}
混合使用局部与全局样式
你也可以在同一个组件中同时包含作用域样式和非作用域样式:
/* 全局样式 *//* 局部样式 */
作用域样式须知
作用域样式并没有消除对 class 的需求。由于浏览器渲染各种各样 CSS 选择器的方式,
p { color: red }
结合作用域样式使用时 (即当与 attribute 选择器组合的时候) 会慢很多倍。如果你使用 class 或者 id 来替代,例如.example { color: red }
,那你几乎就可以避免性能的损失。小心递归组件中的后代选择器!对于一个使用了
.a .b
选择器的样式规则来说,如果匹配到.a
的元素包含了一个递归的子组件,那么所有的在那个子组件中的.b
都会匹配到这条样式规则。
CSS Modules
一个 标签会被编译为 CSS Modules 并且将生成的 CSS class 作为
$style
对象暴露给组件:
This should be red.red { color: red;}
得出的 class 将被哈希化以避免冲突,实现了同样的将 CSS 仅作用于当前组件的效果。
参考 CSS Modules spec 以查看更多详情,例如 global exceptions 和 composition。
自定义注入名称
你可以通过给 module
attribute 一个值来自定义注入 class 对象的属性名:
red.red { color: red;}
与组合式 API 一同使用
可以通过 useCssModule
API 在 setup()
和 中访问注入的 class。对于使用了自定义注入名称的
块,
useCssModule
接收一个匹配的 module
attribute 值作为第一个参数:
import { useCssModule } from 'vue'// 在 setup() 作用域中...// 默认情况下, 返回 的 classuseCssModule()// 具名情况下, 返回 的 classuseCssModule('classes')
CSS 中的 v-bind()
单文件组件的 标签支持使用
v-bind
CSS 函数将 CSS 的值链接到动态的组件状态:
helloexport default { data() { return { color: 'red' } }}.text { color: v-bind(color);}
这个语法同样也适用于 ,且支持 JavaScript 表达式 (需要用引号包裹起来):
const theme = { color: 'red'} hellop { color: v-bind('theme.color');}
实际的值会被编译成哈希化的 CSS 自定义属性,因此 CSS 本身仍然是静态的。自定义属性会通过内联样式的方式应用到组件的根元素上,并且在源值变更的时候响应式地更新。
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!