.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 相关文章推荐
extjs grid取到数据而不显示的解决
Dec 29 Javascript
js 小数取整的函数
May 10 Javascript
BOM与DOM的区别分析
Oct 26 Javascript
jQuery最佳实践完整篇
Aug 20 Javascript
Js sort排序使用方法
Oct 17 Javascript
jquery(hide方法)隐藏指定元素实例
Nov 11 Javascript
jquery实现图片翻页效果
Dec 23 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
Apr 25 Javascript
JavaScript获取IP获取的是IPV6 如何校验
Jun 12 Javascript
利用Javascript实现简单的转盘抽奖
Feb 13 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
Mar 15 Javascript
如何通过JS实现转码与解码
Feb 21 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 身份验证方面的函数
2009/10/11 PHP
PHP在线生成二维码代码(google api)
2013/06/03 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
js实现在文本框光标处添加字符的方法介绍
2012/11/24 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
javascript html5 canvas实现可拖动省份的中国地图
2016/03/11 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
2017/03/13 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
微信小程序 http请求的session管理
2017/06/07 Javascript
VUE元素的隐藏和显示(v-show指令)
2017/06/23 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
2020/08/06 Javascript
python实现绘制树枝简单示例
2014/07/24 Python
详细解读Python中解析XML数据的方法
2015/10/15 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
pygame实现俄罗斯方块游戏(基础篇3)
2019/10/29 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
美国渔具店:FishUSA
2019/08/07 全球购物
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
个人简历自我评价
2014/01/06 职场文书
模具数控专业自荐信
2014/01/27 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
起诉意见书范文
2015/05/19 职场文书
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL