.vue文件 加scoped 样式不起作用的解决方法


Posted in Javascript onMay 28, 2018

浅谈关于.vue文件中的style的scoped属性

注意:scoped作用:使得.vue中的样式不影响其他.vue组件样式,而不是scoped使得.vue组件样式不受外样式影响。

1、在vue组件中,为了使样式私有化(模块化),不对全局造成污染,在style标签上添加scoped属性,以表示它只属于当下的模块。但是要慎用,因为在我们需要修改公共组件(第三方库或者项目中定制的组件)的样式的时候,scoped会造成很多困难,组要增加额外的复杂度。

一、创建公共组件button:

//button.vue
<template>
 <div class="button-warp">
  <button class="button">text</button>
 </div>
</template>
...
<style scoped>
 .button-warp{
  display:inline-block;
 }
 .button{
  padding: 5px 10px;
  font-size: 12px;
  border-radus: 2px;
 }
</style>

浏览器渲染后的button组件为:

<div data-v-2311c06a class="button-warp">
 <button data-v-2311c06a class="button">text</button>
</div>
.button-warp[data-v-2311c06a]{
 display:inline-block;
}
.button[data-v-2311c06a]{
 padding: 5px 10px;
 font-size: 12px;
 border-radus: 2px;
}

从上面的结果可以看出,添加了scoped属性的组件,做了如下操作:

(1)、给HTML的DOM节点增加一个不重复的data属性。(如:data-v-2311c06a)
(2)、在每句css选择器的末尾(编译后生成的css语句)加一个当前组件的data属性选择器(如:data-v-2311c06a)来私有化样式。

二、在 " 不使用 " scoped的组件中引用button组件:

//content.vue
<template>
 <div class="content">
  <p class="title"></p>
  <!-- v-button假设是上面定义的公共组件 -->
  <v-button></v-button>
 </div>
</template>
...
<style>
 .content{
  width: 1200px;
  margin: 0 auto;
 }
 .content .button{
  border-raduis: 5px;
 }
</style>

浏览器渲染出来的结果是:

<div class="content">
 <p class="title"></p>
 <!-- v-button假设是上面定义的组件 -->
 <div data-v-2311c06a class="button-warp">
  <button data-v-2311c06a class="button">text</button>
 </div>
</div>
/*button.vue渲染出来的css*/
.button-warp[data-v-2311c06a]{
 display:inline-block;
}
.button[data-v-2311c06a]{
 padding: 5px 10px;
 font-size: 12px;
 border-radus: 2px;
}
/*content.vue渲染出来的css*/
.content{
 width: 1200px;
 margin: 0 auto;
}
.content .button{
 border-raduis: 5px;
}

虽然,在content组件中修改了button的border-radius属性,但是由于权重关系,生效的依然是组件内部的样式(即.button[data-v-2311c06a]定义的样式), 如果此时仍需修改样式,则鼻血加重我们需要修改的样式的权重。

三、在 " 使用 " scoped的组件中引用button组件:

//content.vue
<template>
 <div class="content">
  <p class="title"></p>
  <!-- v-button假设是上面定义的公共组件 -->
  <v-button></v-button>
 </div>
</template>
...
<style scoped>
 .content{
  width: 1200px;
  margin: 0 auto;
 }
 .content .button{
  border-raduis: 5px;
 }
</style>

浏览器渲染的结果是:

<div data-v-57bc25a0 class="content">
 <p data-v-57bc25a0 class="title"></p>
 <!-- v-button假设是上面定义的组件 -->
 <div data-v-57bc25a0 data-v-2311c06a class="button-warp">
  <button data-v-2311c06a class="button">text</button>
 </div>
</div>
/*button.vue渲染出来的css*/
.button-warp[data-v-2311c06a]{
 display:inline-block;
}
.button[data-v-2311c06a]{
 padding: 5px 10px;
 font-size: 12px;
 border-radus: 2px;
}
/*content.vue渲染出来的css*/
.content[data-v-57bc25a0]{
 width: 1200px;
 margin: 0 auto;
}
.content .button[data-v-57bc25a0]{
 border-raduis: 5px;
}

虽然,我们在content添加了scoped属性,但是.content .button 这句末尾添加的是content的scoped标记,最后我们实际上是找不到向对应的DOM节点的,也就不起作用啦。

解决办法:

在content.vue文件中添加两个style样式:

//content.vue
<template>
 <div class="content">
  <p class="title"></p>
  <!-- v-button假设是上面定义的组件 -->
  <v-button></v-button>
 </div>
</template>
...
<style scoped>
 //针对content组件内部的样式
 .content{
  width: 1200px;
  margin: 0 auto;
 }
</style>
<style>
  //针对公共组件的样式
 .content .button{
  border-raduis: 5px !important;
 }
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用javascript实现计算两个日期的间隔天数
Aug 14 Javascript
打造基于jQuery的高性能TreeView(asp.net)
Feb 23 Javascript
jquery里的正则表达式说明
Aug 03 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
Jun 27 Javascript
VS2008中使用JavaScript调用WebServices
Dec 18 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
Mar 19 Javascript
理解JavaScript中Promise的使用
Jan 18 Javascript
js实现获取两个日期之间所有日期的方法
Jun 17 Javascript
three.js中文文档学习之创建场景
Nov 20 Javascript
对vue事件的延迟执行实例讲解
Aug 28 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
Jun 18 Javascript
基于js实现判断浏览器类型代码实例
Jul 17 Javascript
微信小程序实现上传图片功能
May 28 #Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
May 28 #Javascript
vue-cli构建项目下使用微信分享功能
May 28 #Javascript
vue2.0学习之axios的封装与vuex介绍
May 28 #Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
May 28 #Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
May 28 #jQuery
JavaScript继承定义与用法实践分析
May 28 #Javascript
You might like
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
用PHP调用Oracle存储过程
2006/10/09 PHP
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
php获取操作系统语言代码
2013/11/04 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
php使用post数组的键值创建同名变量并赋值的方法
2015/04/03 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
JAVASCRIPT下判断IE与FF的比较简单的方式
2008/10/17 Javascript
Mootools 1.2教程 函数
2009/09/15 Javascript
基于jquery封装的一个js分页
2011/11/15 Javascript
javascript测试题练习代码
2012/10/10 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
Sublime Text 3常用插件及安装方法
2015/12/16 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
微信小程序form表单组件示例代码
2018/07/15 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
[01:00]一分钟回顾2018DOTA2亚洲邀请赛现场活动
2018/04/07 DOTA
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
基于树莓派的语音对话机器人
2019/06/17 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
Python网页解析器使用实例详解
2020/05/30 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
青年创业培训欢迎词
2014/01/10 职场文书
2014世界杯球队球队口号
2014/06/05 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
本溪水洞导游词
2015/02/11 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
简单聊一聊SQL注入及防止SQL注入
2022/03/23 MySQL