-
Notifications
You must be signed in to change notification settings - Fork 20
Description
概述
- positioning(定位)
1.1. display
1.2. position
1.3. 盒子模型和外边距合并
1.4. 块格式化上下文
1.5. float——圣杯布局与双飞翼布局 - 表格布局
- 栅格布局
- 多栏布局
- 弹性布局
- 网格布局
1. positioning
主要是下面的css样式:
- display,指定用于元素的呈现框的类型。在 HTML 中,默认的 display 属性取决于 HTML 规范所描述的行为或浏览器/用户的默认样式表。在 XML中,其默认值为 inline。
none,关闭一个元素的显示,该元素如同不存在。
inline,该元素生成一个或多个行内元素盒。
block,该元素生成一个块元素盒。
list-item,该元素生成一个容纳内容和单独的列表行内元素盒的块状盒。
inline-block,该元素生成一个块状盒,该块状盒随着周围内容流动,如同它是一个单独的行内盒子(表现更像是一个被替换的元素)。
inline-table,在HTML中没有对应元素。它的行为就像一个HTML中的table元素,但是作为内联框,而不是块级框。 表格框内是一个块级上下文。
table,这个元素的作用就像 <table> 元素. 它定义了一个块级盒子。
table-caption,这个元素的作用的就像<caption> 一样。
table-header-group,这个元素的作用就像<tfoot> 一样。
table-footer-group,这个元素的作用就像<thead> 一样。
table-cell,这个元素的作用就像<td> 一样。
table-row,这个元素的作用就像<tr> 一样。
table-row-group,这个元素的作用就像<tbody> 一样。
table-column,这个元素的作用就像<col> 一样。
table-column-group,这个元素的作用就像<colgroup> 一样。
flex,该元素的行为类似于块级元素,并根据Flexbox模型来描述其内容。
inline-flex,该元素的行为类似于行内块级元素,并根据Flexbox模型来描述其内容。
grid,网格布局。
inline-grid,行内网格布局。
- position,指定一个元素在文档中的定位方式。static | relative | absolute | fixed | sticky
- float,指定一个元素应沿其容器的左侧或右侧放置,允许文本和内联元素环绕它。该元素从网页的正常流动中移除,尽管仍然保持部分的流动性(与绝对定位相反)。
- clear,清除浮动。none | left | right | both | inherit
当应用于非浮动块时,它将非浮动块的边框边界移动到所有相关浮动元素外边界的下方。这个非浮动块的垂直外边距会折叠。
另一方面,两个浮动元素的垂直外边距将不会折叠。当应用于浮动元素时,它将元素的外边界移动到所有相关的浮动元素外边界的下方。这会影响后面浮动元素的布局,后面的浮动元素的位置无法高于它之前的元素。
- visibility,元素的可视性。visible | hidden | collapse | inherit
visible,元素正常显示。
hidden,隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
collapse,用于表格行、列、列组和行组,隐藏表格的行或列,并且不占用任何空间。
- z-index,指定了一个具有定位属性的元素及其子代元素的 z-order。 当元素之间重叠的时候,z-order 决定哪一个元素覆盖在其余元素的上方显示。 通常来说 z-index 较大的元素会覆盖较小的一个。
还有下面的:
- top
当position设置为absolute或fixed时,top属性指定了定位元素上外边距边界与其包含块上边界之间的偏移。
当position设置为relative时,top属性指定了元素的上边界离开其正常位置的偏移。
当position设置为sticky时,如果元素在viewport里面,top属性的效果和position为relative等同;如果元素在viewport外面,top属性的效果和position为fixed等同。
当position设置为static时,top属性无效。
- bottom
- left
- right
圣杯布局与双飞翼布局
相同点:
- 圣杯布局和双飞翼布局解决的问题是一样的,就是两边定宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染。
- 圣杯布局和双飞翼布局解决问题的方案在前一半是相同的,也就是三栏全部float浮动,且左右两栏加上负margin让其跟中间栏div并排,以形成三栏布局。
不同点:
于解决”中间栏div内容不被遮挡“问题的思路不一样:圣杯布局,为了中间div内容不被遮挡,将中间div设置了左右padding-left和padding-right后,将左右两个div用相对布局position: relative并分别配合right和left属性,以便左右两栏div移动后不遮挡中间div;双飞翼布局,为了中间div内容不被遮挡,直接在中间div内部创建子div用于放置内容,在该子div里用margin-left和margin-right为左右两栏div留出位置。
最重要的,圣杯里的float:left元素设置margin-left: -100%并不能达到主要展示内容的左侧,还需要加上position:relative;left:<自身宽度>;但是双飞翼的float:left元素设置margin-left:-100%就可以达到预期效果
2. 表格布局
已经不推荐使用。
但是可以通过设置display来使用:
inline-table,在HTML中没有对应元素。它的行为就像一个HTML中的table元素,但是作为内联框,而不是块级框。 表格框内是一个块级上下文。
table,这个元素的作用就像 <table> 元素. 它定义了一个块级盒子。
table-caption,这个元素的作用的就像<caption> 一样。
table-header-group,这个元素的作用就像<tfoot> 一样。
table-footer-group,这个元素的作用就像<thead> 一样。
table-cell,这个元素的作用就像<td> 一样。
table-row,这个元素的作用就像<tr> 一样。
table-row-group,这个元素的作用就像<tbody> 一样。
table-column,这个元素的作用就像<col> 一样。
table-column-group,这个元素的作用就像<colgroup> 一样。
3. 栅格布局
一个可以无限嵌套的栅格布局,会包含:
- 栅格系统的容器
- 行
- 列
- 各列之间的空隙
设计理念如下:
以上提到的容器、行、列的盒子模型设置为box-sizing: border-box
- 容器的左右padding需要设置为某个特定的值,设为x
- 行的左右margin需要设置为-x
- 列的左右padding需要设置为x
注意:
行需要清除浮动,因为浮动会让父元素塌陷。
栅栏系统提供的功能:
- 行的gutter属性可以设置各列间的间隙,间隙包含在列的宽度里
- 列的span属性可以设置元素的宽度大小
- 列的offset属性可以设置元素的水平偏移量
4. 多列布局
可以使用float达到多列布局的目的。
但是现在浏览器支持更高级的方法:
主要的特性:
1. column-count,列数
2. column-width,列宽
3. column-gap,间隙
次要的特性:
break-after,描述在生成的盒子之后的页面,列或区域中断行为(换句话说,如何以及是否中断)。
break-before,定义页面,列或区域在生成的盒子之前应如何处理中断。
break-inside,描述了在多列布局页面下的内容盒子如何中断,如果多列布局没有内容盒子,这个属性会被忽略。
column-fill
column-rule
column-rule-color,CSS 特性 column-rule-color 让你可以设置在多列布局中被画在两列之间的规则(线条)的颜色。
column-rule-style,CSS 特性 column-rule-color 让你可以设置在多列布局中被画在两列之间的规则(线条)的样式。
column-rule-width,CSS 特性 column-rule-color 让你可以设置在多列布局中被画在两列之间的规则(线条)的宽度。
column-span,设置为all的时候跨越所有列
5. 弹性布局
flex布局模型:主轴和交叉轴、父容器和子容器
主轴和交叉轴
这是相对的概念,比如设置flex容器的方向(flex-direction)为水平方向,这就是主轴的方向,那么交叉轴就是垂直方向;如果设置flex容器的方向(flex-direction)为垂直方向,那么交叉轴就是水平方向。
父容器和子容器
父容器需要设置 display: flex,才会使flex布局生效
父容器可以设置子容器排列方向:flex-direction
父容器可以设置子容器在一行里排满后是否允许换行和换行的方式:flex-wrap
父容器可以设置子容器在一行里的对齐方式,包括主轴和交叉轴:justify-content(主轴)、align-items(单行)、align-content(多行)
总结来说,父容器设置了子容器的排列方向、换行方式、对齐方式
子容器可以设置在主轴方向上的初始大小(flex-basic)、拉伸因子(flex-grow)、收缩规则(flex-shrink)
子容器可以设置在主轴方向上的顺序:order
子容器可以覆盖父元素的align-items:align-self
6. 网格布局
网格是一组相交的水平线和垂直线,它定义了网格的列和行。
CSS网格布局具有以下特点:
- 可以使用固定的轨道尺寸创建网格,比如使用像素单位。你也可以使用比如百分比或者专门为此目的创建的新单位 fr来创建有弹性尺寸的网格。
- 可以使用行号、行名或者标定一个网格区域来精确定位元素。网格同时还使用一种算法来控制未给出明确网格位置的元素。
- 可以使用网格布局定义一个显式网格,但是根据规范它会处理你加在网格外面的内容,当必要时它会自动增加行和列,它会尽可能多的容纳所有的列。
- 网格包含对齐特点,以便我们可以控制一旦放置到网格区域中的物体对齐,以及整个网格如何对齐。
- 多个元素可以放置在网格单元格中,或者区域可以部分地彼此重叠。然后可以CSS中的z-index属性来控制重叠区域显示的优先级。
相关概念
- 网格容器
display: grid;
- 网格轨道
显式网格:
grid-template-columns
grid-template-rows
隐式网格:
grid-auto-rows
grid-auto-columns
fr单位:等份
定义重复部分:repeat()
轨道大小:minmax()
布局算法:grid-auto-flow,[ row | column ] || dense
- 网格线
应该注意的是,当我们定义网格时,我们定义的是网格轨道,而不是网格线。Grid 会为我们创建编号的网格线来让我们来定位每一个网格元素。
grid-column-start
grid-column-end
grid-row-start
grid-row-end
- 网格单元
- 网格区域
grid-template-areas
grid-area
- 网格间距
grid-gap
grid-column-gap
grid-row-gap
- 嵌套网格
嵌套网格和他的父级并没有关系。
- 控制层级
z-index
属性
容器:
grid
grid-area
grid-gap
显示网格:
grid-template
grid-template-areas
grid-template-columns
grid-template-rows
隐式网格:
grid-auto
grid-auto-columns
grid-auto-rows
布局算法:
grid-auto-flow:控制着自动布局算法怎样运作,精确指定在网格中被自动布局的元素怎样排列。
定位:
grid-column
grid-column-end
grid-column-gap
grid-column-start
grid-row
grid-row-end
grid-row-gap
grid-row-start
参考
圣杯布局和双飞翼布局的作用和区别
块格式化上下文
CSS 盒模型
CSS display
CSS 多列布局
CSS 弹性布局
网格布局的基本概念
CSS 网格布局
跟着写一个 CSS 栅格布局
Bootstrap响应式栅格系统的设计原理