Flexbox创建网站布局

内容纲要

基础网页布局

在flexbox之前,如果不使用hack,这种布局很难实现。开发人员通常不得不添加额外的标记,增加负边距以及一些其他的属性来使所有内容正确排列,而不管内容的数量多少或者屏幕大小多少。

而Flexbox是创建常用网站布局的理想选择,例如三列:

结构:

<!-- 1.1 -->
<header>Header</header>
<div id="main">
  <article>Article</article>
  <nav>Nav</nav>
  <aside>Aside</aside>
</div>
<footer>Footer</footer>

样式:

/* 1.2 */
* {
  box-sizing: border-box;
}
html,body{
  margin: 0;
}
#main{
  display: flex;
  min-height: calc(100vh - 40vh);
}
#main > article {
  flex: 1;
}
#main > nav, #main > aside {
  flex: 0 0 20vw;
  background: beige;
}
#main > nav {
  order : -1;
}

header, footer, article, nav, aside{
  padding: 1em;
}
header, footer{
  background: yellowgreen;
  height: 20vh;
}

结果:
Flexbox创建网站布局

首先,将#main元素设置为flex容器,并将headerfooter设置为块元素。也就是说,只有中间是flexbox。

min-height属性的值通过calc()函数计算得到。我们只需要将主区域设置为视口高度的100%,减去headerfooter(每个都是20vh)的高度。这保证了即使内容不多的情况下布局依然能够占据屏幕的整个高度。如果内容没有占满整个屏幕高度,footer将永远不会在下面留下空白的空间。

注意:
min-height之所以使用box-sizing: border-box为了好计算。不然我们还需要再减去padding

flex属性是flex-grow(扩展率),flex-shrink(收缩率)和flex-basis(最小固定值)属性的简写形式。

单值:只设置flex-grow属性。

对值:无单位设置flex-shrink,有单位设置flex-basis

如果想在整个页面上使用flexbox,可以使用嵌套的柔性容器来实现。

Flexbox嵌套

Flexbox本质上是一维布局模型。弹性容器内的弹性子级可以水平或垂直设置,但不能同时设置。如果想要在两个维度中布局,则需要在另一个维度中嵌套弹性容器:

结构:

<!-- 1.1 -->
<div class="container">
  <div class="red">1
    <div class="green">1a</div>
    <div class="blue">1b</div>
  </div>
  <div class="green">2</div>
  <div class="blue">2</div>
</div>

样式:

/* 1.2 */
html,body{
  margin: 0;
  padding: 0;
}
.container{
  display: flex;
}

.red{
  background-color: orangered;
  display: flex;
  flex-direction: column;
}
.green{
  background-color: yellowgreen;
}
.blue{
  background-color: steelblue;
}
.container div{
  font-size: 5vw;
  padding: .5em;
  color: white;
  flex: 1;
}

结果:
Flexbox创建网站布局

在外层和红色子级div容器上使用display: flex。如果我们在红色div容器上使用flex-direction: column会导致其垂直堆叠。flex-directionis的默认值是row,所以我们不用为最外层容器设置flex-directionis属性。

二维(嵌套)Flexbox网页布局

之前的三列布局中我们只在中间部分使用了flexbox。headerfooter仍然是块元素。换句话说,我们的Flexbox是一维布局。尽管整个页面实际上是一个二维布局,但弹性盒部分仅提供了一个维度的布局。

二维布局应该是这样的:

Flexbox创建网站布局

垂直纬度的布局由header#mainfooter组成。可以将整个页面视为一大列。

水平纬度的布局由navarticleaside组成。设置第二行成为弹性容器:

结构:

<!-- 1.1 -->
<header>header</header>
<div id="main">
  <article>article</article>
  <nav>nav</nav>
  <aside>aside</aside>
</div>
<footer>footer</footer>

样式:

/* 1.2 */
*{
  box-sizing: border-box;
}
body{
  display: flex;
  min-height: 100vh;
  flex-direction: column;
  margin: 0;
}
#main{
  display: flex;
  flex: 1;
}
#main > article{
  flex: 1;
}
#main > nav, #main > aside{
  flex: 0 0 20vw;
  background-color: beige;
}
#main > nav{
  order: -1;
}
header, footer{
  background-color: yellowgreen;
  height: 20vh;
}
header,footer,article,nav,aside{
  padding: 1em;
}

结果:
Flexbox创建网站布局

嵌套Flexbox vs Grid
当你使用嵌套flexbox布局时,也许会想到可以使用网格布局。网格布局是为二维布局构建的,不需要嵌套来实现这种布局(尽管网格支持嵌套)。但是,仍然有许多布局更适合于flexbox,因此这只是一个简单的例子。

我相信你可以想到嵌套Flexbox布局的更多其他用途,而不仅仅是网站布局。

code enjoy! ʕ•ᴥ•ʔ

作者:indeex

链接:http://indeex.cc

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


发表评论

您的电子邮箱地址不会被公开。