CSS【详解】性能优化

精简 CSS

  • 移除未使用的 CSS(“死代码”),可借助工具如 PurgeCSS、UnCSS 自动检测并删除未被页面使用的样式。
  • 避免重复样式,通过提取公共样式(如 @mixin 或公共类)减少代码冗余。利用预处理器(Sass、Less)变量、混合宏功能减少重复代码。
  • 避免过度嵌套(如 div > ul > li > a 可简化为 .nav-link),复杂选择器会增加浏览器匹配元素的计算成本。
  • 避免全局样式滥用,使用 CSS Modules 或 Scoped CSS(如 Vue)隔离样式,减少 CSSOM 构建时间。

压缩 CSS

使用 Gzip 或 Brotli 压缩传输,或通过 PostCSS、csso 等工具压缩代码

后处理器(PostCSS)可自动优化代码(如自动前缀、压缩、删除冗余样式)

拆分 CSS

  • 按页面或组件拆分 CSS,避免单个超大 CSS 文件阻塞首屏渲染。
  • 利用媒体查询拆分不同场景的样式(如 @media print 单独拆分打印样式),浏览器会根据当前场景只加载必要的部分。

内联首屏 CSS

将关键 CSS(首屏必需样式)内联到 <head> 中,避免外部 CSS 文件加载延迟导致的首屏空白。

异步加载非首屏 CSS

  • 通过 JavaScript 动态插入 <link> 标签

减少触发重排与重绘的CSS操作

  • 集中修改样式(如通过添加 / 移除类一次性修改多个样式,而非逐条设置 element.style)。
  • 避免频繁读取会触发重排的属性(如 offsetWidth、scrollTop),可先缓存值再使用。

使用性能更好的 CSS 语法

  • 优先使用 ID 或类选择器,避免使用通配符(*)、属性选择器([type=“text”])等低效选择器,尤其是在大型页面中。
  • 避免链式类选择器(如 .box.container.large),增加匹配复杂度
  • 浏览器匹配选择器的顺序是 “从右到左”,例如 .list li a 会先查找所有 <a>,再过滤父元素为 <li> 且祖先为 .list 的元素,效率较低。
    优化示例:将 .list li a 改为 .list-link(直接给 <a> 添加类)。
  • 对静态效果可使用图片代替;对动画效果尽量在小范围元素上使用。

content-visibility: auto

延迟渲染不在视口内的元素

浏览器会跳过不在视口内元素的渲染过程(包括布局、绘制等),从而减少浏览器的工作负担。

使用场景
长列表、滚动页面中存在大量离屏元素的情况,例如电商商品列表、新闻资讯列表等。

.list-item {content-visibility: auto;
}

will-change

提前告知浏览器元素可能会发生的变化,让浏览器有时间提前做好优化准备(如创建独立的图层、预先计算等),从而使动画或过渡更加流畅。

浏览器会根据 will-change 指定的属性,对元素进行相应的优化处理。但需要注意,不能滥用该属性,否则可能会消耗过多的内存和性能。

使用场景
即将发生动画或过渡的元素,例如元素的位置移动、大小变换、透明度变化等。

.box {will-change: transform, opacity;
}

transform

使用 transform 进行动画或过渡时,浏览器会将元素提升到独立的图层进行处理,并且不会触发页面的重排(布局)和重绘(绘制),只需要进行复合操作,性能更高。

复合操作是将页面中不同图层的内容合并成最终的页面显示,这个过程相对高效。而重排和重绘会消耗大量的计算资源。

使用场景
各种需要动画效果的元素,如滑动的轮播图、弹出的对话框等。

.slide {transition: transform 0.3s ease;
}
.slide:hover {transform: translateX(10px);
}

opacity

使用 opacity 进行动画或过渡时,也不会触发重排和重绘,只需要进行复合操作,性能较好。

透明度的变化只影响元素的显示效果,不会改变元素的布局和几何形状,因此浏览器可以高效地处理。

使用场景
元素的淡入淡出效果,如模态框的显示与隐藏、按钮的 hover 效果等。

.fade {transition: opacity 0.3s ease;opacity: 1;
}
.fade:hover {opacity: 0.5;
}

contain

限制元素内部的渲染影响范围,告诉浏览器该元素的渲染不会影响到外部,从而让浏览器可以进行更高效的渲染优化。

contain 有多个取值,如 layout(表示元素内部的布局变化不会影响外部)、paint(表示元素的绘制只在自身范围内,不会溢出到外部)、size(表示元素的大小不会受内部内容变化的影响)等。通过合理设置这些值,可以减少浏览器需要检查和更新的区域。

