前端布局基础概述

一 布局方案:

传统布局(浮动、定位),flex布局,grid布局

1.传统布局:

掌握元素的分类和布局特性、浮动原理和定位原理。

2. flex布局:

通过父元素(flex box)单方面配置相关的CSS属性来决定子元素的布局规则,且在大多数情况下不需要子元素(flex item)的参与,就能完成子元素间地布局问题。

3. grid布局:

二维布局,在IE10才支持,需要使用-ms-后缀(IE11不需要)

二. 布局基础要点:

2.1 CSS基础盒模型(W3C盒模型)

Content area,是当前元素用来容纳所有子孙元素;Padding area,是当前元素用来隔离自身和子孙元素;Border area是当前元素用来显示自身的轮廓;Margin area,是当前元素用来隔离自身和相邻元素。
2.2 box-sizing(CSS3属性)
content-box(即content area)
padding-box(=content area + padding area)
border-box(=content area + padding area + border area)
margin-box(=content area + padding area + border area + margin area)
作用:告诉浏览器,CSS属性 width 和 height 是用于设置哪一种 box 的尺寸。
当box-sizing 值为 border-box时,不能与min-width, max-width, min-height, max-height 一起使用,因为IE-8对min-,max-的解析,仍作用于content-box,不受box-sizing控制。

2.3 元素的分类及布局属性
block-level, inline-level, inline-block-level
块级元素:display属性取 block,flex,grid,list-item 独占一行显示的元素
行内级元素:display取 inline
行内块级元素:inline-block, inline-table, inline-flex, inline-grid 兼具块级元素和行内级元素布局特性的元素。
 

块级元素:独占一行,(width默认100%,height:0);可以设置任何尺寸相关的属性(width,padding,border,margin)

行内级元素:

1)可置换行内元素:展示内容不在CSS作用域内的元素,展示的内容通过元素的 src, value等属性或 CSS conter属性从外部引用得到,可被替换。随着内容来源或内容数量的变化,可置换元素本身也会有水平和垂直方向上尺寸的变化,典型的可替换元素有<img>, <video>, <embed>, 表单类的可替换元素有<textarea>, <input>, 某些元素只在一些特殊情况下表现为可替换元素,<audio>, <object>, <applet>. CSS content 属性来插入的对象又称作匿名可替换元素。

2)不可置换行内元素:<a>, <span> 不可替换。

布局特点:

(1) 在一行内可以与多个同类型的元素从左到右排列

(2) 不可置换行内元素不能设置 width,height,垂直方向上的 margin ,可置换元素都可以。

(3) 在水平和垂直方向的对齐方式,受父元素的 text-align属性和自身 vertical-align 属性控制(父元素是table-cell时,也受父元素的vertical-align 属性控制),在水平方向默认左对齐,垂直方向上默认在行框的 baseline基线上显示。

注:有些浏览器将可置换行内元素重置为 inline-block 元素,布局特性相同,当 inline-level水平排列时,两两之间可能出现6px的空白。

行内块级元素:(兼具block-level和inline-block特性)

(1)排列方式和行内元素同,不独占一行,从左到右

(2)水平和垂直方向上对齐方式和行内级元素同

(3)和块级元素一样,可以设置任何尺寸属性(width默认0)

2.4 格式化上下文:

BFC:独立封闭的渲染区域,从区域顶部,一个接一个根据自身布局特性进行排列:块级元素:从上到下,相邻的块元素可用 margin 隔离,垂直方向相邻的块元素会发生 margin合并;inline-level / inline-level-block元素,从左到右。

创建 BFC 元素:

根元素或其它包含它的元素
浮动元素 (元素的 float 不是 none )
绝对定位元素 (元素的 position absolute fixed )
内联块 (元素具有 display : inline-block )
表格单元格 (元素具有 display : table-cell, HTML 表格单元格默认属性 ) 表格标题 (元素具有 display : table-caption , HTML表格标题默认属性)
overflow 值不为 visible 的块元素
display : flow-root
contain 为以下值的元素: layout , content , 或 strict
弹性项 ( display : flex inline-flex 元素的子元素)
网格项 ( display : grid inline-grid 元素的子元素)
多列容器 (元素的 column-count column-width 不为 auto , 包括 column-count: 1 的元素)
column-span : all  应当总是会创建一个新的格式化上下文,即便具有 column-span: all 的元素并不被包裹在一个多列容器中

