CSS-in-JS 动态主题切换与首屏渲染优化

动态主题切换的实现方式

1. 使用 CSS 变量(CSS Custom Properties)

CSS 变量是实现主题切换最直接的方式:

:root {--primary-color: #4285f4;--background-color: #ffffff;--text-color: #333333;
}[data-theme="dark"] {--primary-color: #8ab4f8;--background-color: #1a1a1a;--text-color: #f1f1f1;
}body {background-color: var(--background-color);color: var(--text-color);
}

JavaScript 切换主题:

function toggleTheme() {document.documentElement.setAttribute('data-theme', document.documentElement.getAttribute('data-theme') === 'dark' ? 'light' : 'dark');
}

2. CSS-in-JS 实现(以 styled-components 为例)

import styled, { ThemeProvider } from 'styled-components';const lightTheme = {primary: '#4285f4',background: '#ffffff',text: '#333333'
};const darkTheme = {primary: '#8ab4f8',background: '#1a1a1a',text: '#f1f1f1'
};const Button = styled.button`background: ${props => props.theme.primary};color: ${props => props.theme.text};
`;function App() {const [theme, setTheme] = useState(lightTheme);const toggleTheme = () => {setTheme(theme === lightTheme ? darkTheme : lightTheme);};return (<ThemeProvider theme={theme}><Button onClick={toggleTheme}>Toggle Theme</Button></ThemeProvider>);
}

提升首屏渲染效率的策略

1. 关键 CSS 提取

// 使用 styled-components 的 ServerStyleSheet 提取关键 CSS
import { ServerStyleSheet } from 'styled-components';const sheet = new ServerStyleSheet();
const html = renderToString(sheet.collectStyles(<App />));
const styleTags = sheet.getStyleTags(); // 插入到 HTML 的 head 中

2. 代码分割与按需加载

import React, { lazy, Suspense } from 'react';
const HeavyComponent = lazy(() => import('./HeavyComponent'));function App() {return (<Suspense fallback={<div>Loading...</div>}><HeavyComponent /></Suspense>);
}

3. 使用 CSS 变量替代动态样式

CSS 变量的性能优于 JavaScript 动态计算样式:

// 不推荐 - 性能较差
const DynamicDiv = styled.div`color: ${props => props.color};
`;// 推荐 - 使用 CSS 变量
const DynamicDiv = styled.div`color: var(--dynamic-color);
`;
// 使用时
<DynamicDiv style={{ '--dynamic-color': props.color }} />

4. 避免不必要的重新渲染

// 使用 React.memo 避免不必要的重新渲染
const ThemedButton = React.memo(styled.button`background: ${props => props.theme.primary};
`);

CSS 变量如何解决这些问题

1. 主题切换性能优化

CSS 变量在浏览器层面实现样式更新,避免了 JavaScript 的样式计算和 DOM 操作:

// 只需改变根元素的变量值
document.documentElement.style.setProperty('--primary-color', newColor);

2. 首屏渲染优化

CSS 变量:

  • 可以被预解析,浏览器可以更快地构建渲染树

  • 减少 CSS-in-JS 运行时生成的样式表大小

  • 支持服务器端渲染,不会产生样式闪烁

3. 动态样式与静态样式的分离

