zoukankan      html  css  js  c++  java
  • vue中css的scoped私有作用域和深度选择器

    使用vue开发项目的时候,当在<style>标签中有scoped属性时,就意味着这部分的css样式只作用于当前组件中的元素。这看起来好像很高深的样子,单实现的原理其实很简单,只要看一下编译前后的代码就能明白了。

    编译前代码:

    <style scoped>
        .example {
            color: red;
        }
    </style>

    编译后代码:

    <style>
        .example[data-v-f3f3eg9] {
            color: red;
        }
    </style>

    从编译前后的代码可以很容易地看出,scoped的底层机制其实是在写的组件的样式中添加了一个额外的属性而已,通过这种形式就能实现所谓的私有作用域。

    但是这种方式也会有弊端,比如说渲染性能问题。考虑到浏览器在渲染各种css选择器的方式的差异性,当 p { color: red } 这样的元素(标签)选择器设置了作用域时(即与特性选择器组合使用时)会比没有设置作用域时慢很多倍。但是如果使用类选择器或者id选择器取而代之的话,比如 .example { color: red } ,性能影响却会消除。所以,在定义scoped样式的时候,应该避免直接使用元素(标签)选择器,取而代之的是给元素另外加上class,有效避免性能问题的产生。

    如果你希望scoped样式中的一个选择器能够作用得更深层次,例如影响子组件,你可以使用【>>>】操作符修饰选择器,被修饰的选择器这时候被称为深度选择器。

    <style scoped>
        .parent >>> .child { /* ... */ }
    </style>

    上述代码将会编译成:

    <style>
        .parent[data-v-f3f3eg9] .child { /* ... */ }
    </style>

    而对于less或者sass等预编译,是不支持【>>>】操作符的,可以使用【/deep/】来替换【>>>】操作符,例如:

    <style>
        .parent /deep/ .child { /* ... */ }
    </style>

    另外深度选择器也可以用于解决一些修改组件库样式不生效的问题,原理同样是加上了编译后属性去匹配新的样式,但是选择使用深度选择器的时候要考虑浏览器的兼容问题,一些古老的浏览器可能是不支持这一特性的。

    "人的感情很微妙,没有直白的表达,并不代表没有感情。"

  • 相关阅读:
    TeamViewer14
    mysql 导出表结构和表数据 mysqldump用法
    虚拟机中不能上外网
    Mysql初始化root密码和允许远程访问
    常用sql语句
    查看连接MYSQL数据库的IP信息
    设置linux下shell显示不同颜色的字体
    常用mysql导入导出数据的命令
    spring boot 以jar的方式启动常用shell脚本
    idea的properties文件乱码问题解决
  • 原文地址:https://www.cnblogs.com/yanggb/p/14158398.html
Copyright © 2011-2022 走看看