前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

本教程案例在线演示

有路网PC端
有路网移动端css

免费配套视频教程

免费配套视频教程html

教程配套源码资源

教程配套源码资源前端

Flex容器

<ul> <!--parent element-->
  <li></li> <!--first child element-->
  <li></li> <!--second child element-->
  <li></li> <!--third child element-->
</ul>

这就是一个无序列表(ul)里有三个列表元素(li)。git

你能够把ul称为父元素,li称为子元素。浏览器

要开始使用Flexbox,必须先让父元素变成一个Flex容器。dom

你能够在父元素中显式的设置display:flex或者display:inline-flex。这样你就能够开始使用Flexbox模块。ide

实际是显式声明了Flex容器以后,一个Flexbox格式化上下文(Flexbox formatting context)就当即启动了。布局

使用一个无序列表(ul)和一群列表元素(li),启动Flexbox格式化上下文的方式以下:学习

/* 声明父元素为flex容器 */
ul {
    display:flex; /*或者 inline-flex*/
}

给列表元素(li)添加一点基本样式。flex

li {
    width: 100px;
    height: 100px;
    background-color: #8cacea;
    margin: 8px;
    list-style: none;
}

你将看到的效果以下图所示:
前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

默认状况下,li是块级元素,在CSS中垂直排布的,也就是说从上到下排列显示,就像下图这样:

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

然而,简单的写一行代码display:flex,你当即就能够看到布局改变了。

如今列表元素(li)水平排列,从左到右。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

Flexbox模块的开始,正如前面的介绍,在任何父元素上使用display:flex

一旦你显式的设置了display属性的值为flex,无序列表ul就会自动变成Flex容器,而其子元素(在本例中是指列表元素li)就变成了Flex项目。

使用了两个关键词,咱们把重点放到他们身上。了解他们对于理解后面的知识相当重要。

  • Flex容器(Flex Container):父元素显式设置了display:flex
  • Flex项目(Flex Items):Flex容器内的子元素

这些只是Flexbox模块的基础。

Flex容器属性

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

经过上面的内容,咱们了解了一些基础知识。知道了Flex容器和Flex项目是什么,以及如何启动Flexbox模块。

有设置一个父元素做为一个Flex容器,几个对齐属性可使用在Flex容器上。

正如你的块元素的width设置了200px,有六种不一样的属性能够用于Flex容器。

flex-direction

flex-direction属性控制Flex项目沿着主轴(Main Axis)的排列方向。

它具备四个值:

/* ul 是一个flex容器 */
ul {
    flex-direction: row || column || row-reverse || column-reverse;
}

简单点来讲,就是flex-direction属性让你决定Flex项目如何排列。它能够是行(水平)、列(垂直)或者行和列的反向。

从技术上讲,水平垂直Flex世界中不是什么方向(概念)。它们经常被称为主轴(Main-Axis)侧轴(Cross-Axis)。默认设置以下所示。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

通俗的说,感受Main-Axis就是水平方向,从左到右,这也是默认方向。Cross-Axis是垂直方向,从上往下。

默认状况下,flex-direction属性的值是row。它让Flex项目沿着Main-Axis排列(从左向右,水平排列)。这就解释了本文开始部分时无序列表的表现效果。

尽管flex-direction属性并无显式的设置,但它的默认值是row。Flex项目将沿着Main-Axis从左向右水平排列。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

若是把flex-direction的属性值修改为column,这时Flex项目将沿着Cross-Axis从上到下垂直排列。再也不是从左向右排列。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

flex-wrap

flex-wrap属性有三个属性值:

ul {
    flex-wrap: wrap || nowrap || wrap-reverse;
}

我将经过一个例子来解释如何使用flex-wrap属性。首先在前面的无序列表的HTML结构中多添加几个列表项li

<ul> <!--parent element-->
    <li></li> <!--first child element-->
    <li></li> <!--second child element-->
    <li></li> <!--third child element-->
    <li></li>
    <li></li>
    <li></li>
</ul>

幸运的是,新添加的Flex项目恰好适合Flex容器大小。也就是Flex项目能恰好填充Flex容器。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

再深刻一点。

