第五节——Vue 中如何编写样式

一、内联样式

<template>
  <div style="color:'red'">
    红色
  </div>
</template>

二、在style标签中编写

1、创建learn-style.css文件

.red { color: red; }

3、在文件中引入

<template>
  <div class="red">
    红色
  </div>
</template>
<script>
import './learn-style.css';
</script>

三、样式污染问题

1、产生原因

Vue最终编译打包后都在一个html页面中,如果在两个组件中取一样类名分别引用在自身,那么后者会覆盖前者。默认情况下,只要导入了组件,不管组件有没有显示在页面中,组件的样式就会生效。也就是说并没有自己的局部作用域

2、解决思路

1、手动处理 (起不同的类名,但是项目一大就会导致类名很乱,不利于团队协作)

2、CSS IN JS : 以js的方式来处理css(推荐)

3、CSS IN JS

CSS IN JS是使用 JavaScript 编写 CSS 的统称,用来解决 CSS 样式冲突、覆盖等问题。

CSS IN JS 的具体实现有 50 多种,比如:React常用(CSS Modules、styled-components)、 Vue常用(<style scoped> 、css modules)等。

推荐使用:<style scoped> (脚手架自动集成,并且非常简单😄)

四、Scoped CSS

1、基本及使用

在style标签上使用scoped,当 <style> 标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素。

<template>
  <div class="ex">hi</div>
</template>
<style scoped>
.ex {
  color: red;
}
</style>

2、原理解析

  • 每个 Vue 文件都将对应一个唯一的 id,该 id 根据文件路径名和内容 hash 生成,通过组合形成scopeId。
  • 编译 template 标签时,会为每个标签添加了当前组件的scopeId

<div class="demo">test</div>
// 会被编译成:
<div class="demo" data-v-12e4e11e>test</div>
  • 编译 style 标签时,会根据当前组件的 scopeId 通过属性选择器和组合选择器输出样式,如:
.demo{color: red;}
// 会被编译成:
.demo[data-v-12e4e11e]{color: red;}
  • 这样就相当为我们配置的样式加上了一个唯一表示

3、对原理更加深入了解(有能力的同学选择背诵)

vue-loader 通过生成哈希 ID,根据 type 的不同调用不同的 loader 将,哈希 ID分别注入到 DOM 和属性选择器中。实现 CSS 局部作用域的效果。CSS Scoped 可以算作为 Vue 定制的一个处理原生 CSS 作用域的解决方案

4、混用本地和全局样式

可以直接创建一个全局的css文件,在入口文件处引入,或者在单个组件内使用不加scoped的style

<style>
/* 全局样式 */
</style>

<style scoped>
/* 本地样式 */
</style>

5、样式穿透(暂时跳过结合项目讲)

如果你的引入了第三方库,如果你想修改第三方库的样式,直接通过dom查找,修改样式是没有效果的。那么可以使用以下属性>>>,/deep/

<style lang="scss" scoped>
.box-card {
  /deep/.el-card__body {
    padding: 10px;
  }
}
</style>
<style lang="scss" scoped>
.box-card {
  >>> .el-card__body {
    padding: 10px;
  }
}
</style>

6、注意

1、通过 v-html 创建的 DOM 内容不受 scoped 样式影响,但是你仍然可以通过深度作用选择器来为他们设置样式

2、Scoped 样式不能代替 class。考虑到浏览器渲染各种 CSS 选择器的方式,当 p { color: red } 是 scoped 时 (即与特性选择器组合使用时) 会慢很多倍。如果你使用 class 或者 id 取而代之,比如 .example { color: red },性能影响就会消除

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值