css预处理文件使用scss嵌套写法深度选择器deep失效问题

项目场景:

vue3 + vite + elementPlus项目,为了保持项目中页面风格的一致性,在项目中使用了css预处理器


问题描述

1. 需求场景

项目中使用了css预处理器,在vite.config.ts文件中定义如下:

  css: {
    // css预处理器
    preprocessorOptions: {
      scss: {
        // 引入 common.scss 这样就可以在全局中使用 common.scss中预定义的变量了
        // common.scss是自己创建的文件
        additionalData: '@import "@/style/common.scss";'
      }
    }
  }

在该scss文件中,可定义变量,也可直接写样式,最终会应用到全局。
由于项目需要,需要修改一些elementPlus组件的原生样式,主要修改el-input这类表单组件的边框弧度,使之成为圆角,如下图:
在这里插入图片描述

基本所有的el-input都要应用该样式,因此便在common.scss文件中添加了下列代码

// 全局修改el-input原生样式圆角
:deep(.el-input .el-input__wrapper) {
    border-radius: 0.6rem 0.6rem 0.6rem 0.6rem !important;
}

2、问题复现

而由于部分el-input使用了append插槽,导致样式变成了这样:
在这里插入图片描述

因此这部分的el-input的样式应改为:


:deep(.el-input .el-input__wrapper) {
    border-radius: 0.6rem 0 0 0.6rem !important;
}

// append插槽样式
:deep(.el-input .el-input-group__append) {
    border-radius: 0 0.6rem 0.6rem 0 !important;
}

便可得到以下效果:
在这里插入图片描述

由于这些el-input都是应用于查询的,而这些el-input我都写在了一个class为searchGroup的div里,因为多个页面都是相同样式,因此理所当然地写在了common.scss中,如下:

.searchGroup{

	//这里有部分searchGroup的样式
	xxxx
	xxxx
	
	:deep(.el-input .el-input__wrapper) {
	    border-radius: 0.6rem 0 0 0.6rem !important;
	}
	// append插槽样式
	:deep(.el-input .el-input-group__append) {
	    border-radius: 0 0.6rem 0.6rem 0 !important;
	}
}

但是但是但是!

问题就这么出现了,部分页面的searchInput是有效的,而部分页面的searchInput却仍是之前的效果!!!

其他的全局样式仍然是有效果的,而部分页面的searchInput也是有效果的,这就有点离谱了!

3、问题排查

首先排查了浏览器缓存的影响,又排查了其他样式优先级的影响,发现也不是,因为我在那些失效的vue文件里根本就没定义样式,就像这样:

<style lang="scss" scoped>
</style>

一开始觉得没有办法了,只能在这些失效的searchInput的vue文件的style里挨个挨个再定义一下了,果然,理所当然地生效了,但是还是想排查一下,就注释掉了其vue文件中新加的style样式,想去F12再找找原因

<style lang="scss" scoped>
// .searchGroup {
//     :deep(.el-input .el-input__wrapper) {
//         border-radius: 0.6rem 0 0 0.6rem !important;
//     }

//     // append插槽样式
//     :deep(.el-input .el-input-group__append) {
//         border-radius: 0 0.6rem 0.6rem 0 !important;
//     }
// }
</style>

转折来了,回到页面一看,刚刚失效的页面又正常了,又生效了
但是自己明明已经将样式注释掉了呀!

于是尝试性地将代码改成了下面这样:

<style lang="scss" scoped>
// 
</style>

样式依然有效!!!
依然有效!!
有效!

原因分析:

原因还没搞清楚,仅在此先记录

原因可能是样式作用域的生成或者预处理器优化等影响,因为style里啥都没写,但是也只是猜想,还没有搞清楚具体原因。

仅先在此记录一下,因为当时碰到这个问题的时候,上网查也没查到什么相似的问题,希望自己的分享能给其他人带来一些帮助


解决方案:

其实有一个很简单的解决方案,不用每个vue文件里都写对应的样式,只需要在common.scss里写成下面这样:

修改后:

:deep(.searchGroup .el-input .el-input__wrapper) {
    border-radius: 0.6rem 0 0 0.6rem !important;
}

// append插槽样式
:deep(.searchGroup .el-input .el-input-group__append) {
    border-radius: 0 0.6rem 0.6rem 0 !important;
}

修改前:

.searchGroup{

	//这里有部分searchGroup的样式
	xxxx
	xxxx
	
	:deep(.el-input .el-input__wrapper) {
	    border-radius: 0.6rem 0 0 0.6rem !important;
	}
	// append插槽样式
	:deep(.el-input .el-input-group__append) {
	    border-radius: 0 0.6rem 0.6rem 0 !important;
	}
}

大家可以自行对比一下,其实就是把深度选择器拿到最外面,并且在筛选条件里多加了一个“.searchGroup”

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在SCSS中,可以使用深度选择器(也称为嵌套选择器)来选择嵌套层级的元素。深度选择器使用`&`符号表示当前选择器的父级。 以下是一个示例,展示了如何在SCSS使用深度选择器: ```scss .container { background-color: #f5f5f5; .nested-element { color: #333; & > span { font-weight: bold; } } .another-nested-element { font-style: italic; &.active { color: blue; } } } ``` 在上述示例中,我们定义了一个`.container`类选择器,并在其中嵌套了两个元素的选择器:`.nested-element`和`.another-nested-element`。 使用深度选择器,我们可以在`.nested-element`的内部使用`&`来表示`.nested-element`本身,从而生成`.container .nested-element`的样式规则。同样地,我们可以在`.another-nested-element`的内部使用`&`来表示`.another-nested-element`本身,从而生成`.container .another-nested-element`的样式规则。 此外,我们还可以使用深度选择器来进行更复杂的选择。例如,在上述示例中,我们使用了`& > span`来选择`.nested-element`内部直接子元素为`<span>`的规则。 注意,深度选择器`&`只能在嵌套选择器内部使用。它可以帮助我们编写更简洁和易读的SCSS代码,减少了重复的选择器名称。 当我们将上述SCSS代码编译成CSS时,会生成相应的选择器规则,如下所示: ```css .container { background-color: #f5f5f5; } .container .nested-element { color: #333; } .container .nested-element > span { font-weight: bold; } .container .another-nested-element { font-style: italic; } .container .another-nested-element.active { color: blue; } ``` 以上就是在SCSS使用深度选择器的基本用法。通过嵌套选择器,我们可以更方便地编写出层级结构清晰的样式规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值