vue样式穿透

前言

vue的style中设置scoped属性后,组件实现样式私有化。
但是该组件又使用的其他组件库时(vant,elementui,自定义等),该组件的style中的样式,优先级低,不生效,这个时候需要使用样式穿透(作用得更深)。

一、scoped底层原理
  • scoped是通过在DOM以及css中加上data-v-xxx唯一标识来实现样式私有化。
1.加上scoped前
<template>
    <div class="demo">
        样式穿透示例
    </div>
</template>
<style >
    .demo{
        color: rgba(255,0,0,0.5);
    }
</style>
demo1.png
2.加上scoped后
<style scoped>
    .demo{
        color: rgba(255,0,0,0.5);
    }
</style>
demo2.png

通过图片可以看到scoped底层是通过在DOM节点中添加data-v-xxxCSS中通过添加[data-v-xxx]属性过滤,提高优先级,来实现样式的私有化。

二、为什么需要样式穿透

看一个场景实例:子组件根元素颜色为红色,非根元素为蓝色
父子两个组件style都使用scoped属性,在不修改子组件的前提下,在父组件上修改子组件的颜色为绿色

// 子组件
<template>
    <div class="c1">
        子组件根元素(red)
        <div class="c2">
            子组件非根元素(blue)
        </div>
    </div>
</template>
<style scoped>
    .c1{
        border: 1px dashed #000;
        margin-top: 10px;
        padding: 5px;
        color: red;
    }
    .c1 .c2{
        border: 1px dotted #000;
        color:blue;
    }
</style>

// 父组件
<template>
    <div class="demo">
        父组件
        <css-demo class="son"></css-demo>
    </div>
</template>
<script lang="ts">
import Vue from 'vue'
import cssDemo from "./css-demo2.vue"
export default Vue.extend({
    components:{ cssDemo }
})
</script>
<style scoped>
    .demo{
        width: 200px;
        padding: 10px;
        border: 1px solid rgba(0,0,0,1);

        color: #000;
    }
    .son{
        color: green;
    }
    .son .c2{
        color: green !important;
    }
    .c1 .c2{
        color: green !important;
    }
    .son.c1 .c2{
        color: green !important;
    }
</style>
demo3.png

demo4.png
  • 可以看到只有子组件的根元素作用有生效,但是子组件的非根元素样式并没有生效,即使使用了!important
  • scoped在渲染的时候,如果组件内部还有子组件,只会在子组件的根元素加上data-v-xxx属性。

当加上样式穿透后

// 父组件
<style scoped>
    >>> .c1 .c2{
        color: green !important;
    }
</style>
demo5.png
demo6.png
三、样式穿透的方法

vue中针对不同的样式类型(css,less,scss)有不用的样式穿透方法。

  • css 使用 >>>
  • less 使用 /deep/
  • scss 使用 ::v-deep
1. css
<style scoped>
    >>> .c1 .c2{
        color: green !important;
    }
</style>
2. less
<style scoped lang="less">
    /deep/ .c1 .c2{
        color: green !important;
    }
</style>
3. scss
<style scoped lang=”scss“>
    ::v-deep .c1 .c2{
        color: green !important;
    }
</style>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在如果你希望 scoped 样式中的一个选择器能够作用得“更深”,例如影响子组件,但由于scoped属性的样式隔离...
    说好的幸福2020阅读 2,893评论 1 4
  • 一、目的 本文的目的主要是为了解决在带有 .... 中,无法修改ui框架的样式问题。但如果去掉scoped话...
    海之深处爱之港湾阅读 1,109评论 0 1
  • 一、什么叫 vue 样式穿透 在 vue 开发过程中,可能会遇到修改 iview UI 组件样式的时候,无效的问题...
    岚平果阅读 2,439评论 0 1
  • 1、sass和less的样式穿透 使用/deep/ 外层 /deep/ 第三方组件 做到三点:a. 当前的vue...
    金刚狼_3e31阅读 586评论 0 1
  • 1.问题由来在使用某个组件库中的表格组件时,查看官方文档,有设置是否展示外边框和列边框,有改变列宽度等API。就是...
    橙_c9cd阅读 1,273评论 0 1