CSS弹性布局

CSS2.1定义了 4 中布局方式

  • 块布局:设计初衷是用于布局文档.指设置 display:block
  • 内联布局:设置的初衷是布局文本,display:inline
  • 表格布局:设置的初衷用于表格格式布局的二维数据
  • 定位布局 设计的初衷是精确定位 position;absolute绝对布局

display:flex声明发生了什么

给任意元素设置 display:flex,弹性布局就会被创建,flex 的子项会发生变化.

  • flex 子项块状化
    flex的父容器设置的 flex,flex 的子项也会发生相应的变化.inline/inline-block/block会变化成 block
  • flex子项浮动失效
    flex 子项的浮动 float:left/float:right都会失效
  • flex 子项支持 z-index属性
    即使 flex 子项的 position 属性的计算值是 static,flex 子项也是支持 z-index属性,如果 z-index属性不是 auto,则会创建新的层叠上下文
  • flex 子项的 margin 不会合并
    flex 子项的 margin 的值不会合并,这一点和普通块级元素不一样
  • flex 子项是格式化的尺寸
    flex 容器是用 margin:auto会对剩余空间智能分配
  • flex子项其他变化
    flex 子项如果设置了绝对定位,则会脱离弹性布局.flex子项表现为收缩,如果需要设置建议的尺寸,则可以给 flex 子项使用 flex-basic属性
    flex 子项默认是水平布局,这个特性是有 flex-direction属性决定的,而且就算 flex-子项的宽度超出了 flex 容器,flex 子项也不会换行.换行属性是由 flex-wrap属性决定的

flex-direction属性与整体布局方向

flex-direction属性用来控制 flex 子项的整体布局方向,决定是从左往右排序.flex-dirction属性有以下语法

  • row: row 是默认值,表示 flex 子项显示为水平排序.方向为当前文档水平流方向.row 的方向收文档 direction 影响
  • row-reverse 表示 flex 子项显示为水平排序.当方向和 row 属性相反
  • column 表示 flex 子项显示为垂直排序.默认情况下从上往下进行排序
  • column-reverse 表示 flex 子项显示为垂直排序,但是方向和 column 属性相反
flex-wrap属性和整体的换行表现

flex-wrap属性用来控制 flex 子项单行显示还是换行显示,以及在换行显示情况下,没一行内容是否在垂直方向的反向显示.

  • nowrap: nowrap 表示 flex子项不换行.如果 flex 子项超出了 flex 容器的宽度总和,那么 flex 子项会发生溢出的现象.如果给每个 flex 子项设置 max-weight的宽度为 100%,那么 flex 的子项会自适应宽度
  • wrap:wrap表示当 flex 子项总和宽度大于 flex 容器的时候,flex 子项会进行换行
  • wrap-reverse 表示宽度不足的时候,flex 子项会换行,但是与 wrap 的方向相反

flex-flow 属性

flex-flow属性是 flex-dirction属性和 flex-wrap属性的缩写.表示弹性布局的流动性特性

CSS 全新的对齐特性综述

CSS 在 flex 中属性名称基本上是几个固定单词的组合,且这些单词在整个 CSS 世界中是通用的含义

  • justify 表示水平方向样式的设置
  • align 表示垂直方向的样式设置
  • items 表示全体元素的样式设置
  • content 表示整体布局样式设置
  • self 表示元素自身样式设置,其一定应用到子元素上
    因此,justify-content 表示整体布局中的水平对齐方式,align-content表示整体布局中的垂直布局
justify-content 整体水平对齐

justify-content 属性在弹性布局中常用的语法如下

  • normal 值,表示根据环境的不同,可以采取不同的对齐方式
  • flex-start 默认对齐方式,它是一个 逻辑 CSS 属性,与文档的方向相关,默认表现是整体布局左对齐
  • flex-end 是逻辑 CSS 属性,与文档的流方向相关,默认表现为整体布局中的对右对齐.注意如果 flex 容易设置了 overflow 滚动,同时应用了 justify-content:flex-end,滚动会消失
  • center 表现为整体居中对齐,这个属性多用在弹性布局有对行且个数不确定的场景下
  • space-between 表示多余的空间间距只在元素中间分配
  • space-around 表示每个 flex 子项两边都环绕互不干扰的等宽间距,最终在视觉上表现边缘两侧的空白只有中间空白的一半
  • space-eventy 表示每个 flex子项两侧空白间距完全相等
垂直对齐属性 align-items和 align-self

