CSS IN JS(十七)

670 阅读2分钟

1.css in js 介绍

CSS-IN-JS 是 WEB 项目中将 CSS 代码捆绑在 JS 代码中的解决方案,这种方案旨在解决 CSS 的局限性,例如缺乏动态功能,作用域和可移植性

CSS-IN-JS 方案的优点:

  1. 让CSS代码拥有独立的作用域,阻止CSS代码泄露到组件外部,防止样式冲突
  2. 让组件更具可移植性,实现开箱即用,轻松创建松耦合的应用程序
  3. 让组件更具可重用性,只需编写一次即可,可以在任何地方运行,不仅可以在同一应用程序中重用组件,而且可以在使用相同框架构建的其他应用程序中重用组件
  4. 让样式具有动态功能,可以将复杂的逻辑应用于样式规则,如果要创建需要动态功能的复杂UI,它是理想的解决方案

缺点:

  1. 为项目增加了额外的复杂性
  2. 自动生成的选择器大大降低了代码的可读性

2.Emotion 库

2.1 介绍

Emotion 是一个旨在使用 JS 编写 CSS 样式的库

npm install @emotion/core @emotion/styled

2.2 css 属性支持

  1. JSX Pragma

通知 babel , 不再需要将 jsx 语法转换为 React.createElement 方法, 而是需要转换为 jsx 方法:

/** @jsx jsx */
import { jsx } from '@emotion/core'
  1. Babel Preset(更推荐)
npm run eject
npm install @emotion/babel-preset-css-prop

在 package.json 文件中找到 babel 属性,加入如下内容:

"presets": [
  "react-app",
  "@emotion/babel-preset-css-prop"
]

使用:

function App() {
  return <div css={{width: 200, height: 200, background: "pink"}}>App works</div>;
}

2.3 css方法

1.String Styles

image-20220213200040302

2.Object Styles

image-20220213200119613

2.4 css属性的优先级

props 对象中的 css 属性优先级⾼于组件内部的 css 属性

在调⽤组件时可以在覆盖组件默认样式

image-20220213205056532

2.5 Styled Components 样式化组件

样式化组件就是⽤来构建⽤户界⾯的,是 emotion 库提供的另⼀种为元素添加样式的⽅式

1.创建样式化组件

String Styles:

image-20220213220605959

Object Styles:

image-20220213220640078

示例:

image-20220213221157951

2.根据props属性覆盖样式

String Styles:

image-20220213221343493

Object Styles:

image-20220213221407613

第一个默认样式,第二个传递的样式

image-20220213221954172

示例:

image-20220213221912445

3.为任何组件添加样式

String Styles:

image-20220213222211332

Object Styles:

image-20220213222234163

示例:

image-20220213222805856

4.通过⽗组件设置子组件样式

String Styles:

image-20220213222926438

Object Styles:

image-20220213222946115

示例:

image-20220213223404950 image-20220213223718310

5.嵌套选择器 &

& 表示组件本身:

image-20220213223908807

示例:

image-20220213224217837

6.as属性

要使⽤组件中的样式, 但要更改呈现的元素, 可以使⽤ as 属性:

image-20220213224312440

示例:

image-20220213224555854

2.6 样式组合

image-20220213224715322

在样式组合中,后调⽤的样式优先级⾼于先调⽤的样式

2.7 全局样式

image-20220213225017188

2.8 关键帧动画

image-20220213225315305

2.9 主题

1.下载主题模块

npm install emotion-theming

2.引⼊ ThemeProvider 组件

image-20220213225540184

3.将 ThemeProvider 放置在视图在最外层

image-20220213225605892

4.添加主题内容

image-20220213225632770

5.获取主题内容

image-20220213225724313 image-20220213225754922