Css 弹性布局(Flex)详细介绍(Flex 属性详解、场景分析)

news2025/2/27 11:11:46

目录​​​​​​​

前言

Flex 布局是什么?

Flex 简介

Flex 容器属性

Flex 基本使用

场景一

flex-direction

场景二

justify-content

align-items

flex-wrap

场景三


前言

我们知道,网页展示就好比一个个盒子堆叠在一起,通过调整盒子的大小、位置、样式等,形成了各式各样的页面。当我们在开发一个页面的时候,我们常规的做法可能是:搭建框架、划分区域、定制排版、调整位置、嵌入内容、微调与增添样式。

布局排版是页面基础且关键的一环。其中,常用的自适应布局技术:Flex布局。

Flex 布局是什么?

Flex 简介

Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。

任何一个容器都可以指定为 Flex 布局。

.box {
  display: flex;
}

行内元素也可以使用 Flex 布局。

.box {
  display: inline-flex;
}

Webkit 内核的浏览器,必须加上-webkit前缀。

.box {
  display: -webkit-flex;  /* Safari */
  display: flex;
}

采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。

Flex 容器属性

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-items
  • align-content

接下来,咱们通过具体实例介绍Flex属性的使用与其在布局上达成的效果。 

Flex 基本使用

场景一

整个页面分为两大部分,我们希望左边部分作为菜单栏,宽度固定;右边部分作为内容展示区,宽度自适应且占满剩余部分。

类似如下布局

常规方式:浮动(float)

首先,将框架搭起来

<div id="app">
  <div id="nav">
    <div class="main-content">
      <div class="left-content">Left</div>
      <div class="right-content">Right</div>
    </div>
  </div>
</div>

为了方便查看效果,给每个盒子设置大小与添加背景色

<style>
.main-content {
  width: 100%;
  height:100%;
  background: #72f884;
}
.left-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(238, 119, 34);
}
.right-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(68, 133, 255);
}
</style>

初始页面展示效果

现在,使用浮动(float),使左边跟右边并列布局

<style>
.main-content {
  width: 100%;
  height:100%;
  background: #72f884;
}
.left-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(238, 119, 34);
  /* 使用浮动完成左右并列布局 */
  float: left;
}
.right-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(68, 133, 255);
  /* 使用浮动完成左右并列布局 */
  float: left;
}
</style>

页面展示效果

此时,再将右边的宽度通过 calc() 方法计算,实现右边自适应

<style>
.right-content {
  box-sizing: border-box;
  /* width: 200px; */
  height: 200px;
  background: rgb(68, 133, 255);
  /* 使用浮动完成左右并列布局 */
  float: left;
  /* 使用calc(),右边宽度 = 总宽度 - 左边菜单栏宽度  */
  width: calc(100% - 200px);
}
</style>

缩小窗口,查看效果

此时,实现了场景一的需求,效果看起来也还OK。但是有个问题,现在的这个布局使用的是浮动,即代表着这两个块脱离了文档流,如果页面有其他布局区域,如头部导航栏、底部关于栏、甚至是其他主内容区,这时候我们可能就需要花点时间去清除浮动带来的影响,或者是增加更多的浮动来完成其他区域的布局。

那么有没有一种布局是既可以不使用浮动(或者说是不脱离文档流),又能实现上面的布局呢?答案是肯定的,可以使用Flex(弹性布局),且写起来也更简便。

现在,我们将浮动样式去掉,在包含左右两个盒子的父盒子加上 display:flex,表示使用弹性布局

<style>
.main-content {
  width: 100%;
  height:100%;
  background: #72f884;
  /* 使用flex弹性布局 */
  display: flex;
}
.left-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(238, 119, 34);
}
.right-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(68, 133, 255);
}
</style>

此时查看页面效果

实现右边部分自适应只需要为右边添加样式 flex:1 即可

.right-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(68, 133, 255);
  /* 表示该盒子自动占满剩余空间(往下展开) */
  flex: 1;
}