继续给Flex容器内添加Flex项目,好比说添加到10个Flex项目。这个时候会发生什么?

<ul> <!--parent element-->
    <li></li> <!--first child element-->
    <li></li> <!--second child element-->
    <li></li> <!--third child element-->
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

一样的,Flex容器仍是能容纳全部的子元素(Flex项目)排列,这是每个Flex容器的默认行为。Flex容器会在一行内容纳全部的Flex项目。这是由于flex-wrap属性的默认值是nowrap。也就是说,Flex项目在Flex容器内不换行排列。

ul {
    flex-wrap: nowrap; /*Flex容器内的Flex项目不换行排列*/
}

no-wrap不是不可改变的。咱们能够改变。

当你但愿Flex容器内的Flex项目达到必定数量时,能换行排列。当Flex容器中没有足够的空间放置Flex项目(Flex项目默认宽度),那么Flex项目将会换行排列。把它(flex-wrap)的值设置为wrap就有这种可能:

ul {
    flex-wrap: wrap;
}

如今Flex项目在Flex容器中就会多行排列。

在这种状况下,当一行再不能包含全部列表项的默认宽度,他们就会多行排列。即便调整浏览器大小。

就是这样子。注意:Flex项目如今显示的宽度是他们的默认宽度。也没有必要强迫一行有多少个Flex项目。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

除此以外,还有一个值:wrap-reverse

是的,你猜对了。它让Flex项目在容器中多行排列,只是方向是反的。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

flex-flow

flex-flowflex-directionflex-wrap两个属性的速记属性。

你还记得使用border的速记写法?border: 1px solid red。这里的概念是相同的,多个值写在同一行,好比下面的示例:

ul {
    flex-flow: row wrap;
}

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

至关于:

ul {
    flex-direction: row;
    flex-wrap: wrap;
}

除了这个组合以外,你还能够尝试一些其它的组合。flex-flow: row nowrapflex-flow: column wrapflex-flow: column nowrap

justify-content

Flexbox模块真得很好。若是你仍然不相信它的魅力,那么justify-content属性可能会说服你。

justify-content属性能够接受下面五个值之一:

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

justify-content属性又能给咱们带来什么呢?提醒你一下,你是否还记得text-align属性。其实justify-content属性主要定义了Flex项目在Main-Axis上的对齐方式。

来看一个简单的例子,仍是考虑下面这个简单的无序列表:

<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>

添加一些基本样式:

ul {
    display:flex;
    border: 1px solid red;
    padding: 0;
    list-style: none;
    background-color: #e8e8e9;
}
li {
    background-color: #8cacea;
    width: 100px;
    height: 100px;
    margin: 8px;
    padding: 4px;
}

你将看到的效果是这样:
前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

经过justify-content属性,可让Flex项目在整个Main-Axis上按照我本身的欲望设置其对齐方式。

可能会有如下几种类型。

flex-start

justify-content的默认属性值是flex-start

flex-start让全部Flex项目靠Main-Axis开始边缘(左对齐)。

ul {
    justify-content: flex-start;
}

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

flex-end

flex-end让全部Flex项目靠Main-Axis结束边缘(右对齐)。

ul {
    justify-content: flex-end;
}

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

center

和你预期的同样,center让全部Flex项目排在Main-Axis中间(居中对齐)。

ul {
    justify-content: center;
}

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

space-between

space-between让除了第一个和最一个Flex项目的二者间间距相同(两端对齐)。

ul {
    justify-content: space-between;
}

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

你注意到有什么不一样?看看下图的描述:

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

space-around

最后,space-around让每一个Flex项目具备相同的空间。

ul {
    justify-content: space-around;
}

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

space-between有点不一样,第一个Flex项目和最后一个Flex项目距Main-Axis开始边缘和结束边缘的的间距是其余相邻Flex项目间距的一半。看看下图的描述:

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

align-items

align-items属性相似于justify-content属性。只有理解了justify-content属性,才能更好的理解这个属性。

align-items属性能够接受这些属性值:flex-start || flex-end || center || stretch || baseline

ul {
    align-items: flex-start || flex-end || center || stretch || baseline
}

它主要用来控制Flex项目在Cross-Axis对齐方式。这也是align-itemsjustify-content两个属性之间的不一样之处。

下面是不一样的值对Flex项目产生的影响。不要忘记这些属性只对Cross-Axis轴有影响。

首先,让咱们设置ul的高度高于li的高度

ul {
      height: 200px;
    }

stretch

align-items的默认值是stretch。让全部的Flex项目高度和Flex容器高度同样。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

flex-start

正如你所但愿的flex-start让全部Flex项目靠Cross-Axis开始边缘(顶部对齐)。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

flex-end

flex-end让全部Flex项目靠Cross-Axis结束边缘(底部对齐)。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

center

center让Flex项目在Cross-Axis中间(居中对齐)。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

baseline

让全部Flex项目在Cross-Axis上沿着他们本身的基线对齐。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

<!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>
    ul {
      border: 1px solid red;
      display: flex;
      height: 200px;
      align-items: baseline;
    }
    li {
    width: 100px;
    background-color: #8cacea;
    margin: 8px;
    list-style: none;
    font-size: 28px;
  }
  li:nth-child(2){
    font-size: 12px;
  }
  </style>
</head>
<body>
  <ul> <!--parent element-->
    <li>1</li> <!--first child element-->
    <li>2</li> <!--second child element-->
    <li>333 33333 33 </li> <!--third child element-->
  </ul>
</body>
</html>

结果看上去有点像flex-start,但略有不一样。那“baseline”究竟是什么呢?下图应该能帮助你更好的理解。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

align-content

还记得前面讨论的wrap属性吗?咱们在Flex容器中添加了更多的Flex项目。让Flex容器中的Flex项目多行排列。

align-content属性用于多行的Flex容器。它也是用来控制Flex项目在Flex容器里的排列方式,排列效果和align-items值同样,但除了baseline属性值。

align-items属性同样,它的默认值是stretch。你如今应该熟悉这些值。那它又是如何影响Flex容器里的10个Flex项目多行排列方式。

stretch

使用stretch会拉伸Flex项目,让他们沿着Cross-Axis适应Flex容器可用的空间。

你看到的Flex项目间的间距,是Flex项目自身设置的margin值。

<!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>
    ul {
      border: 1px solid red;
      display: flex;
      height: 400px;
      flex-wrap: wrap;
      align-content:center;
    }
    li {
    width: 100px;
    background-color: #8cacea;
    margin: 8px;
    list-style: none;
    font-size: 28px;
  }
  li:nth-child(2){
    font-size: 12px;
  }
  </style>
</head>
<body>
  <ul> <!--parent element-->
    <li>1</li> <!--first child element-->
    <li>2</li> <!--second child element-->
    <li>333 33333</li> <!--third child element-->
    <li>1</li> <!--first child element-->
    <li>2</li> <!--second child element-->
    <li>333 33333 33 </li> <!--third child element-->
    <li>1</li> <!--first child element-->
    <li>2</li> <!--second child element-->
    <li>333 33333 33 </li> <!--third child element-->
  </ul>
</body>
</html>

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

flex-start

以前你看到过flex-start。此次是让多行Flex项目靠Cross-Axis开始边缘。沿着Cross-Axis从上到下排列。所以Flex项目在Flex容器中顶部对齐。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

flex-end

flex-end恰好和flex-start相反,让多行Flex项目靠着Cross-Axis结束位置。让Flex项目沿着Cross-Axis从下到上排列,即底部对齐。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

center

你猜到了,center让多行Flex项目在Cross-Axis中间。在Flex容器中居中对齐。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

这是Flex容器的最后一个属性。你如今知道如何使用各类Flex容器属性。你能够在工做中实践这些属性。

Flex项目属性

flex-grow || flex-shrink || flex-basis

如今咱们把注意力从Flex容器转移到Flex项目及其对齐属性。

像Flex容器,对齐属性也能够用在全部的Flex项目。

flex-grow 和 flex-shrink

flex-growflex-shrink属性控制Flex项目在容器有多余的空间如何放大(扩展),在没有额外空间又如何缩小。

他们可能接受0或者大于0的任何正数。0 || positive number

接下来阐述它们的使用。使用一个简单的无序列表作为例子,它只包含一个列表项。

