.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 相关文章推荐
jquery插件qrcode在线生成二维码
Apr 26 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
May 11 Javascript
javascript判断网页是关闭还是刷新
Sep 12 Javascript
学习使用Bootstrap页面排版样式
May 11 Javascript
angular中实现li或者某个元素点击变色的两种方法
Jul 27 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
Jun 29 Javascript
layui复选框的全选与取消实现方法
Sep 02 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
Feb 11 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
Mar 12 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
Apr 04 jQuery
JavaScript数组排序功能简单实现
May 14 Javascript
微信小程序入门之指南针
Oct 22 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
深入PHP内存相关的功能特性详解
2013/06/08 PHP
php使用反射插入对象示例分享
2014/03/11 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
PHP进阶学习之垃圾回收机制详解
2019/06/18 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
js 键盘记录实现(兼容FireFox和IE)
2010/02/07 Javascript
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
JS添加删除DIV的简单实例
2016/07/08 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
2017/01/19 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
vue-devtools的安装步骤
2018/04/23 Javascript
Element Table的row-class-name无效与动态高亮显示选中行背景色
2018/11/30 Javascript
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
用python实现英文字母和相应序数转换的方法
2019/09/18 Python
让你的Python代码实现类型提示功能
2019/11/19 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
python识别验证码的思路及解决方案
2020/09/13 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
大学生应聘自荐信
2013/10/11 职场文书
《夜晚的实验》教学反思
2014/02/19 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
典型事迹材料范文
2014/12/29 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
入党积极分子考察意见
2015/06/02 职场文书
赵氏孤儿观后感
2015/06/09 职场文书