Vue|scoped样式

news/2024/12/23 23:56:35 标签: vue, scoped样式, 样式冲突, 样式兼容, 类名冲突

在 Vue.js 中,scoped 是一个非常有用的特性,允许你将样式限制在当前组件的作用域内,避免样式泄漏到其他组件。它是通过 Vue 的单文件组件(.vue 文件)中的 <style> 标签实现的。

目录

  • 案例演示
  • 总结
    • scoped 的基本使用
    • 工作原理
    • scoped 的局限性
    • 作用范围
    • 组合与嵌套
  • 注意事项
    • 注意事项
    • 常见问题和解决方案

案例演示

vue_4">创建多个vue文件

在效果演示前分别创建两个vue文件,同时在App.vue中进行引用。

<template>
    <div class="test1">
      <h1>定位:{{ address}}</h1>
      <h1>详细:{{ detailAddress }}</h1>
  
    </div>
  </template>
  
  <script>
  export default {
    name: "Company",
    data() {
      return {
        detailAddress: "生态科技园",
        address: "广东省深圳市南山区",
      };
    },
    methods:{
      test(){
        this.hello();
      },
    },
  };
  </script>

<style>
    .test1{
        background: blue;
        border: 10px solid red;
    }
</style>
<template>
  <div class="test2">
    <h1>用户名:{{ name }}</h1>
    <h1>性别:{{ sex }}</h1>
  </div>
</template>

<script>
export default {
  name: "Staff",
  data() {
    return {
      name: "摔跤猫子",
      sex: "男",
    };
  }
};
</script>

<style>
    .test2{
        background: pink;
        border: 10px dotted green;
    }
</style>
<template>
  <div id="app">
    <StaffVue />
    <Home />
  </div>
</template>

<script>
import StaffVue from './components/Staff.vue'
import Home from './components/Home.vue'
export default {
  name: 'App',
  components: {
    StaffVue,
    CompanyVue,
    Home
  }
}
</script>

启动项目后页面效果如下图所示,因为两个不同的vue文件中分别使用了不同的css样式以及不同的class名称,所以其样式各自独立并不冲突。

在这里插入图片描述

将Home.vue中的class类名修改为test2,与Staff.vue文件保持一致后再次刷新页面。

在这里插入图片描述

这时可以看到在没有修改样式内容,只修改了class类名的前提下,Home.vue的样式已经与Staff.vue的样式达到了一样的效果,当多个vue文件在一起时就很容易出现类名冲突的问题。

在这里插入图片描述

两个不同的vue文件中,class都是test2,为什么样式效果是渲染Staff.vue中css样式而不是Home.vue中的? 这是因为在App.vue中是先引用的Home.vue,再引用的Staff.vue,后面的vue文件会把前面的给覆盖掉。

在这里插入图片描述

如果将两者的顺序调整一下,先引用Staff.vue,再引用Home.vue,即以Home.vue中的样式为主。脚手架在解析App.vue文件的时候,先扫描的是引入的文件,然后再读取配置项,最后才解析模板。

在这里插入图片描述
在这里插入图片描述

如何处理类名样式冲突

当组件较少时也许可以通过使用不同的类名来解决这个问题,但终究不是长久之计,也不太现实。只需要在style标签中增加scoped即可,scope翻译就有范围的意思。给这个style标签增加了scoped标记,也就意味着其样式只作用于当前vue结构中,对其进行限制。

在这里插入图片描述
在这里插入图片描述

在页面右键检查就可以看到,它是给最外层的div增加了一个特殊的标签属性并拼接了一个随机生成的值,每次运行这个值可能都不一样,通过这种方式就完成了控制指定的div。

在这里插入图片描述

vue_131">不适合用scoped的组件:App.vue

在 Vue.js 项目中,App.vue 文件是应用的根组件,它是整个 Vue 应用的入口组件。通常,App.vue 作为最上层的组件,负责渲染并展示其他子组件。它通常用于配置应用的基本结构、路由、状态管理(例如 Vuex)等全局功能。

  • 在App.vue中定义样式如下,同时修改其他vue文件中的class类名。
<style >
  .title{
    font-size: 30px;
    color: white;
    font-family: 'Courier New', Courier, monospace;
  }
</style>
  • 其他vue组件
<h1 class="title">用户名:{{ name }}</h1>

得到效果如下图,位于App.vue组件中的样式能够全局作用到其他组件。如果在App.vue组件中使用了scoped,则该样式只能作用于其本身组件中对应的类名标签上。

在这里插入图片描述

总结

scoped 的基本使用

<template>
  <div class="my-component">
    <p>This is a scoped style example.</p>
  </div>
</template>

<script>
export default {
  name: 'MyComponent'
};
</script>

<style scoped>
.my-component {
  background-color: lightblue;
}

p {
  color: green;
}
</style>

工作原理

在 Vue 的 <style scoped> 中,Vue 会自动为该组件的 CSS 选择器添加一个特殊的属性选择器,这样这些样式只会应用于当前组件的 DOM 元素。
例如,Vue 会为 .my-component 类生成一个独特的属性选择器(比如 data-v-xxxxxx),并在 DOM 元素上添加这个属性。然后,样式将仅适用于当前组件的根节点或具有该属性的元素。

例如,以上代码经过 Vue 编译后,生成的 CSS 可能会类似于:

.my-component[data-v-123abc] {
  background-color: lightblue;
}

p[data-v-123abc] {
  color: green;
}

