解决vue scoped html样式无效的问题


Posted in Javascript onOctober 24, 2020

1、问题场景

page1,page2都使用flexible移动端自适应的时候,有一个页面page2需要手动设置rem基准值,

//手动设置基准
html{ 
 font-size: 120px !important;
}

但是在page2引用的self.less里面设置了基准,竟然没有生效

2、问题分析scoped属性

在引用self.less的时候,使用了属性scoped

解决vue scoped html样式无效的问题

vue中引入了scoped这个概念,设计思想就是让当前组件的样式不会修改到其他页面的样式,使用了data-v-hash的方式来使css有了他对应的模块的标识,通俗来说就是使用了scoped属性,template里面的html都会多一个data-v-hash的属性,css 选择器会根据data-v-hash来进行选择,当前的css文件只会对当前的页面生效。参考下图

解决vue scoped html样式无效的问题

那么问题来了,scoped只对当前组件里面的内容生效,会对组件里面的dom加data-v-hash属性,而不会对html,body等组件之外的dom添加,但是css里面的属性选择器都是data-v-hash属性的,参考下图,椭圆形里面是组件之外的,没有data-v-hash属性,所以加了scoped属性的css会对组件外无效。长方形里面的dom是组件里面的,data-v-hash跟css里面的data-v-hash是一致的会生效。

解决vue scoped html样式无效的问题

虽然css里面的body选择器也添加了data-v-hash,但是页面dom没有data-v-hash属性,所以css里面设置的body样式无效。

解决vue scoped html样式无效的问题

3、解决办法

针对必须设置属性scoped的组件,可以在page2.vue里面再单独写一个style,在页面里面单独写组件之外(html,body等)的样式,因为scoped不会对组件之外的dom增加data-v-hash属性

解决vue scoped html样式无效的问题

但是新问题来了,page2设置以后,影响了page1页面的布局,page1页面html的的font-size样式依然是120px,

当然会影响啊,page2也引用了page1的样式啊,但是page2设置了scoped,所以只有page2的html样式会影响page1,

解决办法就是再vue什么周期create里面,用js给html设置font-size

4、总结

遇到了这问题,终于搞明白了scoped染渲染规则,在添加了scoped属性的组件

给组件(template)里面的dom节点,加了一共不重复属性的data-v-hash,来标志唯一性

给组件里面引用的的样式文件,在每个选择器后面添加了一个等同于dom节点一样的data-v-hash字段,实现类似于作用域的问题,不影响全局

如果组件里面还有组件,只会给最外层的组件里面dom,添加data-v-hash,不会影响组件内部引用的组件

补充知识:vue中scoped慎用

scoped表示当前style属性只属于当前模块

实现原理:

vue通过在DOM结构以及css样式上加上唯一的标记 data-v-469af010,保证唯一,

问题:

1.父组件无scoped属性,子组件带有scoped,父组件是无法操作子组件的样式的(原因在原理中可知),虽然我们可以在全局中通过该类标签的标签选择器设置样式,但会影响到其他组件

2.父组件有scoped属性,子组件无,父组件也无法设置子组件样式,因为父组件的所有标签都会带有data-v-469af010唯一标志,但子组件不会带有这个唯一标志属性,与1同理,虽然我们可以在全局中通过该类标签的标签选择器设置样式,但会影响到其他组件

3.父子组建都有,同理也无法设置样式,更改起来增加代码量

因此如果组件内部还有组件,只会给最外层的组件里的标签加上唯一属性字段,不影响组件内部引用的组件( 注意 )

方案:

1.混合使用全局属性和局部属性

<style>
/* global styles */
</style>
<style scoped>
/* local styles */
</style>

2.深选择器

<template>
 <div id="app">
  <gHeader></gHeader>
 </div>
</template>
<style lang="css" scoped>
 .gHeader /deep/ .name{ //第一种写法
  color:red;
 }
 .gHeader >>> .name{  //二种写法
  color:red;
 }
</style>

以上这篇解决vue scoped html样式无效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript for循环设法提高性能
Feb 24 Javascript
发布一个基于javascript的动画类 Fx.js
Nov 05 Javascript
IE和Firefox的Javascript兼容性总结[推荐收藏]
Oct 19 Javascript
创建公共调用 jQuery Ajax 带返回值
Aug 01 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
Dec 15 Javascript
jQuery仿Excel表格编辑功能的实现代码
May 01 Javascript
jquery插件开发之实现google+圈子选择功能
Mar 10 Javascript
JavaScript中的bold()方法使用详解
Jun 08 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
Oct 12 Javascript
jQuery扇形定时器插件pietimer使用方法详解
Jul 18 jQuery
JavaScript实现简单生成随机颜色的方法
Sep 21 Javascript
解决vue v-for src 图片路径问题 404
Nov 12 Javascript
vue项目查看vue版本及cli版本的实现方式
Oct 24 #Javascript
Ant Design的Table组件去除
Oct 24 #Javascript
Ant design vue table 单击行选中 勾选checkbox教程
Oct 24 #Javascript
Antd的Table组件嵌套Table以及选择框联动操作
Oct 24 #Javascript
解决Antd 里面的select 选择框联动触发的问题
Oct 24 #Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
Oct 24 #Javascript
jquery插件懒加载的示例
Oct 24 #jQuery
You might like
php 正则表达式小结
2009/08/31 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
jquery autocomplete自动完成插件的的使用方法
2010/08/07 Javascript
js下用eval生成JSON对象
2010/09/17 Javascript
js 判断脚本加载完毕的代码
2011/07/13 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
如何使用Javascript获取距今n天前的日期
2013/07/08 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
18个非常棒的jQuery代码片段
2015/11/02 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
Python正则表达式介绍
2012/08/06 Python
Python实现截屏的函数
2015/07/26 Python
常见的python正则用法实例讲解
2016/06/21 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
2020/02/06 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
商超业务员岗位职责
2014/03/12 职场文书
央视元宵晚会主持串词
2014/03/25 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
团支书竞选演讲稿
2014/04/28 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python