纵横自如 - 掌握 Flexbox 布局

在 Web 前端开发中,页面的布局是一个非常基础却也非常重要的知识点。而在传统的布局方式中,我们常常需要使用 float、position 等属性来实现复杂的布局效果,但这些属性却很难使我们达到理想的效果。为此,在 CSS3 中,Flexbox 布局诞生了。它能够让我们更加方便、高效地实现页面布局,甚至连响应式布局都可以轻松实现。

理解 Flexbox 布局

Flexbox 布局是一种基于弹性布局的 CSS3 模块,它为元素提供了更加灵活的分布性,并且可以在不同设备尺寸下自动调整元素的布局位置。如果你还没有尝试过 Flexbox 布局,以下这张图或许是对它的一个初步认识。

从图中可以看出,Flexbox 布局主要由以下几个元素组成:

  • 容器 (Container):包含要进行布局的元素,与传统布局相同。
  • 项目 (Item):需要被定位和分配布局的属性,也就是所有子元素。

Flexbox 布局属性

在实现 Flexbox 布局时,我们需要使用一些属性来定义容器、项目之间的布局关系,以下是其主要属性。

容器属性

display

这是最主要的属性,我们需要在容器上使用 display 属性并设置其值为 flexinline-flex。其中,flex 表示块级元素,inline-flex 表示内联元素。

---------- -
  -------- -----
  -- -- --
  -------- ------------
-

flex-direction

该属性指定了容器中项目的主轴方向,可选值包括 rowrow-reversecolumncolumn-reverse

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

flex-wrap

该属性指定项目在一条轴线上排不下时是否换行,可选值为 nowrapwrapwrap-reverse

  • nowrap:不换行。
  • wrap:换行,第一行在上方。
  • wrap-reverse:换行,第一行在下方。
---------- -
  ---------- ------ - ---- - -------------
-

justify-content

该属性指定了项目在主轴上的对齐方式,可选值包括:

  • flex-start:左对齐。
  • flex-end:右对齐。
  • center:居中。
  • space-between:两端对齐,项目之间的间隔相等。
  • space-around:每个项目两侧的间隔相等。
---------- -
  ---------------- ---------- - -------- - ------ - ------------- - -------------
-

align-items

该属性指定了项目在交叉轴上的对齐方式,可选值包括:

  • flex-start:上对齐。
  • flex-end:下对齐。
  • center:居中。
  • baseline:项目的第一行文字的基线对齐。
  • stretch:如果项目未设置高度或设为 auto,将占满整个容器的高度。
---------- -
  ------------ ---------- - -------- - ------ - -------- - --------
-

align-content

类似于 justify-content,该属性指定了多行项目在交叉轴上的对齐方式,可选值包括:

  • flex-start:上对齐。
  • flex-end:下对齐。
  • center:居中。
  • space-between:两端对齐,项目之间的间隔相等。
  • space-around:每个项目两侧的间隔相等。
  • stretch:默认值,如果项目未设置高度或设为 auto,将占满整个容器的高度。
---------- -
  -------------- ---------- - -------- - ------ - ------------- - ------------ - --------
-

项目属性

order

该属性指定项目的排列顺序,可以是一个整数值。默认为 0,可以为负值。

----- -
  ------ ----------
-

flex-grow

该属性指定了项目的放大比例,默认为 0,即如果存在剩余空间也不放大。

----- -
  ---------- --------- -- ------- - --
-

flex-shrink

该属性指定了项目的缩小比例,默认为 1,即如果空间不足,该项目会缩小。

----- -
  ------------ --------- -- ------- - --
-

flex-basis

该属性指定了在分配多余空间之前,项目占据的主轴空间(main size),浏览器根据这个属性计算空间的分配比例,默认值为 auto,即项目原有大小。

----- -
  ----------- -------- - ----- -- ------- ---- --
-

flex

flex 属性是 flex-grow, flex-shrink 以及 flex-basis 的简写形式。

----- -
  -- ----- --------- ----------- ---------- --
  ----- - - -----
-

align-self

该属性允许自己在交叉轴上对齐,覆盖容器的 align-items 属性。默认值为 auto,表示继承容器的 align-items 属性。

----- -
  ----------- ---- - ---------- - -------- - ------ - -------- - --------
-

示例代码

下面我们通过一些示例代码来更清晰地理解 Flexbox 布局的应用。

示例 1:简单的 Flexbox 基本布局

我们来创建一个简单的 Flexbox 布局,将其应用到一个具有固定高度并纵向滚动的 div 容器中。

---- ------------------
  ---- --------------------
  ---- --------------------
  ---- --------------------
------
---------- -
  -------- -----
  --------------- -------
  ------- ------
  ----------- -----
-

----- -
  -------- ----
  ------- ----
  ----------------- --------
  ------ ------
  ---------- -----
-

在上面的代码中,我们给容器设置了一个固定的高度,使其具有纵向滚动条。然后,我们将容器的 display 属性设置为 flex,让其成为一个 Flexbox 布局,同时使用 flex-direction: column 属性让容器内的项目垂直排列。接下来,将 .item 类的项目的样式进行简单的设置。最终,我们得到了一个由三个背景颜色为橙色、字体颜色为白色、具有内外边距的等大盒子组成的垂直滚动栏。

示例 2:侧边栏布局

现在,我们来创建一个带有固定宽度的侧边栏布局,其中侧边栏的宽度设置为 250 像素,主要内容区居右。

---- ------------------
  ---- -----------------------------
  ---- -------------
    -------- ----- ----- --- ----- ----------- ---------- ---------
    -------- ----- ----- --- ----- ----------- ---------- ---------
    -------- ----- ----- --- ----- ----------- ---------- ---------
  ------
------
---------- -
  -------- -----
  ------- ------
-

-------- -
  ------ ------
  ----------------- --------
  ------ ------
  ----------- -------
-

----- -
  ----- --
  ----------------- --------
  -------- -----
-

与上一个示例相同,我们也将 .containerdisplay 属性设置为 flex,但是不同的是,我们并没有使用 flex-direction 属性,而是使用了默认的 row 方向,使得两个子元素并排展示。然后,我们将 .sidebar 的宽度设置为 250 像素,内容居中,并且设置为背景颜色为深蓝色,字体颜色为白色。接下来,我们将 .main 类的元素的 flex 属性设置为 1,它会充满剩下的所有空间,而其他元素需要用 width 属性来表示。

总结

Flexbox 布局是一种非常优秀的布局方式,通过它,我们可以轻松实现很多在传统布局中无法完成的效果,并且可以使布局更加高效、简洁。随着移动设备市场的扩大,它在响应式布局方面的优势表现得越来越明显。如果你还没有尝试过使用 Flexbox 布局实现页面布局,不妨来学习一下吧。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6481739f48841e98940e9386


