深入探索VueJS Scoped CSS 实现原理

yizhihongxing

下面是深入探索VueJS Scoped CSS实现原理的攻略:

前言

在Vue.js中,我们通过<style>标签来声明组件的样式,但是为了避免样式的污染(即样式影响到了其他组件),Vue.js提供了Scoped CSS(作用域CSS)的支持。

Scoped CSS是指将组件的样式限制在组件内部,不影响其他组件的样式,并且保证组件内部的样式可以覆盖全局样式。

实现原理

Vue.js的Scoped CSS主要通过给组件标签内部的元素/属性添加独特的标识,从而实现样式作用域的限制。

具体来说,Vue.js将每个组件编译成一个渲染函数,并且给渲染函数内部的元素 / 属性添加如下两个属性:

  • data-v-[hash]:唯一标识符,也称为命名空间标识符。[hash]是一个随机字符串,用来保证每个组件的标识符都是唯一的。
  • data-v-[hash]:[style-id]:样式标识符,也称为类名。[style-id]是一个自增的数字,用来标识组件内不同的样式。

这样,我们就可以使用CSS选择器来指定组件内的特定元素/属性,并保证样式只作用于该组件内部。

示例说明

示例1:单文件组件中的Scoped CSS

假设我们有一个单文件组件MyComponent.vue

<template>
  <div class="wrapper">
    <h1>{{ msg }}</h1>
    <p class="content">{{ content }}</p>
  </div>
</template>

<script>
export default {
  name: 'MyComponent',
  data () {
    return {
      msg: 'Hello, World!',
      content: 'This is my content'
    }
  }
}
</script>

<style scoped>
.wrapper {
  border: 1px solid red;
}

h1 {
  font-size: 24px;
}

.content {
  font-size: 18px;
  color: blue;
}
</style>

在编译后,上述代码会被转换成以下代码:

<template>
  <div data-v-23e2c4d7 class="wrapper">
    <h1 data-v-23e2c4d7:data-v-1ec20eed> {{ msg }} </h1>
    <p data-v-23e2c4d7:data-v-2bb80a89 class="content"> {{ content }} </p>
  </div>
</template>

<script>
...
</script>

<style>
[data-v-23e2c4d7] .wrapper {
  border: 1px solid red;
}

[data-v-23e2c4d7] h1[data-v-1ec20eed] {
  font-size: 24px;
}

[data-v-23e2c4d7] .content[data-v-2bb80a89] {
  font-size: 18px;
  color: blue;
}
</style>

可以看到,每个元素/属性都被加上了data-v-[hash]data-v-[hash]:[style-id]两个属性。同时,我们在样式表中使用了选择器[data-v-[hash]][data-v-[hash]] [data-v-[hash]:[style-id]]来限制样式只作用于组件内部。

示例2:在组合组件中使用Scoped CSS

假设我们有两个组件Parent.vueChild.vue,其中Parent.vue包含一个Child.vue组件,并且为Child.vue添加了Scoped CSS。

Parent.vue

<template>
  <div class="wrapper">
    <Child />
  </div>
</template>

<script>
import Child from './Child'

export default {
  name: 'Parent',
  components: {
    Child
  }
}
</script>

<style scoped>
.wrapper {
  border: 1px solid red;
}
</style>

Child.vue

<template>
  <div class="content">
    <p>{{ msg }}</p>
  </div>
</template>

<script>
export default {
  name: 'Child',
  data () {
    return {
      msg: 'I am child'
    }
  }
}
</script>

<style scoped>
.content {
  font-size: 18px;
  color: blue;
}
</style>

在编译后,我们可以看到编译结果如下:

Parent.vue

<template>
  <div data-v-4b869cfc class="wrapper">
    <Child data-v-4b869cfc></Child>
  </div>
</template>

<script>
import Child from './Child'

export default {
  name: 'Parent',
  components: {
    Child
  }
}
</script>

<style>
[data-v-4b869cfc] .wrapper {
  border: 1px solid red;
}
</style>

Child.vue

<template>
  <div data-v-7c24a973 class="content">
    <p data-v-7c24a973>{{ msg }}</p>
  </div>
</template>

<script>
export default {
  name: 'Child',
  data () {
    return {
      msg: 'I am child'
    }
  }
}
</script>

<style>
[data-v-7c24a973] .content {
  font-size: 18px;
  color: blue;
}
</style>

