浏览器页面布局规则
- 盒模型计算
- 内联元素与块状元素的布局规则
- 文档流布局
- 元素堆叠
盒模型计算
两个重要的场景:
有个宽度和高度都为100px的盒子,要怎么在调整边框大小的时候,不需要重新计算和设置宽度和高度呢?
元素的属性设置为 box-sizing: border-box
,这样盒模型就会转换为怪异盒模型,盒子设置的总宽高就为盒子的宽高,我们在调整边框和内边距时,不会影响改变盒子的宽高。
box-sizing: content-box
:标准盒模型,此时的宽度和高度为:content + padding + border
。
相邻盒子外边距重叠问题
两个上下相邻的盒子,我们给上边的盒子设置margin-bottom: 10px
,给下边的盒子设置margin-top: 10px
,我们首选会想到这两个盒子距离是20px
,但是结果只有10px
,因此,得出结论,两个相邻的盒子设置外边距会发生重叠且叠加后的值会以最大边距为准。
<style>
.tab-second-wrap .outer, .tab-second-wrap .inner {
width: 100px;
height: 100px;
background-color: #f60;
margin: 10px;
}
</style>
<div class="tab-second-wrap">
<div class="outer"></div>
<div class="inner">hello</div>
</div>
复制代码
注意:并不是所有情况下都会发生外边距的叠加:
- 行内框
- 浮动框
- 绝对定位框 之间外边距不会发生重叠
内联元素和块状元素
问题:
设置元素宽高不起作用的问题?
内联元素和块状元素的区别:
- 内联元素可以和其他内联元素排在同一行,且设置宽度和高度没有效果
- 块状元素不可和其他元素在同一行,且设置宽度和高度时有效果
所以说设置宽高不生效可能是因为元素为内联元素。
解决方法:
设置display
的值:
-
设置为
block
块状元素,此时可以设置高度和宽度 -
设置为
inline
内联元素,此时高度和宽度不起作用 -
设置为
inline-block
,可以理解为内联元素和块状元素的结合,布局规则:- 可以位于块状元素和其他内联元素内部
- 可容纳其他内联元素和块状元素
- 宽度高度起作用
作用:可以给元素设置居中,给内联元素设置宽高,将多个块状元素放在一行
文档流和元素定位
什么是文档流?
正常的文档流在 HTML 里面是从上到下,从左到右的排版布局。
文档流可以通过 position
进行调整:
- static:默认值,正常文档流(设置 top、left 无效)
- relative:元素不会脱离文档流档流,但是设置 top/left,元素会相对于自身的位置发生位移,且会占用空间。如何设置的top/left超出页面会出现滚动条。(设置
overflow: hidden
可以隐藏溢出部分) - absolute:元素脱离文档流,相对于包含块来进行定位,且不占位。
- fixed:元素脱离文档流,且不占位,看起来与
absolute
相似,但是在页面滚动时,fixed
元素的位置没有发生变化。fixed
是相对于浏览器窗口进行定位的。
将元素固定在页面的某一个位置?
回到问题,将元素固定到页面的某一个位置,可以通过设置 position: absolute
将元素固定在文档页面中,设置 position: fixed
可以将元素固定在浏览器窗口的固定位置。
元素堆叠 z-index
通过设置 z-index
的值,我们可以设置元素的堆叠顺序。
z-index 常用于多个元素层级的控制,比如弹窗在最上层,设置较大值的 z-index 来控制。
为什么给元素设置了 z-index: 99999 元素还是被遮挡住了呢?
z-index 值的设置只决定同一父元素中,同级子元素的堆叠顺序。
将某个子元素的 z-index: 99999
,可能是因为它的父元素的 z-index
小于其它同级父元素的z-index
,所以被挡住。
布局方式
常用的布局方式:
- 传统布局方式
- 结合(display/postion/float)属性以及一些边距,x/y轴距离等方式来进行布局。
- Flex 布局方式
- Grid 布局方式
为什么将元素里面的元素设置 float 之后,这个元素的高度就向上和其他元素重叠了呢?
float元素内部如果不存在其他普通流元素,就会表现为高度为 0 ,又称为高度塌陷。
解决方法:
相对于父元素:
- 设置
overflow: hidden
- 使父元素也成为浮动的float元素
- 使用clear清除浮动