文章目录
💬 前言
通过 上一篇 文章,了解到了Flex布局 相关的语法知识,也知道了Flex各个属性值的大致用法。
但是身为程序员,自然是不能单靠死记硬背来学习知识,‘阮一峰’ 大佬显然也知道这个道理,在其博客发布了 相关 Flex布局的实例文章。接下来,参考 “ 一峰 ” 大佬的文章及其他百度资料,结合实际案例给大家讲解一下Flex布局的使用!
提示:以下是本篇文章正文内容,下面案例仅供参考。如有问题,欢迎评论指出!
一、为什么使用Flex布局 ( 唠叨话可略过 ) ?
首先,我们知道前端开发中,页面的排版往往是通过许许多多的样式对页面进行排版和布局。但是在以往的一些布局属性,如:position、float等属性对样式进行排布时,往往很难实现布局响应式
。
或者说,实现响应式布局需要使用 ‘ 流媒体 ’,对页面大小进行动态捕获,且需要编写大量配套的样式。大大增加了工作量,降低了工作效率。同时,因为 ‘ 流媒体 ’需要动态捕获页面窗口大小,也导致了页面性能的下降。
所以W3C 在 2009年提出了 弹性布局(Flex布局)这么一种实现响应式布局的方案
,为盒模型提供了较大的灵活性
。让我们可以简便、完整、响应式地实现各种页面布局。加上目前,它已经得到了所有浏览器的支持
,这意味着,现在就能很安全地使用这项功能。
接下来废话不多说,进入案例环节!
二、实际案例
👉 骰子的布局
骰子的一面,最多可以放置9个点。
下面,就来看看Flex如何实现,从1个点到9个点的布局。你可以到 codepen 查看Demo。
HTML模板
<div class="box">
<span class="item"></span>
</div>
模板中,div元素(代表骰子的一个面)是Flex容器,span元素(代表一个点)是Flex容器中的子项目。如果有多个项目,就要添加多个span元素,以此类推。
> 骰子案例 - 单项目: 仅存在一个子项目
> 子项目左对齐
首先,只有左上角1个点的情况。设置flex容器后,Flex布局默认属性就是首行左对齐,所以一行代码就够了。
CSS代码
.box {
display: flex;
}
> 子项目居中对齐
CSS代码
.box {
display: flex;
justify-content: center;
}
> 子项目右对齐
CSS代码
.box {
display: flex;
justify-content: flex-end;
}
> 设置交叉轴对齐方式,可以垂直移动主轴。
CSS部分
.box {
display: flex;
align-items: center;
}
CSS代码
.box {
display: flex;
justify-content: center;
align-items: center;
}
CSS代码
.box {
display: flex;
justify-content: flex-end;
align-items: flex-end;
}
> 骰子案例 - 双项目
CSS代码
.box {
display: flex;
justify-content: space-between;
}
CSS代码
.box {
display: flex;
flex-direction: column;
justify-content: space-between;
}
CSS代码
.box {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
}
CSS代码
.box {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: flex-end;
}
CSS代码
.box {
display: flex;
}
.item:nth-child(2) {
align-self: center;
}
CSS代码
.box {
display: flex;
justify-content: space-between;
}
.item:nth-child(2) {
align-self: flex-end;
}
> 骰子案例 - 三项目
CSS代码
.box {
display: flex;
}
.item:nth-child(2) {
align-self: center;
}
.item:nth-child(3) {
align-self: flex-end;
}
骰子案例 - 四项目
CSS代码
.box {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
align-content: space-between;
}
> 总结
经过骰子案例可以看出,其他布局都是诸如此类。需要灵活使用flex布局的属性值,通过日常实操中总结出来的。
👉 网格布局
1、基本网格布局
最简单的网格布局,就是平均分布。在容器里面平均分配空间,跟上面的骰子布局很像,但是需要设置项目的自动缩放。
HTML代码
<div class="Grid">
<div class="Grid-cell">...</div>
<div class="Grid-cell">...</div>
<div class="Grid-cell">...</div>
</div>
CSS代码
.Grid {
display: flex;
}
.Grid-cell {
flex: 1;
}
2、百分比布局
某个网格的宽度为固定的百分比,其余网格平均分配剩余的空间。
HTML代码
<div class="Grid">
<div class="Grid-cell u-1of4">...</div>
<div class="Grid-cell">...</div>
<div class="Grid-cell u-1of3">...</div>
</div>
CSS代码
.Grid {
display: flex;
}
/* flex属性是flex-grow, flex-shrink 和 flex-basis的简写 */
.Grid-cell {
flex: 1;
}
.Grid-cell.u-full {
flex: 0 0 100%;
}
.Grid-cell.u-1of2 {
flex: 0 0 50%;
}
.Grid-cell.u-1of3 {
flex: 0 0 33.3333%;
}
.Grid-cell.u-1of4 {
flex: 0 0 25%;
}
👉 圣杯布局
圣杯布局(Holy Grail Layout)指的是一种最常见的网站布局。页面从上到下,分成三个部分:头部(header)
,躯干(body)
,尾部(footer)
。其中躯干又水平分成三栏,从左到右为:导航
、主栏
、副栏
。
HTML代码
<body class="HolyGrail">
<header>...</header>
<div class="HolyGrail-body">
<main class="HolyGrail-content">...</main>
<nav class="HolyGrail-nav">...</nav>
<aside class="HolyGrail-ads">...</aside>
</div>
<footer>...</footer>
</body>
CSS代码
.HolyGrail {
display: flex;
min-height: 100vh;
flex-direction: column;
}
header,
footer {
flex: 1;
}
.HolyGrail-body {
display: flex;
flex: 1;
}
.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;
}
}
👉 输入框的布局
我们常常需要在输入框的前方添加提示,后方添加按钮。
HTML代码
<div class="InputAddOn">
<span class="InputAddOn-item">...</span>
<input class="InputAddOn-field">
<button class="InputAddOn-item">...</button>
</div>
CSS代码
.InputAddOn {
display: flex;
}
.InputAddOn-field {
flex: 1;
}
👉 悬挂式布局
有时,主栏的左侧或右侧,需要添加一个图片栏。
HTML代码
<div class="Media">
<img class="Media-figure" src="" alt="">
<p class="Media-body">...</p>
</div>
CSS代码
.Media {
display: flex;
align-items: flex-start;
}
.Media-figure {
margin-right: 1em;
}
.Media-body {
flex: 1;
}
👉 固定的底栏
有时,页面内容太少,无法占满一屏的高度,底栏就会抬高到页面的中间。这时可以采用Flex布局,让底栏总是出现在页面的底部。
HTML代码
<body class="Site">
<header>...</header>
<main class="Site-content">...</main>
<footer>...</footer>
</body>
CSS代码
.Site {
display: flex;
min-height: 100vh;
flex-direction: column;
}
/* 让content自己占据自己内容的大小 */
.Site-content {
flex: 1;
}
👉 流式布局
每行的项目数固定,会自动分行。
CSS代码
.parent {
width: 200px;
height: 150px;
background-color: black;
display: flex;
flex-flow: row wrap;
align-content: flex-start;
}
.child {
box-sizing: border-box;
background-color: white;
flex: 0 0 25%;
height: 50px;
border: 1px solid red;
}
> 简单综合案例
HTML代码
<div :class="$root.themeHomeChange === '1' ? 'keyApplications_light' : 'keyApplications'">
<div class="header">
<img src="@/assets/img/companyCenter/jiantou.png" />
<span class="headerTitle">{{title}}</span>
<!-- <span class="selectBox" ></span> -->
</div>
<div class="content">
<div
class="item"
v-for="(item, index) in list"
:title="item.label"
:key="index"
@click="tagClick(item)">
<span
class="icon"
:style="{'background': `url(${item.url}) no-repeat`, 'background-size': '100% 100%'}"></span>
<span class="label">{{item.label}}</span>
</div>
</div>
</div>
CSS代码
.keyApplications {
width: calc(100% - 20px);
height: 380px;
padding: 10px;
background: url(../../assets/img/riskControlCenter/hgjcjkBg.png) no-repeat;
background-size: 100% 100%;
.header {
display: flex;
align-items: center;
// padding-left: 10px;
margin-bottom: 5px;
position: relative;
.headerTitle {
font-family: MicrosoftYaHei-Bold;
font-size: 17px;
color: #00F8FF;
font-weight: 600;
margin-left: 5px;
}
}
.content {
width: 100%;
height: calc(100% - 32px);
display: flex;
flex-wrap: wrap;
.item {
width: 47%;
height: 100px;
margin: auto;
cursor: pointer;
color: #FFF;
display: flex;
justify-content: center;
box-shadow: 0px 0px 8px 4px rgba(0,157,255,0.16);
border-radius: 3px;
background-size: 100% 100%;
position: relative;
overflow: hidden;
&:hover {
// 添加选中后的阴影
box-shadow: 0px 0px 10px #00f8ff inset;
color: #00f8ff;
}
.icon {
display: block;
width: 50%;
height: 50px;
margin-top: 15px;
}
.label {
font-size: 13px;
font-weight: bold;
position: absolute;
bottom: 10px;
}
}
}
}
其中,通过灵活设置 容器内 子项目元素的大小,再设置超出换行,即可实现想要的布局效果。使用 justify-content: center; 实现子项目居中,在开发中,灵活混入 position 定位属性,可以使布局更加随心所欲。