什么是 CSS-in-JS?

news/2024/11/24 22:44:44/

CSS-in-JS 是一种将 CSS 样式与 JavaScript 代码结合的方法,它允许开发人员在 JavaScript 组件中编写和管理 CSS 样式。这种方法在许多现代前端框架和库(如 React、Vue 和 Angular)中变得越来越流行,因为它提供了一种组件化的方式来处理样式。

CSS-in-JS 的主要优点包括:

1、组件化:将样式与组件绑定在一起,使得组件更易于维护和重用。

2、动态样式:可以根据组件的状态和属性轻松地更改样式。

3、作用域样式:避免全局样式冲突,因为每个组件的样式都是局部的。

4、代码共享:可以在 JavaScript 和 CSS 之间共享变量和逻辑。

有许多流行的 CSS-in-JS 库,如 styled-components、emotion 和 JSS。这些库提供了创建和管理组件样式的工具和方法。虽然 CSS-in-JS 有很多优点,但它也有一些缺点,如性能问题(尤其是在服务器端渲染应用程序中)和学习曲线。因此,在选择是否使用 CSS-in-JS 时,需要权衡其优缺点。

Styled-components 应该是 CSS-in-JS 最热门的一个库了,到目前为止 github 的 star 数已经超过了27k。通过 styled-components,你可以使用 ES6 的标签模板字符串语法为需要 styled 的 Component 定义一系列 CSS 属性,当该组件的 JS 代码被解析执行的时候,styled-components 会动态生成一个 CSS 选择器,并把对应的 CSS 样式通过 style 标签的形式插入到 head 标签里面。动态生成的 CSS 选择器会有一小段哈希值来保证全局唯一性来避免样式发生冲突。

CSS-in-JS Playground 是一个可以快速尝试不同 CSS-in-JS 实现的网站,上面有一个简单的用 styled-components 实现表单的例子:

import React from 'react';
import styled from 'styled-components';import Form from './form';
import Header from './header';const Container = styled.main`display: flex;flex-direction: column;min-height: 100%;width: 100%;background-color: #f6f9fc;
`;const Stripe = styled.div`height: 10vh;overflow: hidden;transform: skewY(-8deg);transform-origin: 0;background: linear-gradient(-150deg, rgba(255, 255, 255, 0) 40%, #ddecf7 70%);
`;export default function Login() {return (<Container><Header /><Stripe /><Form fields={['email', 'phoneNumber']} /></Container>);
}

从上面的例子可以看出,styled-components 不需要你为需要设置样式的 DOM 节点设置一个样式名,使用完标签模板字符串定义后你会得到一个 styled 好的 Component,直接在 JSX 中使用这个 Component 就可以了。接着让我们打开 DevTools 查看一下生成的 CSS:

从上面 DevTools 可以看出 styled 的 Component 样式存在于 style 标签内,而且选择器名字是一串随机的哈希字符串,这样其实实现了局部 CSS 作用域的效果(scoping styles),各个组件的样式不会发生冲突。除了styled-components,采用唯一 CSS 选择器做法的实现还有:jss,emotion,glamorous 等。

https://www.cssinjsplayground.com/?activeModule=index


http://www.ppmy.cn/news/97487.html

相关文章

Apache Beam构建批处理任务

在之前的博客中我介绍了如何用Beam来构建一个实时处理Kafka消息的流处理任务&#xff0c;Apache Beam构建流处理任务_gzroy的博客-CSDN博客&#xff0c;这次我将介绍一下如何构建批处理的任务。对于不同的业务场景来说&#xff0c;我们需要选择一个合适的方案&#xff0c;并不是…

ubuntu22.04安装Docker 基于 Docker搭建测试用例平台 TestLink

两种方式&#xff0c;一般选择官方 一、官方 更新包管理器&#xff1a;sudo apt update安装 Docker 的依赖包&#xff1a;sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release添加 Docker GPG 密钥&#xff1a;curl -fsSL https://download.docker…

Python潮流周刊#3:PyPI 的安全问题

△点击上方“Python猫”关注 &#xff0c;回复“1”领取电子书 你好&#xff0c;我是猫哥。这里记录每周值得分享的 Python 及通用技术内容&#xff0c;部分为英文&#xff0c;已在小标题注明。&#xff08;标题取自其中一则分享&#xff0c;不代表全部内容都是该主题&#xff…

为什么很多企业把35岁视为分水岭

(点击即可收听) 为什么很多企业把35岁视为分水岭 有时候,别人的故事,若干年后,就是自己的故事,只要身在互联网这个行业里,可以说,每个人都避免不了35岁危机 不要五十步笑百步 前阵子,朋友圈一位行业知名大佬,35岁,每天兢兢业业,任劳任怨,本以为安稳渡过3个月试用期,正快要转正时…

全面SOA化的电子电气架构是什么样?

交流群 | 进“传感器群/滑板底盘群/汽车基础软件群/域控制器群”请扫描文末二维码&#xff0c;添加九章小助手&#xff0c;务必备注交流群名称 真实姓名 公司 职位&#xff08;不备注无法通过好友验证&#xff09; 作者 | 张萌宇 在汽车产业向智能化转型的过程中&#xff0c…

Pyside6-第一篇-创建第一个窗口

Hi&#xff0c;今天起开始更新Pyside6教程了&#xff0c;从0-1开始更新&#xff0c;过程比较的久&#xff0c;一点点来。 今天&#xff0c;我们先来搭建环境。 我的环境&#xff1a; ❝ pycharm 2021.3.3(版本随意&#xff0c;只要不是很低就行)Python版本3.95Pyside版本6.50 ❞…

AutoEncoder GAN

AE Auto-Encoder (AE) 是20世纪80年代晚期提出的&#xff0c;它是一种无监督学习算法&#xff0c;使用了反向传播算法&#xff0c;让目标值等于输入值。 是神经网络的一种&#xff0c;经过训练后能尝试将输入复制到输出。三层网络结构&#xff1a;输入- 隐层- 输出自编码网络…

对于 CRC 校验的 学习笔记

参考资料 CRC校验原理及实现 - 知乎 (zhihu.com) <-- 这个讲的特别好&#xff0c;我的博客主要是抄他的&#xff0c;最后加了一点代码库的分析。 [CRC校验]手算与直观演示_哔哩哔哩_bilibili <-- 这个视频非常直观 【FPGA】CRC校验算法从数学原理到代码实现 CRC 参数…