入门10 浮动定位BFC边距合并
1. 浮动元素有什么特征?对父容器、其他浮动元素、普通元素、文字分别有什么影响?
浮动元素的特征:
- 不占据普通文档流的空间。
- 浮动元素的左(右)外边界不能超过其包含块的左(右)内边界。
- 浮动元素的左(右)外边界必须是源文档中之前出现的左浮动(右浮动)的元素的右(左)边界,除非后出现浮动元素的顶端在先出现浮动元素的底端下面。
- 左浮动元素的右外边界不会在其右边浮动元素的左外边界的右边。一个右浮动元素的左外边界不会在其左边任何左浮动元素的右外边界的左边。
- 一个浮动元素的顶端不能比其父元素的内顶端更高。
- 浮动元素的顶端不能比之前所有浮动元素或块级元素的顶端更高。
- 如果文档中一个浮动元素之前出现另一个元素,浮动元素的顶端不能比包含该元素所生成的框的任何行框的顶端更高。
- 如果浮动元素出现在另一个浮动元素的旁边,而因此可能导致超出包含块的话,这个浮动元素会向下浮动到之前浮动元素下面的某一点。
- 浮动元素必须尽可能高地放置。
- 左浮动元素必须向左尽可能远,右浮动元素必须向右尽可能远。
- inline元素设置浮动,改变inline的display使得它像个block-level。
- 在重叠上,浮动元素会遮盖block-level元素的背景,不会遮盖inline元素。
内边界:指盒模型中的content边界。外边界:指盒模型中的margin边界。
影响:
- 非BFC的正常文档流父元素会"感受"不到浮动元素的存在,从而产生"高度塌陷"。
- 其他浮动元素会"察觉"到浮动元素的存在按照从左到右的"正常文档流"排列。
- 普通元素(非inline-level)会无视浮动元素的存在,从而占据浮动元素的"原来的位置"。
- 文字(也既inline-level)级的元素会环绕浮动元素,表现的像是察觉到浮动元素一样。
文档流是指按照从左到右、从上到下的布局方式,又称普通流、正常流、标准文档流。标准化的语言是:文档流是浏览器按照 HTML 的内容按顺序解析并呈现,遇到行内元素就往行内放,遇到块级元素就空一行放置,一次排列。
2. 清除浮动指什么? 如何清除浮动? 两种以上方法
清除浮动是指清除浮动元素给父元素造成的高度塌陷和给其他元素产生的影响。
方法一:给父元素设置after伪元素。
.clearfix::after{
content: "";
display: block;
clear: both;
}
方法二:创建BFC,将浮动元素限定在BFC内,避免影响其他元素。
overflow: hidden/auto/scroll
float: left/right
position: absolute/fixed
display: inline-block/table-cell/table-caption
清除浮动指元素的侧边不允许出现浮动元素,从而使得浮动元素的不占据普通文档流空间的使得父元素的高度塌陷问题得到解决,主要通过clear属性实现。
clear:指定一个元素是否可以在它之前的浮动元素旁边,或者必须向下移动(清除浮动) 在它的下面。clear 属性适用于浮动和非浮动元素。
当应用于非浮动块时,它将非浮动块的边框边界移动到所有相关浮动元素外边界的下方。这个行为作用时会导致margin collapsing不起作用。
当应用于浮动元素时,它将元素的外边界移动到所有相关的浮动元素外边界的下方。这会影响后面浮动元素的布局,后面的浮动元素的位置无法高于它之前的元素。
方法:
- 设置浮动包含块的父元素height值。
- 使得含块的父元素变成BFC。
- 通过添加:after伪元素,然后在伪元素上设置clear属性来实现。
3. 有几种定位方式,分别是如何实现定位的,参考点是什么,使用场景是什么?
定位方式 | 实现方式 | 使用场景 |
---|---|---|
static | 默认布局,按照文档流定位 | 默认布局 |
relative | 相对于元素自身正常位置进行定位,元素在文档流中仍占据原来空间,只是表现出来的位置会相对原来的位置偏移 | 适用于层叠效果 |
absolute | 绝对定位,相对于有除static外定位属性的第一个父元素偏移,absolute定位元素会脱离文档流 | 适用于小区块的布局使用频繁 |
fixed | 相对浏览器窗口定位,设置的偏移属性,是相对于浏览器窗口的位置 | 适用于广告等意图一直出现在用户眼前的信息 |
- inherit
从父元素继承position属性的值
一般不用 - static默认值,没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)
- relative
生成相对定位的元素,相对于元素本身正常位置进行定位
属性值:left, top,right ,bottom
应用于对其自身进行细微调整 - absolute
生成绝对定位的元素,相对于static定位以外的第一个祖先元素(offset parent)进行定位
属性值:left, top,right ,bottom - fixed
生成绝对定位的元素,相对于浏览器窗口进行定位。
属性值:left, top,right ,bottom
需要一直停留在窗口的元素,例如 - sticky
兼容性较差,一般用JS实现
新的css3属性,它的表现类似position:relative和position:fixed的合体,目标区域在屏幕中可见时,它的行为就像position:relative; 而当页面滚动超出目标区域时,它的表现就像position:fixed,它会固定在目标位置。 - 注意:如果同时定义了left和right值,且width和height有值,那么left生效,right无效,同样,同时定义了top和bottom,top生效。
4. z-index 有什么作用? 如何使用?
z-index 属性设置元素的堆叠顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面
值 | 描述 |
---|---|
auto | 默认,堆叠顺序与父元素相等 |
number | 根据数值确定元素的堆叠顺序 |
inherit | 从父元素继承z-index的值 |
-
z-index规定了元素在Z轴(距离用户远近)上的顺序,值越大则越靠近用户,表现就是元素在最上面。
-
z-index仅在设置了position非static属性的元素生效,且z-index的值只能在兄弟元素之间比较。
-
Z-index默认值为auto,则不建立层叠上下文。设置为0则会建立层叠上下文。
5. position:relative和负margin都可以使元素位置发生偏移?二者有什么区别
position:relative相对自己原本的位置偏移,不影响其它普通流中元素的位置。
margin:除了让元素自身发生偏移还影响其它普通流中的元素。
6. BFC 是什么?如何生成 BFC?BFC 有什么作用?举例说明
BFC:块格式化上下文(block formatting context) 是Web页面的可视CSS渲染的一部分。它是块盒子的布局发生及浮动体彼此交互的区域。首先BFC是一个名词,是一个独立的布局环境,我们可以理解为一个箱子(实际上是看不见摸不着的),箱子里面物品的摆放是不受外界的影响的。
形成条件:
- 根元素或其它包含它的元素
- 浮动 (元素的 float 不是 none)
- 绝对定位的元素 (元素具有 position 为 absolute 或 fixed)
- 内联块 inline-blocks (元素具有 display: inline-block)
- 表格单元格 (元素具有 display: table-cell,HTML表格单元格默认属性)
- 表格标题 (元素具有 display: table-caption, HTML表格标题默认属性)
- 块元素具有overflow ,且值不是 visible
- display: flow-root
应用: - 自适应的两栏布局。
- 清除元素内部浮动。
- 嵌套元素margin边距合并问题的解决。
7. 在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例
在以下场景中外边距合并:
- 同一个BFC,且同处于普通流中的垂直相邻元素外边距合并。
- 父子元素的外边距合并。
- 空元素的外边距合并。
外边距合并规则:
- 两个margin都是正值的时候,取两者的最大值;
- 当 margin 都是负值的时候,取的是其中绝对值较大的,然后,从0位置,负向位移;
- 当有正有负的时候,先取出负 margin 中绝对值中最大的,然后,和正 margin 值中最大的 margin 相加。
- 所有毗邻的margin要一起参与运算,不能分步进行。
不让相邻元素外边距合并的方法:
- 被非空内容、padding、border 或 clear 分隔开。
- 不在一个普通流中或一个BFC中。
- margin在垂直方向上不毗邻。
总结:
- 这些margin都处于普通流中,并在同一个BFC中;
- 这些margin没有被非空内容、padding、border 或 clear 分隔开;
- 这些margin在垂直方向上是毗邻的,包括以下几种情况:
- 一个box的top margin与第一个子box的top margin
- 一个box的bottom margin与最后一个子box的bottom margin,但须在该box的height 为auto的情况下
- 一个box的bottom margin与紧接着的下一个box的top margin
- 一个box的top margin与其自身的bottom margin,但须满足没创建BFC、零min-height、零或者“auto”的height、没有普通流的子元素。
- 例外的情况
- 根元素的外边距不会参与折叠
- 不设置任何属性的空span和空div不影响任何布局,可以无视之。