Flex弹性盒布局

时间:2022-12-04 05:26:41

一、初识Flex布局

    2009年,W3C提出了一种新的方案——Flex布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。各浏览器支持情况如下图: Flex弹性盒布局
Flex布局将成为未来布局的首选方案。

二、Flex的语法

    采用Flex布局的元素,称为Flex容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称"项目"。   容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。其实这里也不尽绝对,当 flex-direction : column 时,主轴会变为竖直方向,交叉轴变为水平方向。而且在这里,与主轴相对应,我觉得将cross axis译为“副轴”更为容易理解,不过这些都是细节。

容器的属性 

  • flex-direction(定义主轴的方向) row(默认值) | column | row-reverse | column-reverse
  • flex-wrap(定义是否换行) no-wrap(默认值) | wrap | wrap-reverse
  • flex-flow(以上两个属性的简写方式)
  • 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 | stretch

项目的属性

  • order(项目在容器中的排列顺序,越小越靠前,默认为0)
  • flex-grow(项目的放大比例,默认0)
  • flex-shrink(项目的缩小比例,默认1)
  • flex-basis(项目在主轴上所占的大小,默认auto,即为项目的原有尺寸)
  • flex(2,3,4项的缩写形式,默认为:flex : 0 1 auto。只写一个值时,后两项为各自的默认值。)
  • align-self(属性允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch


三、利用Flex实现圣杯布局

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>圣杯布局</title>
<style>
.HolyGrail {
display: flex;
min-height: 100vh;
flex-direction: column;
}

header,
footer {
flex: 1;
}

.HolyGrail-body {
display: flex;
flex: 4;
}

.HolyGrail-content {
flex: 1;
}

.HolyGrail-nav, .HolyGrail-ads {
/*两个边栏的宽度设为12em*/
flex: 0 0 12em;
}

.HolyGrail-nav {
/*导航放到最左边*/
order: -1;
}


@media (max-width: 768px) {
.HolyGrail-body {
flex-direction: column;
flex: 1;
}
.HolyGrail-nav,
.HolyGrail-ads,
.HolyGrail-content {
flex: auto;
}
}

.red{background-color: red}
.blue{background-color: blue}
.gray{background-color: gray}
.pink{background-color: pink}
.yellow{background-color: yellow}

</style>
</head>
<body class="HolyGrail">
<header class="red">我是头部空间</header>
<div class="HolyGrail-body">
<main class="HolyGrail-content yellow">主要内容</main>
<nav class="HolyGrail-nav blue">导航区</nav>
<aside class="HolyGrail-ads gray">广告区</aside>
</div>
<footer class="pink">我是尾部空间</footer>
</body>
</html>
几点说明:
  1. header和footer flex : 1,而.HolyGrail-boyflex:4,这就表示它们的尺寸比例为1:1:4。这样简写后,flex-shrink 和 flex-basis的取值分别是各自的默认值。
  2. .HolyGrail-content的flex : 1,HolyGrail-nav的flex : 0 0 12em,.HolyGrail-ads的 flex : 0 0 12em。当 flex-grow 和 flex-shrink 的值都为0时,表示该项目不放大、不缩小。
  3. 当只有一个项目设置 flex : 1,而其它项目没有设置 flex 属性时(即 flex 取默认值),这时其它项目为各自的原始大小,设置了 flex 属性的项目会独自占据剩余空间。
  4. 当浏览器的宽度小于768px时,.HolyGrail-body 中的项目竖直叠放,这时的主轴和副轴是交换了方向的,不过这里没有体现出来,当有设置容器属性的需求时,注意这一点很重要。
   其实不止是圣杯布局,flex还可以实现很多经典的布局方案,它是对传统的基于盒模型,依赖display 属性 +position 属性 +float 属性布局方案的一种替代。     这篇文章并不专注于介绍各个属性的含义,而是强调了一些需要注意的细节。如果想要仔细学习flex,请移步阮一峰老师的博客