第五节——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 },性能影响就会消除

相关推荐
程序员爱技术几秒前
Vue 2 + JavaScript + vue-count-to 集成案例
前端·javascript·vue.js
并不会1 小时前
常见 CSS 选择器用法
前端·css·学习·html·前端开发·css选择器
悦涵仙子1 小时前
CSS中的变量应用——:root,Sass变量,JavaScript中使用Sass变量
javascript·css·sass
衣乌安、1 小时前
【CSS】居中样式
前端·css·css3
兔老大的胡萝卜1 小时前
ppk谈JavaScript,悟透JavaScript,精通CSS高级Web,JavaScript DOM编程艺术,高性能JavaScript pdf
前端·javascript
低代码布道师1 小时前
CSS的三个重点
前端·css
耶啵奶膘3 小时前
uniapp-是否删除
linux·前端·uni-app
王哈哈^_^4 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
cs_dn_Jie5 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic5 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js