可以看到,Parent.vueChild.vue组件都拥有各自的唯一标识符data-v-[hash],并且它们之间是相互独立的。因此,当我们在Child.vue中使用.content样式时,只会作用于Child.vue组件,不会影响Parent.vue组件。

结语

通过上述攻略,相信你已经了解了Vue.js Scoped CSS的实现原理。如果你想深入了解Vue.js Scoped CSS相关知识,可以参考官方文档中的Scoped CSS一章。同时,也可以多尝试一些编写Scoped CSS的示例,以加深自己的理解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入探索VueJS Scoped CSS 实现原理 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • canvas实现图片根据滑块放大缩小效果

    来详细讲解如何使用canvas实现图片根据滑块放大缩小效果。步骤如下: 步骤一:创建canvas元素 首先,我们需要在网页中创建一个canvas元素。可以使用以下代码: <canvas id="canvas"></canvas> 步骤二:获取Canvas 2D上下文 我们需要获取到Canvas 2D上下文,以便在c…

    css 2023年6月10日
    00
  • jQuery基本选择器选择元素使用介绍

    jQuery基本选择器选择元素使用介绍 什么是jQuery选择器 jQuery选择器是一种用于查找HTML元素及操作其内容的标准功能。通过jQuery选择器,我们可以通过某种方式来选取HTML中的元素,从而进行操作。 常用的基本选择器 jQuery提供了多种基本选择器,以下是一些常用的: 元素选择器:通过元素名称来选取元素,例如$(“p”)表示选取所有&lt…

    css 2023年6月10日
    00
  • vue如何使用媒体查询实现响应式

    Vue可以使用媒体查询实现响应式网页。下面就为大家分享如何使用媒体查询实现响应式的完整攻略。 Step 1. 为响应式设置viewport 在\<head>标签中设置视口为移动设备宽度,这样浏览器会以手机的分辨率来呈现网站。 <meta name="viewport" content="width=device…

    css 2023年6月9日
    00
  • CSS命名规范参考及书写注意事项

    CSS命名规范参考及书写注意事项 CSS命名规范是Web开发中非常重要的一部分,良好的命名规范可以提高代码的可读性和可维护性。本攻略将详细讲解CSS命名规范的参考及书写注意事项,包括命名规范的原则、命名规范的分类、命名规范的书写注意事项等,并提供两个示例说明。 1. 命名规范的原则 CSS命名规范的原则是简洁、明确、有意义。具体来说,应该遵循以下几个原则: …

    css 2023年5月18日
    00
  • CSS小技巧 导航中鼠标经过变换文字的实现代码

    下面将详细讲解“CSS小技巧 导航中鼠标经过变换文字的实现代码”的完整攻略: 一、实现思路 该效果的实现思路是利用 CSS 选择器选择到鼠标经过时需要修改的文本元素,设置 :hover 伪类,然后修改文本相关的 CSS 属性。 二、代码实现 具体实现代码如下: <nav> <ul> <li><a href=&quot…

    css 2023年6月10日
    00
  • CSS选择器的权重与优先规则分享

    下面是关于CSS选择器权重与优先级的完整攻略: CSS选择器权重 当多个CSS规则同时作用于同一个元素时,浏览器需要决定应该按照哪个规则来应用样式。为了实现这个目的,CSS定义了选择器的权重,每个规则都按照特定的规则计算出一个特定的权重值。常见的选择器权重如下所示: !important = Infinity 行内样式(style) = 1000 ID选择器…

    css 2023年6月10日
    00
  • CSS网页布局:div水平居中的各种方法

    下面我为你详细讲解“CSS网页布局:div水平居中的各种方法”的完整攻略。 方法一:使用text-align属性 text-align属性可以用于水平对齐元素的内容,其取值包括left、center和right。如果将该属性用于div元素,那么该元素的所有内容都会水平居中。 示例代码: <!DOCTYPE html> <html> &…

    css 2023年6月10日
    00
  • 浅析与CSS3的loading动画加载相关的transition优化

    下面是关于“浅析与CSS3的loading动画加载相关的transition优化”的完整攻略。 什么是CSS3的loading动画加载? CSS3的loading动画加载,顾名思义,是指使用CSS3来实现的页面加载动画。通过对一系列元素的设计,从而达到页面加载时显示动画的效果。这种动画效果可以提高用户等待加载的体验感,从而增加用户对网站的好感度。 trans…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部