Skip to content

实现游览器

· 7 min

MDN

rel: 它的值必须是一组无序的、唯一的、用空格隔开的关键字。例:rel="stylesheet"rel="preload stylesheet"等。

rel=“preload”#

rel 的值是 preload 时,as 为必填。

以更高的优先级去下载和缓存资源,不会触发事件。

rel=“prefetch”#

用户将来可能需要这个资源,浏览器在空闲时间时(优先级低)下载和缓存资源。

HTMLImageElement (<img/>)#

src#

相关资料:

获取图片的要应用的元素:

  1. 父节点是 <picture /> 时,获取 <img /> 之前的 <source /> 兄弟元素
  2. <img />

获取应用元素的 src:

srcset 格式: https://example.com 2xhttps://example.com 300w

其中 2x 为 devicePixelRatio(物理像素分辨率与CSS 像素分辨率之比), 当浏览器的 devicePixelRatio 于该值匹配时,使用该图片。

其中 300w 为图像的固有尺寸

sizes 格式: (max-height: 500px) 1000px

其中 (max-height: 500px) 为媒体条件,意思为视口不高于 500px,使用该图片。可以不写,默认为 true。

其中 1000px 为资源大小的值,

Background#

MDN

background-clip#

根据属性对背景进行裁剪,超出部分不渲染。

border-box: 默认值,将背景裁剪到边框外沿。

padding-box: 将背景裁剪到内边距外沿。

content-box: 将背景裁剪到内容区外沿。

background-image#

在绘制时,图像以 z 方向堆叠的方式进行。先指定的图像会在之后指定的图像上面绘制。因此指定的第一个图像“最接近用户”(最后渲染它),background-color 会在它们之下绘制。

例子:

background-image: url(A), url(B);
background-color: red;
z轴:
最高
A
B
red
最低

background-origin#

指定背景图片 background-image 属性的原点位置。

border-box:以边框的(0, 0)(即左上角)位置为图像的渲染原点。

padding-box:默认值,以内边距的(0, 0)位置为图像的渲染原点。

content-box:默认值,以内容区的(0, 0)位置为图像的渲染原点。

background-position#

百分比:

给定背景图像位置的百分比偏移量是相对于容器的。例:

(container width - image width) * (position x%) = (x offset value)
(container height - image height) * (position y%) = (y offset value)
// 假设我们有一个 300px 宽的图像,我们在一个 100px 宽的容器中使用它
// -25%。结果:向右偏移 50px,即图像的原点在容器的中心。
(100px - 300px) * -25% = 50px
(100px - 300px) * 0% = 0
(100px - 300px) * 50% = -100px
(100px - 300px) * 100% = -200px
// 120%。结果:向左偏移 100px,即图像的最右侧在容器的中心。
(100px - 300px) * 120% = -250px

background-repeat#

space: 尽可能最少数量的图像填补,允许有空白。有两个图像以上时,background-position 属性会被忽略。

round: 用图像填补所有空间,允许压缩图片。

background-size#

位图: 一定有固有尺寸与固有比例。

矢量图: 可能两者都有(width-height viewBox),也可能只有一个, 也可能都没有(游览器会补充一个300*150的大小)。

渐变: 视为只有固有尺寸或者只有固有比例的图片。

cover: 尽可能大的缩放背景图像并保持图像的宽高比例来填满空间。不会有空白,超出时裁剪掉。

contain: 尽可能的缩放背景并保持图像的宽高比例来填满空间。可能会有空白。

auto auto:

auto 和 non auto:

指定长度的使用指定值。

相关知识#

AffineTransform#

一个表示二维仿射变换的类,用于执行从 2D 坐标到其他 2D 坐标的线性映射。它通过平移、缩放、旋转和错切等操作构造变换,并使用一个 3×3 矩阵表示变换过程。

kurbo Affine: [a, b, c, d, e, f]

下面公式为 (x, y) 经过变换生成新的坐标:

xy1acebdf001=ax+cy+ebx+dy+f1\begin{vmatrix} x \\ y \\ 1 \end{vmatrix} * \begin{vmatrix} a & c & e \\ b & d & f \\ 0 & 0 & 1 \end{vmatrix} = \begin{vmatrix} a * x + c * y + e \\ b * x + d * y + f \\ 1 \end{vmatrix}
Scale 缩小 (s_x, s_y) 倍#

Affine::scale(0.5, 0.5) * Affine

sx000sy0001acebdf001=sxasxcsxesybsydsyf001\begin{vmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{vmatrix} * \begin{vmatrix} a & c & e \\ b & d & f \\ 0 & 0 & 1 \end{vmatrix} = \begin{vmatrix} s_x * a & s_x * c & s_x * e \\ s_y * b & s_y * d & s_y * f \\ 0 & 0 & 1 \end{vmatrix}
Translate 平移 (s_x, s_y)#

Affine::translate(0.5, 0.5) * Affine

10px01py001acebdf001=ace+pxbdf+py001\begin{vmatrix} 1 & 0 & p_x \\ 0 & 1 & p_y \\ 0 & 0 & 1 \end{vmatrix} * \begin{vmatrix} a & c & e \\ b & d & f \\ 0 & 0 & 1 \end{vmatrix} = \begin{vmatrix} a & c & e + p_x \\ b & d & f + p_y \\ 0 & 0 & 1 \end{vmatrix}
Rotate 旋转 (a)#

Affine::rotate(a) * Affine

cos(a)sin(a)0sin(a)cos(a)0001acebdf001\begin{vmatrix} cos(a) & -sin(a) & 0 \\ sin(a) & cos(a) & 0 \\ 0 & 0 & 1 \end{vmatrix} * \begin{vmatrix} a & c & e \\ b & d & f \\ 0 & 0 & 1 \end{vmatrix}
Skew 倾斜 (ax, ay)#
1tan(ax)0tan(ay)10001acebdf001\begin{vmatrix} 1 & tan(ax) & 0 \\ tan(ay) & 1 & 0 \\ 0 & 0 & 1 \end{vmatrix} * \begin{vmatrix} a & c & e \\ b & d & f \\ 0 & 0 & 1 \end{vmatrix}