ul {
    display:flex;
    border: 1px solid red;
    padding: 0;
    list-style: none;

}
li {
    background-color: #8cacea;
    height: 100px;
    margin: 8px;
    padding: 10px;
}
<ul>
    <li>I am a simple list</li>
</ul>

添加更多的样式,看起来像这样:

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

默认状况下,flex-grow属性值设置为0。表示Flex项目不会增加,填充Flex容器可用空间。取值为0就是一个开和关的按钮。表示flex-grow开关是关闭的。

若是把flex-grow的值设置为1,会发生:
前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

如今Flex项目扩展了,占据了Flex容器全部可用空间。也就是说开关打开了。若是你试着调整你浏览器的大小,Flex项目也会缩小,以适应新的屏幕宽度。

为何?默认状况下,flex-shrink的值是1,也就是说flex-shrink开关也是打开的。

能够仔细看看flex-growflex-shrink属性在各类状况下的效果,这样能更好的帮助你理解。

flex-basis

flex-basis属性能够指定Flex项目的初始大小。也就是flex-growflex-shrink属性调整它的大小以适应Flex容器以前。

flex-basis默认的值是autoflex-basis能够取任何用于width属性的任何值。好比 % || em || rem || px等。

注意:若是flex-basis属性的值是0时,也须要使用单位。即flex-basis: 0px不能写成flex-basis:0

这里一样使用只有一个列表项的列表作为示例。

/* 声明父元素为flex容器 */
    ul {
    display:flex;
    border: 1px solid red;
    padding: 0;
    list-style: none;

}
li {
    background-color: #8cacea;
    height: 100px;
    margin: 8px;
    padding: 10px;
}
<ul>
    <li>I am a simple list</li>
</ul>

默认状况,Flex项目的初始宽度由flex-basis的默认值决定,即:flex-basis: auto。Flex项目宽度的计算是基于内容的多少来自动计算(很明显,加上了padding值)。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

这意味着,若是你增长Flex项目中的内容,它能够自动调整大小。

<ul>
    <li>I am a simple list AND I am a simple list</li>
</ul>

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

然而,若是你想将Flex项目设置一个固定的宽度,你也能够这样作:

li {
    flex-basis: 150px;
}

如今Flex项目的宽度受到了限制,它的宽度是150px

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

flex速记

flexflex-growflex-shrinkflex-basis三个属性的速记(简写)。

在适当的时候,我建议你使用flex,这样比使用三个属性方便。

li {
    flex: 0 1 auto;
}

上面的代码至关于:

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

注意它们之间的顺序。flex-grow第一,而后是flex-shrink,最后是flex-basis。缩写成GSB,能够帮助你更好的记忆。

若是flex属性值中少一个值,会发生什么呢?

若是你只设置了flex-growflex-shrink值,flex-basis多是默认值0。这就是所谓的绝对flex项目。只有当你设置了flex-basis,你会获得一个相对flex项目。

/* 这是一个绝对的Flex项目 */
li {
    flex: 1 1; /*flex-basis 默认值为 0*/
}
/* 这是一个相对的Flex项目 */
li {
  flex-basis: 200px; /* 只设置了flex-basis的值 */
}

你确定想知道相对和绝对的Flex项目是什么?将在后面回答这个问题。

让咱们看看一些很是有用的flex值。

flex: 0 1 auto

li {
    flex: 0 1 auto;
}

这至关于写了flex默认属性值以及全部的Flex项目都是默认行为。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

很容易理解这一点,首先看看flex-basis属性。flex-basis设置为auto,这意味着Flex项目的初始宽度计算是基于内容的大小。

把注意力放到下一个属性,flex-grow设置为0。这意味着flex-grow不会改变Flex项目的初始宽度。也就是说,flex-grow的开关是关闭的。

flex-grow控制Flex项目的增加,若是其值设置为0,Flex项目不会放大以适应屏幕(Flex容器大小)。

最后,flex-shrink的值是1。也就是说,Flex项目在必要时会缩小。

应用到Flex项目效果就是这样子:

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

注意:Flex项目没有增加(宽度)。若是有必要,若是调整浏览器(调小浏览器宽度),Flex项目会自动计算宽度。

flex: 0 0 auto

li {
    flex: 0 0 auto;
}

这个至关于flex: none

仍是老规矩:宽度是被自动计算,不过弹性项目不会伸展或者收缩(由于两者都被设置为零)。伸展和收缩开关都被关掉了。

它基本上是一个固定宽度的元素,其初始宽度是基于弹性项目中内容大小。

看看这个 flex 简写是如何影响两个弹性项目的。一个弹性项目会比另外一个容纳更多内容。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

应该注意到的第一件事情是,这两个弹性项目的宽度是不一样的。由于宽度是基于内容宽度而自动计算的,因此这是预料获得的。

试着缩放一下浏览器,你会注意到弹性项目不会收缩其宽度。它们从父元素中突出来了,要看到全部内容,必须横向滚动浏览器。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

在缩放浏览器时,弹性项目不会收缩,而是从弹性容器中突出来了。

flex: 1 1 auto

这与 flex: auto 项目相同。

仍是按我前面立的规矩。即,自动计算初始化宽度,可是若是有必要,会伸展或者收缩以适应整个可用宽度

伸展和收缩开关打开了,宽度自动被计算。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

此时,项目会填满可用空间,在缩放浏览器时也会随之收缩。剩余宽度被2个item平均分配,一人一半。

flex: "positive number"

通常应用于有多个弹性项目的情形。

这里正数能够表明任何正数(没有引号)。这与 flex: “正数” 1 0 相同。

flex: 2 1 0 与写为 flex: 2 是同样的,2 表示任何正数。

li {
    flex: 2 1 0; / *与 flex: 2相同 */
}

与前面我立的规矩同样,即,将弹性项目的初始宽度设置为零(嗯?没有宽度?),伸展项目以填满可用空间,而且最后只要有可能就收缩项目

弹性项目没有宽度,那么宽度该如何计算呢?

这个时候 flex-grow 值就起做用了,它决定弹性项目变宽的程度。由它来负责没有宽度的问题。

当有多个弹性项目,而且其初始宽度 flex-basis 被设置为基于零的任何值时,好比 0px,使用这种 flex 简写更实用。

实际发生的是,弹性项目的宽度被根据 flex-grow 值的比例来计算。

考虑以下两个列表项标记及 CSS:

<ul>
    <li>I am One</li>
    <li>I am Two</li>
</ul>

  <style>
    /* 声明父元素为flex容器 */
    ul {
    display:flex;
    border: 1px solid red;
    padding: 0;
    list-style: none;

}
li {
    background-color: #8cacea;
    height: 100px;
    margin: 8px;
    padding: 10px;
    /* flex-basis: 150px; */
}
/* 第一个弹性项目 */
li:nth-child(1) {
    flex: 2 1 0; /* 与写成 flex: 2 相同*/
}

/* 第二个弹性项目 */
li:nth-child(2){
    flex: 1 1 0;
    background-color: #8cacea;
}
  </style>

记住设置 flex-grow : 1,会让弹性项目填满可用空间。伸展开关打开了。

这里有两个弹性项目。一个的 flex-grow 属性值是 1,另外一个是 2,那么会出现啥状况呢?

两个项目上的伸展开关都打开了。不过,伸展度是不一样的,1 和 2

两者都会填满可用空间,不过是按比例的。

它是这样工做的:前一个占 1/3 的可用空间,后一个占 2/3 的可用空间。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

即便两个弹性项目内容同样大(近似),它们所占空间仍是不一样。宽度不是基于内容的大小,而是伸展值。一个是另外一个的约两倍。

绝对和相对Flex项目

前面了解了一些基本概念,但重要的是要澄清一些重要的概念。那绝对和相对Flex项目之间到底有啥区别呢?两者之间主要的区别在于间距及如何计算间距。

一个相对Flex项目内的间距是根据它的内容大小来计算的。而在绝对Flex项目中,只根据 flex 属性来计算,而不是内容。

考虑以下的标记:

<ul>
    <li>
        This is just some random text  to buttress the point being explained.
    Some more random text to buttress the point being explained.
    </li>

    <li>This is just a shorter random text.</li>
</ul>

两个列表项元素,一个比另外一个的文本多得多。