align-item和 align-self属性的一个区别是 align-self属性是设置在具体的某个 flex 子项上,而 flex-items 属性是设置在 flex 容器上,器控制 flex 子项的垂直对齐方式,align-self默认值是 auto,其余的数据值个 align-items 属性值一致.属性如下

  • auto 是 align-self 属性的默认方式,表示 flex 子项的垂直对齐方式是由 flex 容器的 align-items决定的
  • flex-start 是逻辑 css 属性,与文档流方向相关,默认表现形式为 flex子项顶部对齐
    -flex-end 是逻辑 CSS 属性,与文档流方向相关,默认是 flex 子项底部对齐
  • center 表示子项都垂直居中对齐
  • baseline 表示 flex 子项参与基线的对齐
    如果 flex-direction是 colum 或者 column-reverse,则 flex 子项的垂直对齐方式不应该使用 align-items 控制,而是应该使用 justify-content属性控制
align-content 属性与整体布局的垂直布局

align-content属性和 align-items属性的区别在于 align-items属性设置的是每一个 flex 子项的垂直对齐方式,而 align-content 属性是将所有作为一个整体进行垂直对齐设置.align-content 属性如下所示

  • flex-start 是一个逻辑属性,与文档流方向相关,默认表现为顶部堆砌
  • flex-end 是逻辑属性,与文档流方向相关,默认底部堆砌
  • center 表现为整体的垂直对齐
  • space-between 表现上下两行两端对齐,剩下的每一行元素等分剩余空间
  • space-around 表现每一行上下享有独立不重叠的空白空间
  • space-evenly 表现每一行上下的空白空间的大小一致

order 属性

我们可以通过 order 属性来改变 flex 子项的顺序位置.order 属性越小优先级别越高

flex 属性

flex 属性是弹性布局的精髓,因此弹性布局就是 flex 属性的作用.flex 属性是 flex-grow flex-shinrk flex-basic这 3 个属性的缩写.我们先了解下flex 常用的几个声明
表示的是什么意思?

  • flex:1 等同于 flex:1 1 0%,flex:1 2 等同于flex: 1 2 0%,即 flex-basic使用的不是默认 auto,而是使用的是 0%
  • flex:100px 等同于 flex:1 1 100px ,即 flex-grow使用的不是默认的 0,而是使用的 1
  • flex:auto 等同于设置 flex:1 1 auto,其作用和他的名称一样,表示自动,即 flex 子项自动填充剩余空间或者自动收缩
  • flex:none 等同于 flex:0 0 auto 表示没有,即 flex 子项没有弹性,适用于固定尺寸元素
flex-grow flex-shrink flex-basic属性

flex-basic 属性用来表示基础宽度
flex-grow 属性表示宽度还有剩余的时候
flex-shrink 属性表示宽度不足的时候

flex:0 和 flex:none区别

flex:0等同设置 flex:0 1 0%,flex:none等同设置了 flex:0 0 auto.

  • flex:0 元素尺寸不会弹性增大,但是会弹性的收缩,考虑到此时 flex-basic属性是 0%,表示基础尺寸为 0,因此设置 flex:0的元素表现为最小内容宽度
  • flex:none 的尺寸同样不会弹性增大,但是也不会收缩,可以理解为元素的尺寸没有弹性变化,考虑到此时的 flex-basic属性是 auto,即基础的尺寸右内容决定,因此 flex:none 的元素最终尺寸通常表现为最大的内容宽度
  • flex:auto 等同于设置了 flex:1 1 auto,元素可以弹性增大,也可以弹性的减少,但是 flex:1容器不足时会优先最小内容尺寸,flex:auto在容器不足时会优先最大化内容尺寸.当希望元素充分利用剩余空间,但是元素各自的尺寸又需要按照各自内容进行分配的时候,即适合使用 flex:auto

弹性布局最后一行不对齐的处理

如果每一行个数固定

如果没一行的行数是固定的,则可以使用两种方式实现最后一行对齐

  • 模拟 space-between属性和间隙大小,使用 margin 对对吼一行内容出现的间隙进行控制.下面以每一行 4 个为例,最后一行对齐
.list:not(:nth-child(4n)) {
  margin-right:calc(4%/3)
}

要实现最后一行对齐,理论上最好使用 gap 属性设置间隙

  • 根据元素的个数最后一个元素设置动态的 margin 值
flex 子项宽度不固定
  • 给最后一个元素设置 margin-right:auto
  • 使用伪元素在列表的末尾创建一个 flex 子项,并设置 flex:auto或设置 flex:1
如果每一行行数不固定

如果每一行的行数不固定,则上面的方法都失效,需要使用其他的方式实现最最后一行对齐.可以使用空白标签进行填充占位,具体的占位数量由最多列数的个数决定

你可能感兴趣的:(CSS弹性布局)