使用场景
内部结构复杂、但与外部布局关联性较小的元素,例如独立的组件、卡片等

.component {contain: layout paint size;
}

background-attachment: fixed(谨慎使用)

使背景图片固定在视口中,不会随着页面的滚动而滚动。在某些情况下,合理使用可以减少背景图片的重绘次数。

但如果背景图片较大或页面滚动频繁,可能会导致性能问题,因此需要谨慎使用,根据实际情况测试效果。

body {background-image: url('bg.jpg');background-attachment: fixed;
}

image-rendering

用于控制图片缩放时的渲染方式,合理设置可以使图片在缩放时保持更好的视觉效果,同时在一定程度上减少渲染开销。

  • auto:默认值,使用浏览器默认的图片缩放算法。
  • pixelated:当图片放大时,会以像素块的形式显示,适合像素风格的图片,渲染效率较高。

使用场景
需要进行缩放显示的图片,尤其是像素风格的图片。

.pixel-art {image-rendering: pixelated;
}

position: fixed / position: absolute (适度使用)

将元素从文档流中脱离,其位置变化不会影响其他元素的布局,从而减少因元素移动导致的重排。

固定定位(fixed)或绝对定位(absolute)的元素会独立计算布局,其尺寸或位置的修改仅影响自身,不会触发父元素或兄弟元素的布局更新。

使用场景
悬浮组件(如导航栏、弹窗、广告位),避免其位置变化牵连其他元素的布局计算。

注意事项
过多脱离文档流的元素可能增加图层管理成本,需适度使用。

float(合理使用)

浮动元素的布局计算相对独立,其位置调整对周边元素的影响范围较小(仅影响 “浮动流” 内的元素)。

使用场景
图文混排(如新闻段落中的图片浮动),避免图片与文字的布局相互干扰导致频繁重排。

注意事项
滥用浮动可能导致布局混乱,且现代布局更推荐 flex 或 grid,但特定场景下浮动仍有性能优势。

pointer-events: none

禁止元素响应鼠标事件(如点击、 hover 等),浏览器无需为该元素监听鼠标交互,减少事件处理开销。

元素被设置为 pointer-events: none 后,会被排除在鼠标事件目标之外,浏览器无需对其进行事件捕获和处理。

使用场景
纯装饰性元素(如背景图案、动画特效层),无需用户交互的元素可禁用鼠标事件,提升事件处理效率。

.decorative-layer {pointer-events: none;
}

user-select: none

禁止用户选中元素内容,减少浏览器对文本选中状态的跟踪和渲染

浏览器默认会监听文本选中事件并绘制选中高亮,禁用后可减少这部分的渲染开销。

使用场景
按钮、图标、导航等无需复制的元素,避免用户误选并降低渲染压力。

.button {user-select: none;
}

backface-visibility: hidden

隐藏元素旋转时的 “背面”,减少 3D 变换中的渲染计算,降低 GPU 负载。

使用场景
3D 旋转动画(如卡片翻转效果),无需显示背面时使用,提升动画流畅度。

.card {transform-style: preserve-3d;backface-visibility: hidden;
}

isolation: isolate

创建一个新的堆叠上下文,限制元素内部的渲染影响范围,避免与外部元素的堆叠计算相互干扰。

堆叠上下文是浏览器处理元素层叠顺序的机制,isolation: isolate 强制创建独立上下文,减少跨上下文的层叠计算。

使用场景
复杂组件(如弹窗、下拉菜单),避免其内部元素的层叠关系影响页面其他部分的渲染。

.dropdown {isolation: isolate;
}

overflow: hidden

浏览器默认会计算元素所有内容的布局,即使超出容器范围,overflow: hidden 可让浏览器直接忽略超出部分,降低计算量。

配合 content-visibility: auto 使用时,裁剪效果可进一步提升离屏元素的渲染效率。

使用场景
图片容器、卡片组件等需要裁剪内容的元素,避免超出部分的无效渲染。

touch-action

浏览器对触摸事件的默认处理(如手势识别)较为复杂,touch-action 可禁用不必要的行为,提升触摸交互的响应速度。

使用场景
移动端自定义交互元素(如滑动组件、手势控制区域),例如禁用滚动:

.swipe-container {touch-action: none; /* 禁用所有默认触摸行为 */
}

font-display(@font-face 中)

使用 font-display: swap 避免字体加载期间的文本不可见(FOIT);限制字体变体(如字重、样式)数量,减少字体文件体积。

