名词(术语)了解--CSSOM (CSS Object Model)

名词(术语)了解–CSSOM (CSS Object Model)

在这里插入图片描述

CSSOM 概述

CSSOM 是一个与 DOM (Document Object Model) 相对应的、用于 CSS 的 API 集合。

它提供了一种程序化的方式来读取和修改文档的样式信息。

CSSOM 的主要组成部分

  1. 样式规则树
document
└── stylesheets└── cssRules├── style rule 1│   ├── selector│   └── declaration block├── style rule 2└── style rule 3
  1. 计算样式
  • 浏览器会将所有适用的 CSS 规则计算并应用到每个 DOM 节点
  • 继承属性会从父节点传递到子节点
  • 最终每个节点都会有一个完整的计算样式(computed style)

CSSOM API 主要功能

  1. 读取样式信息
// 获取元素的计算样式
const style = window.getComputedStyle(element);
console.log(style.backgroundColor);// 访问样式表
const sheets = document.styleSheets;
  1. 修改样式
// 直接修改元素样式
element.style.backgroundColor = 'red';// 添加新的样式规则
const sheet = document.styleSheets[0];
sheet.insertRule('body { background-color: lightblue }', 0);
  1. 操作 CSS 规则
// 获取所有CSS规则
const rules = document.styleSheets[0].cssRules;// 删除规则
document.styleSheets[0].deleteRule(0);

CSSOM 渲染过程

  1. 构建过程

    • 加载 HTML → 构建 DOM
    • 加载 CSS → 构建 CSSOM
    • DOM + CSSOM = 渲染树(Render Tree)
  2. 性能注意事项

    • CSS 被视为渲染阻塞资源
    • CSSOM 构建会阻止页面渲染
    • 优化建议:
      • 精简 CSS
      • 移除未使用的 CSS
      • 使用媒体查询划分 CSS

实际应用示例

  1. 动态主题切换
// 通过 CSSOM 实现动态主题切换
function toggleTheme(isDark) {const root = document.documentElement;if (isDark) {root.style.setProperty('--bg-color', '#333');root.style.setProperty('--text-color', '#fff');} else {root.style.setProperty('--bg-color', '#fff');root.style.setProperty('--text-color', '#333');}
}
  1. 响应式样式调整
