Maison  >  Article  >  interface Web  >  Comment utiliser la pénétration de style pour modifier le style par défaut d'elementUI dans le projet vue3

Comment utiliser la pénétration de style pour modifier le style par défaut d'elementUI dans le projet vue3

PHPz
PHPzavant
2023-05-12 14:34:121720parcourir

1. Modularisation des styles

Dans un seul fichier CSS, nous écrivons le style du composant dans la balise style Vous pouvez voir que généralement la balise style aura un attribut scoped, qui peut. être atteint Même si les sélecteurs des différents composants sont les mêmes, les styles n'interfèrent pas les uns avec les autres.

Comment utiliser la pénétration de style pour modifier le style par défaut delementUI dans le projet vue3

Regardez un exemple, nous définissons une classe hello-world-box dans les deux composants, et dans le Set correspondant différents styles dans la balise scope. hello-world-box类,在对应的scope标签中设置不同的样式。

Comment utiliser la pénétration de style pour modifier le style par défaut delementUI dans le projet vue3

可以看到,vue为我们在不同的组件中的标签上加上了一个独有的属性(PostCSS转译实现)。然后通过属性选择器,实现不同属性的标签样式互不干扰。

css属性选择器的作用是:为带有特定属性的 HTML 元素设置样式

.hello-world-box[data-v-e17ea971] {
    color: red;
}

这也是style标签scoped属性实现样式模块化的原理。
当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,也就是说,该样式只能适用于当前组件元素。通过该属性,可以使得组件之间的样式不互相污染。如果一个项目中的所有style标签全部加上了scoped,相当于实现了样式的模块化。

二、样式穿透实现

了解了vue中样式模块化的实现,进入正题,如何实现自定义elmentUI组件库中组件的样式呢?
这其实也是比较常见的需求,因为有的UI图并不是使用element组件库的组件画的,所以样式上肯定存在偏差。
我们来看看el-table

Comment utiliser la pénétration de style pour modifier le style par défaut delementUI dans le projet vue3

可以看到,element组件的样式都是通过外部样式文件实现的,所以对应的标签上并没有vue加上的属性。
那么我们直接在使用elment组件的组件中加上样式,是不会生效的,外部导入的样式文件优先级更高。

1、外部css文件

我们可以自己定义一个css文件,然后书写对应的要修改的样式。
例如:styles.css

Comment utiliser la pénétration de style pour modifier le style par défaut delementUI dans le projet vue3

在入口文件main.js中引入:

Comment utiliser la pénétration de style pour modifier le style par défaut delementUI dans le projet vue3

这里注意引入elment css文件和自定义css文件的引入顺序,因为css样式生效是后来者居上的。

Comment utiliser la pénétration de style pour modifier le style par défaut delementUI dans le projet vue3

生效了。
但是这样其实是存在问题的: 样式文件影响了所有组件,也就是我们在其他页面中调用这个组件,样式也被修改了。
解决办法之一就是在组件对应的类上在包上一层自定义的类名。

2、:deep()

:deep():改变css解析时私有属性的位置

.outer {
  .el-input__inner {
    // 此时css解析的为 .outer .el-input__inner[data-v-xxxx] 样式无效
    background: pink;
  }

  :deep(.el-input__inner) {
    // 此时css解析的为 .outer[data-v-xxxx] .el-input__inner 样式生效
    background: red;
  }
}

3、:slotted()

:slotted():在子组件定义样式插槽内容样式

默认情况下,作用域样式不会影响到 <slot></slot> 渲染出来的内容,因为它们被认为是父组件所持有并传递进来的。

<template>
  <div>
    <slot>插槽</slot>
  </div>
</template>

<style lang="less" scoped>
:slotted(.red) {
  color: red;
}
</style>

4、:global()

:global() :全局选择器,定义全局样式,不用单开一个没有scoped的style。

<style scoped>
:global(.red-box) {
	color: red;
}
</style>
<!-- 等效于 -->
<style>
 .red-box{
     color:red
 }
</style>

5、动态css(v-bind)

vue3单文件组件的 <style></style> 标签支持使用 v-bind CSS 函数将 CSS 的值链接到动态的组件状态,也就是我们可以在style标签中引入script标签中的响应式变量:

<template>
    <el-table :data="tableData" >
        <el-table-column prop="date" label="Date" width="180" />
        <el-table-column prop="name" label="Name" width="180" />
        <el-table-column prop="address" label="Address" />
    </el-table>
</template>

<script lang="ts" setup>
import { ref } from &#39;vue&#39;;

const tableData = [
    {
        date: &#39;2016-05-03&#39;,
        name: &#39;Tom&#39;,
        address: &#39;No. 189, Grove St, Los Angeles&#39;,
    },
    {
        date: &#39;2016-05-02&#39;,
        name: &#39;Tom&#39;,
        address: &#39;No. 189, Grove St, Los Angeles&#39;,
    },
    {
        date: &#39;2016-05-04&#39;,
        name: &#39;Tom&#39;,
        address: &#39;No. 189, Grove St, Los Angeles&#39;,
    },
    {
        date: &#39;2016-05-01&#39;,
        name: &#39;Tom&#39;,
        address: &#39;No. 189, Grove St, Los Angeles&#39;,
    },
]

