小米技术社区
小米技术社区管理员 关于小米

27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]

E-mail:mzze@163.com

Q Q:32362389

W X:xiaomi168527

小米技术社区大牛王飞 关于王飞

27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]

E-mail:wf_live@126.com

Q Q:3940019

微博:王小贱ss

小米技术社区设计小艳 关于小艳

大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]

E-mail:97157726@qq.com

Q Q:97157726

标签云
精品推荐
  • html5弹性布局display:flex;的具体用法

    html5弹性布局display:flex;的具体用法

    首先我们来了解一下flex的定义:Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。在我们开发网站的时候,碰见如下图两边对齐的时候回很头疼,不管是用cl……
    371人已经看过了
您的位置:首页 > 前端开发 > Htm l+ Css > Html5 + Css3

一文读懂"flex布局"

分类: Html5 + Css32个赞

我们在写前端页面的时候可能会遇到这样的问题:同样的一个页面在 1920x1080 的大屏幕中显示正常,但是在 1366x768 的小屏幕中却显示的非常凌乱。 这是因为我们开发的页面不能做到自适应屏幕大小。为了解决这个问题,弹性布局应运而生。 

Flexbox 布局也叫 Flex 布局,弹性盒子布局。任何一个容器都可以通过display:flex;指定为 Flex 布局。


基本概念 

采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有 {% span blue , 子元素 %}(注意是子元素,不是全部后代元素)自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。 

image.png

容器默认存在两根轴: 水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置与边框的交叉点叫做(main start),结束位置叫做(main end);交叉轴的开始位置叫做(cross start),结束位置叫做(cross end)。

项目默认沿主轴排列。单个项目占据的主轴空间叫做(main size),占据的交叉轴空间叫做(cross size)。


通过display:flex设置了弹性容器之后,我们需要为该容器和它的子元素设置相关的属性,这样才能达到我们想要的弹性布局效果,下面我们来看看有哪些属性。 


容器属性
父容器flex-direction属性决定项目排列方向
flex-wrap如果一条轴线排不下,如何换行。
flex-flow是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap
justify-content定义了项目在主轴上的对齐方式
align-items定义项目在交叉轴上如何对齐
align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用
子容器align-self定义flex子项单独在侧轴(纵轴)方向上的对齐方式
flex-grow属性定义项目的放大比例,默认为 0 ,即如果存在剩余空间,也不放大
flex-shrink属性定义了项目的缩小比例,默认为 1 ,即如果空间不足,该项目将缩小
flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)
flexflex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
order定义项目的排列顺序。数值越小,排列越靠前,默认为 0


本文将以以下源码为基础源码演示:

如某一子属性演示修改了基本源码会标注,没标注的默认都为基础源码

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="base.css">
    <title>一文读懂flex布局-bbsxiaomi.com</title>
</head>
<body>
    <div class="box">
        <div class="son1">1</div>
        <div class="son2">2</div>
        <div class="son3">3</div>
        <div class="son4">4</div>
        <div class="son5">5</div>
        <div class="son6">6</div>
    </div>
</body>
</html>

CSS:

* {
    margin: 0;
    padding: 0;
}

.box {
    width: 600px;
    height: 300px;
    margin: 50px auto;
    background: #f1f1f1;
    display: flex;
   
}
.box div{
    width: 50px;
    height:200px;
}
.box .son1{
    background-color:#f9bf58;
}
.box .son2{
    background-color:aqua;
}
.box .son3{
    background-color:bisque;
}
.box .son4{
    background-color:blue;
}
.box .son5{
    background-color:aquamarine;
}
.box .son6{
    background-color:blueviolet;
}

1、flex-direction

flex-direction 属性决定主轴的方向(即项目的排列方向)

属性值含义
row默认值,主轴为水平方向(水平布局),起点在左端,从左向右排列
row-reverse主轴为水平方向(水平布局),起点在右端,从右向左排列
column主轴为垂直方向(垂直布局),起点在上沿,从上往下排列
column-reverse主轴为垂直方向(垂直布局),起点在下沿,从下往上排列


image.pngimage.png

image.pngimage.png

拓展:通过上图得知,当子元素的宽或者高大于父元素时,子元素没有溢出父元素,会自动平均分配高度为50px,如果想要指定某个子元素高度,可在子元素上采用flex:1灵活调整


2、flex-wrap

默认情况下,项目都排在一条线(又称"轴线")上。flex-wrap属性定义,如果一条轴线排不下,如何换行。



属性值含义
nowrap默认值,表示不换行
wrap换行
wrap-reverse换行,第一行在下方

为了测试出效果,请把原始代码的.box div修改为


.box div{
    width: 200px;
    height:200px;
}

image.pngimage.png


image.png

拓展:通过上图得知,当用wrap换行时,多行子元素的高大于父元素时,子元素溢出了父元素,高度为子元素高度*行数


3、justify-content

justify-content属性定义了项目在主轴上的对齐方式。



属性值含义
flex-start默认值,左对齐
flex-end右对齐
center居中
space-between两端对齐,项目之间的间隔都相等
space-around每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍

image.pngimage.png


image.pngimage.png

image.png


4、align-items

在弹性容器设置子元素不换行的情况下,设置侧轴上的子元素排列方式。




属性值含义
flex-start交叉轴的起点对齐
flex-end交叉轴的终点对齐
center交叉轴的中点对齐
baseline项目的第一行文字的基线对齐
stretch(默认值) 如果项目未设置高度或设为auto,将占满整个容器的高度



