详解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 相关文章推荐
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
Jan 24 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
jquery 按键盘上的enter事件
May 11 Javascript
基于javascript的JSON格式页面展示美化方法
Jul 02 Javascript
Jquery easyui开启行编辑模式增删改操作
Jan 14 Javascript
Bootstrap零基础学习第一课之模板
Jul 18 Javascript
AngularJS 入门教程之事件处理器详解
Aug 19 Javascript
JS中作用域和变量提升(hoisting)的深入理解
Oct 31 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
Mar 30 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 Javascript
vue实现点击当前标签高亮效果【推荐】
Jun 22 Javascript
layer提示框添加多个按钮选择的实例
Sep 12 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
memcache命令启动参数中文解释
2014/01/13 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
用Javascript评估用户输入密码的强度(Knockout版)
2011/11/30 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
javascript实现实时输出当前的时间
2015/04/27 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
Node.js  事件循环详解及实例
2017/08/06 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
vue实现微信获取用户信息的方法
2019/03/21 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
[02:40]DOTA2英雄基础教程 炼金术士
2013/12/23 DOTA
Python正则表达式知识汇总
2017/09/22 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
python的sorted用法详解
2019/06/25 Python
Python中zip函数如何使用
2020/06/04 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
求网格中的黑点分布
2013/11/06 面试题
邀请函模板
2015/02/02 职场文书
阿凡达观后感
2015/06/10 职场文书
红色电影观后感
2015/06/18 职场文书
浅谈MySQL中的六种日志
2022/03/23 MySQL
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python
服务器SVN搭建图文安装过程
2022/06/21 Servers