刚开始使用vue的时候容易被里面的样式搞懵:

  样式可以在main.js中引入,在模块js文件中引入,在组件中的style标签引入,在组件中的script标签引入,还可以在index.html的body中引入。

  我不禁要问:

  1、从不同位置引入的样式到底是什么关系?

  2、在实际定义样式时应该定义在哪个位置,以避免样式产生的冲突?

  纸上得来终觉浅,绝知此事要躬行。看十次文档,不如做一个测试。

  新建一个最简单的项目并运行:如果你人品没问题,会看到弹出的浏览器中,head标签内有这样的style

  在项目src目录中找找看:

  第一个style在\src\App.vue文件的style中

  第二个style在\src\components\HelloWorld.vue文件中

  App.vue是所有路由的出口,包含HelloWorld.vue,因此页面先加载App.vue的style,再加载HelloWorld.vue的style。看起来很简单,先加载的会先出现,根据页面样式的规则,如果有相同的类定义,后者会覆盖前者。

  但是我想就开头出现的问题了解得更深入。为避免多个问题纠缠在一起,我逐个去分析:

加载顺序的问题

1、为方便看到测试的结果,我改造一下项目:

  我只须关注main.js、App.vue、HelloWorld.vue这三个文件的样式加载,因此删除了其它无关的内容,再来看浏览器:

  结果有点奇怪,先加载app.css,再加载hello.css,再加载main.css,
  为什么呢?我们来看看main.js是怎么定义的:

  原来main.js里先引入了App.vue文件,所以它先执行App.vue里的script,从而引入了app.css

  随后引入router,router里引入了HelloWorld.vue,继而加载hello.css

  加载完App.vue后才按顺序加载main.css,于是有了上面的结果。

  而所有组件的style都是script里的代码执行完后再加载。

  所以我大致可以得出结论:

  样式从main.js入口开始顺序加载,

  遇到组件则加载组件中script所引入的样式,

  先处理完所有scipt中的引入,

  再处理style,

  style按包含关系从外到内加载

  但是问题还没完,我又得出另外的问题:这些页面都是固定的,如果是异步加载页面,当路由切换到另一个页面时,此页面原来的样式是否会删除,当前页面的样式会添加到哪里?

2、为此我又再路由中添加了ComB.vue,并且使用异步加载该组件。

    

  再看浏览器:先只会加载到app-style

  点击hello之后,加载hello-style

  点击comb之后,异步加载comb组件,先引入comb-import,再引入comb-style

  可以看到,浏览器先加载1.js组件文件,然后执行script加载comb.css,再加载ComB.vue的style,而当我切换回ComA页面时,head标签内的样式不再有变化。

  另外可以看到,当我更改路由使HelloWorld不在根路径显示,HelloWorld就只加载hello.css,而不会加载HelloWorld的style,只有HelloWorld页面显示出来时才加载。

3、我再看看如果把helloworld也改成异步组件会怎么样?

  可以看到之前第二个加载的hello-import没有了,然后先点击谁,谁就先加载

 

  所以可以知道:如果ComA和ComB都是异步组件,则先打开哪一页就加载哪一页的script和style

  再定义一个ComBB,在ComB中引入,但不显示,则ComBB只显示comb_b.css,但不显示style

  所以:加载顺序应再加两条规则:

  异步组件先显示的先加载

  没有显示的页面或者组件不加载style

4、再看一个问题:一个组件内可以定义不止一个style,并且有scoped的style和没有scoped的style可以并存,它们会按照所定义的顺序加载。

  看浏览器,按顺序加载:

<style type="text/css">
.noScope1.noScope2{
height: 50px
}
</style>
<style scoped>
.comb-style{
color: red;
}
</style>
<style type="text/css">
.noScope2{
border: 1px solid red;
height:20px;
}
</style>

  并且我把样式稍微做了改变,比如先给noScope2加height,发现覆盖了noScope1的高度;再然后,给.noScope1加上.noScope2,高度又变成50,

  也就是说:跟普通CSS拥有一样的权重优先机制。

5、再看写在body内的样式

  通过main.js控制的样式都在head标签中显示,由此就可以知道,如果我在body内定义样式,是可以把head标签内的同名样式覆盖掉的。

  但要注意的是,在body内引入的样式,因为已经不在main.js控制范围内,也就是不参与打包,所以必须定义在static静态资源目录内。

  同时要注意,在body引入的样式不在src文件夹内,没有热更新的功能,所以每次更改后需要手动刷新页面。