/* 静态部分编译时确定 */
.button {padding: 8px 16px;border-radius: 4px;/* 动态部分通过变量控制 */background: var(--button-bg, #eee);color: var(--button-color, #333);
}

4. 主题持久化示例

结合 localStorage 实现主题持久化:

// 初始化主题
const savedTheme = localStorage.getItem('theme') || 'light';
document.documentElement.setAttribute('data-theme', savedTheme);// 切换主题并保存
function toggleTheme() {const newTheme = document.documentElement.getAttribute('data-theme') === 'dark' ? 'light' : 'dark';document.documentElement.setAttribute('data-theme', newTheme);localStorage.setItem('theme', newTheme);
}

性能对比

方案首屏渲染主题切换维护性SSR支持
纯 CSS-in-JS较慢需要额外配置
CSS 变量最快一般原生支持
混合方案较快最好需要配置

最佳实践推荐:使用 CSS 变量定义主题色,结合 CSS-in-JS 管理组件样式,既能保证性能又能维护良好的开发体验。

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

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

相关文章

不止 “听懂”,更能 “感知”!移远通信全新AI 音频模组 重新定义智能家居“听觉”逻辑

7月29日&#xff0c;在 2025 世界人工智能大会&#xff08;WAIC&#xff09;期间&#xff0c;移远通信正式发布全新 VA500-GL AI 音频模组。该产品基于本地化 AI 算法&#xff0c;为智能家电赋予精准 “听觉” 与主动交互能力&#xff0c;借助环境状态智能检测、离线语音控制及…

【Python】 切割图集的小脚本

Python 切割图片脚本 前言&#xff1a; 有短时间没写博客了&#xff0c;今天打算再写一篇MonoGame的教程&#xff0c;这篇是我再做我自己的2D 游戏项目的时候我需要一些已经切割好的图片但我得到图片是合在一起图集&#xff0c;这个脚本适合正在做2D游戏开发且不依赖于游戏引…

网络安全是什么?手把手教你认识网络安全

网络安全是什么&#xff1f;手把手教你认识网络安全 提到网络安全&#xff0c;不少人会联想到电影里黑客指尖翻飞攻破系统的炫酷场景。但实际上&#xff0c;它并非遥不可及的技术名词&#xff0c;而是与我们日常生活息息相关的 “数字保镖”。从手机支付密码到社交账号信息&am…

AtCoder Beginner Contest 416(2025.7.26)

文章目录A Vacation ValidationB 1D Akari&#xff08;补&#xff09;C Concat (X-th)&#xff08;补&#xff09;题目考查题意简述解法思路 &#xff1a;AC代码D Match, Mod, Minimize 2&#xff08;补&#xff09;题目分数/评级题目考查时间复杂度题意简述解法思路 &#xff…

基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(五)

目录 五、Hue、Zeppelin 比较 1. Zeppelin 简介 2. Zeppelin 安装配置 &#xff08;1&#xff09;安装环境 &#xff08;2&#xff09;Zeppelin 及其相关组件 &#xff08;3&#xff09;配置 Zeppelin &#xff08;4&#xff09;启动 Zeppelin &#xff08;5&#xff0…

《消息队列学习指南:从 MQ 基础到 SpringAMQP 实践》

初识MQ 同步调用 目前我们采用的是基于OpenFeign的同步调用&#xff0c;也就是说业务执行流程是这样的&#xff1a; 支付服务需要先调用用户服务完成余额扣减 然后支付服务自己要更新支付流水单的状态 然后支付服务调用交易服务&#xff0c;更新业务订单状态为已支付 三个…

深度学习 --- 过拟合与欠拟合

深度学习 — 过拟合与欠拟合 文章目录深度学习 --- 过拟合与欠拟合一.概念1.1 过拟合1.2 欠拟合1.3 判断方式二&#xff0c;解决欠拟合三&#xff0c;解决过拟合3.1 L2正则化3.1.1 定义以及作用3.1.2 代码3.2 L1正则化3.3 L1与L2对比3.4 Dropout示例3.5 数据增强3.5.1 图片缩放…

Python 之抽象方法 @abstractmethod 的理解

如果你熟悉 Java 的话&#xff0c;Java 里有一个抽象接口的概念&#xff0c;Python 里的抽象方法基本上与其类似。在 Python 中&#xff0c;abstractmethod 是一个装饰器&#xff0c;用于定义抽象方法。它是实现抽象基类&#xff08;Abstract Base Class, ABC&#xff09;的核心…

深度学习·pytorch

广播机制 从末尾开始逐个维度遍历两个矩阵的shape&#xff0c;如果维度不相同&#xff0c;则考虑广播&#xff1a;任一方的维度为1或者维度不存在(小矩阵广播为大矩阵)&#xff0c;这样的运算可以广播 可以广播的例子 xtorch.empty(5,3,4,1) ytorch.empty(3,1,1) (x.add_(y)).s…

SpringBoot集成deepseek

pom文件&#xff1a;<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org…

JetBrains Annotations:从入门到落地,彻底告别 NullPointerException

本文基于三篇高质量博客&#xff08;JetBrains Annotations官方文档、Jakarta Validation 规范、《Effective Java》第3版&#xff09;的原文内容&#xff0c;结合作者在一线研发团队落地 JetBrains Annotations 的实战经验&#xff0c;系统梳理了该注解库的核心能力、使用姿势…

基于Rust与HDFS、YARN、Hue、ZooKeeper、MySQL

基于Rust与HDFS、YARN、Hue、ZooKeeper、MySQL集合 以下是基于Rust与HDFS、YARN、Hue、ZooKeeper、MySQL等技术栈结合的实例,涵盖不同场景和应用方向: 数据处理与分析 使用Rust编写MapReduce作业,通过YARN提交到HDFS处理大规模数据集。Rust的高性能特性适合处理密集型计算…

芯片上市公司正在放弃射频业务

转载自--钟林谈芯射频芯片赛道本来不卷的&#xff0c;投资人多了也就卷了。本周&#xff0c;多家媒体报道某芯片上市公司终止射频业务&#xff0c;终止射频业务的何止一家芯片上市公司&#xff0c;从去年开始就逐渐有上市公司终止射频业务&#xff0c;开启清货模式。如人饮水&a…

Jmeter 性能测试监控之ServerAgent

使用 Jmeter 对 Linux 服务器的进行压测时&#xff0c;想要监控服务器的 CPU 、内存&#xff0c;可以通过添加插件 【ServerAgent】来观察,可以实时监控性能指标 一、ServerAgent-2.2.3下载 下载地址&#xff1a; GitCode - 全球开发者的开源社区,开源代码托管平台 二、通过插…

5.苹果ios逆向-过ssl证书检测和安装ssh和获取root权限

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

Navicat 17 教程:Windows 和 Mac 系统适用

一、引言 对于程序员们来说&#xff0c;Navicat是一款极为实用的数据库管理工具。Navicat 17更是带来了诸多新特性&#xff0c;能大大提升我们的工作效率。今天就为大家带来Navicat 17在Windows和Mac系统上的使用教程。 二、准备工作 &#xff08;一&#xff09;下载安装包 「…

Android 中 实现柱状图自定义控件

一、基本思路 创建自定义控件的数据模型; 创建一个自定义 View 类,继承自 View; 在初始化方法中获取自定义属性的值。 创建设置数据方法,将数据模型列表转换成自定义绘制时的数据; 重写 onDraw 方法,以实现自定义的绘制逻辑。 二、主要绘制方法 1、drawLine 绘制直线 p…

Netty 核心原理与实战:从 DiscardServer 看透 Reactor 模式与组件协作

目录 Netty 是什么&#xff1f; Netty 的目标 Netty 实战案例 DiscardServer 服务端程序 NettyDiscardServer 业务处理器 NettyDiscardHandler 配置类 NettyDemoConfig 回顾 Reactor 模式中的 IO 事件处理流程 Netty 中的 Channel Netty 中的 Reactor Netty 中的 Han…

关于“LoggerFactory is not a Logback LoggerContext but Logback is on ......“的解决方案

​ ✨重磅&#xff01;盹猫的个人小站正式上线啦&#xff5e;诚邀各位技术大佬前来探秘&#xff01;✨ 这里有&#xff1a; 硬核技术干货&#xff1a;编程技巧、开发经验、踩坑指南&#xff0c;带你解锁技术新姿势&#xff01;趣味开发日常&#xff1a;代码背后的脑洞故事、工具…

2025年6月电子学会青少年软件编程(C语言)等级考试试卷(三级)

答案和更多内容请查看网站&#xff1a;【试卷中心 -----> 电子学会 ----> C/C ---->三级】 网站链接 青少年软件编程历年真题模拟题实时更新 编程题 第 1 题 打印城门 题目描述 给定一个正整数 n&#xff0c;输出如下的星号城门。具体格式请见样例。 输入格…