加点样式:

ul {
    display: flex; /*触发弹性盒*/
}

li {
    flex: auto; /*记住这与 flex: 1 1 auto; 相同*/
    border: 2px solid red;
    margin: 2em;
}

以下是结果:

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

若是你已经忘了的话,flex: 1 1 auto 是与 flex-grow: 1flex-shrink: 1 和 flex-basis: auto 相同的。

Flex项目的初始宽度是被自动计算的(flex-basis: auto),而后会伸展以适应可用空间(flex-grow: 1)。

当Flex项目由于被设置为 flex-basis: auto,而致使宽度被自动计算时,是基于Flex项目内包含的内容的大小而计算。

上面示例中Flex项目的内容大小不相同。所以,Flex项目的大小就会不相等。

既然各个宽度开始就不是相等的(它是基于内容的),那么当项目伸展时,宽度也保持不相等。

能够试试让两个li的内容相同再试试。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

上面示例中的Flex项目是相对Flex项目。

下面咱们把Flex项目变成绝对的, 就是说此次它们的宽度是基于 flex 属性,而不是内容的大小。一行代码就能够出奇迹。

li {
    flex: 1 ; /*与 flex: 1 1 0 相同*/
}

效果以下:

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

此次看到两个Flex项目的宽度相同了吗?

Flex项目的初始宽度是零(flex-basis: 0),而且它们会伸展以适应可用空间。当有两到多个Flex项目的 flex-basis 取值为0时,它们会基于 flex-grow值共享可用空间。

如今宽度不会基于内容大小而计算,而是基于指定的 flex 属性值来计算。

绝对Flex项目的宽度只基于 flex 属性,而相对Flex项目的宽度基于初始内容大小

Auto-margin 对齐

小心Flex项目上的 margin: auto 对齐。当在Flex项目上使用 margin: auto 时,事情看起来就很怪异了。

你须要理解会发生什么。它会致使不可预料的结果,不过我打算解释解释。

当在Flex项目上使用 margin: auto 时,值为 auto 的方向(左、右或者两者都是)会占据全部剩余空间。

这玩意有点难理解。下面我来讲明一下。

考虑以下的导航栏标记以及 CSS 样式:

<ul>
    <li>Branding</li>
    <li>Home</li>
    <li>Services</li>
    <li>About</li>
    <li>Contact</li>
</ul>

  <style>
    /* 声明父元素为flex容器 */
    ul {
    display:flex;
    border: 1px solid red;
    padding: 0;
    list-style: none;

}
li {
    background-color: #8cacea;
    margin: 8px;
    padding: 10px;
    flex: 0 0 auto;
    border: 2px solid red;
}

  </style>

你能够看到以下的效果:

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

这里有几件事情要注意:

  • flex-grow 值为设置为0。这就解释了为何列表项不会伸展。
  • Flex项目向Main-Axis的开头对齐(这是默认行为)。
  • 因为项目被对齐到Main-Axis开头,右边就有一些多余的空间。看到了吧?

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局
如今在第一个列表项(branding)上使用 margin: auto,看看会出啥状况。

li:nth-child(1) {
    margin-right: auto; /*只应用到右外边距*/
}

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

刚刚发生了什么?以前的剩余空间如今已经被分配到第一个Flex项目的右边了。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

还记得我前面说的话吧?当在Flex项目上使用 margin: auto 时,值为 auto 的方向(左、右或者两者都是)会占据全部剩余空间

若是想让一个Flex项目的两边都用自动外边距对齐,该怎么办呢?

/* 若是愿意的话,也能够用 margin 简写来设置两个边 */
li:nth-child(1) {
    margin-left: auto;
    margin-right: auto
}

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

如今空白被分配到Flex项目的两边了。

那么,这是否是对很酷的自动外边距对齐的一种折衷方案呢?看起来是。若是没注意的话,它也多是受挫之源。当在一个Flex项目上使用自动外边距(margin: auto)时,justify-content 属性就不起做用了。

例如,在上面的Flex容器上经过 justify-content 属性,设置不一样的对齐选项时,对布局没有影响。

ul {
    justify-content: flex-end;
}

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

Flexbox实战