6、总结

  经过以上的测试,可以得知style出现的顺序跟你定义的位置,是否异步组件,初始状态是否显示有关。而样式的覆盖又可以通过添加scoped和在body内添加样式文件来控制。相信单页应用要精准控制样式绝对不是难事。

深入理解VUE样式style层次分析的更多相关文章

  1. VUE温习:style层次分析

    一.vue样式style层次分析 1.样式可以在main.js.模块js文件.组件style.组件script标签内,index.html文件内引入,不同位置引入的样式有什么关系. 2.总结: (1) ...

  2. 013——VUE中多种方式使用VUE控制style样式属性

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. Vue.js style(内联样式)

    Vue.js style(内联样式) 我们可以在 v-bind:style 直接设置样式: <div id="app"> <div v-bind:style=&q ...

  4. 深入理解vue

    一 理解vue的核心理念 使用vue会让人感到身心愉悦,它同时具备angular和react的优点,轻量级,api简单,文档齐全,简单强大,麻雀虽小五脏俱全. 倘若用一句话来概括vue,那么我首先想到 ...

  5. vue中的scoped分析以及在element-UI和vux中的应用

    vue使用了单文件组件方式来解耦视图即.vue后缀文件名 单文件组件组成部分: <template> </template> <script> </scrip ...

  6. 从Elo Rating System谈到层次分析法

    1. Elo Rating System Elo Rating System对于很多人来说比较陌生,根据wikipedia上的解释:Elo评分系统是一种用于计算对抗比赛(例如象棋对弈)中对手双方技能水 ...

  7. 第十四章:样式(Style)和主题(Theme)

    简介 Android的样式(Style)和主题(Theme)文件就好比WEB开发中的CSS一样,可以实现UI界面的风格统一管理,这和Windows平台的XAML格式(Silverlight.WPF)类 ...

  8. 理解Vue中的Render渲染函数

    理解Vue中的Render渲染函数 VUE一般使用template来创建HTML,然后在有的时候,我们需要使用javascript来创建html,这时候我们需要使用render函数.比如如下我想要实现 ...

  9. v-bind指令动态绑定class和内联样式style

    动态绑定class—概述 数据绑定(v-bind指令)一个常见需求是操作元素的 class 列表.因为class是元素的一个属性,我们可以用 v-bind 处理它们 我们只需要计算出表达式最终的字符串 ...

随机推荐

  1. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

  2. eclipse 背景颜色

    步骤阅读 3 本例使用的背景色是喜大普奔的豆沙绿,比较柔和 设置为:色调:85.饱和度:120.亮度:208 即可,据说长时间使用可以缓解眼疲劳哦. (吐槽:开什么玩笑,远离编程才能缓解眼疲劳好吗)

  3. iOS 11开发教程(六)iOS11Main.storyboard文件编辑界面

    iOS 11开发教程(六)iOS11Main.storyboard文件编辑界面 在1.2.2小节中提到过编辑界面(Interface builder),编辑界面是用来设计用户界面的,单击打开Main. ...

  4. github安装k8s

    转:https://mritd.me/2016/10/29/set-up-kubernetes-cluster-by-kubeadm/#23镜像版本怎么整 一.环境准备 首先环境还是三台虚拟机,虚拟机 ...

  5. ubuntu16.04服务器apache的ssl证书配置

    背景:在腾讯云申请的免费证书1年,服务器ubuntu 16.04版本,我的是多域名 1.ssl模块的安装 sudo a2enmod ssl //开启apache ssl模块 a2ensite defa ...

  6. Shell 学习笔记之条件语句

    条件语句 if # if if condition then command fi # if else if condition then command else command fi # if e ...

  7. Shell 学习笔记之运算符

    基本运算符 算术运算符 val = expr 2 + 2 需要注意的是 表达式和运算符之间需要有空格(比如2 + 2,不能是2+2) 两边最外面的字符是`,在esc键下面,不是引号哦 乘号* 前面必须 ...

  8. Codeforces Round #349 (Div. 1) B. World Tour 暴力最短路

    B. World Tour 题目连接: http://www.codeforces.com/contest/666/problem/B Description A famous sculptor Ci ...

  9. codevs 1052 地鼠游戏 优先队列

    1052 地鼠游戏 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.codevs.cn/problem/1052/ Descriptio ...

  10. 快速定位问题 Request无法获取参数

    比如说最近开发甲修改了iframe标签的src,开发乙在设置src的时候传入了2个参数,通过iframe标签链接到这个页面时,开发乙调试时发现没有拿到任何参数值.然后开发乙百度了一下,发现iframe ...