vue项目中,scss 使用 /deep/ 穿透写法

当 <style> 标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素。这类似于 Shadow DOM 中的样式封装。它通过使用 PostCSS 来实现以下转换:

<template>
  <div class="example" data-v-f3f3eg9>hi</div>
</template>

<style>
.example[data-v-f3f3eg9] {
  color: red;
}
</style>

PostCSS 给一个组件中的所有 DOM 添加了一个独一无二的动态属性,然后给 CSS 选择器额外添加一个对应的属性选择器来选择该组件中 DOM,这种做法使得样式只作用于含有该属性的 DOM——组件内部 DOM。

问题描述:当我们需要修改 element-ui 内部组件的样式时,我们通常将内部组件的样式放在一个 class 作用域下,同时使用全局作用域的样式去修改默认 ui 样式,代码如下:

<style lang="scss">
  .button-box{
    .el-button{
      padding: 13px 50px;
    }
  }
</style>

混用本地和全局样式

你可以在一个组件中同时使用有 scoped 和非 scoped 样式:

<style>
/* 全局样式 */
</style>

<style scoped>
/* 本地样式 */
</style>

如果我们依然使用当前组件的 scoped 属性,那我们如何去修改 element-ui 内部的样式呢?引用了第三方组件,需要在组件中局部修改第三方组件的样式,而又不想去除 scoped 属性造成组件之间的样式污染。此时只能通过特殊的方式,穿透 scoped。下面我们就会介绍这个深度作用选择器。

深度作用选择器

如果你希望 scoped 样式中的一个选择器能够作用得“更深”,例如影响子组件,你可以使用 >>> 操作符:

<style scoped>
.a >>> .b { /* ... */ }
</style>
// 上述代码将会编译成:
.a[data-v-f3f3eg9] .b { /* ... */ }

有些像 Sass 之类的预处理器无法正确解析 >>>。这种情况下你可以使用 /deep/ 或 ::v-deep 操作符取而代之——两者都是 >>> 的别名,同样可以正常工作。

<style lang="scss" scoped>
  .button-box{
    /deep/ .el-button{
      padding: 13px 50px;
    }
  }
</style>

更多详情,请查看 Vue-loader 官网之 Scoped CSS

补充:webpack 之解析 CSS 文件。

webpack 将一切文件视为模块,而 webpack 只能解析 JS 文件,如果想将其他问题也打包的话,这是我们就会用到 Loader。Loader 被称为加载器,其作用是让 webpack 可以加载和解析非 JS 文件的能力。下面我们介绍跟 css 有关的几个加载器:

style-loader: 把 CSS 代码注入到 JavaScript 中,通过 DOM 操作去加载 CSS;

css-loader:加载 CSS,支持模块化、压缩、文件导入等特性;

postcss-loader:做浏览器兼容性的;

sass-loader:将 scss 文件信息解析成 css 信息。

module.exports = {
    entry: path.join(srcPath, 'index'),
    module: {
        rules: [{
            test: /\.css$/,
            // loader 的执行顺序是从后往前
            loader: ['style-loader', 'css-loader', 'postcss-loader'],
        },{
            test: /\.scss$/,
            // loader 的执行顺序是从后往前
            loader: ['style-loader', 'css-loader', 'scss-loader'],
        }]
    },
    plugins: [
        ......
    ]
}
 
<think>好的,用户想在HBuilder中将/deep/替换为::v-deep。首先,我需要回忆一下相关的Vue样式穿透知识。记得在Vue单文件组件中,/deep/已经被弃用了,尤其是在Vue 2.7及以上版本,因为引入了部分Vue 3的特性,所以必须改用::v-deep或者:deep()。用户提到的引用[3]也提到这个问题,升级后会出现警告,建议使用:deep()。不过用户可能在使用::v-deep,因为Vue 2可能还支持这种写法。 接下来,用户可能是在使用HBuilder时遇到了预编译器错误,比如引用[4]提到的SCSS插件未安装的问题。不过用户的问题更侧重于替换选择器。需要确认用户的项目是否使用了Sass或SCSS,因为如果用了,可能需要检查插件是否安装正确,但替换/deep/本身可能不需要插件,只是语法问题。 然后,思考具体的替换步骤。首先需要全局搜索项目中的/deep/,包括可能的不同写法,比如>>>和/deep/。然后逐一替换为::v-deep,或者:deep(),但要注意Vue版本。根据引用[3],Vue 2.7推荐使用:deep(),但用户可能更习惯::v-deep,所以需要指出两种方式,但建议后者。 另外,要注意替换后的样式是否正确应用,可能需要检查DOM结构,或者使用开发者工具查看样式是否生效。同时,提醒用户检查是否有SCSS编译问题,如引用[4]提到的,需要安装对应的编译器插件,否则即使替换了选择器,SCSS代码也无法编译,导致错误。 最后,总结步骤:全局搜索替换,注意语法变化,处理可能的编译依赖,并验证替换效果。可能还需要处理一些边缘情况,比如嵌套的/deep/使用,或者混合其他选择器的情况,确保替换后的选择器语法正确。</think>在HBuilderX中将`/deep/`替换为`::v-deep`可通过以下步骤实现: --- ### 一、替换语法操作步骤 1. **全局搜索替换** 使用`Ctrl+Shift+F`调起全局搜索: - 查找内容:`/\b\/deep\/\b/g` - 替换为:`::v-deep` - 注意勾选正则表达式选项,确保精确匹配独立单词`/deep/` 2. **特殊语法处理** 若存在嵌套写法如: ```scss .parent /deep/ .child { ... } ``` 需改为: ```scss .parent ::v-deep .child { ... } ``` --- ### 二、注意事项 1. **Vue版本适配** - Vue 2.7+推荐使用`:deep()`代替`::v-deep`,但`::v-deep`仍可兼容[^3] - 若项目Vue3特性,应优先采用`:deep()`语法: ```scss :deep(.child) { ... } ``` 2. **预编译环境配置** 若使用SCSS/Sass需确保已安装编译器插件: - 通过HBuilderX插件市场安装`SCSS/Sass编译`插件[^4] - 离线项目需手动添加`node-sass`和`sass-loader`依赖 --- ### 三、验证替换结果 1. 检查控制台是否仍存在样式穿透警告 2. 使用浏览器开发者工具查看DOM元素样式应用状态 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值