.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 相关文章推荐
js类中的公有变量和私有变量
Jul 24 Javascript
Javascript 中的类和闭包
Jan 08 Javascript
jquery 表格的增行删行实现思路
Mar 21 Javascript
浅谈javascript的Array.prototype.slice.call
Aug 31 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
Sep 15 Javascript
AngularJS 过滤器的简单实例
Jul 27 Javascript
JS添加或修改控件的样式(Class)实现方法
Oct 15 Javascript
原生js实现查询天气小应用
Dec 09 Javascript
ES2015 Symbol 一种绝不重复的值
Dec 25 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
Apr 28 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
Jul 26 Javascript
JavaScript仿京东轮播图效果
Feb 25 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的历史和优缺点
2006/10/09 PHP
PHP-MySQL教程归纳总结
2008/06/07 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
使用PHPMyAdmin修复论坛数据库的图文方法
2012/01/09 PHP
php中stream(流)的用法
2014/03/25 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
javascript实现淘宝幻灯片广告展示效果
2015/04/27 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
jQuery替换textarea中换行的方法
2015/06/10 Javascript
JQuery中ajax方法访问web服务实例
2015/07/18 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
关于ES6箭头函数中的this问题
2018/02/27 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
javascript匿名函数中的'return function()'作用
2018/10/15 Javascript
vue实现放大镜效果
2020/09/17 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
python批量下载图片的三种方法
2013/04/22 Python
浅谈python 线程池threadpool之实现
2017/11/17 Python
简单了解什么是神经网络
2017/12/23 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
Python测试Kafka集群(pykafka)实例
2019/12/23 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
2021/03/02 Python
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
高级编程求职信模板
2014/02/16 职场文书
八荣八耻的活动方案
2014/08/16 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
副总经理岗位职责范本
2014/09/30 职场文书
幼儿园元旦主持词
2015/07/06 职场文书