重学前端 26 # CSSOM

简介: 重学前端 26 # CSSOM

一、介绍


CSSOM 是 CSS 的对象模型,在 W3C 标准中,它包含两个部分:描述样式表和规则等 CSS 的模型部分(CSSOM),和跟元素视图相关的 View 部分(CSSOM View)。



二、CSSOM


2.1、创建样式表

用 style 标签和 link 标签创建样式表

<style title="Hello">
a {
  color:red;
}
</style>
<link rel="stylesheet" title="x" href="data:text/css,p%7Bcolor:blue%7D">


2.2、CSSOM API 的基本用法

// 获取文档中所有的样式表
document.styleSheets
// 虽然无法用 CSSOM API 来创建样式表,但是可以修改样式表中的内容
document.styleSheets[0].insertRule("p { color:pink; }", 0)
document.styleSheets[0].removeRule(0)
// 获取样式表中特定的规则(Rule),(使用它的 cssRules 属性来实现)
document.styleSheets[0].cssRules



2.3、CSSStyleRule 的两个属性

selectorText 和 style,分别表示一个规则的选择器部分和样式部分。


1、selector 部分:是一个字符串,按照选择器语法设置即可。


2、style 部分:是一个样式表,它跟元素的 style 属性是一样的类型,所以可以像修改内联样式一样,直接改变属性修改规则中的具体 CSS 属性定义,也可以使用 cssText 这样的工具属性。

// 获取一个元素最终经过 CSS 计算得到的属性的方法
window.getComputedStyle(elt, pseudoElt);



三、CSSOM View


CSSOM View 这一部分的 API,可以视为 DOM API 的扩展,它在原本的 Element 接口上,添加了显示相关的功能,可以分成三个部分:窗口部分,滚动部分和布局部分



3.1、窗口 API

用于操作浏览器窗口的位置、尺寸等。

  • moveTo(x, y):窗口移动到屏幕的特定坐标
  • moveBy(x, y):窗口移动特定距离
  • resizeTo(x, y):改变窗口大小到特定尺寸
  • resizeBy(x, y):改变窗口大小特定尺寸


// 窗口 API 还规定了 window.open() 的第三个参数:
window.open("about:blank", "_blank" ,"width=100,height=100,left=100,right=100" )




3.2、滚动 API


1、视口滚动 API


   可视区域(视口)滚动行为由 window 对象上的一组 API 控制

   scrollX:是视口的属性,表示 X 方向上的当前滚动距离,有别名 pageXOffset

   scrollY:是视口的属性,表示 Y 方向上的当前滚动距离,有别名 pageYOffset

   scroll(x, y):使得页面滚动到特定的位置,有别名 scrollTo,支持传入配置型参数 {top, left}

   scrollBy(x, y):使得页面滚动特定的距离,支持传入配置型参数 {top, left}


通过这些属性和方法,可以读取视口的滚动位置和操纵视口滚动。

// 监听视口滚动事件,需要在 document 对象上绑定事件监听函数
document.addEventListener("scroll", function(event){
  //......
})


2、元素滚动 API


在 Element 类,为了支持滚动,加入了以下 API。


   scrollTop:元素的属性,表示 Y 方向上的当前滚动距离。

   scrollLeft:元素的属性,表示 X 方向上的当前滚动距离。

   scrollWidth:元素的属性,表示元素内部的滚动内容的宽度,一般来说会大于等于元素宽度。

   scrollHeight:元素的属性,表示元素内部的滚动内容的高度,一般来说会大于等于元素高度。

   scroll(x, y):使得元素滚动到特定的位置,有别名 scrollTo,支持传入配置型参数 {top, left}。

   scrollBy(x, y):使得元素滚动到特定的位置,支持传入配置型参数 {top, left}。

   scrollIntoView(arg):滚动元素所在的父元素,使得元素滚动到可见区域,可以通过 arg 来指定滚到中间、开始或者就近。


// 可滚动的元素也支持 scroll 事件,在元素上监听它的事件即可
element.addEventListener("scroll", function(event){
  //......
})


