flex布局

flex布局体验

  • 操作方便,布局非常简单,移动端应用非常广泛
  • PC端浏览器支持情况比较差
  • IE11或者更低的版本,不支持或者只支持一部分

建议:

  • PC端布局,还是最好使用传统布局
  • 移动端或者不考虑兼容性问题的PC端页面布局,还是最好使用flex弹性布局

flex布局原理

  • 弹性布局,为盒模型提供最大的灵活性,任何一个容器都可以被指定为flex布局
  • 当父盒子设为flex布局,子元素的float,clear,vertical-align均会失效(效果比这三者更为精确)
  • 伸缩布局=弹性布局=伸缩盒布局=弹性盒布局=flex布局
  • 采用flex布局的元素,称之为flex容器,所有子元素自动成为容器成员,称之为flex项目
  • flex布局原理:通过给父盒子添加flex属性,控制子盒子的位置和排列方式

flex常见属性

父项常见属性

  • flex-direction:设置主轴的方向
  • justify-content:设置主轴上的子元素排列方式
  • flex-wrap:设置子元素是否换行
  • align-content:设置侧轴上的子元素的排列方式(多行
  • align-items:设置侧轴上的子元素排列方式(单行)
  • flex-flow:复合属性,相当于同时设置了flex-direction和flex-wrap

flex-direction设置主轴的方向

主轴和侧轴

在flex布局里,是分为主轴和侧轴两个方向,同样的叫法有:行和列,X轴和Y轴

  • 默认主轴方向就是x轴方向,水平向右
  • 默认侧轴方向就是y轴方向,垂直向下
  • flex-direction决定主轴的方向(项目排列方向)
  • 注意:主轴和侧轴是会变化的,就看flex-direction设置谁是主轴,剩下的就是侧轴。子元素就是跟着主轴来进行排列的。
    属性值 解释说明
    row 默认值,从左到右
    row-reverse 从右到左
    column 从上到下
    column-reverse 从下到上
  • row:


  • row-reverse:


  • column:


  • column-reverse:


justify-content主轴上子元素排列方式

  • justify-content属性定义了项目在主轴上的对齐方式
  • 注意:使用这个属性之前一定要确定好主轴是哪一个
    属性值 解释说明
    flex-start 默认值,从头部开始,如果主轴是x轴那么就从左往右
    flex-end 从尾部开始排列
    center 在主轴居中对齐,(x轴的话就是水平居中)
    space-around 平分剩余空间
    space-between 先两边贴边,再平分剩余空间(重要)

(主轴为row的情况)

  • flex-start:


  • flex-end:


  • center:


  • space-around:



    -space-between:


flex-wrap设置子元素是否换行

  • 默认情况下,项目都排在一条线(轴线)上
  • flex-wrap属性定义,flex布局中默认是不换行的
    属性值 解释说明
    nowrap 默认值,不换行
    wrap 换行
  • 如果设置的是不换行,子元素个数过多,不够分摊父级容器的宽度,子元素会压缩自己的宽度,达到平摊的目的,比如:


  • 设置换行的话:


align-items侧轴上子元素排列方式(单行)

  • 控制子项在侧轴(默认为y轴)上的排列方式
  • 在子项为单行的时候使用
    属性值 解释说明
    flex-start 默认值,从上到下
    flex-end 从下到上
    center 挤在一起居中(垂直居中)
    stretch 拉伸

(主轴为x轴,即row)

  • flex-start:


  • flex-end:


  • center:


  • stretch:
    (前提是去掉子元素的高度,让其自然拉伸)
    为了展示效果还是加一条靠边水平平分

    获得一个新的水平垂直居中的好办法
    在父盒子添加align-items:center与justify-content:center就可以实现水平垂直居中的效果了,方便又省事
 div {
            display: flex;
            width: 400px;
            height: 400px;
            background-color: pink;
            /* flex-direction: row; */
            justify-content: center;
            /* flex-wrap: wrap; */
            align-items: center;
        }
        span {
            width: 100px;
            height: 100px; 
            background-color: purple;
        }
效果图

align-content侧轴上子元素排列方式(多行)

  • 设置子项在侧轴上的排列方式,只能用于子项出现换行的情况(多行),在单行下是没有效果的
    属性值 解释说明
    flex-start 在侧轴的头部开始排列
    flex-end 在侧轴的尾部开始排列
    center 在侧轴的中间进行显示
    space-around 子项在侧轴平分剩余空间
    space-between 子项在侧轴先分布在两头,再平分圣域空间
    stretch 设置子项元素高度平分父元素高度

测试代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        div {
            display: flex;
            width: 800px;
            height: 800px;
            background-color: pink;
            flex-direction: row;
            flex-wrap: wrap;    
            /* justify-content: center; */
        }
        span {
            width: 250px;
            height: 100px;
            margin-right: 10px;
            margin-bottom: 10px;
            background-color: purple;
        }
    </style>
</head>
<body>
    <div>
        <span>1</span>
        <span>2</span>
        <span>3</span>
        <span>4</span>
        <span>5</span>
        <span>6</span>
        <span>7</span>
        <span>8</span>
        <span>9</span>
    </div>
</body>
</html>
效果图
  • flex-start:


  • flex-end:


  • center:


  • space-around:


  • space-between:


  • stretch:


    跟不设置的时候默认样式一样,因为给子元素设置了高度

    取消子元素的高度属性之后

align-content与align-items区别:

  • align-items适应于单行情况,只有上对齐,下对齐,居中与拉伸
  • align-content适应于换行(单行情况下无效),可以设置上对齐,下对齐,居中,拉伸和平均分配剩余空间等属性值
  • 总的来说就是单行找align-items,多行找align-content


flex-flow

  • 它是flex-direction和flex-wrap属性的复合属性
    比如:
  • flex-flow:row nowrap;
flex-flow:row nowrap;

flex-direction:row;
flex-wrap:nowrap;

是等效的

子项常见属性

flex属性(重要)

  • flex属性定义的是子项目分配父盒子的剩余空间,用flex来表示占有多少份数
  • 属性值为数字,数字为1,表示占总份数的1份,默认值为0
.item {
  flex:<number>;/*default0*/
}

例子代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }
    section {
      display: flex;
      width: 60%;
      height: 80px;
      margin: 50px auto;
      background-color: pink;
    }
    section div:nth-child(1),section div:nth-child(3) {
      width: 80px;
      height: 80px;
      background-color: skyblue;
    }
    section div:nth-child(2) {
      flex: 1;
      height: 80px;
      background-color: green;
    }

    .box {
      display: flex;
      width: 60%;
      height: 80px;
      background-color: pink;
      margin: 0 auto;
    }
    .box span {
      flex: 1;
    }
    .box span:nth-child(2) {
      flex: 2;
      background-color: purple;
    }
  </style>
