美文网首页
Vue下是如何实现CSS私有作用域的

Vue下是如何实现CSS私有作用域的

作者: MsgSS | 来源:发表于2019-01-31 18:24 被阅读85次

在web开发中,css是一个利器,它可以使得我们的页面更加炫酷华丽,但是在好用的前提下它也给迭代开发带来了一定的麻烦,比如样式相互覆盖或者样式影响到了未考虑的元素等,所以css的私有化就显得很有必要了。

但从严格意义上来说,css样式都是全局的,并不存在私有作用域这一说法,所以我们会通过各种各样的方式来模拟实现css的私有化。其中大部分都说基于BEM思想来实现的。

css私有化的实现原则是匹配规则尽可能精确。比如通过全局唯一的id来匹配或通过全局唯一的class来匹配,如每一个需要赋予样式的元素都添加一个独一无二的类名,然后只通过类名来书写样式,避免使用通配符、标签选择器和后代选择器等。

在css私有化领域中非常出名的是BEM(Block Element Modifier)命名规则,它的主要思想是:

只通过  块__元素--修饰符  来定义规则

BEM的好处:清晰易懂,看到类名就知道作用是什么,方便维护;

BEM的缺点:丑、长(服务器开启gzip后会小一点);

简单介绍BEM后,我们再看看vue下的实现。在vue单文件组件下,我们只需要在style标签上添加scoped属性就可以实现css私有化的功能,那么它又是如何实现的呢?

未添加scoped属性前 添加scoped属性后

可以清楚看到,添加scoped后,vue-loader加载器会做两个处理:

1、给html标签添加data-v-hash属性
2、给css样式添加[data-v-hash]选择器

这样一来,css样式就只对带有相应data-v-hash的标签起作用了,也就变现实现了css作用域的功能。

当然,在开发过程中,也会遇到父之间无法操作子组件样式的问题(比如在自己的页面上用了element-ui的el-button组件)

element-ui

如果父组件加了scoped属性,那么所以规则都会自动在最后追加data-v-hash选择器,自然找不到子组件的元素,此时我们需要把父组件的scoped去掉,或者使用深度作用选择器

<style scoped>
    .a >>> .b { /* ... */ }
 </style>

参考链接:https://vue-loader-v14.vuejs.org/zh-cn/features/scoped-css.html

相关文章

  • Vue下是如何实现CSS私有作用域的

    在web开发中,css是一个利器,它可以使得我们的页面更加炫酷华丽,但是在好用的前提下它也给迭代开发带来了一定的麻...

  • js笔记之作用域

    1. 如何区分全局作用域和私有作用域? 在全局作用域下声明(预解释的时候)的变量是全局变量 在私有作用域中声明的变...

  • 《vue》关于样式中“scoped”边界问题

    众所周知,Vue中样式的scoped,可以划分css模块,形成css作用域。 那么它的作用域边界是哪里呢? 先说结...

  • 关于私有作用域的预解释

    如何区分私有变量还是全局变量: 在全局作用域下,预解释的时候,声明的变量是全局变量。 在"私有作用域中声明的变量"...

  • 浅谈js的作用域

    1、如何区分私有变量和全局变量 (1).在全局作用域下声明(预解释的时候)的变量是全局变量;(2).在私有作用域中...

  • 2017-3-22 less

    Extend伪类 样式的继承使用 LESS: CSS: 命名空间和作用域 指定命名空间LESS: CSS: 私有作...

  • 作用域链,原型链,面向对象的理解

    作用域链: 函数执行会形成一个私有的作用域,形成和当前私有作用域中声明的变量都是私有变量,当前私有作用域有自我保护...

  • 作用域链

    -如何区分私有变量和全局变量: 1.在全局作用域下声明(预解释的时候)的变量是全局变量2.在私有作用域中声明的变量...

  • 作用域链跟原型链

    作用域链: 函数执行会形成一个私有的作用域,形参和在当前私有作用域中声明的变量都是私有变量,当前的私有作用域有自我...

  • 如何在laravel-mix中使用CSS Modules

    使用Vue开发SPA时,如果想在组件中用 CSS Modules 来替代 scoped 控制CSS作用域,只...

网友评论

      本文标题:Vue下是如何实现CSS私有作用域的

      本文链接:https://www.haomeiwen.com/subject/vlqlsqtx.html