元素绘制顺序

本文详细介绍了浏览器在绘制元素时的顺序,包括层叠上下文的概念、形成层叠上下文的元素条件以及不同类型的元素自身的绘制顺序,如根元素、块元素、列表项和表元素等。此外,还讨论了z-index的工作原理及其对元素叠放顺序的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

元素绘制顺序,顾名思义,即浏览器创建和布局元素的顺序,包括时间和空间顺序。

层叠上下文

HTML元素大多是二维的,所谓层叠上下文是指当多个元素在二维空间重叠时,如何在一个三维的空间上确定各元素的位置。形成层叠上下文的元素就会有一个三维坐标,这个第三维的坐标值受z-index的影响,但这个三维坐标的值并不一定等于z-index的值。

需要注意,HTML元素大部分是流式布局的(从上到下),元素之间并没有重叠,所以,并不是所有元素会形成层叠上下文,也就更没有z-index值。

其次,z-index是相对父层叠上下文(不是父元素)而言的,也就是说只有同一个层叠上下文中的元素相互重叠时,z-index才相互起作用。

叠层顺序,stacking queue

元素的z-index值越大,离用户就越近,反之越远。

为了更好的阐述z-index,就一下图为例。下图每一条竖线代表一个元素,同一行中的每条竖线表示视觉上叠在一起的元素,最右边代表用户的眼睛。元素重叠,用户只能看到z-index最大的那个元素,也就是离用户最近的元素。

                     |           |             |      |

                     |                  |      |      | 

                     |                  |      |      | ⇦ ☻ user

z-index:  canvas  -1    0    1      2

需要注意的是,同一个层叠上下文中,相同z-index值的子元素,后面的元素显示在前一个元素之上。也就是说,z-index只是一个相对坐标,而不是绝对的z轴坐标。

属性z-index的值默认是auto,在大多数情况下,实际等于0。布局时,负的z-index的最先,然后是z-index:auto或z-index:0,按DOM出现顺序绘制,最后是z-index值最大的元素。

根据前面所讲,不是所有元素都形成层叠,所以不是所有元素都会创建层叠上下文。下面再来了解哪些元素形成了层叠上下文。

形成层叠上下文的元素

HTML元素大部分是根据流式布局的,所以一般不会重叠。如果发生了子元素相互重叠的现象,则必定形成了层叠上下文。理论上常见的形成层叠上下文的元素有:

  • 根元素;
  • 相对、绝对定位元素,而且z-index不是auto。
  • position:fixed元素;
  • opacity小于1的元素;
  • transform不是none的元素;
  • filter不是none的元素;
  • isolation是isolate的元素;
  • will-change影响的样式属性为以上所指属性的元素;
  •  -webkit-overflow-scrolling为touch的元素;

以上只是理论情况,比如在Chrome 47中,transform并没有生成层叠上下文,此时使用z-index不会起任何作用,还得使用position:relative。

如果没有指定z-index,大部分元素按DOM出现顺序(树的前序遍历)绘制。

元素自身绘制顺序

除了元素之间有顺序,元素本身的内容也有绘制顺序,一般来说,是先涂背景颜色,然后是添加背景图片。如果元素比较复杂,则还有其他顺序。以下就来了解各种类型元素自身内容的绘制顺序。

根元素

根元素就是上面的canvas,也就是整个画布。

1.        根元素的背景颜色就是整个画布的背景颜色;

2.        根元素的背景图片就是整个画布的背景图片;

块元素、list-item

1.        首先绘元素的背景颜色;

2.        然后绘元素的背景图片;

3.        最后绘元素的边框;

表元素

1.        首先绘table的背景颜色、图片;

2.        绘column group的背景颜色、图片;

3.        绘column的背景颜色、图片;

4.        绘row group的背景颜色、图片;

5.        绘row的背景颜色、图片;

6.        绘单元格的背景颜色、图片;

7.        所有的表格边框(按照DOM出现顺序);

Outline

所有以上完成后,最后一步是绘制outline。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值