前言

在我们前端的开发中经常会使用到各种 ui 框架 下面这两个是比较火的,也是我常用的两个ui框架。

问题描述

但是在使用框架的时候难免会遇到需要改变组件中的一些样式,当然如果我们所有页面的组件样式都是统一的话,我们可以进行全局设置样式,但是如果我们仅仅在一个页面中需要个性化的样式设置,我们平常会下面这样操作:

<style lang="less" scoped>
#main {width: 100%;height: 90%;
}
.ivu-form .ivu-form-item-label {color: #fff;
}
.ivu-table th {height: 60px !important;
}
.ivu-table td {height: 45px !important;
}
.conLeft {width: 78%;height: 100%;padding: 10px;position: relative;img {width: 100%;height: 100%;}.smaBox {cursor: pointer;position: absolute;width: 40px;height: 40px;}
}
</style>

不难看出我们上面的很多类名就是我们组件中自带的,我们只有通过这些类名去更改我们当前页面组件呈现的样式,但是因为我们在当前页面中去编写的样式只想让其应用在当前的页面中,所以我们在style中去添加了scoped属性,关于scoped属性的讲解我们放到下面去讲解;

先回到我们上面的代码中,看似没有任何问题我们去通过类名改变组件的样式,但是他不会生效,就是因为scoped属性导致的问题,在我们的Vue项目中scoped属性真的很好用,为我们避免了组件之间的样式覆盖,使我们定的样式不会造成全局的污染!

解决办法 - 样式穿透即可

首先我们要搞明白添加上scoped属性后发生了什么,如果您着急解决问题可以直接看我们这个小节的问题解决,如果您想知其然知其所以然,那么您现在可以先去看文章的下一小节——scoped属性的原理。

使用样式穿透去解决 scoped 带来的问题,样式穿透有四种形式:
不太推荐第一种写法,不同浏览器的展示形式不一样,容易出问题,2、3、4这几种都是有预处理器(less, scss, sass)的写法,推荐大家使用第二、三种,

  1. stylus的样式穿透 使用 >>>
  2. /deep/
  3. ::v-deep
  4. 去掉scoped
    将scoped属性去掉。虽然很方便 但是失去了样式的保护,我们就需要用原始的方法保护该组件的样式作用域,可通过后台选择器等等方式实现样式的保护,使其不受污染。好像更麻烦了。


上面我通过使用第二种方式 轻松实现了

scoped属性的原理

为了使样式私有化(模块化),不对全局造成污染,可以在style标签上添加scoped属性以表示它的只属于当下的模块,这是一个非常好的举措

我们可能只了解他的作用就是为了让当前组中的style中的样式,仅仅对当前组件生效,对原理可能不太懂,那下面小编就带大家梳理一下scoped的原理。

scoped的用法
<template><div class="box">欢迎您的光临</div>
</template><style lang="less" scoped>.box{background-color:green;}
</style>
  • 从上面的代码中我们可以看出我们的scoped属性就是直接写到我们的style标签当中,使用就是这么简单
设置scoped属性后发生了什么

设置上了scoped 实际上我们是将代码通过 PostCss 进行了转换,下面我们进行一下对比

PostCss是一个样式处理工具,它通过自定义的插件和工具生态体系来重新定义css,有兴趣的同学可以去了解一下关于PostCss中的一些常用插件,让你的css更哇塞

转换前:

<template><div class="box">欢迎您的光临</div>
</template><style lang="less" scoped>.box{background-color:green;}
</style>

转换后:


<template><div class="box" data-v-21aa888a>欢迎您的光临</div>
</template><style>.example[data-v-21aa888a] {color: red;}
</style>
  • 上面对比后大家应该就懂了是怎么回事了吧,其实说白了加上scoped后vue编译过程中会生成一个唯一的data-xxx标志,样式后面会跟上该标志,以避免污染全局样式
  • 在父组件中设置了scoped中的样式 如果该组件中有子组件 那子组件的根元素中也会继承父组件中生成的style的唯一标识
慎用scoped

上面我们看到了scoped这个属性很香,其实他隐藏了很多坑

  • 大家都知道css样式有一个优先级的说法,scoped的这一操作,虽然达到了组件样式模块化的目的,但是会造成一种后果:每个样式的权重加重了:理论上我们要去修改这个样式,需要更高的权重去覆盖这个样式。这是增加复杂度的其中一个维度,所以如果要达到修改样式的目的,就必须加重我们要修改样式的权重(增加选择器层级,ID选择器,并列选择器,impotant等)
  • 还有一种情况就是我们的两个组件中均含有scoped 而且一个组件中包含了另一个组件,所以在Dom渲染的时候会在dom节点上加上很多唯一style的标识,有的是继承的,有的是自己组件的,所以我们在修改样式的时候还是会涉及到上面所说的权重问题,如果做不好可能会出现尴尬的问题就是自己的组件修改不了自己组件的样式哈哈
  • 最后的问题就是我们上面抛出的问题,当我们设置此属性后我们想要改变组件中的样式是改变不了的,当然我们可以通过强大样式穿透进行解决!

