0

0

实现动态两列布局并居中奇数项的CSS Flexbox教程

聖光之護

聖光之護

发布时间:2025-12-07 21:18:15

|

538人浏览过

|

来源于php中文网

原创

实现动态两列布局并居中奇数项的CSS Flexbox教程

本教程将详细介绍如何使用css flexbox实现一个动态的两列布局,确保每行最多容纳两个子元素,并使其在空间不足时自动换行。特别地,我们将解决当子元素数量为奇数时,如何使最后一行的单个元素水平居中显示的问题,全程无需javascript介入。

一、理解布局需求与核心挑战

网页设计中,我们经常需要创建能够根据内容数量或屏幕尺寸动态调整的布局。本教程的目标是构建一个容器,其内部的子元素按照以下规则排列:

  1. 每行最多显示两个子元素。
  2. 当一行中子元素数量超过两个时,多余的子元素会自动换到下一行。
  3. 如果子元素总数为奇数,导致最后一行只有一个子元素,该子元素应在当前行中水平居中。
  4. 整个过程纯粹通过CSS实现,不依赖JavaScript。

核心挑战在于如何在纯CSS环境下,既实现两列布局与自动换行,又能优雅地处理奇数项的居中问题。Flexbox是解决此类问题的理想工具

二、HTML结构与CSS规范化

首先,我们需要一个包含多个子元素的父容器。重要的是,子元素应使用类(class)而非ID(id),因为ID在HTML文档中必须是唯一的。

1. HTML结构

我们将使用一个父div作为Flex容器,内部包含任意数量的子div作为Flex项目。

立即学习前端免费学习笔记(深入)”;

Lorem ipsum dolor sit, amet consectetur adipisicing elit.
Lorem ipsum dolor sit, amet consectetur adipisicing elit.
Lorem ipsum dolor sit, amet consectetur adipisicing elit.
Lorem ipsum dolor sit, amet consectetur adipisicing elit.
Lorem ipsum dolor sit, amet consectetur adipisicing elit.

2. CSS规范化:盒模型

为了确保元素的宽度计算符合预期,尤其是在设置边框或内边距时,建议全局设置box-sizing: border-box;。

GPT Detector
GPT Detector

在线检查文本是否由GPT-3或ChatGPT生成

下载
/* 确保边框和内边距包含在元素的总宽度内 */
* {
  box-sizing: border-box;
}

三、Flexbox实现核心逻辑