此时左右两个盒子并列布局,且右边自适应,why?以下详细展开。

flex-direction

flex-direction属性决定主轴的方向,即项目(或者说是子盒子)的排列方向。

它可能有4个值。

  • row(默认值):主轴为水平方向,起点在左端。
  • row-reverse:主轴为水平方向,起点在右端。
  • column:主轴为垂直方向,起点在上沿。
  • column-reverse:主轴为垂直方向,起点在下沿。

布局图示

上面例子不设置该属性,因此为默认值(row),即主轴水平、从左到右排列。

场景二

整个页面分为多个部分,我们希望这些部分是并列布局,且宽度自适应。

页面布局如下(以三个部分举例,若更多部分做法一致)

<div id="app">
  <div id="nav">
    <div class="main-content">
      <div class="left-content">Left</div>
      <div class="middle-content">Middle</div>
      <div class="right-content">Right</div>
    </div>
  </div>
</div>

初始样式(同样,父盒子使用flex布局)

<style>
.main-content {
  width: 100%;
  height:100%;
  background: #72f884;
  /* 使用flex弹性布局 */
  display: flex;
}
.left-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(238, 119, 34);
}
.middle-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(173, 40, 250);
}
.right-content {
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  background: rgb(68, 133, 255);
}
</style>

初始页面效果

现在,我们三个子盒子的宽度是固定的,因此实现不了自适应,我们可以使用 %(百分比)方式设置各个子盒子相对于父盒子所占的百分比

<style>
.left-content {
  box-sizing: border-box;
  /* 宽度使用 % ,实现自适应 */
  width: 30%;
  height: 200px;
  background: rgb(238, 119, 34);
}
.middle-content {
  box-sizing: border-box;
  /* 宽度使用 % ,实现自适应 */
  width: 40%;
  height: 200px;
  background: rgb(173, 40, 250);
}
.right-content {
  box-sizing: border-box;
  /* 宽度使用 % ,实现自适应 */
  width: 30%;
  height: 200px;
  background: rgb(68, 133, 255);
}
</style>

页面展示效果

缩小查看页面展示效果

注意观察,此时三个子盒子的宽度总和等于父盒子的宽度,即30% + 40% + 30% = 100%。

如果三个盒子的宽度占比总和小于100%,即都为30%,页面效果如下

此时页面会多出空的部分,我们可以将这部分利用起来。

justify-content

该属性定义了项目在主轴上的对齐方式。

它可能取5个值,具体对齐方式与轴的方向有关。下面假设主轴为从左到右。

此时主轴(flex-direction)为默认的row,即水平方向,从左到右。

  • flex-start(默认值):左对齐(即上面页面展示效果)
  • flex-end:右对齐
  • center: 居中
  • space-between:两端对齐,项目之间的间隔都相等。
  • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

接下来我们一一展示属性达成的效果

flex-start

如上图

flex-end

center

space-between(注意空白部分分配情况)

space-around(注意空白部分分配情况)

以上就是justify-content不同取值的布局效果,最后两个取值就是如何分配剩余的空白部分。

还有一个与justify-content相似的属性是align-items。

align-items

该属性定义项目在交叉轴上如何对齐。(如果主轴为水平,那么交叉轴就是垂直)

它可能取5个值。具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下。

  • flex-start:交叉轴的起点对齐。
  • flex-end:交叉轴的终点对齐。
  • center:交叉轴的中点对齐。
  • baseline: 项目的第一行文字的基线对齐。
  • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

flex-startflex-endcenter与justify-content中展示效果类似,只是一个是水平方向一个是垂直方向。各属性布局效果如下:

回到场景二,如果三个盒子的宽度占比总和大于100%,页面效果又是怎样的?

<style>
.left-content {
  box-sizing: border-box;
  /* 宽度使用 % ,实现自适应 */
  width: 40%;
  height: 200px;
  background: rgb(238, 119, 34);
}
.middle-content {
  box-sizing: border-box;
  /* 宽度使用 % ,实现自适应 */
  width: 40%;
  height: 200px;
  background: rgb(173, 40, 250);
}
.right-content {
  box-sizing: border-box;
  /* 宽度使用 % ,实现自适应 */
  width: 30%;
  height: 200px;
  background: rgb(68, 133, 255);
}
</style>

