Vue样式穿透

1.什么情况下使用样式穿透

        在使用vue组件开发的过程中,有些第三方的组件库(例如Element UI)的组件是需要进行调整样式以还原UI图的。需要局部修改第三方组件库样式而又不去除scoped属性,就会造成组件之间的样式覆盖,此时就需要穿透scoped,也就是需要使用样式穿透。

2.什么是样式穿透

        样式穿透,官方叫做深度选择器,就是在父级组件里强制修改子组件的内部样式

3.怎样使用样式穿透

        1.使用css样式时,可以用>>>进行样式穿透

<style lang="css" scoped>
.parent >>> .son{
    /**/
}
</style>

        2.使用less,scss时,可以用/deep/进行样式穿透

        有些预处理器(例如less,scss)无法正确解析>>>,可以使用 /deep/ 或 ::v-deep 操作符代替
        style使用css的预处理器(less, sass, scss)的写法如下

<style lang="scss" scoped>
.parent{
     /deep/ .son { 
          /**/
     }
} 
</style>

        或者使用::v-deep

<style lang="scss" scoped>
.parent{
     ::v-deep .son { 
          /**/
     }
} 
</style>

我的实例:当使用uni-app脚手架进行项目的创建时,使用组件scroll-view,需要更换滚动视图区域的背景颜色。

新建页面scroll (part是自己创造的组件)

<template>
	<view>
		<view class="uni-padding-wrap uni-common-mt box">
			<view>
				<scroll-view  class="scroll-view_H" scroll-x="true" @scroll="scroll" scroll-left="120">
					<view id="demo1" class="scroll-view-item_H uni-bg-red"><part/></view>
					<view id="demo2" class="scroll-view-item_H uni-bg-green"><part/></view>
					<view id="demo3" class="scroll-view-item_H uni-bg-blue"><part/></view>
				</scroll-view>
			</view>
			<view class="uni-common-pb"></view>
		</view>
	</view>
</template>

在需要插入的index页面引入组件

<template>
	<view class="content">
		
		<Scroll class="scroll"/>

	</view>
	
</template>

<script>
	import Scroll from '../index/Scroll-swiper.vue';

	export default {
		components: {
			Scroll,
		}
    }
</script>

在scroll页面中,使用选择器无法改变背景颜色。

此时选择去引入组件index页面,选中插入组件,因为是scss预处理器,所以用2里面的方式,这里使用的/deep/
 

<style lang="scss" scoped>
.content{
	.scroll{
		margin-top: 1rem;
		/deep/ .uni-scroll-view{
			background-color: #efefef;
		}
	}
}
</style>

此时水平滚动就添加好了背景颜色

 注意:
        ① 操作符 >>> 可能会因为无法编译而报错,可以使用 /deep/
        ② vue3.0 中使用 /deep/ 会报错,更推荐使用 ::v-deep
        ③ 对于使用了 css 预处理器(scss 、sass、 less)时,深度选择器 ::v-deep 比较通用

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue 2中的样式穿透(Scoping Inheritance)是一种设计模式,用于解决组件内部CSS规则对父级元素影响的问题,通常在采用单文件组件(SFC)和Vue CLI构建的应用中。当一个组件需要修改其根元素的一些样式时,如果直接写在`.vue`文件的`<style>`标签内,样式会作用于整个应用,这可能会导致命名冲突。 然而,在Vue 2的默认配置下,如果你使用了内置的 scoped 样式(即前缀为 `.` 的选择器),它会限制样式的应用范围到当前组件及其所有后代。这意味着,除非你在组件外部显式地引入未scoped的样式,或者使用`:v-deep` 或 `>>>` 伪元素穿透样式,否则父组件无法直接访问子组件的 scoped 样式。 如果你发现样式穿透失效,可能是以下几种情况: 1. **未正确使用穿透符**:在父组件的样式中,你需要使用 `::v-deep` 或 `>>>` 来穿透子组件的 scoped 样式。例如:`.parent ::v-deep .child-class { ... }`。 2. **全局注册的样式库**:某些全局使用的CSS库如Element UI、Vuetify等,它们有自己的CSS模块系统,可能导致样式覆盖。在这种情况下,你需要确认是否正确处理了库内的穿透规则。 3. **CSS预处理器(如Sass、Less)**:在预处理器中,如果不小心,你可能需要手动转换或配置来支持穿透。 4. **CSS冲突**:两个组件同时设置了相同的样式,优先级较高的样式会生效。 5. **版本问题**:Vue 2.6及以上版本引入了更严格的CSS scoping,确保样式仅作用于组件自身。如果使用的是早期版本,可能需要升级或调整设置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值