《Vue 的CSS之deep语法》

介绍 | Vue Loader

vue-loader.vuejs.org/zh/guide/scoped-css.html

::v-deep

我们知道,在Vue组件的style标签里,加上scoped属性,会使写的样式只影响当前的组件,不会影响到子组件。

去掉scoped就可以了,但是去掉scoped同时也会导致其他问题,可能会影响到别的。

有什么方法能在父组件的css里影响子组件的样式,同时保留scoped呢?

deep有两种写法,::v-deep兼容性最强, 优先使用这个。

使用方法:在想要影响子组件的那个元素的选择器的前边加上::v-deep

//Statistics.vue父组件
<template>
   <Layout>
       <Type/>
   </Layout>
</template>
<style lang="scss" scoped>
    ::v-deep li{
        border:1px solid black;
    }
    ::v-deep ul{
        border:1px solid red;
    }
</style>

Type子组件里有ul和li元素,想要在父组件里改变它的样式,就在选择器前加::v-deep,表示深入到子组件里边找这个选择器。可以发现成功影响了自组件的样式。

可是如果子组件里有很多个li,或者li嵌套li,那只在外边说深入里边的li不准确。怎么精确的定位到子组件里的某个元素呢?

classPrefix 前缀

可以给子组件传一个prop,是classPrefix。在子组件里判断,如果外边给传了这个classPrefix,那某个元素就拥有了一个class,叫做"xxx-item",xxx是classPrefix变量的值。

然后在父组件的css里,就可以deep 这个加了前缀的选择器,就可以精准找到这个元素了。

给元素绑定class

给一个元素添加class可以使用&&,也可以使用对象形式。

<li :class="type==='-' && 'selected'" @click="selectType('-')">支出 </li>
 

如果前边的表达式为True,这个元素就拥有了后边的class。如果我这时再给它添加一个class绑定,会出错,不能同时有两个:class,所以升级使用对象

<li :class="{selected:type==='-', [classPrefix+'-item']:classPrefix}" @click="selectType('-')">支出 </li>

绑定的class是一个对象,里边是key-value。表示如果value表达式为真,我就拥有了key这个class。因为对象可以有很多个键值对,所以使用对象可以同时动态绑定多个class。

 

要绑定的第二个class,是xxx-item,xxx是父组件要给我传的一个prop。如果给传了,即如果classPrefix这个外部属性给传了,我就拥有了以它为前缀的一个class。可是这个classPrefix是一个变量,在这里使用${}插值不合法。有ES6的新语法:如果一个key里边有变量,就用[]把这个key包起来,里边用字符串相加的方式表达。

总结

在子组件的特定元素上绑定了classPrefix的类之后,在父组件的css里就可以deep 这个新加的class找到这个元素了。

<template>
   <Layout>
       <Type :type.sync="yyy" class-prefix="xxx"/>
   </Layout>
</template>
<style lang="scss" scoped>
    ::v-deep .xxx-item{
        border:1px solid black;
    }
    ::v-deep ul{
        border:1px solid red;
    }
</style>
复制代码

使用classPrefix在以下场景非常好用:一个父组件使用了多个一样的子组件,但是又需要不同的样式,就可以给不同的子组件传不同的classPrefix,那么里边的具体某个元素在不同的使用下就有独特的class。这样每个组件的样式都不互相影响。

 

转载:https://juejin.cn/post/6844904175147417613
 
 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: vue3 中的 css deep 函数是用来实现深度作用选择器的。它可以用来匹配当前元素的所有后代元素,并为这些元素应用样式。比如,如果有如下的 HTML 结构: ``` <div class="container"> <p>Lorem ipsum</p> <div> <p>Dolor sit amet</p> </div> </div> ``` 你可以使用 deep 选择器来给 container 元素下的所有 p 元素应用样式,代码如下: ```css .container { color: red; } .container >>> p { font-size: 20px; } ``` 这样,HTML 中的所有 p 元素的字体颜色都会变成红色,字体大小都会变成 20px。 注意,deep 选择器是一个非常强大的工具,但同时也是一个实验性的特性,并不是所有浏览器都支持。如果你希望你的代码在所有浏览器中都能正常工作,请谨慎使用。 ### 回答2: Vue3中的CSS deep函数用于给组件的样式添加深度选择器,以实现对子组件中的元素样式的修改。 在Vue3之前的版本中,我们可以使用/deep/或>>>来标记一个深度选择器,以便样式可以穿透到子组件中的元素。然而,在Vue3中,由于存在性能问题,Vue团队移除了/deep/和>>>的支持。 取而代之的是,Vue3提供了新的方式来实现类似的效果,即CSS deep函数。CSS deep函数使用::v-deep伪选择器来替代/deep/和>>>。使用CSS deep函数时,需要将::v-deep的选择器嵌套在子组件的选择器中,以实现对子组件元素样式的修改。 下面是一个示例,演示了如何使用CSS deep函数来修改子组件中元素的样式: ```html <template> <div class="parent"> <child></child> </div> </template> <style scoped> .parent ::v-deep .child-element { color: red; } </style> ``` 在上面的示例中,.parent ::v-deep .child-element选择器将样式应用到了子组件中具有.child-element类的元素上。这样可以实现对子组件元素的样式修改。 需要注意的是,CSS deep函数只能在带有scoped属性的样式标签内生效。因为scoped样式的特性是,它仅仅在组件内部生效,不会影响到其他组件。 总结来说,Vue3中的CSS deep函数用于给组件的样式添加深度选择器,以实现对子组件中的元素样式的修改。 ### 回答3: Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。Vue3 是 Vue.js 的最新版本,其中引入了许多新特性和改进。其中一个新的特性是 CSS deep 函数。 CSS deep 函数是一个特殊的选择器,用于在 Vue 组件中的样式中选择子组件中的元素。它的语法是 `::v-deep` 或 `>>`。 使用 CSS deep 函数,可以从父组件中的样式中选择子组件中的元素,即使这些元素被 Vue 的样式隔离(scoped)。scoped 样式是 Vue 组件中的一种样式隔离机制,它确保每个组件中的样式只适用于该组件的 DOM 元素,而不会泄漏到其它组件或全局样式中。 在某些情况下,我们可能需要在父组件的样式中选择子组件的元素。例如,当我们使用第三方组件库时,我们可能希望为该组件库的元素应用一些全局样式。在这种情况下,使用 CSS deep 函数可以绕过 scoped 样式的限制,选择子组件中的元素,并应用我们希望的样式。 例如,假设我们有一个父组件和一个子组件。父组件的样式是 scoped 的,子组件的样式是全局的。如果我们希望在父组件的样式中选择子组件中的元素,我们可以使用 CSS deep 函数。示例代码如下: ```css /* 父组件的样式 */ <style scoped> .parent ::v-deep .child { color: red; } </style> /* 子组件的样式 */ <style> .child { font-size: 16px; } </style> ``` 在上述示例中,父组件中的样式使用了 CSS deep 函数 `::v-deep` 来选择子组件中的元素,并将颜色设置为红色。这样,父组件中的元素将应用这个样式,即使子组件中的样式是 scoped 的,并且颜色将变为红色。 总之,Vue3 中的 CSS deep 函数是一个用于选择子组件中元素的特殊选择器。它可以绕过 scoped 样式的限制,在父组件的样式中选择子组件的元素,并应用所需的样式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值