讲师中心 微信公众号
AI工具推荐 视频效率加速

Flexbox布局教程:实现图片水平垂直并排显示与2x2网格排列

大雪吖_4151

大雪吖_4151

发布时间:2025-12-15 11:17:03

|

953人浏览过

|

来源于php中文网

原创

Flexbox布局教程:实现图片水平垂直并排显示与2x2网格排列

本文详细讲解如何利用flexbox布局实现图片2x2排列,使其在网页上水平垂直并排显示。核心在于正确配置容器的`flex-wrap`属性,并巧妙运用项目(item)的`flex-basis`属性来控制其尺寸。通过实例代码,读者将掌握flexbox在复杂布局中的应用,实现灵活且响应式的图片网格展示。

Flexbox基础与图片布局挑战

在网页设计中,将多个图片或其他元素排列成网格状,例如2x2的布局,是一个常见的需求。Flexbox(弹性盒子)是CSS3中一个强大的布局模块,它提供了一种更有效的方式来布置、对齐和分配容器中项目(items)的空间,即使它们的大小是未知或动态的。

当我们需要将一组元素(如图片)既水平排列又垂直堆叠时,Flexbox的单行布局能力结合其换行(wrapping)机制就能派上用场。本教程将重点解决如何利用Flexbox将四张图片排列成两行两列的网格布局。

HTML结构示例

首先,我们来看一下用于展示图片的HTML结构。这里我们有一个article容器,其中包含多个figure元素,每个figure元素又包含一张图片(img)和一个图片说明(figcaption)。

<article class="upgrades">
  <h3>Delorean Upgrades</h3><br>
  <br>
  <figure>
    <img src="https://placekitten.com/200/300" alt="bumper_sticker">
    <figcaption>Flux Capacitor</figcaption>
  </figure>
  <figure>
    <img src="https://placekitten.com/201/301" alt="flame">
    <figcaption>Flame Decals</figcaption>
  </figure>
  <figure>
    <img src="https://placekitten.com/202/302" alt="flux cap">
    <figcaption>Bumper Stickers</figcaption>
  </figure>
  <figure>
    <img src="https://placekitten.com/203/303" alt="hub cap">
    <figcaption>Hub Caps</figcaption>
  </figure>
</article>

在这个结构中,article.upgrades将作为Flex容器的父元素,而每个figure元素将是Flex项目。

初始CSS分析与问题

为了实现2x2布局,我们需要将article或其父级设置为Flex容器,并允许其内容换行。以下是可能尝试的初始CSS样式:

section { /* 假设 article.upgrades 的父元素是 section */
  display: flex;
  flex-direction: row-reverse; /* 注意这里的方向 */
  flex-wrap: wrap;
  justify-content: space-between;
}

article {
  flex: 200; /* 可能用于控制 article 在 section 中的大小 */
}

.upgrades {
  flex: 100; /* 针对 article.upgrades */
}

.reviews {
  align-self: flex-end; /* 与本教程主题无关 */
}

figure {
  background-color: #3482D5;
  height: 80px;
  display: flex; /* figure 内部也可能是flex容器 */
  flex: 1 auto; /* 关键属性,可能导致布局问题 */
  margin: 5px;
  line-height: 1.5;
}

在上述CSS中,section被设置为Flex容器,并使用了flex-wrap: wrap允许项目换行。justify-content: space-between用于在主轴上均匀分布项目。然而,关键在于figure元素的flex: 1 auto;。

flex是一个复合属性,它包含了flex-grow、flex-shrink和flex-basis。

  • flex-grow: 1 允许项目在容器有剩余空间时增长。
  • flex-shrink: 1 允许项目在容器空间不足时收缩。
  • flex-basis: auto 表示项目的初始大小基于其内容或宽度/高度属性。

当flex-basis设置为auto时,浏览器会根据内容大小来决定项目的初始尺寸,这往往导致项目无法按照我们预期的固定比例或尺寸进行排列,尤其是在需要精确控制每行项目数量时。因此,即使设置了flex-wrap: wrap,图片也可能无法形成整齐的2x2布局,或者无法正确地每行显示两个。

解决方案:优化flex-basis

要实现每行显示两个图片,并最终形成2x2的网格,我们需要精确控制每个figure元素的宽度。这可以通过调整flex-basis属性来实现。

