.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 通用简单的table选项卡实现
May 07 Javascript
js相册效果代码(点击创建即可)
Apr 16 Javascript
非常好用的JsonToString 方法 简单实例
Jul 18 Javascript
ie浏览器使用js导出网页到excel并打印
Mar 11 Javascript
JavaScript使用循环和分割来替换和删除元素实例
Oct 13 Javascript
node.js中的path.sep方法使用说明
Dec 08 Javascript
使用jQuery 操作table 完成单元格合并的实例
Dec 27 jQuery
详解Node 定时器
Feb 26 Javascript
解决Angular4项目部署到服务器上刷新404的问题
Aug 31 Javascript
Vuex 模块化使用详解
Jul 31 Javascript
非常漂亮的js烟花效果
Mar 10 Javascript
idea编译器vue缩进报错问题场景分析
Jul 04 Vue.js
微信小程序实现上传图片功能
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字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
用PHP解决的一个栈的面试题
2014/07/02 PHP
详解php中 === 的使用
2016/10/24 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
微信小程序 获取二维码实例详解
2017/06/23 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
js module大战
2019/04/19 Javascript
Node.js 路由的实现方法
2019/06/05 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
用Python编写web API的教程
2015/04/30 Python
Python抓取百度查询结果的方法
2015/07/08 Python
Python使用turtule画五角星的方法
2015/07/09 Python
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
python正则表达式re之compile函数解析
2017/10/25 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
python zip()函数的使用示例
2020/09/23 Python
Python存储读取HDF5文件代码解析
2020/11/25 Python
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
法人授权委托书范本
2014/04/04 职场文书
学校群众路线专项整治方案
2014/10/31 职场文书
大班上学期个人总结
2015/02/13 职场文书
《1942》观后感
2015/06/08 职场文书
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS
vscode内网访问服务器的方法
2022/06/28 Servers