Appearance
样式穿透的区别
在前端开发中,尤其是在使用CSS预处理器或者某些特定的框架(如Vue.js)时,经常会遇到>>>
、/deep/
、::v-deep
、::v-deep()
和:deep()
这些深度选择器。它们主要用于穿透组件样式隔离(例如Shadow DOM或类似机制),以允许父组件自定义子组件的样式。以下是它们的区别与用法:
1. >>>
(不推荐):
这是一个较为早期的选择器,用于在父组件中影响子组件的样式。
但是构建工具(如Webpack的vue-loader)处理单文件组件(SFC)的方式,>>>可能不会直接按照预期工作,特别是在某些预处理器(如Sass)中,因为这些工具需要特殊处理才能正确解析这个组合符。
css
.parent >>> .child { color: red; }
2. /deep/
(在其他cli中推荐,vue-cli不推荐):
/deep/
是一个SCSS和LESS中的深度选择器,作用类似于>>>
。
/deep/
是为了解决>>>在一些CSS预处理器中的不兼容问题而引入的。它是作为深度选择器的一种替代语法,在预处理器中表现更好。 在底层,构建工具会将/deep/转换为更广泛支持的选择器模式,以便能够穿透样式作用域。
less
.parent /deep/ .child { color: red; }
3. ::v-deep
(vue2项目中推荐):
在Vue.js项目中,当使用vue-loader
进行单文件组件(SFC)的处理时,推荐使用::v-deep
来替代>>>
和/deep/
。
::v-deep
更加语义化,明确指出这是一个深度选择器,有助于提高代码可读性。
less
.parent ::v-deep .child { color: red; }
4. ::v-deep()
(不推荐)
这个语法是在 vue2 向 vue3 过渡期间提出的一个过渡性组合器,并没有太大意义。
5. :deep()
(vue3项目推荐):
在较新版本的Vue.js中引入的:deep()
更加简洁,适合现代Vue项目。这种变化旨在进一步标准化和简化深度选择器的使用。
less
.parent :deep(.child) { color: red; }
总结
- 对于Vue3项目,强烈推荐使用
:deep()
,其他的在较新版本的vite中已经提示警告了。另外这也是因为Vue团队正在推动标准化,而且这些选择器提供了更好的兼容性和清晰度。 - 如果你正在维护一个Vue2的旧项目,更推荐使用
/deep/
。