3.3、布局 API

1、全局尺寸信息


f590846d9e7963fc5d13de0d42e09587.png


2、元素的布局信息

有些元素可能产生多个盒,事实上,只有盒有宽和高,元素是没有的。


1、获取宽高的对象应该是盒


   CSSOM View 为 Element 类添加了两个方法:getClientRects()和getBoundingClientRect()。

getClientRects:会返回一个列表,里面包含元素对应的每一个盒所占据的客户端矩形区域,这里每一个矩形区域可以用 x, y, width, height 来获取它的位置和尺寸。


getBoundingClientRect:返回元素对应的所有盒的包裹的矩形区域,需要注意,这个 API 获取的区域会包括当 overflow 为 visible 时的子元素区域。



目录
相关文章
|
6月前
|
并行计算 机器人 网络安全
阿里云服务器上部署ROS2+Isaac-Sim4.5实现LeRobot机械臂操控
本文介绍了如何在阿里云上申请和配置一台GPU云服务器,并通过ROS2与Isaac Sim搭建机械臂仿真平台。内容涵盖服务器申请、系统配置、远程连接、环境搭建、仿真平台使用及ROS2操控程序的编写,帮助开发者快速部署机器人开发环境。
2330 4
|
11月前
|
缓存 自然语言处理 安全
快速调用 Deepseek API!【超详细教程】
Deepseek 强大的功能,在本教程中,将指导您如何获取 DeepSeek API 密钥,并演示如何使用该密钥调用 DeepSeek API 以进行调试。
|
开发框架 Dart JavaScript
深入探讨Flutter中的Web支持功能,以及如何利用Flutter构建跨平台Web应用的最佳实践
【6月更文挑战第11天】Flutter,Google的开源跨平台框架,已延伸至Web支持,让开发者能用同一代码库构建移动和Web应用。Flutter Web基于Dart转JavaScript,利用WebAssembly和JavaScript在Web上运行。构建Web应用最佳实践包括选择合适项目、优化性能、进行兼容性测试和利用Flutter的声明式UI、热重载等优势。尽管性能挑战存在,Flutter Web为跨平台开发提供了更多机会和潜力。
444 1
|
开发框架 Dart 前端开发
【Flutter前端技术开发专栏】Flutter中的Web支持:构建跨平台Web应用
【4月更文挑战第30天】Flutter,Google的开源跨平台框架,已延伸至Web领域,让开发者能用同一代码库构建移动和Web应用。Flutter Web通过将Dart代码编译成JavaScript和WASM运行在Web上。尽管性能可能不及原生Web应用,但适合交互性强、UI复杂的应用。开发者应关注性能优化、兼容性测试,并利用Flutter的声明式UI、热重载等优势。随着其发展,Flutter Web为跨平台开发带来更多潜力。
491 0
【Flutter前端技术开发专栏】Flutter中的Web支持:构建跨平台Web应用
|
XML JSON Java
spring,springBoot配置类型转化器Converter以及FastJsonHttpMessageConverter,StringHttpMessageConverter 使用
spring,springBoot配置类型转化器Converter以及FastJsonHttpMessageConverter,StringHttpMessageConverter 使用
1610 1
|
机器学习/深度学习 人工智能 自然语言处理
人工智能八大关键技术简析
人工智能八大关键技术简析
289 2
|
Web App开发 NoSQL API
Python Flask 优秀资源大全
版权: https://github.com/humiaozuzu/awesome-flask Awesome Flask ============= 介绍 Awesome-Flask 是由 humiaozuzu 发起和维护的 Flask 资源列表。
2466 0
|
JavaScript 前端开发
|
负载均衡 安全 Dubbo
深入浅出微服务:40个微服务架构实战案例(Dubbo+Springcloud)
微服务在近几年来可以说是十分火爆,我们应该知道微服务的发展历程大致分为6个阶段分别是:单体应用阶段提、垂直应用阶段、分布式系统阶段、服务治理阶段、微服务阶段、最后到服务网格阶段。