将figure元素的flex属性修改为flex: 1 0 40%;是解决此问题的关键。

Html2md
Html2md

使用 Readability + Turndown 将 HTML 页面转换为干净的、Agent 友好的 Markdown。去除导航栏、广告、页脚、Cookie 横幅、社交按钮等干扰元素。支持 URL...

下载
figure {
    background-color: #3482D5;
    height: 80px;
    display: flex;
    flex: 1 0 40%; /* 关键修改 */
    margin: 5px;
    line-height: 1.5;
}

让我们详细解析flex: 1 0 40%;的含义:

  • flex-grow: 1: 允许figure元素在容器有额外空间时进行伸展。这意味着如果一行只有一个元素,它会占据更多空间;如果一行有两个元素,它们会均匀分享剩余空间。
  • flex-shrink: 0: 禁止figure元素在容器空间不足时收缩。这非常重要,它确保了每个元素不会因为空间不足而变得比其flex-basis更小。
  • flex-basis: 40%: 这是核心。它定义了figure元素在分配剩余空间之前的理想宽度。当容器宽度足够时,每个figure元素会尝试占据其父容器宽度的40%。

结合flex-wrap: wrap和justify-content: space-between:

  • 当每个figure的flex-basis为40%时,一行可以容纳两个这样的元素(40% + 40% = 80%),还剩下20%的空间用于space-between产生的间距和元素的margin。
  • 当一行已经有两个元素后,如果还有更多figure元素,它们将因为flex-wrap: wrap而自动换到下一行,继续形成两列布局。

完整示例代码

为了更清晰地展示,我们提供一个完整的HTML和CSS示例,演示如何实现2x2的图片布局。

HTML (保持不变):

<section>
  <article class="upgrades">
    <h3>Delorean Upgrades</h3><br>
    <br>
    <figure>
      <img src="https://placekitten.com/200/300" alt="bumper_sticker">
      <figcaption>Flux Capacitor</figcaption>
    </figure>
    <figure>
      <img src="https://placekitten.com/201/301" alt="flame">
      <figcaption>Flame Decals</figcaption>
    </figure>
    <figure>
      <img src="https://placekitten.com/202/302" alt="flux cap">
      <figcaption>Bumper Stickers</figcaption>
    </figure>
    <figure>
      <img src="https://placekitten.com/203/303" alt="hub cap">
      <figcaption>Hub Caps</figcaption>
    </figure>
  </article>
</section>

CSS (优化后):

body {
  font-family: sans-serif;
  margin: 20px;
  background-color: #f4f4f4;
}

section {
  display: flex;
  /* flex-direction: row-reverse; */ /* 根据需求决定是否反转方向 */
  flex-wrap: wrap;
  justify-content: space-between;
  max-width: 600px; /* 限制section宽度以便观察换行效果 */
  margin: 0 auto;
  padding: 10px;
  border: 1px solid #ccc;
  background-color: #fff;
}

article {
  flex: 1 1 100%; /* article占据section的全部宽度 */
  margin-bottom: 20px;
  text-align: center;
}

.upgrades {
  /* flex: 100; */ /* 这里的flex值需要更具体,例如 flex: 1 1 100%; */
}

/* .reviews {
  align-self: flex-end;
} */

figure {
  background-color: #3482D5;
  color: white;
  height: 80px; /* 固定高度 */
  display: flex; /* figure内部也是flex容器,用于对齐图片和文字 */
  flex-direction: column; /* 让图片和文字垂直排列 */
  justify-content: center; /* 垂直居中内容 */
  align-items: center; /* 水平居中内容 */
  flex: 1 0 40%; /* 关键:定义初始宽度为40%,允许增长但不收缩 */
  margin: 5px; /* 元素之间的外边距 */
  line-height: 1.5;
  box-sizing: border-box; /* 确保padding和border不增加元素总宽度 */
}

figure img {
  max-width: 100%; /* 确保图片不会溢出figure */
  height: auto;
  display: block; /* 移除图片底部默认空白 */
}

figcaption {
  font-size: 0.8em;
  margin-top: 5px;
}