我们将分别配置父容器(#container)和子元素(.smallerCon)的Flexbox属性。

1. 配置父容器(#container)

父容器是Flexbox的起点,它定义了子元素的排列方式、换行行为以及水平对齐方式。

#container {
  width: 90vw; /* 容器宽度,可根据需求调整 */
  margin: auto; /* 容器自身水平居中 */

  /* Flexbox 属性 */
  display: flex; /* 启用 Flexbox 布局 */
  flex-flow: row wrap; /* 定义主轴方向为行,并允许子元素换行 */
  justify-content: center; /* 子元素在主轴(水平方向)上居中对齐 */
  gap: 1rem; /* 子元素之间的间距 */
}
  • display: flex;: 将#container声明为Flex容器。
  • flex-flow: row wrap;: 这是flex-direction: row;和flex-wrap: wrap;的简写。
    • row: 子元素沿水平方向排列。
    • wrap: 当一行空间不足时,子元素会换到下一行。
  • justify-content: center;: 这个属性至关重要。它使得Flex容器中的所有子元素在主轴上(这里是水平方向)居中对齐。当最后一行只有一个子元素时,它会自然地在行中居中显示。
  • gap: 1rem;: 这是一个现代CSS属性,用于设置Flex项目之间的间距,避免了使用负margin或复杂的margin计算。

2. 配置子元素(.smallerCon)

子元素需要被配置为在Flex容器中占据合适的宽度,以确保每行显示两个。

.smallerCon {
  height: 20vh; /* 子元素高度,可根据需求调整 */
  min-width: 18rem; /* [可选] 设置最小宽度,防止在小屏幕上过度收缩 */

  /* Flexbox 属性 */
  /* flex:   ; */
  flex: 0 1 calc(50% - 0.5rem); /* 关键属性,控制子元素宽度 */

  /* 子元素内部如果还有内容,也可以作为Flex容器 */
  display: flex;
  flex-flow: row wrap; /* 内部内容也支持换行 */

  /* 样式美化 */
  background-image: linear-gradient(
      to bottom right,
      rgba(255, 0, 128, 0.577),
      rgba(0, 204, 255, 0.49)
    ),
    url("../img/26March.gif");
  object-fit: cover;
  background-size: cover;
  background-repeat: no-repeat;
  background-position: center;
  border: 2px solid rebeccapurple;
}
  • flex: 0 1 calc(50% - 0.5rem);: 这是实现两列布局的关键。
    • flex-grow: 0: 子元素不会在有额外空间时放大。
    • flex-shrink: 1: 子元素在空间不足时可以缩小(但min-width会限制其缩小程度)。
    • flex-basis: calc(50% - 0.5rem): 这是子元素的理想宽度。50%意味着它尝试占据父容器一半的宽度。由于gap: 1rem;在两个子元素之间创建了1rem的间距,为了让两个子元素恰好并排,每个子元素需要从其50%宽度中减去一半的gap值(即0.5rem)。这样,两个子元素的宽度加上它们之间的1rem间距,正好等于父容器的100%宽度。
  • min-width: 18rem;: 这是一个可选但推荐的属性。它确保在屏幕非常小,即使flex-shrink生效,子元素也不会缩小到不可读的程度,而是会强制换行。
  • 子元素内部也可以再次作为Flex容器(display: flex; flex-flow: row wrap;),这使得其内部的smallerLeftBoxText也能进行Flex布局,例如居中。

3. 配置子元素内部文本(#smallerLeftBoxText)

.smallerLeftBoxText {
  width: 40vw; /* 文本宽度 */
  margin: auto; /* 文本自身在 .smallerCon 内部居中 */
  font-weight: 400;
  color: rgb(245, 223, 223);
}
  • margin: auto;:当.smallerCon作为Flex容器时,其内部的.smallerLeftBoxText通过margin: auto;可以实现在父容器中的水平和垂直居中。

四、完整代码示例

将上述HTML和CSS整合,即可得到一个功能完整的动态两列布局。




    
    
    Flexbox动态两列布局与奇数项居中
    



    
这是第一个内容块。Flexbox布局实现了动态两列排版。
这是第二个内容块。当空间不足时,元素会自动换行。
这是第三个内容块。如果总数为奇数,最后一个元素会居中。
这是第四个内容块。无需JavaScript,纯CSS即可实现。
这是第五个内容块。因为是奇数,我被居中了!

五、注意事项与总结

  1. ID与Class的正确使用: 确保多个重复的元素使用class而非id。id必须是唯一的。
  2. flex-basis与gap的配合: calc(50% - 0.5rem)是实现两列布局并正确处理gap的关键。如果gap的值改变,0.5rem也需要相应调整为gap值的一半。
  3. justify-content: center;的重要性: 这是实现奇数项居中的核心。当一行中只有一个Flex项目时,justify-content: center;会将其完美地水平居中。
  4. 响应式设计 通过媒体查询(@media),可以进一步优化布局在不同屏幕尺寸下的表现。例如,在小屏幕上将flex-basis设置为100%,使每行只显示一个元素。
  5. box-sizing: border-box;: 强烈推荐在项目中使用此属性,它简化了宽度和高度的计算,避免了因边框和内边距导致的布局问题。
  6. 浏览器兼容性: Flexbox在现代浏览器中得到了广泛支持。对于旧版浏览器,可能需要添加前缀或考虑备用方案,但这在大多数现代Web开发中已不是主要问题。

通过上述Flexbox技术,我们能够以纯CSS的方式,高效且灵活地构建出符合动态两列布局需求,并能智能处理奇数项居中显示的UI组件,极大地提升了前端开发的效率和代码的可维护性。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

557

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

394

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

754

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

478

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

454

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

1031

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

658

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

554

2023.09.20

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

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

精品课程

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

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

CSS教程
CSS教程

共754课时 | 22万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号