const redColor = ref(&#39;red&#39;)

</script>

<style scoped>
.el-table {
    color: v-bind(redColor);
}
</style>

Comment utiliser la pénétration de style pour modifier le style par défaut delementUI dans le projet vue3

可以看到,即使在带scoped的style标签中,样式穿透也生效了。

实际的值会被编译成哈希化的 CSS 自定义属性,因此 CSS 本身仍然是静态的。自定义属性会通过内联样式的方式应用到组件的根元素
Comment utiliser la pénétration de style pour modifier la valeur par défaut d'elementUI dans vue3 project Style

#🎜🎜#Comme vous pouvez le voir, vue ajoute un attribut unique (implémentation de la traduction PostCSS) aux étiquettes des différents composants. Ensuite, grâce au sélecteur d'attributs, les styles d'étiquettes des différents attributs n'interfèrent pas les uns avec les autres. #🎜🎜#
#🎜🎜#Le rôle du sélecteur d'attribut CSS est de définir des styles pour les éléments HTML avec des attributs spécifiques #🎜🎜#
rrreee#🎜🎜#Il s'agit également de l'implémentation de l'attribut de portée de la balise de style style Le principe de modularité. #🎜🎜#Lorsqu'une balise de style a un attribut scoped, son style CSS ne peut être appliqué qu'au composant actuel, c'est-à-dire que le style ne peut être appliqué qu'à l'élément du composant actuel. Grâce à cet attribut, il est possible d'éviter que les styles entre les composants ne se contaminent les uns les autres. Si toutes les balises de style d'un projet sont étendues, cela équivaut à réaliser une modularisation de style. #🎜🎜##🎜🎜# 2. Implémentation de la pénétration du style #🎜🎜##🎜🎜# Après avoir compris l'implémentation de la modularisation de style dans vue, entrons dans le vif du sujet, comment implémenter le style des composants dans le composant elementUI personnalisé bibliothèque? #🎜🎜#Il s'agit en fait d'une exigence relativement courante, car certains diagrammes d'interface utilisateur ne sont pas dessinés à l'aide de composants de la bibliothèque de composants d'éléments, il doit donc y avoir des écarts dans le style. #🎜🎜#Jetons un coup d'oeil à el-table#🎜🎜##🎜🎜#Comment le projet vue3 utilise-t-il la pénétration de style pour modifier le style par défaut d'elementUI#🎜🎜##🎜🎜#Comme vous pouvez le voir, les styles des composants d'élément sont implémentés via des fichiers de style externes, il n'y a donc pas de vue ajouté aux propriétés des balises correspondantes. #🎜🎜# Ensuite, si nous ajoutons directement des styles aux composants à l'aide de composants d'éléments, cela ne prendra pas effet. Les fichiers de style importés en externe ont une priorité plus élevée. #🎜🎜#

1. Fichier CSS externe

#🎜🎜#Nous pouvons définir nous-mêmes un fichier CSS, puis écrire le style correspondant à modifier. #🎜🎜#Par exemple : styles.css#🎜🎜##🎜🎜# vue3 Comment le projet utilise la pénétration de style pour modifier le style par défaut d'elementUI#🎜🎜##🎜🎜#Introduit dans le fichier d'entrée main.js : #🎜🎜##🎜🎜#Comment utiliser la pénétration de style pour modifier le style par défaut d'elementUI dans le projet vue3#🎜🎜##🎜🎜#Faites attention à l'introduction des fichiers CSS d'éléments et des styles personnalisés ici Définissez l'ordre dans lequel les fichiers CSS sont introduits, car les styles CSS prennent effet en premier. #🎜🎜##🎜🎜#Comment utiliser la pénétration de style pour modifier la valeur par défaut d'elementUI dans vue3 project Style#🎜🎜##🎜🎜# prend effet. #🎜🎜#Mais il y a en fait un problème avec ça : le fichier de style affecte tous les composants, c'est-à-dire que lorsque nous appelons ce composant dans d'autres pages, le style est également modifié. #🎜🎜#Une des solutions est d'ajouter un nom de classe personnalisé au dessus du package sur la classe correspondant au composant. #🎜🎜#

2, :deep()

#🎜🎜#:deep() : Changer la position des attributs privés lors de l'analyse CSS #🎜🎜#rrreee

3 , :slotted()

#🎜🎜#:slotted() : Définit le style de contenu du slot dans le composant enfant #🎜🎜##🎜🎜#Par défaut, le style de portée n'est pas Affectera le contenu rendu par <slot></slot> car il est considéré comme étant détenu et transmis par le composant parent. #🎜🎜#rrreee

4. :global()

#🎜🎜#:global() : Sélecteur global, définissant un style global sans ouvrir un style non défini. #🎜🎜#rrreee

5. La balise CSS dynamique (v-bind)

#🎜🎜#vue3 La balise <style></style> prend en charge l'utilisation de v -bind La fonction CSS lie la valeur CSS à l'état du composant dynamique, c'est-à-dire que nous pouvons introduire la variable responsive dans la balise script dans la balise style : #🎜🎜#rrreee# 🎜🎜# Comment utiliser la pénétration de style pour modifier le style par défaut d'elementUI dans le projet vue3#🎜🎜# #🎜🎜#Vous pouvez voir que même dans les balises de style étendues, la pénétration du style prend effet. #🎜🎜##🎜🎜#Les valeurs réelles sont compilées dans des propriétés personnalisées CSS hachées, de sorte que le CSS lui-même reste statique. Les propriétés personnalisées sont appliquées à l'élément racine du composant via des styles en ligne et sont mises à jour de manière réactive lorsque la valeur source change. #🎜🎜##🎜🎜#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer