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

简介: 带你玩转 ui 框架 ——scoped及样式穿透问题详解

前言

在我们前端的开发中经常会使用到各种 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的标识,有的是继承的,有的是自己组件的,所以我们在修改样式的时候还是会涉及到上面所说的权重问题,如果做不好可能会出现尴尬的问题就是自己的组件修改不了自己组件的样式哈哈
  • 最后的问题就是我们上面抛出的问题,当我们设置此属性后我们想要改变组件中的样式是改变不了的,当然我们可以通过强大样式穿透进行解决!



相关文章
|
1月前
|
小程序 JavaScript 前端开发
小程序常见的UI框架
小程序常见的UI框架
264 60
|
5天前
|
缓存 测试技术 C#
使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题
【10月更文挑战第20天】本文介绍了使用 Radzen Blazor 组件库开发基于 ABP 框架的炫酷 UI 主题的步骤。从准备工作、引入组件库、设计主题、集成到 ABP 框架,再到优化和调试,详细讲解了每个环节的关键点和注意事项。通过这些步骤,你可以打造出高性能、高颜值的应用程序界面。
|
1月前
|
JavaScript
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
这篇文章介绍了如何使用Ant Design Vue UI框架创建一个简单的后台管理模板,包括创建Vue项目、安装和使用ant-design-vue、以及编写后台管理通用页面的代码和样式。
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
|
11天前
|
前端开发 开发者 UED
UI 框架:nav-ui&uni-ui&vant
本文档介绍了`nav-ui`、`uni-ui`和`vant`三个UI库的基本使用方法,包括图标、表格和树的使用示例,以及如何在项目中安装和配置这些UI组件。对于`nav-ui`,详细说明了图标组件的安装与使用,包括本地图标和第三方图标库的集成方式。`uni-ui`部分则重点讲解了CSS的使用方法。最后,`vant`部分提供了从项目创建到组件安装的具体步骤,以及如何将下载的组件正确地集成到项目中。
|
11天前
|
前端开发 JavaScript 开发者
UI 框架:element-ui(二)
在当今快速发展的前端开发领域,用户界面的设计和交互体验日益成为软件成功的关键因素之一。Element UI,作为一款基于Vue.js的组件库,以其精美的界面和丰富的功能受到了广泛的关注与应用。它为开发者提供了一整套高质量的组件,帮助他们快速构建具有现代感的应用程序。 Element UI不仅注重美观的设计,还提供了良好的文档支持和社区活跃度,使得开发者能够轻松上手并解决实施过程中的各种问题。在这篇文章中,我们将深入探讨Element UI的基本特点、安装步骤,以及如何利用其强大的组件系统高效地构建用户友好的界面。无论您是初学者还是有经验的开发者,这篇文章都将为您开辟一条通向更高效开发的道路。
|
11天前
|
JavaScript 前端开发 数据安全/隐私保护
UI 框架:Element-plus组件库(一)
在现代Web开发中,用户界面的设计与交互体验至关重要。随着前端技术的迅速发展,各种UI框架层出不穷,旨在提升开发效率和用户体验。其中,Element Plus作为一款基于Vue 3的组件库,因其简洁优雅的设计和丰富的功能而备受欢迎。 Element Plus不仅提供了众多高质量的组件,还注重与开发者的友好互动,使得即使是初学者也能快速上手。在本系列文章中,我们将深入探讨Element Plus的各个组件及其应用,通过实例演示如何有效利用该框架构建美观且功能强大的用户界面。
|
1月前
|
JavaScript
从零开始写一套广告组件【一】搭建基础框架并配置UI组件库
其实这个从零有点歧义,因为本质上是要基于`tdesign-vue-next`来进行二次封装为一套广告UI组件库,现在让我们在一起快乐的搭建自己的广告UI库之前,先对以下内容做出共识:
61 0
从零开始写一套广告组件【一】搭建基础框架并配置UI组件库
|
1月前
|
Linux C# Android开发
一个开源、跨平台的.NET UI框架 - Avalonia UI
一个开源、跨平台的.NET UI框架 - Avalonia UI
|
1月前
|
C# Android开发 开发者
Uno Platform 高级定制秘籍:深度解析与实践样式和模板应用,助你打造统一且高效的跨平台UI设计
【9月更文挑战第7天】Uno Platform 是一个强大的框架,支持使用 C# 和 XAML 创建跨平台 UI 应用,覆盖 Windows、iOS、Android、macOS 和 WebAssembly。本文介绍 Uno Platform 中样式和模板的应用,助力开发者提升界面一致性与开发效率。样式定义控件外观,如颜色和字体;模板则详细定制控件布局。通过 XAML 定义样式和模板,并可在资源字典中全局应用或嵌套扩展。合理利用样式和模板能简化代码、保持设计一致性和提高维护性,帮助开发者构建美观高效的跨平台应用。
46 1
|
2月前
|
前端开发 JavaScript UED
element-ui 表格数据究竟隐藏着怎样的神秘样式与格式化技巧?快来揭开谜底!
【8月更文挑战第22天】《element-ui 表格数据样式及格式化案例》展示了如何利用 element-ui 的表格组件实现美观且易读的数据展示。通过简单配置,可以自定义表格样式,如边框、背景色等,并通过 formatter 实现数据格式化,例如将成绩保留一位小数。此外,还能依据条件设置行样式,如成绩达优则高亮显示,从而增强用户体验和数据可读性。
59 1