特性: 

(1)对应一个独立封闭的渲染区域,子元素的CSS样式不会影响BFC元素外部。普通块级元素,子元素的margin-top 不会隔开自身与父元素(普通块级元素),但是会作用到父元素外部(将父元素和叔伯元素或祖父元素隔开);BFC元素,作为一个独立、封闭的渲染区域,子元素的 margin-top ,会隔开自身与父元素(BFC元素),不会影响到父元素外部。

(2)浮动元素参与BFC父元素的高度计算,也就是BFC元素能识别浮动元素。普通块级元素,不能识别浮动子元素,高度塌陷;BFC元素,能够识别,浮动元素参与BFC元素的高度计算。

(3)占据文档流的BFC元素(可使用 overflow:auto创建),能够识别浮动的兄弟元素,与之同行显示。普通块级:不能识别浮动的兄弟元素,会被浮动的兄弟元素覆盖部分内容。 

(4)占据文档流的BFC元素(可使用overflow:auto创建),width:auto时,会占满当前行的剩余宽度。 

IFC:

1.水平方向一个接一个地显示,垂直方向,每个元素可以设置不同的对齐方式,内部元素被一行行的矩形框包含,这些虚拟的矩形框称为行框。IFC的作用区域可以看成是包含所有子元素的行框组成的矩形区域。

 2. 创建:由所包含的子元素创建,只有在一个区域内仅包含可水平排列的元素时才会生成,子元素可以是文本、inline-level、inline-block-level。

3. 特性:

从左到右,从上到下排布;内部每个元素都可以通过设置vertical-align属性来调整在垂直方向上的对齐;包含这些内部元素的矩形区域,形成的每一行被称为 line box(行框)。

2.5 包含块:

1. 定义:

在设置元素属性尺寸属性的百分比值或偏移属性的值时,有一个“相对参考系”,它一般包裹着这个元素的块级祖先元素(一般块级父元素)或离这个元素最近的非 static(relative absolute fixed)定位的祖先元素,他们的容纳区域(content box / padding box)叫做包含块。

特别地,relative  偏移属性的相对坐标系是其在文档流原来的位置。

2. ICB(初始包含块)

在视觉阅读层面,展示内容的两种呈现方式:连续媒体,分页媒体。

连续媒体:采取连续展示内容的方式,保持了展示内容显示的连续性(一页显示所有内容),可以在连续媒体的可视窗口查看当前呈现的内容。浏览器窗口可以看成是连续媒体,当内容尺寸超过 viewport时,可以通过平滑滚动的方式来阅读内容。起始位置为画布原点(首屏的左上角,浏览器渲染数据后生成的内容文档可以看成是一张画布)

分页媒体:采用切页展示内容的方式,将要展示的内容切分成等尺寸的多页(分页显示所有内容),可以在页面显示区域查看当前呈现的内容。像幻灯片、电子书阅读器,就可以通过切页的方式来阅读。

3. 不同定位元素分别对应的包含块

static relative定位元素的包含块是其块级祖先元素(通常是块级父级元素)的 content box

absolute 的是最近的非静态定位祖先元素的padding box,查无非静态定位祖先元素,那么它的包含块是 ICB

fix 的是当前视窗

注:ICB(初始包含块)是专有名词,特指根元素<html />的包含块,不要将一个元素的初始包含块错误理解为它的父元素。、

2.6 基本原理

1. 文档流:页面元素默认存放的“容器”。

特性:按照书写顺序,从左到右,从上到下排列,页面元素根据自身布局属性(block-box / inline-box)决定行内显示还是换行显示;文档流中的元素,相互尊重,有序排列,彼此识别。

脱离文档流:元素脱离了默认存放的容器,换到另一个容器存放。一个元素脱离文档流会导致:它的父元素无法识别它,它也不参加父元素高度的计算。若有一个父元素的所有子元素都脱离文档流会出现“高度塌陷”问题。脱离文档流的方法:将元素设置为浮动元素,将元素设置为absolute、fix元素。