</head>
<body>
  <section>
    <div>1</div>
    <div>2</div>
    <div>3</div>
  </section>
  <div class="box">
    <span>1</span>
    <span>2</span>
    <span>3</span>
  </div>
</body>
</html>


flex:2表示box大盒子下的三个span占了四份,其中,2占了两份

align-self与order属性

  • align-self属性表示允许单个项目有与其他项目不一样的对齐方式,可以覆盖掉父级元素的align-items属性
  • 默认值是auto,表示继承父级元素的align-items属性,如果没有父级元素,等于stretch(拉伸)
   div {
            display: flex;
            width: 800px;
            height: 800px;
            background-color: pink;
            flex-flow: row wrap;   
            align-items: flex-start;
        }
        span {
            width: 250px;
            height: 100px;
            margin-right: 10px;
            margin-bottom: 10px;
            background-color: purple;
        }
        span:nth-child(2) {
            align-self: flex-end;
        }
    <div>
        <span>1</span>
        <span>2</span>
        <span>3</span>
    </div>
效果图
  • order属性定义项目的排列顺序
  • 数值越小,排列越靠前,默认为0
  • 注意:和z-index不一样
  span:nth-child(2) {
            /* align-self: flex-end; */
            /* 调整子项加载的顺序,默认值为0,如果想要往前提,属性值可以为负值 */
            order: -1;
            /* 如果前面的元素想要往后移动,属性值要比前面的都大 */
            order:1;
        }

每个子项的默认值都是0,只要是大于0或者小于0的负值都可以进行顺序的调整了

设置为1的情况,2跑到3后面了

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

推荐阅读更多精彩内容