传统布局方式的局限性

传统的网页布局方式,采用 display + position + float 的方式来实现。这种方式,无法实现一些复杂的布局,并且在实现某些布局时,会有一些局限性。

比如,最常见的多列布局,我们一般是通过 float 来实现的。这种方式并不是标准,float 属性一开始是用来实现文字环绕图片的效果,后来人们发现这货比 display: inline 之类的属性好用,便用它来实现多列布局。

再如,垂直居中的实现,也是各种奇淫技巧,并没有标准的实现方式。

即使是最简单的水平居中,也经常通过 margin: 0 auto 来实现的。虽然居中的功能是实现了,但从语义方面来说,这种写法也不是很规范。

当然,并不是说,非标准的就是不好。但是非标准的方式,对新手来说,往往学习成本比较高,并且还有各种副作用。比如用 float 实现布局需要我们手动清除浮动,而清除浮动的方式也是各种奇淫技巧。

本文介绍的Flex 布局,能为我们解决这些问题。

这篇文章主要介绍 Flex 相关的概念和每一个属性的用法。

Flex 布局是什么

Flex 布局是 Flexible Box 的缩写,也叫做弹性布局。我们可以通过下面的方式来实现 Flex 布局。

.box {
    display: -webkit-flex;
    display: flex;
}

设置了 display: flex 的元素,其子元素 的 floatclearvertical-align 属性将会失效。

Flex 模型介绍

在学习 Flex 的用法之前,我们先来学习 Flex 的基本概念。

  • 设置了 display: flex 的元素称为 Flex 容器(flex container)、其子元素称为 Flex 项(flex item)。
  • 默认水平方向为主轴(main axis)、主轴开始位置称为 main start,主轴结束位置称为 main end。
  • 与主轴垂直的轴是交叉轴(cross axis),交叉轴开始位置称为 cross start,交叉轴结束位置称为 cross end。

Flex 容器

Flex 容器支持以下六个属性:

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-items
  • align-content

flex-direction

flex-direction属性用来设置主轴的方向。它有以下四个值。

row(默认值):水平向右为主轴方向。

row-reverse:水平向左为主轴方向。

column:垂直向下为主轴方向。

colunm-reverse:垂直向上为主轴方向。

主轴和交叉轴是相互垂直的,也就是说,如果设置了主轴的方向为垂直方向,那么交叉轴的方向就是水平方向。

flex-wrap

flex-wrap 属性用来设置 Flex 项的换行方式。它有以下三个值。

nowrap(默认值):不换行。

wrap:换行。

wrap-reverse:换行,先排最后一行。

flex-flow

flex-flow 属性是 flex-directionflex-wrap 的缩写。默认值 row nowrap

flex-flow: flex-direction flex-wrap;

justify-content

justify-content 属性用来设置 Flex 项在主轴上的排列方式。它有以下五个值。

flex-start(默认值):从 main start 开始排列。

flex-end:从 main end 开始排列。

center:在主轴上居中。

space-between:两端对齐。Flex 项之间的距离相等。

space-around:每一个 Flex 项左右的距离相等。两项之间的距离是旁边的距离的两倍。

align-items

align-items 属性用来设置 Flex 项在交叉轴上的对齐方式。它有以下五个值。

flex-start:交叉轴的起始位置(cross start)对齐。

flex-end:交叉轴的结束位置(cross end)对齐。

center:交叉轴的中点对齐。

baseline: Flex 项的第一行文字的基线对齐。

stretch(默认值):Flex 项目将占满整个 Flex 容器的高度。但是如果 Flex 项设置了高度,该属性不起作用。

align-content

align-content 属性用来设置交叉轴上多行对齐方式,类似于 justity-content。这个属性只有在交叉轴上的行数大于一时才起作用。它有以下六个属性。

stretch(默认值):多行占满整个轴线。

注意:如果 Flex 设置了高度,这个属性不起作用。

flex-start:与交叉轴的起始位置对齐。

flex-end:与交叉轴的结束位置对齐。

center:与交叉轴的中点位置对齐。

space-between:在交叉轴上两端对齐,每行之间的距离相等。

space-around:每行的上下距离相等。两行之间的间距是最上面和最下面的间距的两倍。

Flex 项

Flex 项支持以下属性:

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self

order

order 属性用来设置 Flex 项的顺序。默认为 0。数值越小,Flex 项越排在前面。

.item:nth-child(1){
    order: 3;
}
.item:nth-child(2){
    order: 2;
}
.item:nth-child(3){
    order: 1;
}

flex-basis

flex-basis 属性用来设置 Flex 项的宽度,用法与 width 一样。可以当做是 width 的别名。默认值为 auto。如果元素同时设置了 flex-basis 属性和 width 属性,flex-basis 属性会覆盖 width 属性,即 width 属性不会起作用。

如果是 Flex 项,建议使用 flex-basis 而不是 width,这样比较符合规范。

flex-grow

flex-grow 属性用来设置,当 Flex 容器的宽度大于所有 Flex 项目的宽度的总和时,剩下的空间如何分配给子元素。若 Flex 容器的宽度小于或等于所有 Flex 项目宽度的总和,即没有剩余空间,该属性不会起作用。

对于 flew-grow 大于 1 的 Flex 项,会按照 flew-grow 的值的比例分配剩余的空间。比例越大,分配的就越大。flew-grow 值为 2 的 Flex 项分配到的宽度是flew-grow 值为 1 的两倍。

默认值是 0,即按原先的大小显示,不需要分配额外的宽度。

