33丨浏览器:事件-为什么会有捕获过程和冒泡过程?

事件概述在开始接触具体的 API 之前,我们要先了解一下事件。一般来说,事件来自输入设备,我们平时的个人设备上,输入设备有三种: 键盘; 鼠标; 触摸屏。 这其中,触摸屏和鼠标又有一定的共性,它们被称作 pointer 设备,所谓 pointer 设备,是指它的输入最终会被抽象成屏幕上面的一个点。但是触摸屏和鼠标又有一定区别,它们的精度、反应时间和支持的...

Read More

32丨浏览器:CSSOM

在前面的文章中,我们已经学习了 DOM 相关的 API,狭义的 DOM API 仅仅包含 DOM 树形结构相关的内容。今天,我们再来学习一类新的 API:CSSOM。 我想,你在最初接触浏览器 API 的时候,应该都有跟我类似的想法:“好想要 element.width、element.height 这样的 API 啊”。 这样的 API 可以直接获取元...

Read More

31丨浏览器:DOM

DOM API 是最早被设计出来的一批 API,也是用途最广的 API,所以早年的技术社区,常常用 DOM 来泛指浏览器中所有的 API。不过今天这里我们要介绍的 DOM,指的就是狭义的文档对象模型。 DOM API 介绍顾名思义,文档对象模型是用来描述文档,这里的文档,是特指 HTML 文档(也用于 XML 文档,但是本课不讨论 XML)。同时它又是一...

Read More

30丨浏览器:一个浏览器是如何工作的5

在之前的几篇文章中,我们已经经历了把 URL 变成字符流,把字符流变成词(token)流,把词(token)流构造成 DOM 树,把不含样式信息的 DOM 树应用 CSS 规则,变成包含样式信息的 DOM 树,并且根据样式信息,计算了每个元素的位置和大小。 那么,我们最后的步骤,就是根据这些样式信息和大小信息,为每个元素在内存中渲染它的图形,并且把它绘制到对...

Read More

29丨浏览器:一个浏览器是如何工作的4

我们书接上文。浏览器进行到这一步,我们已经给 DOM 元素添加了用于展现的 CSS 属性,接下来,浏览器的工作就是确定每一个元素的位置了。我们的基本原则仍然不变,就是尽可能流式地处理上一步骤的输出。 在构建 DOM 树和计算 CSS 属性这两个步骤,我们的产出都是一个一个的元素,但是在排版这个步骤中,有些情况下,我们就没法做到这样了。 尤其是表格相关排版、F...

Read More

28丨浏览器:一个浏览器是如何工作的3

在上一节课中,我已经讲了浏览器的 DOM 构建过程,但是这个构建的 DOM,实际上信息是不全的,它只有节点和属性,不包含任何的样式信息。我们这一节课就来讲讲:浏览器是如何把 CSS 规则应用到节点上,并给这棵朴素的 DOM 树添加上 CSS 属性的。 整体过程首先 CSS 选择器这个名称,可能会给你带来一定的误解,觉得好像 CSS 规则是 DOM 树构建好了...

Read More

27丨浏览器:一个浏览器是如何工作的2

今天我们主要来看两个过程:如何解析请求回来的 HTML 代码,DOM 树又是如何构建的。 解析代码我们在前面讲到了 HTTP 的构成,但是我们有一部分没有详细讲解,那就是 Response 的 body 部分,这正是因为 HTTP 的 Response 的 body,就要交给我们今天学习的内容去处理了。 HTML 的结构不算太复杂,我们日常开发需要的 90...

Read More

26丨浏览器:一个浏览器是如何工作的1

实际上,对浏览器的实现者来说,他们做的事情,就是把一个 URL 变成一个屏幕上显示的网页。 这个过程是这样的: 浏览器首先使用 HTTP 协议或者 HTTPS 协议,向服务端请求页面; 把请求回来的 HTML 代码经过解析,构建成 DOM 树; 计算 DOM 树上的 CSS 属性; 最后根据 CSS 属性对元素逐个进行渲染,得到内存中的位图; 一个可选的...

Read More

25丨HTML&CSS:ARIA-可访问性是只给盲人用的特性么?

我们都知道,HTML 已经是一个完整的语义系统。在前面的课程中,我们围绕着 HTML 本身做了讲解,但是在实际应用中,我们还会用到一些它的扩展。今天我们要讲的 ARIA 就是其中重要的一部分。 ARIA 全称为 Accessible Rich Internet Applications,它表现为一组属性,是用于可访问性的一份标准。关于可访问性,它被提到最...

Read More

24丨HTML&CSS:用代码挖掘CSS属性

浏览器中已经实现的属性首先我们来看看浏览器中实现了哪些属性。我们用一段代码来看一下。 1Object.keys(document.body.style).filter(e => !e.match(/^webkit/)) 这段代码思路非常简单,就是枚举 document.body.style 上的所有属性,并且去掉 webkit 前缀的私有属性。 在我的...

Read More