为了stretch测试出效果,请把原始代码css中的.box div修改为(高修改为auto或者删除height)

.box div{
    height:auto
}


为了其它测试效果请把原始代码css中的.box .son*修改为(不同的高度)

.box .son1{
    height:50px;
    background-color:#f9bf58;
}
.box .son2{
    height:100px;
    background-color:aqua;
}
.box .son3{
    height:150px;
    background-color:bisque;
}
.box .son4{
    height:200px;
    background-color:blue;
}
.box .son5{
    height:250px;
    background-color:aquamarine;
}
.box .son6{
    height:300px;
    background-color:blueviolet;
}

image.pngimage.png

image.pngimage.png

image.png


5、flex-flow

flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。

这里不在演示



6、align-content

在弹性容器设置子元素换行的情况下, 设置侧轴上的子元素排列方式。


属性值含义
flex-start与交叉轴的起点对齐
flex-end与交叉轴的终点对齐
center与交叉轴的中点对齐
space-between与交叉轴两端对齐,轴线之间的间隔平均分布
space-around每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍
stretch默认值,轴线占满整个交叉轴

为了测试出效果,请把原始代码css中的.box div修改为


.box {
    width: 600px;
    height: 300px;
    margin: 50px auto;
    background: #f1f1f1;
    display: flex;
    flex-wrap: wrap;
}
.box div{
    width: 200px;
}

html修改为(去掉6)

    <div class="box">
        <div class="son1">1</div>
        <div class="son2">2</div>
        <div class="son3">3</div>
        <div class="son4">4</div>
        <div class="son5">5</div>
    </div>


image.pngimage.png

image.pngimage.png

image.pngimage.png


7、子元素属性 

(1)align-self

定义flex子项单独在侧轴(纵轴)方向上的对齐方式。,允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。



属性值含义
autoauto默认值。元素继承了它的父容器的 align-items 属性
stretch元素被拉伸以适应容器
center元素位于容器的中心
flex-start元素位于容器的开头
flex-end元素位于容器的结尾
baseline元素位于容器的基线上

为了测试出效果,请把原始代码css中的.box和.box div修改为,并在align-self添加在3上


.box {
    width: 600px;
    height: 300px;
    margin: 50px auto;
    background: #f1f1f1;
    display: flex;
    align-items: center;
}
.box div{
    width: 50px;
}

image.pngimage.png

image.pngimage.png

image.pngimage.png

(2)flex-grow

flex-grow属性定义了flex项目的扩展比例,即当有多余的空间时,该项目将如何分配这些空间。默认值是0,表示项目不会扩展。

image.png

(3)flex-shrink

属性指定了 flex 元素的收缩规则。flex 元素仅在默认宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据 flex-shrink 的值。

为了测试出效果,请把原始代码css中的.box div修改为

.box div{
    width: 150px;
    height:200px;
    flex-shrink:1
}

image.png

(4)flex-basis

flex-basis属性定义了在分配剩余空间之前,flex项目的初始大小。它可以被看作是项目在主轴方向上的首选尺寸(用于设置或检索弹性盒伸缩基准值)。

属性值含义
autoauto默认值。长度等于灵活项目的长度。如果该项目未指定长度,则长度将根据内容决定。
number一个长度单位或者一个百分比,规定灵活项目的初始长度。


为了测试出效果,请把原始代码css中的.box div修改为

.box div{
    flex-basis: auto;
    height:200px;
}

image.pngimage.png


(5)flex

flex 属性是 flex-grow、flex-shrink 和 flex-basis 属性的简写属性。用于设置或检索弹性盒模型对象的子元素如何分配空间。

(1)默认值:flex:0 1 auto,即在有剩余空间时,只放大不缩小

.item {
  flex:0 1 auto;
}
.item {
  flex-grow: 0;
  flex-shrink: 1;
  flex-basis: auto;
}

(2)flex: none,即有剩余空间时,不放大也不缩小,最终尺寸通常表现为最大内容宽度。

.item {
  flex:0 0 auto;
}
.item {
  flex-grow: 0;
  flex-shrink: 0;
  flex-basis: auto;
}

(3)flex: 0,即当有剩余空间时,项目宽度为其内容的宽度,最终尺寸表现为最小内容宽度。

.item {
  flex:0 1 0%;
}
.item {
  flex-grow: 0;
  flex-shrink: 1;
  flex-basis: 0%;
}

(4)flex: auto,即元素尺寸可以弹性增大,也可以弹性变小,具有十足的弹性,但在尺寸不足时会优先最大化内容尺寸。

.item {
  flex:1 1 auto;
}
.item {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: auto;
}

(5)flex: 1,即元素尺寸可以弹性增大,也可以弹性变小,具有十足的弹性,但是在尺寸不足时会优先最小化内容尺寸。

.item {
  flex:1 1 0%;
}
.item {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 0%;
}

image.pngimage.png

如果其它都不设置flex,只设置2为flex:1,则第二个元素的宽度就是弹性的,如图

640.gif

(6)order

order属性用来定义项目的排列顺序。数值越小,排列越靠前,默认为 0 。

为了测试出效果,请把原始代码css中的.box div修改为

.box div{
    width: 50px;
    height:200px;
    order:1;
}

image.png


以上为flex布局的全部用法,相比于float布局,flex布局提供了更简洁的语法、更强的对齐和分布能力、更灵活的响应式设计、更好的控制和一致的跨浏览器表现,简单说除了兼容性问题,各方便都比float布局强。

小米技术社区

本站内容均为小米原创,转载请注明出处:小米技术社区>> 一文读懂"flex布局"