带你玩转 ui 框架 ——scoped及样式穿透问题详解相关推荐

  1. 三大框架题目整合考试题(含详解)

    三大框架题目整合考试题(含详解) 1.在Hibernate的关联关系映射配置中,下列选项对于inverse说法错误的是(bd). (选择二项) A. inverse属性指定了关联关系中的方向 //in ...

  2. php事件和行为,Yii框架组件和事件行为管理详解

    Yii框架组件和事件行为管理详解 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Yii框架组件和事件行为管理详解.txt ] (友情提示:右键点上行txt文档名- ...

  3. 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...

  4. 自动化测试框架[Cypress命令行执行测试详解]

    前提 已经熟练掌握了Cypress的基本知识,请参考自动化测试框架[Cypress概述]和自动化测试框架[各自动化测试框架比较] 已经熟练掌握Cypress环境配置,请参考自动化测试框架[Cypres ...

  5. 项目中如何修改UI框架的默认样式

    我们在使用elementUI时,只能使用框架自带的样式,普通的修改方法并不能实现,我整理了下面几种修改样式的方法. 1. 行内修改样式 通过在行内设置style修改,用于局部组件块 <el-bu ...

  6. 手把手教你玩转SOCKET模型:完成端口(Completion Port)详解

    这篇文档我非常详细并且图文并茂的介绍了关于网络编程模型中完成端口的方方面面的信息,从API的用法到使用的步骤,从完成端口的实现机理到实际使用的注意事项,都有所涉及,并且为了让朋友们更直观的体会完成端口 ...

  7. spring框架使用Quartz执行定时任务实例详解

    版权声明:本文为博主原创文章,如需转载,请标明出处. https://blog.csdn.net/alan_liuyue/article/details/80382324 Quartz简介 1.Qua ...

  8. 第一节:框架前期准备篇之Log4Net日志详解

    一. Log4Net简介 Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架,它的功能很强大,可以将日志分为不同的等级,以不同的格式输出到不同的存储介质中,比如:数据库.t ...

  9. VJ框架 与 人脸检测/物体检测 详解

    Viola-Jones Object Detection Framework 1. VJ Framework 1.1 Overview 本文详细阐述 Viola-Joines 人脸检测/物体检测 实时 ...

最新文章

  1. 【经典算法】快速排序
  2. Android的几个分析工具
  3. 《深度探索C++对象模型》--1 关于对象
  4. MyGeneration【ui-原】
  5. 安装Xcode在Mac OS X10.7.3上
  6. java在面板中点击按钮后弹出对话框
  7. 分裂的奶牛群(洛谷P2907题题解,Java语言描述)
  8. 开发实例_5G时代导热石墨散热片的开发和应用实例
  9. 从高排到低变成小楼梯儿歌_幼儿数学儿歌,转发收藏!
  10. java 元祖_在java中对元组列表进行排序的有效方法
  11. 权威cpu测试软件,权威CPU测试软件更新 CPU-Z v1.40.5
  12. c语言指向读取的字节数的指针,c - C语言中指针的大小 - SO中文参考 - www.soinside.com...
  13. 倒车雷达matlab仿真,倒车雷达系统设计(超声波-SEG4)
  14. 联想y50更换固态硬盘_联想y50怎么加固态硬盘而不换原来的机器硬盘?
  15. EXCEL VBA编程入门三:VBA开发环境认识
  16. 圆通物流轨迹查询(非第三方)
  17. java libtorrent_[转载]libtorrent安装windows版
  18. python 循环语句 教学设计_pythonwhile循环教案
  19. android远程主机强迫关闭了一个现有的连接,远程主机强迫关闭了一个现有的连接解决方法...
  20. 推荐几个做自媒体好用的电影素材网站

热门文章

  1. python爬取歌曲评论_python 爬取歌曲评论的简单示例
  2. python添加时间戳_在python中添加时间戳
  3. python做abaqus后处理_python进行abaqus后处理的二次开发,我想提取odb文件中的nodeSet,结果总提示Keyerror,请各位大神指教。...
  4. access建立两个字段唯一索引_数据库索引原理及优化
  5. c++ 动态分配数组_C/C++编程笔记:「C语言指针」民间解读版本
  6. 7-7 六度空间 (30分)_现役球员中,谁最可能成下一位30000分先生?3大前十巨星没戏...
  7. 李宏毅机器学习课程1~~~Introduction Regression
  8. 产品经理十二时辰:内容过于真实,扎心了!
  9. 用java编程实现集合的交、并、差和补运算
  10. 数据库四大特性与隔离级别