scoped 的局限性

  1. 全局样式:scoped 只影响当前组件的样式。如果你需要全局样式,scoped 不适用。可以使用 <style> 标签而不加 scoped,或者使用外部的 CSS 文件。
  2. 深度选择器:有时你需要为子组件中的元素应用样式,但 scoped 仅作用于当前组件。如果要跨组件的深度嵌套应用样式,可以使用 ::v-deep(也叫 >>> 或 /deep/)。

例如:

<style scoped>
.parent-class ::v-deep .child-class {
  color: red;
}
</style>

或者使用 /deep/(这种写法是 Vue 2.x 的):

<style scoped>
.parent-class /deep/ .child-class {
  color: red;
}
</style>

作用范围

scoped 样式仅限于当前组件,它不会影响其他组件的样式。它的作用是将 CSS 样式限制在该组件的 DOM 元素内部,从而避免全局样式的冲突。

组合与嵌套

可以将多个 scoped 样式放在同一个 <style> 标签中,Vue 会自动确保这些样式局部化。

<template>
  <div class="my-component">
    <p>This is scoped.</p>
    <button class="btn">Click Me</button>
  </div>
</template>

<style scoped>
.my-component {
  color: blue;
}

.my-component p {
  font-size: 14px;
}

.my-component .btn {
  background-color: red;
  color: white;
}
</style>

注意事项

注意事项

  • scoped@import:如果你在 scoped 样式中使用了 @import 导入外部 CSS 文件,这些外部文件的样式会应用到全局,而不会被限制在当前组件的作用域内。为了避免全局污染,尽量避免在 scoped 样式中使用全局 @import。
  • scoped 不适用 JavaScript 变量:scoped 样式只针对 CSS 有效,而不支持 JavaScript 动态变量。需要动态样式时,可以使用 Vue 的动态绑定样式(v-bind:style)和类(v-bind:class)功能。

常见问题和解决方案

  • 样式覆盖问题:当子组件的样式需要覆盖父组件时,可以使用 ::v-deep 或 /deep/ 来确保样式的覆盖。
  • 多个 scoped 样式冲突:如果两个组件的 scoped 样式相互冲突,可以通过更改 CSS 的选择器来避免。例如,可以使用更具体的选择器来确保某个组件样式不会被其他组件覆盖。

http://www.niftyadmin.cn/n/5797130.html

相关文章

opencv 项目--图像匹配

本文按照如下设计 ImageStitching_ExcessThree.py from Stitcher import Stitcher import cv2 import my_utils # 只拼接两张图片# 读取需要拼接的图片 # imageA_original cv2.imread("left_01.png") # imageB_original cv2.imread("right_01.png") ima…

深入浅出:多功能 Copilot 智能助手如何借助 LLM 实现精准意图识别

阅读原文 1. Copilot中的意图识别 如果要搭建一个 Copilot 智能助手&#xff0c;比如支持 知识问答、数据分析、智能托管、AIGC 等众多场景或能力&#xff0c;那么最核心的就是基于LLM进行意图识别分发能力&#xff0c;意图识别的准确率直接决定了 Copilot 智能助手的能力上限…

速通Python 第三节

一、顺序语句 默认情况下 , Python 的代码执行顺序是按照从上到下的顺序 , 依次执行 print("1") print("2") print("3") 执行结果一定为 "123", 而不会出现 "321" 或者 "132" 等 . 这种按照顺序执行的代码…

情报信息收集能力

红队专题-Web渗透之资产思路框架知识整理 钓鱼社工 钓鱼自动化zip域名ARP欺骗快捷方式ToolsburpsuiteApp 抓包ffuf模糊测试QingScanWiresharkCloudCFEn-Decodeffffffff0xInfodirbdirmapdirsearchdnsenum使用测试常规使用使用字典文件进行dns查询子域名暴力查询部分C类IP地址IP块…

Docker核心技术和实现原理

目录 1. Docker镜像原理介绍1.1 操作系统基础1.2 Union FS(联合文件系统)1.3 再看 Docker 镜像是什么 2. 镜像的实现原理2.1 Docker 分层存储实现原理2.2 docker 镜像加载原理 3. 镜像分层存储实战3.1 基础知识3.2 实战过程 4. overlay 文件系统工作实战5. Docker卷原理介绍5.1…

图解HTTP-HTTP协议

HTTP HTTP是一种不保存状态&#xff0c;即无状态的协议。HTTP协议自身不对请求和响应之间的通信进行保存。为了保存状态因此后面也有一些技术产生比如Cookies技术。 HTTP是通过URI定位网上的资源&#xff0c;理论上将URI可以访问互联网上的任意资源。 如果不是访问特定的资源…

前端开发问题记录

1. vue3生产包部署在第三方平台的iframe&#xff0c;页面空白&#xff0c;部分资源无法加载 因为vue3采取的是按需加载的一个策略&#xff0c;因为有些第三方平台不支持这种模式&#xff0c;特别第三方是通过iframe去加载vue3的生产包&#xff0c;很容易出现页面空白&#xff…

生产制造管理系统:现代制造业的智能引擎

在当今快速变化的商业环境中&#xff0c;企业要想保持竞争力&#xff0c;就必须不断优化生产流程&#xff0c;提高生产效率&#xff0c;降低成本&#xff0c;并确保产品质量。这正是生产制造管理系统&#xff08;Manufacturing Execution System&#xff0c;简称MES&#xff09…