前端开发中利用css的scoped和deep的方法实现样式穿透

scoped作用域

在vue中,我们为了避免父组件的样式影响到子组件的样式,会在style中加

父组件:
复制代码
<template>
  <div>
    <h1 class="title">{{ name }}</h1>
    <input type="text" v-model.lazy="name" />
    <child />
  </div>
</template>

<script>
import child from "./child";
export default {
  data() {
    return {
      name: "",
    };
  },
  components: {
    child,
  },
};
</script>

<style scoped>
.title {
  color: #ff0;
}
</style>
子组件:
复制代码
<template>
  <div>
    <h1 class="title">child</h1>
  </div>
</template>

<script>
export default {};
</script>

<style scoped>
.title {
  color: #f00;
}
</style>

我们在加了 scoped 之后样式会自动添加一个hash值,如下:

复制代码
.title[data-v-211e4c4a] {
    color: #ff0;
}

但是这样也存在着一个问题,比如你使用了别人的组件或者自己开发一个组件,有时候你修改一处就可能影响到别的地方,这个时候要么你不用别人的组件,自己重新封装一个,但很多时候是不太现实的,所以就需要有一个方法或者方式,既不影响到别的地方,又能修改子组件在当前的样式。

深度作用选择器 /deep/和>>>和::v-deep

使用了外届的组件或者自己开发一个组件,修改一处就可能会影响到用这个组件的所有样式,所以就需要有一个方法或者方式,既不影响到别的地方,又能修改子组件在当前的样式。/deep/就能实现

>>>

只作用于css,不支持css预加载器(less/scss)

是/deep/的简写形式,适用于Vue2.x版本,Vue3.x版本使用会报错

/deep/

仅适用于Vue2.x版本

支持css预加载器

::v-deep

Vue3.x的深度作用选择器正式写法

例如
复制代码
<style scoped>
/deep/ .title {
  color: #f00;
}
</style>

<style scoped>
>>> .title {
  color: #f00;
}
</style>

<style scoped>
::v-deep .title {
  color: #f00;
}
</style>
注意

VUE3.0下/deep/的使用可能会有报错,如果/deep/报错,可采用::v-deep

项目中用到了预处理器 scss 、sass、less,操作符 >>> 可能会因为无法编译而报错 。可以使用 /deep/

总结

Vue2.x版本使用优先级/deep/,>>>

Vue3版本使用::v-deep

相关推荐
HyaCinth14 分钟前
一人一周,用 Codex 渐进式迁移重构了一个材料学组件库
前端·javascript·css
龙猫里的小梅啊12 小时前
CSS(四)CSS文本属性
前端·css
爱上好庆祝16 小时前
学习js的第2天
前端·css·学习·html·css3
天外飞雨道沧桑17 小时前
详解CSS中的Containing Block:概念、规则与实战解析
前端·css
Yeats_Liao20 小时前
后台 Sidebar 伸缩交互(PC + 移动端)实现
前端·javascript·css·html5
里欧跑得慢21 小时前
微交互设计模式:提升用户体验的细节之美
前端·css·flutter·web
爱上好庆祝1 天前
学习js第一天(出发新世界)
开发语言·前端·javascript·css·学习·html·ecmascript
ZC跨境爬虫1 天前
UI前端美化技能提升日志day6:(使用苹果字体+计算样式对比差异)
前端·javascript·css·ui·状态模式
是上好佳佳佳呀1 天前
【前端(九)】CSS Transform 2D/3D 变换笔记:分清两个原点,搞懂多重变换
前端·css·笔记
林恒smileZAZ1 天前
CSS终于支持渐变色的过渡了[特殊字符]
css·html·css3