Skip to content

CSS 布局相关 #17

@coconilu

Description

@coconilu

概述

  1. positioning(定位)
    1.1. display
    1.2. position
    1.3. 盒子模型和外边距合并
    1.4. 块格式化上下文
    1.5. float——圣杯布局与双飞翼布局
  2. 表格布局
  3. 栅格布局
  4. 多栏布局
  5. 弹性布局
  6. 网格布局

1. positioning

主要是下面的css样式:

  1. 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,行内网格布局。
  1. position,指定一个元素在文档中的定位方式。static | relative | absolute | fixed | sticky
  2. float,指定一个元素应沿其容器的左侧或右侧放置,允许文本和内联元素环绕它。该元素从网页的正常流动中移除,尽管仍然保持部分的流动性(与绝对定位相反)。
  3. clear,清除浮动。none | left | right | both | inherit
当应用于非浮动块时,它将非浮动块的边框边界移动到所有相关浮动元素外边界的下方。这个非浮动块的垂直外边距会折叠。
另一方面,两个浮动元素的垂直外边距将不会折叠。当应用于浮动元素时,它将元素的外边界移动到所有相关的浮动元素外边界的下方。这会影响后面浮动元素的布局,后面的浮动元素的位置无法高于它之前的元素。
  1. visibility,元素的可视性。visible | hidden | collapse | inherit
visible,元素正常显示。
hidden,隐藏元素,但是其他元素的布局不改变,相当于此元素变成透明。
collapse,用于表格行、列、列组和行组,隐藏表格的行或列,并且不占用任何空间。
  1. z-index,指定了一个具有定位属性的元素及其子代元素的 z-order。 当元素之间重叠的时候,z-order 决定哪一个元素覆盖在其余元素的上方显示。 通常来说 z-index 较大的元素会覆盖较小的一个。

还有下面的:

  1. top
当position设置为absolute或fixed时,top属性指定了定位元素上外边距边界与其包含块上边界之间的偏移。
当position设置为relative时,top属性指定了元素的上边界离开其正常位置的偏移。
当position设置为sticky时,如果元素在viewport里面,top属性的效果和position为relative等同;如果元素在viewport外面,top属性的效果和position为fixed等同。
当position设置为static时,top属性无效。
  1. bottom
  2. left
  3. right

圣杯布局与双飞翼布局

相同点:

  1. 圣杯布局和双飞翼布局解决的问题是一样的,就是两边定宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染。
  2. 圣杯布局和双飞翼布局解决问题的方案在前一半是相同的,也就是三栏全部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. 栅格布局

一个可以无限嵌套的栅格布局,会包含:

  1. 栅格系统的容器
  2. 各列之间的空隙

设计理念如下:

以上提到的容器、行、列的盒子模型设置为box-sizing: border-box

  1. 容器的左右padding需要设置为某个特定的值,设为x
  2. 行的左右margin需要设置为-x
  3. 列的左右padding需要设置为x

注意:

需要清除浮动,因为浮动会让父元素塌陷。

栅栏系统提供的功能:

  1. 行的gutter属性可以设置各列间的间隙,间隙包含在列的宽度里
  2. 列的span属性可以设置元素的宽度大小
  3. 列的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网格布局具有以下特点:

  1. 可以使用固定的轨道尺寸创建网格,比如使用像素单位。你也可以使用比如百分比或者专门为此目的创建的新单位 fr来创建有弹性尺寸的网格。
  2. 可以使用行号、行名或者标定一个网格区域来精确定位元素。网格同时还使用一种算法来控制未给出明确网格位置的元素。
  3. 可以使用网格布局定义一个显式网格,但是根据规范它会处理你加在网格外面的内容,当必要时它会自动增加行和列,它会尽可能多的容纳所有的列。
  4. 网格包含对齐特点,以便我们可以控制一旦放置到网格区域中的物体对齐,以及整个网格如何对齐。
  5. 多个元素可以放置在网格单元格中,或者区域可以部分地彼此重叠。然后可以CSS中的z-index属性来控制重叠区域显示的优先级。

相关概念

  1. 网格容器
display: grid;
  1. 网格轨道
显式网格:
    grid-template-columns
    grid-template-rows
隐式网格:
    grid-auto-rows
    grid-auto-columns
fr单位:等份
定义重复部分:repeat()
轨道大小:minmax()
布局算法:grid-auto-flow,[ row | column ] || dense
  1. 网格线
应该注意的是,当我们定义网格时,我们定义的是网格轨道,而不是网格线。Grid 会为我们创建编号的网格线来让我们来定位每一个网格元素。
grid-column-start
grid-column-end
grid-row-start
grid-row-end
  1. 网格单元
  2. 网格区域
grid-template-areas
grid-area
  1. 网格间距
grid-gap
grid-column-gap
grid-row-gap
  1. 嵌套网格
嵌套网格和他的父级并没有关系。
  1. 控制层级
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响应式栅格系统的设计原理

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions