Flex弹性盒布局

一、初识Flex布局

    2009年,W3C提出了一种新的方案——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,请移步阮一峰老师的博客






猜你喜欢

转载自blog.csdn.net/ghostlpx/article/details/52294121