举个例子,Flex 容器中共有三个 Flex 项,他们 flew-grow 的值分别为 0、2、3。则第二个 Flex 项目的最终宽度为:原先的宽度 + 剩余的宽度 * 2 / (2 + 3)。

flex-shrink

flex-shrink 属性用来设置,当 Flex 容器的宽度小于所有 Flex 项目宽度的总和,即空间不足时,Flex 项如何缩小宽度。只有空间不足时,该属性才会起作用。

值越大,减小的就越大。值为 0,表示不减小。默认值为 1

关于减小后的宽度的计算还是有点麻烦的,鉴于篇幅有限,不再此说明。

flex

flex 属性是 flex-growflex-shrinkflex-basis 的缩写。默认值为 1 1 auto

flex: flex-grow flex-shrink flex-basis;

align-self

Flex 容器的 align-items 属性会作用于所有 Flex 项,如果你希望某个 Flex 项不遵循 align-items 属性设置的值,可以用 align-self 属性覆盖。用法与 align-items 一致。

总结

Flex 布局会是未来布局的首选,尽管在兼容性方面还是有点不足。你可以根据下面的脑图,回顾一下这篇文章讲解过的知识。

下一篇文章,会讲解如何用 Flex 实现常见的布局。

参考

CSS 学习笔记 - Flex 布局的更多相关文章

  1. CSS学习笔记09 简单理解BFC

    引子 在讲BFC之前,先来看看一个例子 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  2. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  3. css学习笔记四

    广州天气变冷了,css学习笔记还是要总结. 总结: 1:几米页面静态页面主要是一列结构头部banner图,mainbody部分放文字内容和图书图片,底部是页面的版权信息 2:腾讯软件中心静态页面制作( ...

  4. CSS学习笔记10 相对定位,绝对定位与固定定位

    文档流中的元素的位置由元素在 (X)HTML 中的位置决定,这就是最原始的普通流,前面讲到的浮动CSS学习笔记08 浮动可以改变元素在文档流中的位置,除了这个我们还可以通过使用CSS的position ...

  5. CSS学习笔记08 浮动

    从CSS学习笔记05 display属性一文中,我们知道div是块元素,会独占一行,即使div的宽度很小,像下面这样 应用display属性的inline属性可以让div与div共享一行,除了这种方法 ...

  6. CSS学习笔记之选择器

    目录 1.元素选择器 2.继承 3.选择器分组 4.声明分组 5.后代选择器 6.子元素选择器 7.相邻兄弟选择器 8.类选择器 9.ID 选择器 10.属性选择器 11.伪类 12.伪元素 1.元素 ...

  7. 2022-07-10 第五小组 pan小堂 css学习笔记

    css学习笔记 什么是 CSS? CSS 指的是层叠样式表* (Cascading Style Sheets) CSS 描述了如何在屏幕.纸张或其他媒体上显示 HTML 元素 CSS 节省了大量工作. ...

  8. HTML+CSS学习笔记 (7) - CSS样式基本知识

    HTML+CSS学习笔记 (7) - CSS样式基本知识 内联式css样式,直接写在现有的HTML标签中 CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌 ...

  9. HTML+CSS学习笔记 (6) - 开始学习CSS

    HTML+CSS学习笔记 (6) - 开始学习CSS 认识CSS样式 CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏 ...

随机推荐

  1. POJ 3342 Party at Hali-Bula / HDU 2412 Party at Hali-Bula / UVAlive 3794 Party at Hali-Bula / UVA 1220 Party at Hali-Bula(树型动态规划)

    POJ 3342 Party at Hali-Bula / HDU 2412 Party at Hali-Bula / UVAlive 3794 Party at Hali-Bula / UVA 12 ...

  2. Eclipse简单插件开发-启动时间提示

    1.新建Plug-in Project 不用改其他选项,直接点击"Next",然后点击"Finish"   2.新建ShowTime.java package ...

  3. 微信小程序 瀑布流布局

    今天做小程序的时候,碰到一个比较常见的需求,就是要瀑布流布局,两列,交错分布,大概如下图 最终要实现的结果就是如左图所示. 不过在微信小程序里面,不能通过JavaScript来直接操作dome,所以一 ...

  4. 玩玩微信公众号Java版之二:接收、处理及返回微信消息

    前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~   可以用我们的微信号来直接进行测试,下面先看测试效果图:   这是最基本的文本消息的接收.处理及返回,来看看是怎么实现的吧!   首先可 ...

  5. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  6. 基于android的语音质量评估

    最近研究如何通过android评估通话质量,希望获取的参数有:(1)接通时长 (2)掉话次数 (3)语音是否清晰,以下将给出接通时长和掉话次数的详细定义: 接通时长:通话一方开始拨号到另一方开始振铃的 ...

  7. 数位dp模板 [dp][数位dp]

    现在才想到要学数位dp,我是不是很弱 答案是肯定的 以一道自己瞎掰的题为模板 //题: //输入数字n //从0枚举到n,计算这n+1个数中含有两位数a的数的个数 //如12930含有两位数93 #i ...

  8. luogu P1494 岳麓山上打水 [iddfs]

    题目描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信息组有一个容量为q升的大缸,由于 ...

  9. FTP publisher plugin插件

    说明:这个插件可以将构建的产物(例如:Jar)发布到FTP中去. 官方说明:FTP publisher plugin 安装步骤: 系统管理→管理插件→可选插件→Artifact Uploaders→F ...

  10. LNMP环境的安装

    一.LNMP的安装 1.准备工作 #清理已经安装包 rpm -e httpd rpm -e mysql rpm -e php yum -y remove httpd yum -y remove mys ...