现在,调整父盒子的宽度为1000px

如果子盒子为40%,宽度理应为400px,但是有下图可知,宽度小于400px了 

此时宽度被压缩了,其实此时是按照比例缩小了,由之前的按照100份来占比,现在相当于按照1100份来占比(40% 40% 30%),此时的宽度就是1000 * (40/110) 大概就是363.64。

那如果我们就想宽度是那么多,不能有误差,该怎么办呢?

flex-wrap

默认情况下,项目都排在一条线(又称"轴线")上。flex-wrap属性定义,如果一条轴线排不下,如何换行。在宽度总和超出父盒子的宽度时,希望保持每个子盒子的准确宽度,那就只能分行排列(一行排列会被按比例压缩,如上图)。

它可能有3个值。

  • nowrap(默认值):不换行。
  • wrap:换行。
  • wrap-reverse:换行,第一行在下方。 

分别对应以下图 

此时设置flex-wrap:wrap,允许换行 

.main-content {
  width: 100%;
  height:100%;
  background: #72f884;
  /* 使用flex弹性布局 */
  display: flex;
  /* 使用flex-wrap,wrap为允许换行,nowrap为不允许换行 */
  flex-wrap: wrap;
}

再次查看页面展示效果

换行之后子盒子的宽度正常,不被压缩了。 

场景三

现在希望将场景一与场景二结合,即在一个页面中分为左右两大部分,左边部分是菜单栏(宽度固定200px);右边部分是内容展示区,宽度自适应且占满,内容展示区里面又分为三部分,每个部分宽度为该区域的30%。

1、搭建左右两大部分

html

<div id="app">
  <div id="nav">
    <div class="main-content">
      <div class="left-content">Left</div>
      <div class="right-content">Right</div>
    </div>
  </div>
</div>

css

<style>
.main-content {
  width: 100%;
  height:100%;
  background: #72f884;
  /* 使用flex弹性布局 */
  display: flex;
}
.left-content {
  box-sizing: border-box;
  width: 200px;
  height: 100%;
  background: rgb(238, 119, 34);
}
.right-content {
  box-sizing: border-box;
  flex: 1;
  height: 100%;
  background: rgb(68, 133, 255);
}
</style>

页面展示效果

2、布局右边部分

里面分为三部分(用一个新的div包裹,结构分明)

html

<div id="app">
  <div id="nav">
    <div class="main-content">
      <div class="left-content">Left</div>
      <div class="right-content">
        Right
        <div class="right-content-item">
          <div class="right-content-item-list">part1</div>
          <div class="right-content-item-list">part2</div>
          <div class="right-content-item-list">part3</div>
        </div>
      </div>
    </div>
  </div>
</div>

css

.right-content-item {
  width: 100%;
  height: 100%;
}
.right-content-item-list {
  width: 30%;
  height: 30%;
  background: rgb(242, 245, 37);
}

页面展示效果

此时右边部分(新增的div)内容区使用flex布局

.right-content-item {
  width: 100%;
  height: 100%;
  display: flex;
}

页面展示效果

此时使用justify-content属性

.right-content-item {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: space-around;
}

页面展示效果

缩小窗口,查看页面展示效果

无论窗口放大或缩小,都能实现自适应。在该例子中,可以知道,flex布局里面的子盒子依然可以使用flex布局,即可以嵌套使用,可用该特点结合flex中的各个属性实现多种自适应布局场景。

最后flex-flow跟align-content不展开,可以自行了解。

参考:

Flex 布局教程:语法篇 - 阮一峰的网络日志https://www.ruanyifeng.com/blog/2015/07/flex-grammar.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022版完整版web前端学习路线图(超详细自学路线)

