flex布局

By Leaf



在前端的学习过程中,布局可以说是非常重要的,之前一直用DIV和CSS布局,但是深受定位、浮动等属性的困扰。后来学习了flex布局才发现,只要熟悉flex布局,大部分复杂的网页都可以用flex布局实现。这里主要是将之前学习的flex知识加以复习和巩固,便于自己以后忘记查阅。

一、简单理解flex布局

首先我们来理解一下flex布局的一些基本概念(图是我从网上找来的,我觉得对理解flex布局很有用):

image.png

任何一个容器都可以指定为flex布局

  • 在flex容器中有两条轴线:水平轴线(main axis)垂直轴线(cross axis)。我们可以通过设置决定我们布局的主轴方向,一般默认主轴为水平轴线。
  • flex容器中每一个项目单元都称为flex item,每一个flex item所占的主轴空间为main sizecross size则为flex item的垂直空间(或称交叉轴空间)。

任何一个容器都可以指定为flex布局,任何容器耶必须先指定flex布局display:flex才能使用flex布局的所有属性。
flex的属性有:

  • flex-direction: row | row-reverse | column | column-reverse; 确定主轴方向
  • flex-wrap:nowrap | wrap | wrap-reverse;允许项目是否换行
  • justify-content:flex-start | flex-end | center |space-between | space-around;确定项目在主轴的对齐方式
  • align-items:flex-start | flex-end | center | baseline | stretch;确定项目在交叉轴方向的对齐方式
  • align-content:flex-start | flex-end | center | space-between | space-around | stretch;确定多根轴线的对齐方式,如果项目只有一根轴线,则该属性不起作用。

接下来对每一个属性和属性值展开demo:

<!--demo,html代码-->
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>flex布局</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .container div {
            width: 100px;
            height: 100px;
            border: 1px solid red;
        }
        .container{
            display: flex;
            flex-direction: row;
        }
    </style>
</head>

<body>
    <div class="container">
        <div>1</div>
        <div>2</div>
        <div>3</div>
        <div>4</div>
    </div>
</body>

</html>
  1. flex-direction 确定主轴方向

flex-direction: row | row-reverse | column | column-reverse

  • flex-direction:row;确定主轴方向为水平方向,起点在左端
  .container{
            display: flex;
            flex-direction: row;
        }
image.png
  • flex-direction:row-reverse;确定主轴方向为水平方向,起点在右端
  .container{
            display: flex;
            flex-direction: row-reverse;
        }
image.png
  • flex-direction:column;确定主轴方向为垂直方向,起点在上端
 .container{
            display: flex;
            flex-direction: column;
        }
image.png
  • flex-direction:column-reverse;确定主轴方向为垂直方向,起点在下端
 .container{
            display: flex;
            flex-direction: column-reverse;
        }
image.png
  1. flex-wrap 允许项目是否换行

flex-wrap:nowrap | wrap | wrap-reverse;

  • flex-wrap:nowrap;当容器的主轴固定,而空间不足的时候,项目flex-item会随着调整,不会换到下一行
  .container{
            width: 300px;
            border: 1px solid black;
            display: flex;
            flex-direction: row;
            flex-wrap: nowrap;
        }
image.png
  • flex-wrap:wrap;当容器的主轴固定,而空间不足的时候,项目flex-item会随着调整,换到下一行
  .container{
            width: 300px;
            border: 1px solid black;
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
        }
image.png
  1. justify-content确定项目在主轴方向的对齐方式

justify-content:flex-start | flex-end | center | space-between | space-around

  • jusity-content:flex-start;确定项目在主轴方向的对齐方式:左对齐(这里主轴设置主轴是水平方向:flex-direction:row;
 .container{
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            justify-content: flex-start;
        }
image.png
  • jusity-content:flex-end;确定项目在主轴方向的对齐方式:右对齐(这里主轴设置主轴是水平方向:flex-direction:row;
 .container{
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            justify-content: flex-end;
        }
image.png
  • jusity-content:flex-center;确定项目在主轴方向的对齐方式:居中对齐(这里主轴设置主轴是水平方向:flex-direction:row;
 .container{
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            justify-content: center;
        }
image.png
  • jusity-content:fspace-between;确定项目在主轴方向的对齐方式:两端对齐,项目之间的间隔相等,即剩余空间等分成间隙(这里主轴设置主轴是水平方向:flex-direction:row;
 .container{
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            justify-content: space-between;
        }
image.png
  • jusity-content:space-around;确定项目在主轴方向的对齐方式:每个项目两侧的间隔相等(这里主轴设置主轴是水平方向:flex-direction:row;
 .container{
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            justify-content: space-around;
        }
image.png
  • jusity-content:space-evenly;确定项目在主轴方向的对齐方式::项目均匀分布,所有项目之间及项目与边框之间距离相等(这里主轴设置主轴是水平方向:flex-direction:row;
 .container{
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            justify-content: space-evenly;
        }
image.png

综上所诉,
justify-content确定项目在主轴方向的对齐方式的大图如下(图是我在学习的过程中在网上看到的,这个图一目了然,很容易理解):

image.png

  1. align-items确定项目在交叉轴方向的对齐方式。

align-items:flex-start | flex-end | center | baseline | stretch;

为了效果明显,我们要修改div的样式,给每一个div设置分别高度20px、40px、60px、80px。

 .container div {
            width: 100px;
        }

        .container div:nth-of-type(1) {
            height: 20px;
            border: 1px solid red;
        }
        .container div:nth-of-type(2) {
            height: 40px;
            border: 1px solid blue;
        }
        .container div:nth-of-type(3) {
            height: 60px;
            border: 1px solid rgb(255, 0, 157);
        }
        .container div:nth-of-type(4) {
            height: 80px;
            border: 1px solid green;
        }

  • align-item:flex-start;确定项目在交叉轴方向的对齐方式
        .container {
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            align-items: flex-start;
        }
image.png
  • align-item:flex-end;确定项目在交叉轴方向的对齐方式
        .container {
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            align-items: flex-end;
        }
image.png
  • align-item:center;确定项目在交叉轴方向的对齐方式:以交叉轴的中点对齐
 .container {
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            height: 300px;
            border: 1px solid black;
            align-items: center;
        }
image.png
  • align-item:baseline;确定项目在交叉轴方向的对齐方式:以第一行文字为基线对齐
 .container {
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            height: 300px;
            border: 1px solid black;
            align-items: baseline;
        }
image.png
  • align-item: stretch;如果项目flex-item没有设置高度,而容器设置了高度,则项目会默认充满整个容器。
    假设容器高度设置为 300px,而项目都没有设置高度的情况下,则项目的高度也为 300px。
   .container div {
            width: 100px;
        }

        .container div:nth-of-type(1) {
            /* height: 20px; */
            border: 1px solid red;
        }

        .container div:nth-of-type(2) {
            /* height: 40px; */
            border: 1px solid blue;
        }

        .container div:nth-of-type(3) {
            /* height: 60px; */
            border: 1px solid rgb(255, 0, 157);
        }

        .container div:nth-of-type(4) {
            /* height: 80px; */
            border: 1px solid green;
        }

        .container {
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            height: 300px;
            border: 1px solid black;
            align-items: stretch;
        }
image.png

综上所述:


image.png
  1. align-content确定了在交叉轴方向的对齐方式及额外空间分配,类似于主轴上justify-content的作用。

align-content: stretch | flex-start | flex-end | center | space-between | space-around ;

image.png

image.png

在这里献上几位大神对flex布局的讲解,因为有了他们的深入讲解,我才理解了flex布局,这里根据学到知识自己整合了一下,便于自己以后忘记查阅,若有错别之处,望大神之处,比心,感谢。
30分钟学会flex布局
flex-弹性布局原来如此简单
flex小技巧
flex快速上手小记
(图好像没放好,等我有空再整理)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容