CSS-IN-JS

news2024/11/25 8:14:21

CSS-IN-JS

为什么会有CSS-IN-JS

CSS-IN-JS是web项目中将CSS代码捆绑在JavaScript代码中的解决方案。

这种方案旨在解决CSS的局限性,例如缺乏动态功能,作用域和可移植性。

CSS-IN-JS介绍
1:CSS-IN-JS方案的优点:
  • 让css代码拥有独立的作用域,阻止CSS代码泄露到组件外部,防止样式冲突
  • 让组件更具可移植性,实现开箱即用,轻松创建松耦合的应用程序
  • 让组件更具可重用性,只需编写一次即可,可以在任何地方运行。不仅可以在同一应用程序中重用组件,而且可以在使用相同框架构建的其他应用程序中重用组件。
  • 让样式具有动态功能,可以将复杂的逻辑应用于样式规则,如果要创建需要动态功能的复杂UI,它是理想的解决方案。
2:CSS-IN-JS方案的缺点:
  • 为项目增加了额外的复杂性。
  • 自动生成的选择器大大降低了代码的可读性
Emotion库

CSS-IN-JS是一种css的解决方案,而Emotion库则是具体的工具库。

1:Emotion库介绍:

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

npm install @emotion/core @emotion/styled

2:css属性支持
jsx Pragma

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

在组件使用导入jsx

import { jsx } from '@emotion/core'
Babel Preset

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

"@emotion/babel-preset-css-prop"

效果如下:

在这里插入图片描述

3:css方法
string styles
const style = css`
width:100px;
height:100px;
background:'green'
`

在这里插入图片描述

object styles
const style =css({
width:200,
height:200,
background:'yellow'
})

在这里插入图片描述

4:css属性优先级

props对象中的css属性优先级高于组件内部的css属性,在调用组件时可以在=覆盖组件默认样式。

5:styled Components样式化组件

样式化组件就是用来构建用户界面的,是emotion库提供的另一种 为元素添加样式的方式

创建样式化组件
import styled from '@emotion/styled'
// 字符串形式
const Button = styled.button`
color:red
`;
// 对象形式
const Button = styled.buttom({
   color:red
})

在这里插入图片描述

根据props属性覆盖样式
// 字符串形式
const Button = sytled.button`
width:${props => props.width||100px}
`

在这里插入图片描述

// 对象形式
const Button = sytled.button(props =>{
width:props.width||100
})
// 或者如下
const Button = sytled.button({
    // 这里是默认
    width:10
},props =>({
    // 这里是props传进来的,这样就不用写判断了
width:100
}))

在这里插入图片描述

为任何组件添加样式
const Demo = ({className}) => <div className={className}>Demo</div>
const Fancy = styled(Demo)`
color:red;
`
// 或
const Fancy = styled(Demo)({
    color:red
})

在这里插入图片描述

通过父组件设置子组件的样式

子组件单独调用color为red,父组件调用时Child的color为green

// 字符串形式
const Child = styled.div`
color:red
`
const parent = sytled.div`
${Child}:{
color:'green'
}
`

// 对象形式
const Child = styled.div({
    color:'red'
})
const parent = sytled.div({
    [Child] {
        color:'green'
    }
})

在这里插入图片描述

嵌套选择器 &

通过&进行关联,& 表示组件本身

const Container = styled.div`
color:red;
& > a {
color:pink;
}
`

在这里插入图片描述

as 属性

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

const Button = styled.button`
	color:red;
`
<Button as='a' href='#'>button</Button>

在这里插入图片描述

6:样式组合

在样式组合中,后调用的样式优先级高于先调用的样式

const base = css`
	color:yellow;
`
const danger = css`
	color:red;
`
<button css={[base,danger]}>button</button>

在这里插入图片描述

7:全局样式
import { css,Global } from '@emotion/core'
const globalStyles = css`
	body {
		margin:0;
		background:red;
	}
`
function App(){
    return <>
        <Global styles ={globalStyles} />
            app
        </>
}

在这里插入图片描述

8:动画

使用emotion提供的 keyframs

import { css, keyframes} from '@emotion/react'
import React from 'react'

const move = keyframes`
  0%{
    background:red;
    left:0;
    top:0;
  }
  100% {
    background:tomato;
    left:600px;
    top:300px;
  }
`
const boxCss = css`
  width:100px;
  height:100px;
  position:absolute;
  animation: ${move} 2s ease infinite alternate;
`

function App(){
  return <div
    // @ts-ignore
    css = {boxCss}
  >app</div>
}

在这里插入图片描述

9:主题

下载主题模块

npm install emotion-theming
import { ThemeProvider } from 'emotion-theming'
// 存储主题样式
const theme = {
	colors:{
		primary:'hotpink'
	}
}
<ThemeProvider theme={theme}></ThemeProvider>
// 获取主题内容
const getPrimaryColor = props => css`
	color:${props.colors.primary}
`
<div css={getPrimaryColor}></div>

// 第二种方式
import { useTheme } from 'emotion-theming'
function Demo(){
     const theme = useTheme();
}
}

}


```typescript
// 获取主题内容
const getPrimaryColor = props => css`
	color:${props.colors.primary}
`
<div css={getPrimaryColor}></div>

// 第二种方式
import { useTheme } from 'emotion-theming'
function Demo(){
     const theme = useTheme();
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1433807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索数据可视化:Matplotlib在Python中的高效应用

探索数据可视化&#xff1a;Matplotlib在Python中的高效应用 引言Matplotlib基础安装和配置Matplotlib基础概念绘制简单图表线形图散点图柱状图 图表定制和美化修改颜色、线型和标记添加标题、图例和标签使用样式表和自定义样式 高级图表类型绘制高级图表多图布局和复杂布局交互…

ES6中新增Array.of()函数的用法详解

new Array()方法 ES6为Array增加了of函数用一种明确的含义将一个或多个值转换成数组。因为用new Array()构造数组的时候&#xff0c;是有二意性的。 构造时&#xff0c;传一个参数&#xff0c;实际上是指定数组的长度&#xff0c;表示生成多大的数组。 构造时&#xff0c;传…

SpringbootV2.6整合Knife4j 3.0.3 问题记录

参考 https://juejin.cn/post/7249173717749940284 近期由于升级到springboot2.6X&#xff0c;所以服务端很多组件都需要重新导入以及解决依赖问题。 下面就是一个很经典的问题了&#xff0c; springboot2.6与knife4j的整合。 版本对应 springboot2.6与knife4j 3.0.3 坑 …

CSRF:跨站请求伪造攻击

目录 什么是CSRF&#xff1f; DVWA中的CSRF low medium hight impossible 防御CSRF 1、验证码 2、referer校验 3、cookie的Samesite属性 4、Anti-CSRF-Token 什么是CSRF&#xff1f; CSRF全称为跨站请求伪造&#xff08;Cross-site request forgery&#xff09;&…

【学网攻】 第(20)节 -- 网络端口地址转换NAPT配置

系列文章目录 目录 系列文章目录 文章目录 前言 一、NAPT是什么&#xff1f; 二、实验 1.引入 实验目的 技术原理 实验步骤 实验设备 实验拓扑图 实验配置 实验验证 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第…

AIGC实战——归一化流模型(Normalizing Flow Model)

AIGC实战——归一化流模型 0. 前言1. 归一化流模型1.1 归一化流模型基本原理1.2 变量变换1.3 雅可比行列式1.4 变量变换方程 2. RealNVP2.1 Two Moons 数据集2.2 耦合层2.3 通过耦合层传递数据2.4 堆叠耦合层2.5 训练 RealNVP 模型 3. RealNVP 模型分析4. 其他归一化流模型4.1 …

计算机网络——新型网络架构:SDN/NFV

1. 传统节点与SDN节点 1.1 传统节点(Traditional Node) 这幅图展示了传统网络节点的结构。在这种设置中&#xff0c;控制层和数据层是集成在同一个设备内。 以太网交换机&#xff1a;在传统网络中&#xff0c;交换机包括控制层和数据层&#xff0c;它不仅负责数据包的传输&…

FANUC机器人如何清除示教器右上角的白色感叹号?

FANUC机器人如何清除示教器右上角的白色感叹号&#xff1f; 如下图所示&#xff0c;示教器上显示白色的感叹号&#xff0c;如何清除呢&#xff1f; 具体可参考以下步骤&#xff1a; 按下示教器上白色的“i”键&#xff0c;如下图所示&#xff0c; 如下图所示&#xff0c;按…

飞天使-linux操作的一些技巧与知识点6-node,npm与jenkins执行用户

文章目录 安装node,npmjenkins执行时候出现找不到npm 命令 安装node,npm 以下是在 CentOS 7.9 上使用 nvm 安装 Node.js 的步骤&#xff1a;安装 nvm&#xff1a;bashCopy Codecurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash在终端中重新加…

Java 运用 StringJoiner 高效的拼接字符串

运用 StringJoiner 高效的拼接字符串 package com.zhong.stringdemo;import java.util.ArrayList; import java.util.StringJoiner;public class Test {public static void main(String[] args) {ArrayList<String> s new ArrayList<>();s.add("11");s.…

备战蓝桥杯---搜索(剪枝)

何为剪枝&#xff0c;就是减少搜索树的大小。 它有什么作用呢&#xff1f; 1.改变搜索顺序。 2.最优化剪枝。 3.可行性剪枝。 首先&#xff0c;单纯的广搜是无法实现的&#xff0c;因为它存在来回跳的情况来拖时间。 于是我们可以用DFS&#xff0c;那我们如何剪枝呢&#…

Vulnhub靶机:hacksudoAliens

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;hacksudoAliens&#xff08;10.0.2.46&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com…

PyTorch使用

前言 系统环境&#xff1a;win10 使用Anaconda&#xff0c;Anaconda的安装自行百度。 conda 23.7.4 目录 前言 创建虚拟环境 1、查看当前有哪些虚拟环境 2、创建虚拟环境pytorch 3、激活及关闭pytorch虚拟环境 4、删除pytorch虚拟环境 使用yolov5测试 1、切换至yolo…

UWA Pipeline 2.6.0 版本更新

UWA Pipeline是一款面向游戏开发团队的本地协作平台&#xff0c;旨在为游戏开发团队搭建专属的DevOps研发交付流水线&#xff0c;提供可视化的CICD操作界面、高可用的自动化测试以及UWA性能保障服务的无缝贴合等实用功能。 本周&#xff0c;我们迎来了全新的UWA Pipeline 2.6.…

MES系统是什么?MES软件有什么用?

在制造业领域&#xff0c;伴随着科技的不断进步和产业升级&#xff0c;企业越来越重视数字化和信息化在生产管理中的应用。引入先进的管理系统成为企业提高生产效率、降低成本、增强产品质量的关键途径。在工业4.0的大背景下&#xff0c;MES制造执行系统作为一种位于ERP企业资源…

docker手动迁移镜像

1&#xff0c;将镜像保存在本地 docker save 镜像名称:版本号 > 镜像名称.tar 2&#xff0c;下载镜像 通过 ftp 工具或者命令&#xff0c;下载到本地 3&#xff0c;上传镜像到目标 docker 所在服务器 4&#xff0c;导入镜像 docker load < 镜像名称.tar

【ACL 2023】Enhancing Document-level EAE with Contextual Clues and Role Relevance

【ACL 2023】Enhancing Document-level Event Argument Extraction with Contextual Clues and Role Relevance 论文&#xff1a;https://aclanthology.org/2023.findings-acl.817/ 代码&#xff1a;https://github.com/LWL-cpu/SCPRG-master Abstract 与句子级推理相比&…

程序员转行餐饮店之路:从开始到失败

之前一直有做副业的想法&#xff0c;比如最开始的水果摊&#xff0c;地铁口的烟花摆摊&#xff0c;都是从开始到失败。执着于摆摊的原因有两个&#xff1a;一是工资款如同上证指数一样&#xff0c;越来越低&#xff1b;二是为了先熟悉一下“创业”的过程。 契机终于来了&#x…

互联网加竞赛 基于深度学习的水果识别 设计 开题 技术

1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天做一个 基于深度学习的水果识别demo 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/pos…

第三篇:SQL数据模型、通用语法和语法分类

一&#xff0c;SQL数据模型 &#xff08;一&#xff09;关系型数据库&#xff08;RDBMS&#xff09; 1.概念 &#xff08;百度百科&#xff09;指采用了关系模型来组织数据的数据库&#xff0c;其以行和列的形式存储数据&#xff0c;以便于用户理解&#xff0c;关系型数据库这…