跟着路线图认真坚持学习从前端小白到大神不是梦&#xff0c;0基础看这一篇足矣&#xff01; 学们记得加关注点赞收藏&#xff0c;自学路上不迷糊&#xff01; 零基础小白自学前端路线图速览&#xff1a; 阶段一&#xff1a;核心基础入门 前端计算机常识 ➾ htmlcss基础 ➾ h…

JDBC 连接 MySQL

哈喽~大家好&#xff0c;这次我们来看看 JDBC 如何 连接 MySQL. 目录 一、开头 二、介绍 1、JDBC 的概念 2、JDBC 的功能 3、JDBC 的常用接口和类 三、数据库的创建&#xff08;MySQL&#xff09; 1、连接 MySQL (1)、注册驱动 (2)、获取连接 (3)、获取执行者连接 …

猿创征文|超实用的前端开发工具分享

&#x1f373;作者&#xff1a;贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 &#xff0c;一名很普通但不想普通的程序媛}贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛&#x1f933; &#x1f64a;语录&#xff1a;多一些不为什么的…

Element UI 及 Element Plus框架

一&#xff0c;何为Element UI 及 Element Plus&#xff1f; 它们是前端框架。它是包含很多有自己风格的组件库。 Element目前有两个版本&#xff1a;element-ui 及 element-plus两个版本。它将HTML的基础控件进行了封装&#xff0c;用户只需要调用这些控件就可以了。而不需要…

实验一 基于CSS+HTML+JS开发简单个人网站

目录&#xff1a; 实验要求 实验代码 1.注册 2.登录 3.主页 4.个人简介 5.我的理想 6.我的生活 7.学习内容 总结 实验要求 实验一 基于CSSHTMLJS开发简单个人网站 实验学时&#xff1a;4 实验类型&#xff1a;设计 一、目的与任务 目的&#xff1a;熟悉在静态网…

Vue3-Pinia的基本使用

什么是Pinia呢&#xff1f; Pina开始于大概2019&#xff0c;是一个状态管理的库&#xff0c;用于跨组件、页面进行状态共享&#xff08;这和Vuex、Redux一样&#xff09;,用起来像组合式API&#xff08;Composition API&#xff09; Pinia和Vuex的区别 PInia的最初是为了探索…

web期末作业网页设计——我的家乡(网页源码)

作品介绍 1.网页作品简介方面 &#xff1a;HTML网站模板。主要有&#xff1a;首页 家乡简介 风景名胜 特色美食 站长介绍 在线调查 等总共 6 个页面html下载。 2.网页作品编辑&#xff1a;此作品为学生个人主页网页设计题材&#xff0c;代码为简单学生水平 htmlcss 布局制作&am…

超详细的VSCode下载和安装教程以及解决VSCode下载速度特别慢的问题

文章目录1. 引言2. 下载VSCode3. 解决VSCode下载速度特别慢4. 安装VSCode1. 引言 今天用WebStorm运行前端代码时&#xff0c;发现不太好打断点。 于是&#xff0c;打算改用VSCode来运行前端代码&#xff0c;但前提是要安装VSCode&#xff0c;如下便是超详细的VSCode安装教程以…

小程序中使用echarts(硬货,全网最详细教程!)

echarts是一个基于JS的数据可视化图标库&#xff0c;它提供了直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性定制的数据可视化图表。一般在vue中会使用到&#xff0c;并且官网也详细的说明了如何在vue中使用&#xff0c;但是今天我想来探讨的是&#xff0c;如何在微…

你评论,我赠书~【哈士奇赠书 - 15期】〖HTML5+CSS3+JavaScript从入门到精通(微课精编版)(第2版)〗等你来拿

文章目录❤️‍&#x1f525; 赠书活动 - 《HTML5CSS3JavaScript从入门到精通&#xff08;微课精编版&#xff09;&#xff08;第2版&#xff09;》❤️‍&#x1f525; 编辑推荐❤️‍&#x1f525; 抽奖方式与截止时间❤️‍&#x1f525; 赠书活动 → 获奖名单❤️‍&#x…