// 监听视窗变化并动态调整样式
const mediaQuery = window.matchMedia('(max-width: 768px)');function handleScreenChange(e) {if (e.matches) {// 小屏幕样式调整document.body.style.fontSize = '14px';} else {// 大屏幕样式调整document.body.style.fontSize = '16px';}
}mediaQuery.addListener(handleScreenChange);

最佳实践

  1. 性能优化

    • 减少选择器复杂度
    • 避免频繁修改样式
    • 使用 CSS 类名切换代替直接样式操作
  2. 代码组织

    • 将样式操作封装成可复用的函数
    • 使用 CSS 变量实现主题系统
    • 保持 CSS 结构清晰
  3. 调试技巧

    • 使用浏览器开发工具的 Elements 面板
    • 利用 Computed 标签页查看计算样式
    • 使用 Sources 面板调试样式修改

深入CSSOM

1. CSSOM 的高级特性

1.1 视图相关 API (CSSOM View Module)

CSSOM View Module 提供了与元素视图相关的属性和方法:

// 1. 获取元素尺寸
const element = document.querySelector('.box');// 元素完整尺寸(包括内边距和边框)
console.log(element.offsetWidth, element.offsetHeight);// 元素内部尺寸(包括内边距)
console.log(element.clientWidth, element.clientHeight);// 元素实际内容尺寸(包括溢出部分)
console.log(element.scrollWidth, element.scrollHeight);// 2. 获取元素位置
// 相对于带定位父元素的偏移
console.log(element.offsetLeft, element.offsetTop);// 相对于视口的位置
const rect = element.getBoundingClientRect();
console.log(rect.top, rect.left, rect.bottom, rect.right);// 3. 视口信息
console.log(window.innerWidth, window.innerHeight); // 视口大小
console.log(window.pageXOffset, window.pageYOffset); // 页面滚动位置

1.2 CSS 自定义属性(CSS Variables)操作

// 1. 定义全局 CSS 变量
document.documentElement.style.setProperty('--primary-color', '#007bff');// 2. 读取 CSS 变量
const styles = getComputedStyle(document.documentElement);
const primaryColor = styles.getPropertyValue('--primary-color');// 3. 动态主题实现
class ThemeManager {constructor() {this.root = document.documentElement;}setTheme(theme) {const themes = {light: {'--bg-color': '#ffffff','--text-color': '#333333','--shadow-color': 'rgba(0,0,0,0.1)'},dark: {'--bg-color': '#333333','--text-color': '#ffffff','--shadow-color': 'rgba(255,255,255,0.1)'}};Object.entries(themes[theme]).forEach(([property, value]) => {this.root.style.setProperty(property, value);});}
}

2. 高级应用场景

2.1 响应式布局管理器

class ResponsiveLayoutManager {constructor() {this.breakpoints = {mobile: 480,tablet: 768,desktop: 1024};this.mediaQueries = {};this.init();}init() {Object.entries(this.breakpoints).forEach(([device, width]) => {const query = window.matchMedia(`(min-width: ${width}px)`);query.addListener(this.handleBreakpoint.bind(this));this.mediaQueries[device] = query;});}handleBreakpoint(e) {const html = document.documentElement;Object.entries(this.mediaQueries).forEach(([device, query]) => {if (query.matches) {html.setAttribute('data-device', device);}});}
}const layoutManager = new ResponsiveLayoutManager();

2.2 动画性能优化器

class AnimationOptimizer {static prepareForAnimation(element) {// 强制浏览器创建新的图层,优化动画性能element.style.willChange = 'transform';// 使用 transform 代替位置属性element.style.transform = 'translateZ(0)';}static cleanupAfterAnimation(element) {// 动画结束后清理element.style.willChange = 'auto';}static smoothAnimation(element, properties, duration = 300) {this.prepareForAnimation(element);const animations = Object.entries(properties).map(([prop, value]) => {return element.animate({[prop]: value}, {duration,easing: 'cubic-bezier(0.4, 0, 0.2, 1)'});});Promise.all(animations.map(anim => anim.finished)).then(() => this.cleanupAfterAnimation(element));}
}

2.3 样式隔离实现

class StyleIsolator {constructor(scopeName) {this.scopeName = scopeName;this.styleSheet = this.createStyleSheet();}createStyleSheet() {const style = document.createElement('style');document.head.appendChild(style);return style.sheet;}addRule(selector, cssText) {// 添加作用域前缀const scopedSelector = `.${this.scopeName} ${selector}`;const rule = `${scopedSelector} { ${cssText} }`;this.styleSheet.insertRule(rule, this.styleSheet.cssRules.length);}removeAllRules() {while (this.styleSheet.cssRules.length > 0) {this.styleSheet.deleteRule(0);}}
}

3. 性能优化最佳实践

3.1 批量样式修改

class StyleBatchProcessor {static batchUpdate(element, updates) {// 将元素脱离文档流const display = element.style.display;element.style.display = 'none';// 批量更新样式requestAnimationFrame(() => {Object.entries(updates).forEach(([prop, value]) => {element.style[prop] = value;});// 重新加入文档流element.style.display = display;});}
}// 使用示例
StyleBatchProcessor.batchUpdate(element, {backgroundColor: '#fff',transform: 'translateX(100px)',opacity: '0.8'
});

3.2 样式计算缓存

class StyleCache {constructor() {this.cache = new WeakMap();}getComputedStyle(element, property) {if (!this.cache.has(element)) {this.cache.set(element, new Map());}const elementCache = this.cache.get(element);if (!elementCache.has(property)) {const value = window.getComputedStyle(element)[property];elementCache.set(property, value);}return elementCache.get(property);}invalidate(element) {this.cache.delete(element);}
}

3.3 CSS 动画性能监控

class AnimationPerformanceMonitor {static startMonitoring() {this.observer = new PerformanceObserver((list) => {for (const entry of list.getEntries()) {if (entry.entryType === 'layout-shift') {console.warn('Layout shift detected:', entry.value);}}});this.observer.observe({ entryTypes: ['layout-shift'] });}static measureAnimationPerformance(element, animationDuration) {const startTime = performance.now();const cleanup = () => {const endTime = performance.now();const duration = endTime - startTime;if (duration > animationDuration * 1.1) {console.warn('Animation performance issue detected');}};element.addEventListener('transitionend', cleanup, { once: true });}
}

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

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

相关文章

智能化超声波影像分析,优化医疗决策的开源AI解决方案

思通数科的医疗信息精准抽取系统是一款基于人工智能的开源软件,旨在自动化处理医疗数据,特别是从超声波影像到诊断报告的信息提取。该系统集成了图像识别、自然语言处理和知识图谱等先进技术,能够从医疗影像中提取关键数据,并将这…

Objective-C 音频爬虫:实时接收数据的 didReceiveData_ 方法

在互联网技术领域,数据的获取和处理是至关重要的。尤其是对于音频内容的获取,实时性和效率是衡量一个爬虫性能的重要指标。本文将深入探讨在Objective-C中实现音频爬虫时,如何高效地使用didReceiveData:方法来实时接收数据,并通过…

Python轴承故障诊断 (15)基于CNN-Transformer的一维故障信号识别模型

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…

如何在 Elasticsearch Ruby 客户端中使用 ES|QL Helper

作者:来自 Elastic Fernando Briano 了解如何使用 Elasticsearch Ruby 客户端编写 ES|QL 查询并处理其结果。 简介 Elasticsearch Ruby 客户端可用于编写 EQ|QL 查询,使处理从 esql.query 返回的数据更加容易。ES|QL 允许开发人员通过查询过滤、转换和分…

【elkb】ELKB安装token过期

问题 elastic启动时候生成的token 有效期只有30分钟。 30分钟后提示: Couldnt configure Elastic Generate a new enrollment token or configure manually. 相关版本信息 elasticsearch:8.8.1kibana:8.8.1logstash:8.8.1file…

交易所开发:开启数字金融新时代

当今数字化高速发展的时代,交易所作为金融市场的核心枢纽,发挥着至关重要的作用。而随着区块链技术的兴起,数字货币交易所的开发更是为金融领域带来了全新的变革与机遇。 一、数字货币交易所的重要性 数字货币交易所是连接数字货币世界与传统…

企业内训|LLM大模型在服务器和IT网络运维中的应用-某日企IT运维部门

本课程是为某在华日资企业集团的IT运维部门专门定制开发的企业培训课程,本课程旨在深入探讨大型语言模型(LLM)在服务器及IT网络运维中的应用,结合当前技术趋势与行业需求,帮助学员掌握LLM如何为运维工作赋能。通过系统…

网上商城设计小程序ssm+论文源码调试讲解

2相关技术 2.1微信小程序 小程序是一种新的开放能力,开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播,同时具有出色的使用体验。尤其拥抱微信生态圈,让微信小程序更加的如虎添翼,发展迅猛。 2.2 MYSQL数据…

大贤3D家谱——让修家谱不再困难

修家谱作为一种文化传统,承载着家族的历史和文化记忆,但近年来确实面临一些困难,导致很多人不愿意修家谱。以下是一些主要原因: 1、信息获取难度: 家谱的修订需要大量的历史资料和族谱记录。许多家庭的老谱由于时间久…

Node + HTML搭建自己的ChatGPT [基础版]

文章目录 明明外面的ChatGPT产品那么多了,为什么要在本地搭建自己的ChatGPT呢?整体架构流程1. 获取APIKey1.1 常见的AI模型1.2 为什么选DeepSeek1.3 怎么获取DeepSeek的APIKey1.3.1 注册并登录DeepSeek开放平台1.3.2 选择API keys1.3.3 创建API key1.3.4…

【Linux学习】(8)第一个Linux编程进度条程序|git三板斧

前言 第一个Linux编程——进度条git的简单使用 一、第一个Linux编程——进度条 在写进度条之前我们需要两个基础知识: 回车换行缓冲区 1. 回车换行 首先我们需要知道回车换行它是两个概念,回车是回车,换行是换行换行:光标从上往下…

DEVOPS: 认证与调度

概述 不知道大家有没有意识到一个现实,就是大部分时候,我们已经不像以前一样通过命令行,或者可视窗口来使用一个系统了现在我们上微博、或者网购,操作的其实不是眼前这台设备,而是一个又一个集群 通常,这样…

MUX VLAN 实验配置

MUX VLAN(Multiplex VLAN)是一种高级的VLAN技术,通过在交换机上实现二层流量隔离和灵活的网络资源控制,提供了一种更为细致的网络管理方式 MUX VLAN通过定义主VLAN(Principal VLAN)和多个子VLAN&#xff0…

海外云手机怎样助力亚马逊店铺运营?

随着全球化的发展,越来越多的企业开始重视海外市场的拓展,尤其是出海企业和B2B外贸企业。亚马逊作为全球最大的电商平台之一,成为了许多企业争夺国际市场的重点战场。本文将深入分析海外云手机在优化亚马逊店铺引流中的作用和优势&#xff0c…

优惠券项目的设计与实现,完结!

你好 我是田哥 我的充电桩项目中,优惠券相关功能已基本完成。另外,关于充电桩项目,我之前分享过一些相关文章: 充电桩项目,开源啦! 充电桩项目实战:消息丢失和重复消费问题 用充电桩项目面试&am…

【electron8】electron实现“图片”的另存为

注:该列出的代码,都在文章内示例出 1. 另存为按钮事件: const saveAsHandler async () > {const { path, sessionId } recordInfoif(typeof message ! string) return;// 因为我的图片是加密的,所以我需要根据接口返回的路…

使用vue+kkFileview组件实现各种类型文件预览

关于kkFileView 【参考】:https://kkfileview.keking.cn/zh-cn/docs/home.html 文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署。万能的文件预览开源项目,基本支持主流文档格式预览 本项目介绍 项目使用…

低空经济产业链、政策、延伸品调研笔记

文章目录 1 低空经济市场1.1 政策摘要1.2 市场规模预测 3 涉及产业链与核心产品3.1 产业链3.2 原材料3.2.1 上游3.2.2 中游3.2.3下游 3.3 无人机3.4 eVTOL3.5 空管系统 4 应用场景4.1 城市空中出行(UAM)4.2 低空物流4.3 低空旅游与体验4.4 农林植保与监测4.5 基础设施巡检与维护…

JVM基础(内存结构)

文章目录 内存结构JAVA堆方法区 (Method Area)运行时常量池(Runtime Constant Pool) 虚拟机栈 (Java Virtual Machine Stack)本地方法摘栈(Native Method Stacks)程序计数器&#xf…

Matlab 车牌识别技术

1.1设计内容及要求: 课题研究的主要内容是对数码相机拍摄的车牌,进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发,涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。 图1-1系统总…