2. 浮动:

起始位置:最后一行最左侧的空白位置,而不管空白位置是否能够容纳当前浮动元素。

浮动方向:左浮动从起始位置向左浮动;右浮动向右。

结束位置:左:遇到第一个左浮动元素或包含块的最左侧padding时,结束浮动;右:遇到最右侧。

同一行内,最多有两条浮动队,左浮动队,右浮动队;一条浮动队可能占满一行;连续浮动的若干元素如果无法在同一行内显示,则会按行被切成两条或更多条浮动队。

浮动元素对 display 的影响:

3. 清除浮动:

作用:改变“当前元素” 与“前一个声明的浮动元素” 之间的默认布局规则,体现为:让当前元素换行显示。

使用者:当前元素(浮动元素  / 非浮动元素的块级元素)。作用对象(清除谁的浮动):前一个声明的浮动元素。

为什么使用者不包括非浮动的 inline 元素?

因为非浮动的 inline 元素能识别浮动元素,是否使用 clear 清除“前一个声明的浮动元素”的浮动,布局结构是一样的。非浮动的块级元素,无法识别前面声明的左浮动元素,故会和左浮动元素发生重叠(左浮动元素在上),所以非浮动的块级元素使用 clear:left 清除前一个左浮动元素,避免重叠。

clear 属性的取值及应用场景:

left 值的应用场景:前面声明的浮动元素是向左浮动;both:前面声明的浮动元素浮动方向不确定。

注:当前元素如果要清除浮动,清除的是前面声明的浮动元素的浮动,clear 属性要取什么值,跟当前元素的是否浮动或浮动方向没有任何关系,而取决于其前面声明的浮动元素的浮动方向。

如果当前浮动元素或非浮动块级元素,且前面声明的元素是左(右)浮动元素,那么当前元素可以使用 clear:left / right,清除前一个左(右)浮动元素的左(右)浮动,此时当前元素会换行显示;如果当前元素 clear 的浮动与前面一个浮动元素的浮动方向不同向,当前元素不会换行。

清除浮动后 margin 的合并问题:

(1)两个浮动的元素之间,垂直方向上的 margin 不会合并。

(2)非浮动的块级元素和浮动元素之间,垂直方向上的 margin会合并。

清除浮动的特殊应用:解决父元素的高度塌陷问题。

4. 定位:

static: 无法设置 top、right、bottom、left四个偏移属性

relative: 元素在文档流原来的位置

absolute: 离元素最近的一个非 satic (relative / absolute / fixed)定位祖先元素(包含块是它的padding box),如果没有,则为 ICB(出示包含块),即为元素 html 的包含块。

fixed: 当前视窗(viewport)

5. line box(行框)

包含 IFC 内部的所有子元素的虚拟矩形区域,形成的每一行。

模型结构(七线谱):

top text-top middle baseline text-bottom bottom线,

行框的高度:一行的 top 线和 bottom 线间的垂直距离(上下两个行半距的高度和一个内容区域的高度之和)。影响行框高度计算的因素:(1)自身 line-height 属性的设置,(2)内部 inline-level 子元素的 margin box 高度的取值和 line-height、vertical-align 两个属性的设置。

两个重要属性:line - height  vertical - align 

由行框和行框内的 inline-level 元素体现,inline-height 决定 inlilne-level 元素所在行框的高度,是 inline-level元素在一行内垂直方向上的显示范围;vertical-align属性决定 inline-level 元素在一行内的垂直对齐方式,即决定 inline-level 元素在一行内垂直方向上的最终位置。

1)line-height

作用:一般用于块级元素设置其内部每一行的高度,即默认行高;也可用于不可置换元素(span a)设置所在行框的高度,每一行计算出的最终行高,既受父元素 line-height 的影响,也受子元素 line-height 的影响。

取值:<length>, <number>, <percentage> 和关键字 normal(默认值)

length:使用指定带单位的长度来设置 line-height,长度单位可以是 px pt em rem

number:使用 font-size 值的倍数来设置 line-height

percentage:用 font-size 值的百分比来设置 line - height 

关键字 normal:计算出的尺寸,取决于浏览器各自的解析机制和选用的 font-family类型,浏览器根据选用的 font-family 类型计算出一个合适值。