导航系统是每一个网站或者应用程序的重要组成部分。这个世界上的每一个网站都会有某种导航系统。

下面咱们看看这些热门网站,以及它们是如何实现其导航系统的。你看到Flexbox是如何帮助你更高效地建立这些布局吗?

也仔细看看哪里会用得上自动外边距特性。

Bootstrap导航

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

AirBnB PC端导航

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

Twitter PC端导航

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

建议你本身写代码。试着本身实现这些导航系统。

切换flex-direction会发生什么?

还记得我说过默认的Main-Axis方向是从左到右,Cross-Axis方向是从上到下吧?

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

好吧,如今你也能够改变这个方向。

正如在较早的小节中所描述的那样,用 flex-direction: column 时,确实是这样。

当用 flex-direction: column 时,Main-Axis和Cross-Axis会向以下所看到的那样改变:

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

若是曾用英语写过文字,那么你就知道英语是从左到右,从上到下来写的。

Flexbox的默认Main-Axis和Cross-Axis也是采用一样的方向。

不过,若是将 flex-direction 切换为 column,它就再也不遵循英语的范式,而是日语的范式!

是的,日语。

若是你用日语写过文字,那么应该很熟悉了。(郑重声明,我从没用过日语写过文字)。

日文一般是从上到下写的!没那么怪,对吧?

这就解释了为嘛这对英语写做者可能有点恼火。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

看看下面这个例子。标准无序列表(ul),带有 3 个列表项(li)。不过此次我要改变一下flex-direction

<ul>
    <li></li>
    <li></li>
    <li></li>
</ul>

 <style>
    /* 声明父元素为flex容器 */
    ul {
    display:flex;
    border: 1px solid red;
    padding: 0;
    list-style: none;
    flex-direction: column;

}
li {
    background-color: #8cacea;
    margin: 8px;
    padding: 10px;
    flex: 0 0 auto;
    border: 2px solid red;
}
  </style>

以下是方向变化以前的样子:

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

以下是方向变化以后的样子:

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

如今文字是以日语风格写的:沿Main-Axis从上到下

你会看到项目的宽度填满了空间,对吧?

若是在以前要变成这样子,得处理 flex-basis 以及 flex-grow 属性。

下面来看看这些会如何影响新的布局。

li {
    flex-basis: 100px;
}

下面是你会获得的。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

什么?高度是被影响了,可是宽度没有啊?我以前说过,flex-basis 属性定义每一个Flex项目的初始宽度。

在切换 flex-direction 时,请注意,影响Main-Axis的每个属性如今会影响新Main-Axis。像 flex-basis 这种会影响Main-Axis上Flex项目宽度的属性,如今会影响项目的高度,而不是宽度。

方向已经被切换了!

因此,即便你使用 flex-grow 属性,它也是影响高度。本质上,每一个做用于横向轴(即Main-Axis)上的 flex 属性,如今都会做用于纵向上的新Main-Axis。它只是在方向上的一个切换。

这里再来一个例子。我发誓在这个例子以后你会有更好的理解。减小以前看到过的Flex项目的宽度,它们就再也不填满整个空间了:

li {
    width: 200px;
}

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

若是想把列表项移到屏幕中间该怎么办呢?

在英语中,这是你到目前为止处理弹性容器的方式。就是说, 把Flex项目移到Main-Axis的中间 。

因此,你会用 justify-content: center。可是这样作不起做用。由于方向变了,中心是沿着Cross-Axis,而不是Main-Axis。

再来看看:
前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

因此请用日语文字来思考。Main-Axis是从上到下,你不须要这样。Cross-Axis是从左到右。貌似是你所要的

你须要 把Flex项目移到Cross-Axis的中间 。这里想起哪一个Flex容器属性了么?

是的,align-items 属性。align-items 属性处理Cross-Axis上的对齐。

因此要把这些项目移到中间,得这样作:

li {
    align-items: center;
}

瞧瞧!Flex项目已经居中了吧。

前端入门教程--从0开始经过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局

参考:
https://medium.freecodecamp.com/understanding-flexbox-everything-you-need-to-know-b4013d4dc9af#.pr6cltk9j

相关文章
相关标签/搜索