1. 介绍

在 Vue 中,我们可以使用 scoped 特性来给组件的样式添加作用域。通过为组件的 <style> 标签添加 scoped 特性我们可以确保组件的样式仅应用于该组件的模板中,而不会影响其他组件或全局样式。

2. 基本使用

<template>
  <div class="example"&gt;
    <h1&gt;Scoped Styles</h1&gt;
  </div&gt;
</template&gt;

<style scoped&gt;
.example {
  color: red;
}
</style&gt;

在上面的例子中,.example 类的样式只会应用于该组件的模板中,而不会影响其他组件或全局样式。

3. scoped原理

4. 深度选择器

我们vue开发过程中,总是会用到各种组件库,如:ElmentUI/andt design等等,或者我们自己封装的组件,这些组件库提供的组件样式有时并不满足实际需求,这时候需要使用深度选择器修改样式。

下面是一个使用深度选择器的例子:
在这里插入图片描述
此时我们自己的组件中修改 btn 组件的样式,发现没有效果
在这里插入图片描述
vue提供了:deep()选择器

<template&gt;
  <div class="example">
    <btn>Scoped Styles</btn>
  </div>
</template>

<style lang="scss" scoped>
.example {
  :deep(.content) {
    color: red;
  }
}
</style>

在这里插入图片描述
当然了在 sass 中我们还可以使用 ::vdeep (在 less使用 /deep/ )来修改样式,也是可以实现的。

5. 插槽选择器

默认情况下,作用域样式不会影响到<slot/>渲染出来的内容,因为它们被认为是父组件所持有并传递进来的。使用 :slotted伪类以明确地将插槽内容作为选择器目标
在这里插入图片描述
渲染效果如下
在这里插入图片描述

<template>
  <div class="example">
    <button class="content">
      <slot></slot>
      <slot name="title"></slot>
    </button>
  </div>
</template>

<script setup lang="ts"></script>

<style lang="scss" scoped>
/* 直接修改插槽元素的样式,不生效 */
.example {
   .unname-class {
     color: red;
   }
}

/* 使用:slotted()插槽选择器可以修改插槽内元素的样式 */
.example {
  :slotted(.unname-class) {
    color: red;
  }
  :slotted(.name-class) {
    color: orange;
  }
}
</style>

</style>

6. 全局选择器

在实际开发中我们可能封装比较多的公共样式文件,但在某个组件中我们想去修改某个公共样式,那这个时候比起另外创建一个<style></style>标签来说,更推荐使用:global()选择器

<style scoped lang="scss">
:global(.global-color) {
  color: red;
}
</style>

在这里插入图片描述
修改前文字颜色为橙色,修改后文字颜色已经发生改变,效果如下
在这里插入图片描述

7. 混合使用局部全局样式

<style>
// ......
</style>

<style scoped lang="scss">
// ......
</style>

8. CSS Modules

先看效果
在这里插入图片描述
示例代码

<template>
  <div class="example">
    <header :class="$style.header">头部</header>
    <main :class="$style.main">内容</main>
    <footer :class="$style.footer">底部</footer>
  </div>
</template>

<style module lang="scss">
.header,
.main,
.footer {
  height: 100px;
  width: 500px;
  border: 1px solid #000;
  font-size: 18px;
  font-weight: bold;
}
.header {
  margin-bottom: 20px;
  color: palevioletred;
}
.main {
  margin-bottom: 20px;
  color: green;
}
.footer {
  color: blue;
}
</style>

9. 自定义注入名称

<template>
  <div class="example">
    <header :class="myStyle.header">头部</header>
    <main :class="myStyle.main">内容</main>
    <footer :class="myStyle.footer">底部</footer>
  </div>
</template>

<style module="myStyle" lang="scss">
.header,
.main,
.footer {
  height: 100px;
  width: 500px;
  border: 1px solid #000;
  font-size: 18px;
  font-weight: bold;
}
.header {
  margin-bottom: 20px;
  color: palevioletred;
}
.main {
  margin-bottom: 20px;
  color: green;
}
.footer {
  color: blue;
}
</style>

10. CSS 中的 vbind()

渲染效果
在这里插入图片描述

代码示例

<template>
  <div class="example">
    <div class="example-text">css中v-bind绑定变量</div>
  </div>
</template>

<script setup lang="ts">
import { ref } from "vue";
const color = ref("red");
</script>

<style scoped lang="scss">
.example-text {
  color: v-bind(color);
}
</style>

原文地址:https://blog.csdn.net/to_the_Future/article/details/130872660

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_38156.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注