zoukankan      html  css  js  c++  java
  • sass、less中的scoped属性

    1、scoped 的实现原理

    Vue中的Less 中的 scoped 属性的效果主要是通过 PostCss 实现的。代码示例:

    //编译前
    <template>
        <div class="example">scoped测试案例</div>
    </template>
    <style scoped lang="less">
     .example{
         color:red;
     }
    </style>
    
    //编译后
    <template>
        <div class="example" data-v-5558831a>scoped测试案例</div>
    </template>
    .example[data-v-5558831a] {
      color: red;
    }

    PostCSS 给一个组件中的所有 dom 添加了一个独一无二的动态属性(比如上面的data-v-5558831a),给 css 选择器额外添加一个对应的属性选择器来选择组件中的 dom ,这种做法使得样式只作用于含有该属性的dom元素(组件内部的dom)。

    可以总结,scoped 的渲染规则:

    1. 给HTML的dom节点添加一个不重复的data属性(例如: data-v-5558831a)来唯一标识这个dom 元素
    2. 在每句css选择器的末尾(编译后生成的css语句)加一个当前组件的data属性选择器(例如:[data-v-5558831a])来私有化样式

    2、scoped穿透

    scoped在Vue项目中,当我们引入第三方组件库时,需要在局部组件中修改第三方组件库的样式,而又不想去除scoped属性造成组件之间的样式覆盖。这时我们可以通过特殊的方式穿透scoped。

    stylus的样式穿透 使用>>>来进行穿透

    外层 >>> 第三方组件
            样式
            
    .wrapper >>> .swiper-pagination-bullet-active
       background: #fff

    sass 和 less 的样式穿透使用 /deep/

    外层 /deep/ 第三方组件 {
       样式
    }
    .wrapper /deep/ .swiper-pagination-bullet-active{
       background: #fff;
    }

    可以参考:https://segmentfault.com/a/1190000015932467

    3、scoped使用中的问题

    在 style 标签里添加 scoped 属性代表着 style 标签里的样式只会作用于该组件而不会作用于其他组件中,但其他公共样式仍会对该组件起作用。比如父子组件中,在父组件中添加了 scoped 属性,此时父组件中的样式并不会作用于子组件。

    有个现象比较奇怪,在父组件中没有 scoped 属性,子组件中有,此时如果从父组件中打开子组件,父组件中设置的样式会对子组件起作用,但是如果直接跳转打开子组件页面的话,此时父组件中的样式就不会对子组件起作用了。所以我们在组件中设置样式应该尽量都添加 scoped 属性。

  • 相关阅读:
    Docker笔记(三):Docker安装与配置
    Docker笔记(二):Docker管理的对象
    Docker笔记(一):什么是Docker
    ubuntu18.04上搭建KVM虚拟机环境超完整过程
    软件项目研发流程该怎么规范
    线程池的基本原理,看完就懂了
    Spring Boot2从入门到实战:统一异常处理
    redission-tomcat:快速实现从单机部署到多机部署
    4. matlab入门——函数、绘图基础
    3. matlab入门——控制结构、选择结构、循环结构、错误控制
  • 原文地址:https://www.cnblogs.com/wenxuehai/p/11611960.html
Copyright © 2011-2022 走看看