对元素高度的影响:

(1)对块级元素自身 height 的影响:不设置 height 时,元素仅有一行时,height=line-height,多行时,height等于每一行的 line-height 之和。

(2)对不可置换行内元素(span)height 的影响:单行时:height=text-top 到 text-bottom 的距离,line-height 取值不会影响到 height,height 由 font-size 和浏览器的默认机制决定(一般 >  font-size ,大小取决于浏览器解析机制)。多行时:height=第一行的 text-top线到最后一行的 text-bottom 线的距离,line-height 取值会影响到 height,height=line-height * 行数-(line-height - 每一行 text-top线到 text-bottom 的距离 ),即 height=line-height*行数 - 2*half - heading

(3)不可置换的子元素(span)的line-height 对父元素 height 的影响

块级元素的每一行行高都可以不同;不可置换的子元素(span)的line-height 可以决定所在行框的高度;如果一个父元素不设置 height,那么其height=所有行高之和;不可置换的行内子元素的 line-height 属性是通过影响行框的高度来影响父元素的高度的。

2)vertical-align 属性:

用于设置 inline-level 元素自身在行框内的垂直对齐方向,控制范围在一行内。值有 top、middle、baseline(默认)、bottom,不常用的有 text-top, text-bottom, sub, super, 几乎不用的 length, percentage.

取值作用:

top:当前 inline-level 元素的上 margin edge 在行框内贴顶;

bottom: 下 margin edge 在行框内贴底;

middle:垂直平分线和行框内的 middle 线重合;

baseline:下 margin edge 紧贴在行框的 baseline上。

table-cell 元素用于控制其内部子元素在垂直方向上的对齐方式,而且这些子元素的类型不受限制,span / div,用 table 布局来实现子元素在父元素内部垂直居中。

6. margin

用来隔离自身与相邻元素或父元素,在元素水平 垂直方向上的居中定位发挥重要作用。

6.1 auto的计算规则(在 width 和 margin 上使用)

1)水平方向

设置文档流中的块级元素在父元素内部水平居中:给元素设置固定宽度,使用 margin:0 auto

文档流中的块级元素如果不设置任何水平尺寸属性,默认的width 是当前行的 content width,此时 width 取 auto 和 100% 最终计算值一样。

2)垂直方向

不可以设置 margin:auto 0,让其垂直居中,因为文档流中的块元素垂直方向的 margin 为 auto 计算规则与水平方向上计算规则不同:不取父元素剩余的高度,而是0.

虽不能使用margin: auto 0,实现普通文档流中的块级元素在父元素内部垂直居中, 但是可以使用
margin: auto 0,实现绝对或固定定位元素在包含块内部垂直居中 ,因为绝对或固定定位元素垂直方向上的margin,其 auto仍会取包含块的剩余高度。子元素outheight (当前子元素 margin box 的高度)= 包含块 height - 子元素 top - 子元素 bottom。(包含块 height 可以是当前子元素的相对定位的相对定位参考系的 padding box 的高度、ICB 的高度或 viewport 的高度)

 要实现子元素在父元素内部垂直居中,就要保证:子元素的 top 值 + bottom值为 0,(让子元素 outheight = 包含块 height);子元素的 top 值取0 (让子元素的上 margin edge 紧贴包含块的顶部)。

说明:绝对定位的子元素 top 为 0,轮廓(包含margin)的上边界与其包含块内容区域的顶部紧贴

6.2 margin合并:

垂直方向上:元素与自身或相邻的兄弟元素、父元素、子元素的 margin 发生合并,margin 取较大的值,水平方向上则不会。

6.3 子元素的 margin 垂直方向隔离父元素的情况(水平始终可以隔离):

(1)父元素是 BFC 元素

(2)父元素拥有 border

(3)父元素拥有 padding

(4)子元素是可置换元素或 display为 inline-block inline-table table-caption的元素 (可置换行内元素的display 属性为 inline-block、inline-table 的子元素,垂直方向上的 margin 能够隔离自身与父元素)。

在垂直方向上,兄弟元素之间不要设置相邻的 margin ,子元素也不要使用 margin 来隔离父元素,这样有较好的兼容性。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值