【CSS3】flex布局实践篇 | 7种常见网页布局方案

1、垂直居中

垂直居中一度是前端面试时必问知识点。 目前的垂直解决方案 使用了 从负外边距 到 display:table-cell 等荒谬的奇技淫巧,包括全高的伪元素。这些方法是又复杂又难写。

不知道大家第一次使用flex布局做什么,反正我是用来做垂直居中,使用它实在是太简单了,两行代码搞定。

复制代码
<div class="main">
    <h2>我居中啦!</h2>
    <p>这个元素水平垂直居中了。</p>
</div>
复制代码

2、sticky footer布局

业务场景:

当页面内容少时,让页脚粘在底部;当内容超过一屏时,页脚跟在后面。

这一度也是一个CSS布局难题。但flex布局可以完美解决这个问题。

javascript 复制代码
<div class="container">
  <header>header</header>
  <main>
    <div class="content">
      今夜我不会遇见你 </br>
      今夜我遇见了世上的一切</br>
      但不会遇见你。
    </div>
  </main>
  <footer>footer</footer>
</div>



.container {
    display: flex;
    flex-derection: column;
}

header, footer{
    height: 100px;
}

头部和尾部定高,中间内容设置高度后,当内容少时,页脚会在上面,不会固定在底部。

这种效果显然不是我们期望的,要想实现业务要求,就需要使用到flex-grow属性,它的默认值是0。即当有空余空间时,也不放大。这时我们需要将中间main设置flex-grow为1,这样当有空余空间,他就会放大,填充剩余空间。

javascript 复制代码
main { flex-grow: 1; }

内容少时-吸附在底部:

内容多时-跟随滚动:

这样我们就实现了这个经典布局了。

3、圣杯布局

这是一个经典的 CSS 布局挑战,历史上出现的方案都没有完美解决。直到 Flexbox 布局的出现,终于成为可能。

圣杯布局由页头 (header),中间部分 (center),页脚 (footer),和三栏组成。中间的一栏是主要内容,左边和右边提供如广告、导航的链接。

javascript 复制代码
<div class="HolyGrail">
  <header>header</header>
  <div class="HolyGrail-body">
    <main class="HolyGrail-content">content</main>
    <nav class="HolyGrail-nav">nav</nav>
    <aside class="HolyGrail-ads">ads</aside>
  </div>
  <footer>footer</footer>
</div>


.HolyGrail {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}

header,footer {
  height: 100px;
}

.HolyGrail-body {
  flex: 1;

  display: flex;
  justify-content: space-between;
}

.HolyGrail-nav, .HolyGrail-ads {
  flex: 0 0 100px;
}

.HolyGrail-content {
  flex: 1;
}

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

小屏幕时,中间内容自动成垂直布局,三列。

复制代码
javascript 复制代码
/* 响应式 */
@media (max-width: 768px) {
  .HolyGrail-body {
    flex-direction: column;
  }

  .HolyGrail-nav, .HolyGrail-ads, .HolyGrail-content {
    flex: 1;
  }
}

4、经典导航栏布局

javascript 复制代码
<header>
  <div class="header-left">
    <div class="logo"></div>
    <nav>
      <a>首页</a>
      <a>档案</a>
    </nav>
  </div>

  <div class="header-right">
    <div class="user">echo</div>
    <div class="logout">退出</div>
  </div>
</header>



header {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.header-left,.header-right {
  display: flex;
  align-items: center;
}

.logo {
  flex: 0 0 32px;
}

.user {
  margin-right: 20px;
}

5、栅格布局

基础栅格布局

最简单的网格布局就是平均分布。在容器中平均分配空间,需要设置项目的自动缩放。

javascript 复制代码
<div class="grid">
  <div class="cell"></div>
  ...
</div>


.grid {
  display: flex;
}

.cell {
  flex: 1;
}

独立尺寸布局

当你的需求不是等宽栅格的时候,可以添加尺寸属性到特定的栅格中。没有尺寸属性的栅格将简单地继续平分剩下的可用空间。

下边加了 "auto" 标签的栅格没有指定任何尺寸属性。

javascript 复制代码
<div class="grid">
  <div class="cell u-1of2"></div>
  <div class="cell"></div>
  <div class="cell"></div>
</div>


.u-1of2 {
  flex: 0 0 50%;
}

.u-1of3 {
  flex: 0 0 33.33%;
}

.u-1of4 {
  flex: 0 0 25%;
}

6、悬挂式布局

这种布局很普遍,当我们在做一个新闻列表模块时,通常它每一栏的的左侧或右侧,需要展示一个图片栏。

javascript 复制代码
<div class="list">
  <div class="item">
    <div class="img"></div>
    <div class="info"></div>
  </div>
  <div class="item">
    <div class="img"></div>
    <div class="info"></div>
  </div>
</div>


.list {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.item {
  display: flex;
  gap: 10px;
}

.item:nth-of-type(2n) {
  flex-direction: row-reverse;
}

.img {
  width: 32px;
  height: 32px;
}

.info {
  flex: 1;
}

7、输入框附加布局

我们常常需要在输入框的前方添加提示,后方添加按钮。

javascript 复制代码
<!-- 后置 -->
<div class="InputAddOn next">
    <input class="InputAddOn-field" />
    <span class="InputAddOn-item">搜索</span>
</div>


.InputAddOn {
  display: flex;
}

.InputAddOn-field {
  flex: 1;
}

.InputAddOn-item {
  flex: 0 0 60px;
}

结语

以上介绍的7种布局基本覆盖了大部分业务场景下的页面布局。或有不足之处,欢迎大家补充讨论。

相关推荐
请叫我飞哥@8 小时前
HTML5 CSS 与样式详解
前端·css·html5
Amarantine、沐风倩✨10 小时前
设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
java·物联网·音视频·webrtc·html5·视频编解码·七牛云存储
荆州克莱14 小时前
mysql中局部变量_MySQL中变量的总结
spring boot·spring·spring cloud·css3·技术
sunshine64115 小时前
【CSS】实现tag选中对钩样式
前端·css·css3
安冬的码畜日常21 小时前
【CSS in Depth 2 精译_086】14.3:CSS 剪切路径(clip-path)的用法
前端·css·css3·html5·clip-path·css剪辑·css剪切路径
m0_748248021 天前
HTML5前端实现毛玻璃效果的可拖拽登录框
前端·html·html5
red润1 天前
使用 HTML5 Canvas 实现动态蜈蚣动画
前端·html·html5
m0_748248941 天前
HTML5系列(11)-- Web 无障碍开发指南
前端·html·html5
桃园码工2 天前
8_HTML5 SVG (4) --[HTML5 API 学习之旅]
html5·svg·滤镜·文本·stroke
羊小猪~~2 天前
前端入门之VUE--ajax、vuex、router,最后的前端总结
前端·javascript·css·vue.js·vscode·ajax·html5