传统布局方式的局限性

传统的网页布局方式,采用 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. 十年过去了,各位 .net 兄弟还好吗

    时间是最无情的,一下子就毕业10年了.很久没有发发牢骚了,今天突然想发一下.看过我文章喷过的知道,我一般都是散文,看完不知道我写了什么,形散而神不散嘛. 十年了,不好意思,没像网上说的标准一样,做管理 ...

  2. java基础06 IO流

    IO用于在设备间进行数据传输的操作. Java IO流类图结构:   IO流分类 字节流: InputStream FileInputStream BufferedInputStream Output ...

  3. JMeter Http请求POST提交token失败,取样器结果Response Code 415

    Jmeter脚本,http请求以post方式提交token,执行脚本在察看结果中显示失败,取样器结果响应状态Response Code 415,如图:

  4. FreeRTOS源代码的编程标准与命名约定

    编程标准 (Coding Standard) FreeRTOS 源代码遵守 MISRA (Motor Industry Software Reliability Association) 规范. 与 ...

  5. Struts2入门项目开发小步骤

    Step1: Struts2的获取和添加到项目中: 在官方网站:http://struts.apache.org 获取Struts的其中一个版本. 在开发项目之前,需要添加struts2的类库支持,也 ...

  6. mybaits错误解决:There is no getter for property named 'parentId ' in class 'java.lang.String'

    在使用mybaitis传参数的时候,如果仅传入一个类型为String的参数,那么在 xml文件中应该使用_parameter来代替参数名. 比如mapper中如下方法,只有一个String值 publ ...

  7. 学会用requirejs,5分钟足矣

    学会用requirejs,5分钟足矣 据说公司的项目较多的用到requirejs管理依赖,所以大熊同学挤出了5分钟休息时间学习了一下,现在分享一下.如果你想了解requirejs的实现原理,请绕道!如 ...

  8. (转载)Windows 上搭建Apache FtpServer

    因工作需要,最近经常接触到FTP,今天我来介绍一个开源的FTP服务器,那就是Apache FTPServer,Apache FTPServer是一个100%纯Java的FTP服务器. 它的设计是基于现 ...

  9. php 设计模式之策略模式

    策略模式:定义算法,并将其封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 步骤:1.抽象策略角色:定义接口或抽象类 2.具体策略角色:实现该接口(抽象类),即具体的算法实现 ...

  10. Java 学习内容总结

    最近对Core Java基础做了一些学习.有自己的见解,也有别人的总结,供大家参考. 1 实现多线程的方式有几种? 其实这个问题并不难,只是在这里做一个总结.一共有三种. 实现Runnable接口,并 ...