通过设置字体加载期间的显示策略(如使用系统默认字体暂代),减少浏览器等待字体加载时的渲染阻塞。

使用场景
引入自定义字体时,优化字体加载体验:

@font-face {font-family: 'MyFont';src: url('myfont.woff2') format('woff2');font-display: swap; /* 加载时使用备用字体,加载完成后替换 */
}

避免使用低性能的 CSS 语法

  • 避免使用通配符(*)、属性选择器([type=“text”])等低效选择器
  • 避免使用过大的背景图
  • 避免昂贵的 CSS 属性,部分属性计算成本高,如 box-shadow(尤其是模糊半径大时)、filter(如 blur)、clip-path 等,频繁使用或应用于大面积元素会导致性能下降。
  • CSS 变量(–var)虽灵活,但频繁通过 JavaScript 读写会触发额外的样式计算,高频率交互场景下需谨慎使用。
  • 预处理器(Sass、Less)的嵌套功能需合理使用,避免编译后生成复杂选择器;
  • 避免@import:@import会导致 CSS 加载串行化(必须等前一个加载完成才加载下一个),改用<link>并行加载。

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

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

相关文章

Flutter 线程模型详解:主线程、异步与 Isolate

一、主线程&#xff1a;默认的执行环境 所有代码默认运行在主线程。下面的例子展示了一个会阻塞主线程的错误示范&#xff1a; import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({super.key});ov…

ChartDB:可视化数据库设计工具私有化部署

ChartDB:可视化数据库设计工具私有化部署一、什么是ChartDB ChartDB 是一款基于 Web 的开源数据库可视化工具&#xff0c;专为简化数据库设计与管理流程而开发。以下是其核心特性与功能概述: 1、核心功能 智能查询可视化‌&#xff1a;通过单条 SQL 查询即可生成数据库架构图&a…

单片机-FreeRTOS(ing)

目录 一、基础介绍 1.1 调度策略 1.1.1 调度方式 1.1.2 调度器 1.2 任务以及优先级 1.2.1 任务与协程 1.2.2 任务状态 1.2.3 任务优先级 1.2.4 任务优先级分配方案 1.3 任务间通信 - 信号量 1.3.1 信号量 1.3.2 任务间计数信号量的实现 1.3.3 中断方式计数信号量的…

为什么调用API总返回404,该如何调试

当调用一个应用程序接口&#xff08;API&#xff09;时&#xff0c;持续地收到“404 未找到”的错误&#xff0c;其核心原因在于客户端发起的“请求”&#xff0c;未能成功地&#xff0c;匹配到服务器上任何一个“真实存在”的、可供访问的“资源路径”。这本质上&#xff0c;是…

医疗信息化自主可控转型的实践探索 —— 以常德二院为例

目录 头雁领航 - 激发医疗新质生产力 核心支撑 - 电科金仓奠定数据底座 生态共建 - 携手护航医疗信创发展 信创产业发展是国家经济数字化转型、提升产业链发展的关键&#xff0c;是科技自立自强的核心基座&#xff0c;其本质是实现中国信息化产业的自主可控。医疗信创作为关…

Gin传参和接收参数的方式

Gin查询参数和接收参数的方式 常用 Gin 绑定方法对比方法用途特点c.Bind()自动识别 Content-Type最通用&#xff0c;根据请求头自动选择绑定方式c.ShouldBindJSON()只绑定 JSON强制使用 JSON 格式&#xff0c;类型明确c.ShouldBindXML()只绑定 XML强制使用 XML 格式c.ShouldBin…

MariaDB/MySQL 客户端工具与服务端配置精要指南

文章目录一、客户端与服务端程序二、用户账号管理三、MySQL 客户端命令3.1 命令类型​3.2 使用模式​3.3 常用选项​3.4 提示符定制​四、mysqladmin管理命令​​五、服务端配置​5.1 配置文件​​​5.2 Socket 通信配置​​六、最佳实践总结免费个人运维知识库&#xff0c;欢迎…

自动化项目日报生成工具测评与选型:如何匹配团队日报管理需求

引言在项目管理场景中&#xff0c;手动撰写日报常面临多重效率瓶颈&#xff1a;任务数据分散在协作群、Excel 表格、项目看板等多个平台&#xff0c;汇总时需反复核对&#xff1b;不同成员日报格式不统一&#xff0c;管理层整合分析耗时&#xff1b;任务进度与日报信息不同步&a…

基于SpringBoot+Vue的吴韵苏香文旅小程序(协同过滤算法、Echarts图形化分析、腾讯地图API、二维码识别)