猜你喜欢

  • 如何使用响应式框架构建响应式设计

    在网络和设备的多样化时代,响应式设计已经成为了网站开发的标配。而响应式框架则是将响应式设计落地的重要工具。本文将介绍如何使用响应式框架构建响应式设计,主要包括以下两个方面: 响应式框架的选择 响应...

    1 年前
  • 如何在 PWA 中实现客户端存储和快速访问

    PWA(Progressive Web Apps)是一种新兴的 WEB 应用程序,它运行于浏览器中,并具有类似于原生应用程序的体验。PWA 具有离线访问、推送通知和快速加载等功能,这让 Web 应用变...

    1 年前
  • 如何正确使用 Web Components 进行跨框架和跨语言的组件开发

    随着前端技术的发展,Web Components 已经成为了一种非常重要的前端开发技术。它可以让开发者们更加轻松地创建和维护跨框架和跨语言的组件,同时提高代码复用和可维护性。

    1 年前
  • TypeScript 中箭头函数的最佳实践

    TypeScript 里的箭头函数是一个非常实用的特性,可以方便地创建一个匿名函数。它可以减少代码的复杂度,增强可读性和可维护性。然而,如果不采用最佳实践,使用箭头函数可能会带来一些意外的问题。

    1 年前
  • Angular Material 侧边栏的使用

    简介 Angular Material 是 Angular 框架的一个 UI 库,提供了一些常用的组件和样式用于开发 Web 应用程序。其中,侧边栏是一个常见的布局组件,被广泛应用于网站和应用程序的设...

    1 年前
  • ## 详解 ES6 中新增的三个循环语句: for...in, for...of, and forEach

    详解 ES6 中新增的三个循环语句: for...in, for...of, and forEach 在 ES6 中,新增了三种循环语句:for...in、for...of 和 forEach。

    1 年前
  • 解决 Promise 在低版本浏览器下的兼容性问题

    Promise 是 ES6 中的一项新特性,它可以很好地解决异步编程的问题。然而,在低版本浏览器中,并不支持 Promise,因此在开发过程中需要对其进行兼容性处理。

    1 年前
  • Sequelize 之使用 npm 包 sequelize-fixtures 实现数据批量导入

    在开发 Web 应用的过程中,我们通常需要向数据库中导入数据,以便于测试和运行。但是手动插入数据既费时也易错,因此有必要学会如何使用 npm 包 sequelize-fixtures 来实现数据的批量...

    1 年前
  • NUXT SSR 到 Serverless 全站部署

    NUXT SSR 到 Serverless 全站部署 随着云计算技术的不断发展,Serverless 架构开始成为互联网应用的新趋势。相比传统的后端部署方式,Serverless 架构不仅可以将成本和...

    1 年前
  • ES10 中的新特性 Array 增加了多个方法,包括 flat、flatMap、reduce 等

    ES10 中的新特性 - Array 增加了多个方法 在前端开发领域中,数组是最常用的数据结构之一,而 ES10 中引入的一些新的数组方法,如 flat、flatMap、reduce 等,可大大提高数...

    1 年前
  • Express.js + Angular.js 实现 MVVM 开发

    Express.js + Angular.js 实现 MVVM 开发 前言 在前端开发中,MVVM 架构模式已经成为了一种非常流行的模式。MVVM 代表着 Model-View-ViewModel 模...

    1 年前
  • Docker 镜像加速器配置与使用教程

    Docker 镜像加速器是一个能够加快 Docker 镜像下载速度的工具。由于 Docker 镜像在下载的过程中,需要从(一般是) Docker Hub 下载,而在国内,由于众所周知的原因,国际网络的...

    1 年前
  • 在 GraphQL 服务中使用 Dataloader 以加速你的数据

    GraphQL 是一种强大的 API 技术,它允许客户端根据自己的需求精确获取数据。但是,在实际开发中,我们可能会遇到一些性能问题,尤其是在获取大量连续的数据时。这个时候,我们可以使用 Dataloa...

    1 年前
  • 使用 React-Router 构建 SPA 应用中如何优雅地处理路由变化?

    在前端开发中,单页面应用(Single Page Application, SPA)已经成为常见的开发方式。而使用 React-Router 可以更好地管理 SPA 应用中的路由。

    1 年前
  • Extendable Methods 解决继承问题

    在前端开发中,继承是一种常见的编程技术,用于子类派生自父类并继承其属性和方法。然而,当需要为子类添加新的方法时,通常需要在子类中重写整个方法,这会带来一些问题:代码冗余、维护困难等。

    1 年前
  • Fastify 框架中异步文件读写的实现方式

    Fastify 是一个高效、快速、简单且低开销的 Node.js Web 框架,它的设计目标是优秀的开发者体验和性能,它在实现性能优化方面表现尤为出色。在 Fastify 中,异步文件读写操作是实现性...

    1 年前
  • Webpack 优化:提取动态 import() 的公共依赖

    在前端开发中,我们经常使用 Webpack 进行项目的打包和优化。在这个过程中,我们可能会遇到一个问题,就是当我们使用动态加载(dynamic import)时,会出现重复加载同样的依赖库,导致浪费网...

    1 年前
  • ES7 中的 Array 方法:Array.prototype.copyWithin 的详解及应用实例

    在ES7标准中提供了一种新的数组方法:Array.prototype.copyWithin 。本文将对这个方法的定义、用法、示例等做详细介绍,希望能对前端开发者有所帮助。

    1 年前
  • Jest 测试时如何 mock setTimeout/setInterval?

    在前端开发中,我们经常需要使用 setTimeout 和setInterval 待定时器来执行一些异步操作,但当进行单元测试时, 这样的异步操作会导致测试的不确定性,因为测试的结果取决于待定时器何时被...

    1 年前
  • 无障碍导航栏设计:如何为屏幕阅读器用户提供更好的使用体验?

    前言 在前端开发中,我们经常会遇到需要设计导航栏的情况,这对于一般用户来说非常方便易用。但是,对于一些使用屏幕阅读器的用户,导航栏可能会成为一道障碍。 在这篇文章中,我们将深入探讨无障碍导航栏的设计,...

    1 年前

相关推荐

    暂无文章