Parsing error: No Babel config file detected for xxx Either disable config file checking...报错解决方法

Parsing error: No Babel config file detected for xxx Either disable config file checking…报错解决方法 使用Vue3创建项目&#xff0c;创建完成后发现会报错&#xff0c;如下图&#xff1a; 翻译了一下&#xff0c;其实已经告诉我们解决方法了&#xff1a; Either disa…

node.js中Express简介

Express简介 1.什么是Express 官方给出的概念&#xff1a;Express是基于Node.js平台&#xff0c;快速、开放、极简的web开发框架。 通俗理解&#xff1a;Express的作用和Node.js内置的http模块类似&#xff0c;是专门用来创建web服务器的 Express的本质&#xff1a;就是一个n…

CSS设置背景颜色透明的两种方法

在css中设置背景颜色透明的方法有两种&#xff1a; 一种是通过rgba方法设置&#xff0c;另一种是通过backgroundh和opacity设置 下面分别是css中 两种方法实现的背景颜色透明实例 1&#xff0c;通过background和opacity设置背景颜色透明 background属性中属性值比较简单…

Vue+ELementUI主页布局----侧边栏布局(el-aside)

第一节Login.vue登录表单知识&#xff1a; Element-UIvue实现登录表单_我爱布朗熊的博客-CSDN博客 具体Element-UI地址&#xff1a; Element - The worlds most popular Vue UI framework 目录 一、布满整个页面 二、主页Header布局 三、主页左侧带单布局 四、axios请求…

前端练手项目合集40.0个,附源码,2022年最新

今天分享40个博主平时收集整理的前端练手项目&#xff0c;都是一些适合前端新手的小项目合集。 1、【网易云音乐首页制作】 2、【实战项目之今日头条】 3、【实战项目之拉勾网】 4、【ReactNative项目之美食APP】 5、【uni-APP项目实战教程】 6、【React项目管理后台系统】 7、…

uni-app 怎么实现路由拦截

前言 随着业务的需求&#xff0c;项目需要支持H5、各类小程序以及IOS和Android&#xff0c;这就需要涉及到跨端技术&#xff0c;不然每一端都开发一套&#xff0c;人力成本和维护成本太高了。团队的技术栈主要以Vue为主&#xff0c;最终的选型是以uni-appuview2.0作为跨端技术…

vue中实现路由跳转的三种方式(超详细整理)

vue中实现路由跳转的三种方式 一、使用vue-router vue-router 本质是一个第三方的包 用的时候需要下载 步骤 &#xff08;7步法 &#xff09;&#xff1a; 下载vue-router模块到当前工程 yarn add vue-router在main.js中引入VueRouter函数 // 引入路由 import VueRouter from…

【TypeScript】TS 看这一篇就够了

文章目录&#x1f9d1;‍&#x1f4bb;TypeScript基本概念TypeScript 是什么&#xff1f;为什么要有typescript安装编译 TS 的工具包编译并运行 TS 代码创建基于TS的vue项目&#x1f9d1;‍&#x1f4bb;TypeScript基础类型注解TypeScript类型概述TypeScript原始数据类型数组类…

Vue实现登录功能全套详解(含封装axios)

目录 Vue项目中实现登录大致思路&#xff1a; 用到的关键文件 一、安装插件 二、创建store 三、封装axios qs vue 插件 api.js的作用 四、路由拦截 五、登录页面实际使用 Vue项目中实现登录大致思路&#xff1a; 1、第一次登录的时候&#xff0c;前端调后端的登陆接…

vite入门/徒手搭建vite/配置vite/使用vite脚手架/vite步骤

以下内容全部以图片形式展示&#xff08;自己动手尝试一下印象岂不是更深&#xff1f;&#xff09; 当然啦&#xff0c;也有完整的&#xff0c;自己拉代码https://github.com/ispaomoya/build-vite.git 文章有点长&#xff0c;你忍一下 目录 一、了解一下webpack和vite 二、…