&#x1f388;系统亮点&#xff1a;协同过滤算法、Echarts图形化分析、腾讯地图API、二维码识别&#xff1b;一.系统开发工具与环境搭建1.系统设计开发工具后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17小程序&a…

python numpy.random的基础教程(附opencv 图片转数组、数组转图片)

目录 1.在区间[a,b)随机生成n个整数。 2.在区间[a,b)随机生成n个数。 3.在区间[0,1)生成随机数 4.打乱顺序 5.从指定的列表中选择 NumPy&#xff08;Numerical Python&#xff09;是一个开源的科学计算库&#xff0c;专门用于高效处理多维数组&#xff08;ndarray&#xf…

Vue2.x核心技术与实战(二)

目录 三、Vue2.x:生命周期+工程化开发(组件入门) 3.1 生命周期 3.1.1 生命周期 & 生命周期四个阶段 3.1.2 生命周期钩子 Vue生命周期钩子案例 - 新闻列表 & 输入框自动聚焦 3.2 综合案例:小黑记账清单 3.3 工程化开发入门 3.3.1 工程化开发 & 脚手架Vue …

【鸿蒙心迹】7×24小时极限求生:当Origin_null遇上鸿蒙,我如何用100杯咖啡换一条跨域活路?

文章概要 大家好&#xff0c;我是那个把黑眼圈熬成华为工牌挂绳的倒霉蛋。过去100个夜晚&#xff0c;我在HarmonyOS NEXT的ArkWeb里被Origin:null反复按在地上摩擦——小程序白屏、OPTIONS 400、官方文档沉默三连击。最终&#xff0c;我用C、libcurl、OpenSSL和一堆速溶咖啡&am…

【git】删除一条本地提交的历史commit

在工程中&#xff0c;如果想要删除一条本地提交的历史commit&#xff0c;可以通过droprebase -i HEAD^n的方式。1.情景提交了三条commit&#xff0c;想删掉第二条commit。git logcommit_id_*******1 commit_id_*******2 commit_id_*******32.解决git rebase -i HEAD~2输出&…

软件测试中,JMeter 的作用以及优缺点是什么?

回答重点JMeter 是一款开源的软件测试工具&#xff0c;主要用来对各种软件或服务进行性能测试和负载测试。它可以模拟大量用户同时对服务器、网络或其他资源发起请求&#xff0c;从而测试它们的响应时间、吞吐量等性能指标。优点&#xff1a;1&#xff09; 开源且免费 &#xf…

STM32存储结构

我们在使用Keil编译程序成功后会,有一行各部分占用内存的提示信息,如下Program Size:Code7492 RO-data556 Rw-data72 ZI-data11688,这是stm32代码编译后的提示我们分析一下这个编译输出&#xff1a;- Code: 7492字节 -> 代码部分&#xff08;存放在Flash&#xff09;- RO-da…

手机 浏览器调用摄像头扫描二维码Quagga

注&#xff1a;需用谷歌浏览器才能调用权限1. 引入依赖&#xff1a;npm install ericblade/quagga2<template><el-button color"#188ae2" click"handleScan" class"scan-btn" :disabled"isInitializing || isScanning">{{…

【Oracle篇】伪列之Version Query:全链路追踪行数据变更的所有记录(不仅仅是被修改的最后时间)(第二篇,总共六篇)

&#x1f4ab;《博主主页》&#xff1a;    &#x1f50e; CSDN主页__奈斯DB    &#x1f50e; IF Club社区主页__奈斯、 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对…

代理模式深度解析:从静态代理到 Spring AOP 实现

代理模式是软件开发中一种经典的设计模式&#xff0c;它通过引入 "代理对象" 间接访问目标对象&#xff0c;从而在不修改目标对象代码的前提下&#xff0c;实现功能增强&#xff08;如日志记录、事务管理&#xff09;、权限控制等横切需求。从简单的静态代理到灵活的…

算法 ----- 链式

目录 一 、链式 二 、题目 1、两两相加 &#xff08;1&#xff09;题目 (3) 代码书写 2、两两交换链表中的节点 &#xff08;1&#xff09;题目 &#xff08;2&#xff09; 解题思路 &#xff08;3&#xff09;代码书写 3、重排链表 &#xff08;1&#xff09;题目 …

运维监控prometheus+grafana

目录 一、环境 二、Node_exporter部署 三、Prometheus部署 四、Grafana部署 五、验证、使用 一、环境 系统使用CentOS7虚拟机。 监控三台服务器&#xff1a; 192.168.114.10 Node1 #部署Prometheus、node_exporter、Grafana 192.168.114.20 Node2 …