说明:

  • section作为主容器,display: flex; flex-wrap: wrap; justify-content: space-between;是实现多列布局和换行的基础。
  • article元素被设置为flex: 1 1 100%;,确保它在section中占据一行。
  • figure元素是关键的Flex项目。通过flex: 1 0 40%;,我们告诉浏览器每个figure元素在理想情况下应占据父容器宽度的40%。flex-shrink: 0确保它们不会缩小,从而保证每行能容纳两个元素。margin: 5px;提供了元素间的间距。
  • figure内部也被设置为display: flex; flex-direction: column; justify-content: center; align-items: center;以实现图片和文字的垂直居中布局。
  • max-width: 600px在section上是为了更好地模拟有限的容器宽度,以便观察换行效果。

关键概念解析:flex属性详解

flex是一个CSS简写属性,用于设置弹性项目的伸缩能力。它结合了flex-grow, flex-shrink, 和 flex-basis三个属性。

  • flex-grow (默认值 0): 定义了弹性项目在有剩余空间时是否应该增长以及如何增长。值为0表示不增长,大于0表示按比例增长。
  • flex-shrink (默认值 1): 定义了弹性项目在空间不足时是否应该收缩以及如何收缩。值为0表示不收缩,大于0表示按比例收缩。
  • flex-basis (默认值 auto): 定义了在分配剩余空间之前,弹性项目的初始主轴尺寸。它可以是长度值(如px, em, rem)或百分比(如%)。

理解这三个属性对于精确控制Flex项目的大小至关重要。在本例中,flex-basis: 40%是实现2x2布局的核心,它直接决定了每行可以容纳多少个项目。

布局注意事项与最佳实践

  1. box-sizing: border-box;: 建议在所有元素上设置box-sizing: border-box;,这会使元素的padding和border包含在其指定的宽度和高度内,从而更容易计算和预测布局。
  2. 响应式设计: 使用百分比作为flex-basis(如40%)是实现响应式布局的良好实践。当父容器宽度变化时,Flex项目会自动调整其宽度,并根据flex-wrap规则换行。
  3. 间距处理: 可以使用margin来创建Flex项目之间的间距,也可以在Flex容器上使用gap属性(现代浏览器支持)来定义行和列之间的间距,这通常更简洁且避免了边缘项目的额外边距问题。
  4. 调试工具: 浏览器开发者工具中的Flexbox检查器是调试Flexbox布局的强大工具,可以直观地看到Flex容器和项目的边界、主轴和交叉轴等。

总结

通过本教程,我们深入探讨了如何利用Flexbox实现图片或其他元素2x2的网格布局。核心在于理解并正确配置Flex容器的flex-wrap属性以允许换行,以及Flex项目的flex-basis属性来精确控制其初始尺寸。通过设置flex: 1 0 40%;,我们能够确保每行显示两个元素,并在容器宽度变化时保持布局的灵活性和响应性。掌握flex-grow、flex-shrink和flex-basis这三个属性是有效利用Flexbox进行复杂布局的关键。

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
css3教程
css3教程

php中文网为大家提供css3教程合集,CSS3的语法是建立在CSS原先版本基础上的,它允许使用者在标签中指定特定的HTML元素而不必使用多余的class、ID或JavaScript。php中文网还为大家带来css3的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2020

2023.06.14

有哪些css3渐变属性
有哪些css3渐变属性

css3中渐变属性有linear-gradient、radial-gradient、conic-gradient、repeating-linear-gradient、repeating-radial-gradient等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3086

2023.11.01

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6127

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2588

2023.08.10

margin在css中是啥意思
margin在css中是啥意思

在CSS中,margin是一个用于设置元素外边距的属性。想了解更多margin的相关内容,可以阅读本专题下面的文章。

857

2023.12.18

css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

3032

2023.12.07

html边框设置教程
html边框设置教程

本教程将带你全面掌握HTML/CSS边框设置,从基础的border属性讲起,涵盖所有边框样式、圆角设置及高级技巧,帮助你快速上手实现各种边框效果。

2693

2025.09.02

flex教程
flex教程

php中文网为大家带来了flex教程合集,Flex是采用Flex布局的元素,称为Flex容器(flex container),简称"容器",它的所有子元素自动成为容器成员,有三个核心概念: flex项,需要布局的元素;flex容器,其包含flex项;排列方向,这决定了flex项的布局方向。php中文网还为大家带来flex的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

10497

2023.06.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 6.1万人学习

CSS教程
CSS教程

共754课时 | 98.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn