详解Vue中的scoped及穿透方法


Posted in Javascript onApril 18, 2019

scoped的由来

css一直有个令人困扰的作用域问题:即使是模块化编程下,在对应的模块的js中import css进来,这个css仍然是全局的。为了避免css样式之间的污染,vue中引入了scoped这个概念。

在vue文件中的style标签上,有一个特殊的属性:scoped。当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件。通过设置该属性,使得组件之间的样式不互相污染。如果一个项目中的所有style标签全部加上了scoped,相当于实现了样式的模块化。

但是这些样式又是如何实现不相互影响呢?

scoped的原理

vue中的scoped 通过在DOM结构以及css样式上加唯一不重复的标记:data-v-hash的方式,以保证唯一(而这个工作是由过PostCSS转译实现的),达到样式私有化模块化的目的。

总结一下scoped三条渲染规则:

  1. 给HTML的DOM节点加一个不重复data属性(形如:data-v-19fca230)来表示他的唯一性
  2. 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-19fca230])来私有化样式
  3. 如果组件内部包含有其他组件,只会给其他组件的最外层标签加上当前组件的data属性

上个栗子。转译前:

<style lang="scss" scoped>
  .test {
    background: blue;
    span{
      color:red;
    }
  }
</style>
<template>
  <div class="test">
    <span>hello world !</span>
  </div>
</template>

转译后:

<style lang="css">
  .test[data-v-ff86ae42] {
    background: blue;
  }
  .test span[data-v-ff86ae42]{
    color: red;
  }
</style>
<template>
  <div class="test" data-v-ff86ae42>
    <span data-v-ff86ae42>hello world !</span>
  </div>
</template>

可以看出:PostCSS会给一个组件中的所有dom添加了一个独一无二的动态属性data-v-xxxx,然后,给CSS选择器额外添加一个对应的属性选择器来选择该组件中dom,这种做法使得样式只作用于含有该属性的dom——组件内部dom, 从而达到了'样式模块化'的效果.

穿透scoped

但是,在做项目中,会遇到这么一个问题,即:引用了第三方组件,需要在组件中局部修改第三方组件的样式,而又不想去除scoped属性造成组件之间的样式污染。那么有哪些解决办法呢?

  1. 不使用scoped 省略(个人不推荐)
  2. 在模板中使用两次style标签:
<style lang="scss">
  /*添加要覆盖的样式*/
</style>
<style lang="scss" scoped>
  /* local styles */
</style>
<!--vue官网中提到:一个 .vue 文件可以包含多个style标签。所以上面的写法是没有问题的。-->

穿透scoped >>>

<template>
 <div class="box">
  <dialog></dialog>
 </div>
</template>
<!--使用 >>>或者 /deep/ 操作符(Sass 之类的预处理器无法正确解析 >>>,可以使用/deep/)-->
<style lang="scss" scoped>
.box {
 /deep/ input {
  width: 166px;
  text-align: center;
 }
}
</style>
或者
<style lang="scss" scoped>
.box >>> input {
  width: 166px;
  text-align: center;
 }
}
</style>

希望能帮助遇到同样问题的你,thanks!

以上所述是小编给大家介绍的Vue中的scoped及穿透方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
你可能不再需要JQUERY
Mar 09 Javascript
在VS2008中使用jQuery智能感应的方法
Dec 30 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
Nov 27 Javascript
jQuery实现html表格动态添加新行的方法
May 28 Javascript
基于jquery实现放大镜效果
Aug 17 Javascript
js判断日期时间有效性的方法
Oct 24 Javascript
js实现仿微博滚动显示信息的效果
Dec 21 Javascript
JS实现弹出居中的模式窗口示例
Jun 20 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
Aug 05 Javascript
纯JS实现表单验证实例
Dec 24 Javascript
js实现双人五子棋小游戏
May 28 Javascript
javascript实现数字时钟效果
Feb 06 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
Apr 18 #Javascript
Vue 进阶之路(三)
Apr 18 #Javascript
Vue自定义全局Toast和Loading的实例详解
Apr 18 #Javascript
javascript数据类型中的一些小知识点(推荐)
Apr 18 #Javascript
在element-ui的select下拉框加上滚动加载
Apr 18 #Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 #Javascript
vue模式history下在iis中配置流程
Apr 17 #Javascript
You might like
第4章 数据处理-php正则表达式-郑阿奇(续)
2011/07/04 PHP
php实例分享之二维数组排序
2014/05/15 PHP
PHP中feof()函数实例测试
2014/08/23 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
让table变成exls的示例代码
2014/03/24 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
2015/01/02 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
AngularJs  unit-testing(单元测试)详解
2016/09/02 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
javascript 作用于作用域链的详解
2017/09/27 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
python爬虫之xpath的基本使用详解
2018/04/18 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
Python正则表达式和re库知识点总结
2019/02/11 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
Python Numpy库datetime类型的处理详解
2019/07/13 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
Django的ListView超详细用法(含分页paginate)
2020/05/21 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
回门宴父母答谢词
2014/01/26 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
解决python绘图使用subplots出现标题重叠的问题
2021/04/30 Python
完美解决golang go get私有仓库的问题
2021/05/05 Golang
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python