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

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

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

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

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

每行最多显示两个子元素。当一行中子元素数量超过两个时,多余的子元素会自动换到下一行。如果子元素总数为奇数,导致最后一行只有一个子元素,该子元素应在当前行中水平居中。整个过程纯粹通过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;。

/* 确保边框和内边距包含在元素的总宽度内 */* {  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动态两列布局与奇数项居中            /* 全局盒模型设置 */        * {            box-sizing: border-box;        }        body {            font-family: Arial, sans-serif;            margin: 0;            padding: 20px;            background-color: #f4f4f4;        }        /* 父容器样式 */        #container {            width: 90vw; /* 容器宽度 */            margin: 20px auto; /* 容器自身水平居中,并设置上下边距 */            border: 2px dashed #ccc; /* 方便观察容器边界 */            padding: 1rem; /* 容器内边距 */            background-color: #fff;            /* Flexbox 属性 */            display: flex; /* 启用 Flexbox */            flex-flow: row wrap; /* 主轴方向为行,允许换行 */            justify-content: center; /* 子元素在主轴上居中对齐 */            gap: 1rem; /* 子元素之间的间距 */        }        /* 子元素样式 */        .smallerCon {            height: 20vh; /* 子元素高度 */            min-width: 18rem; /* 可选:设置最小宽度,防止小屏幕下过度收缩 */            border: 2px solid rebeccapurple; /* 边框 */            background-image: linear-gradient(                    to bottom right,                    rgba(255, 0, 128, 0.577),                    rgba(0, 204, 255, 0.49)                ),                url("https://via.placeholder.com/400x200/FF00FF/FFFFFF?text=Background+Image"); /* 示例背景图 */            background-size: cover;            background-repeat: no-repeat;            background-position: center;            color: rgb(245, 223, 223);            display: flex; /* 使子元素内部内容也能Flex布局 */            align-items: center; /* 垂直居中内部文本 */            justify-content: center; /* 水平居中内部文本 */            text-align: center; /* 文本自身居中 */            /* Flexbox 属性 */            /* flex-grow: 0, flex-shrink: 1, flex-basis: calc(50% - 0.5rem) */            flex: 0 1 calc(50% - 0.5rem); /* 关键:确保每行两列并考虑间距 */        }        .smallerLeftBoxText {            width: 90%; /* 文本占据 .smallerCon 的宽度 */            font-weight: 400;            padding: 10px;            background-color: rgba(0, 0, 0, 0.3); /* 文本背景,增加可读性 */            border-radius: 5px;        }        /* 响应式调整 */        @media (max-width: 768px) {            #container {                width: 95vw;                gap: 0.5rem;            }            .smallerCon {                flex: 0 1 calc(100% - 0.5rem); /* 小屏幕下每行一个 */                min-width: unset; /* 取消最小宽度限制 */            }        }        
这是第一个内容块。Flexbox布局实现了动态两列排版。
这是第二个内容块。当空间不足时,元素会自动换行。
这是第三个内容块。如果总数为奇数,最后一个元素会居中。
这是第四个内容块。无需JavaScript,纯CSS即可实现。
这是第五个内容块。因为是奇数,我被居中了!

五、注意事项与总结

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

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

以上就是实现动态两列布局并居中奇数项的CSS Flexbox教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1603239.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
掌握CSS Flexbox:构建尺寸稳定的布局
上一篇 2025年12月23日 17:02:58
纯CSS修改含多元素按钮文本的技巧与局限性
下一篇 2025年12月23日 17:03:16

相关推荐

  • 一加Nord手机为什么无法卸载应用?解锁系统限制的详细方法

    无法卸载应用因权限或预装限制,需停用设备管理权限、通过应用管理卸载、使用ADB命令移除,或解锁Bootloader刷机彻底删除。 如果您尝试在使用一加Nord手机时卸载某个应用,但发现无法完成操作,这通常是因为该应用属于系统预装应用或具有设备管理权限,导致常规卸载方式失效。以下是解决此问题的步骤: …

    2026年9月22日
    000
  • 配置PHP多线程的性能监控_通过监控优化php多线程怎么实现的效率

    PHP虽不支持传统多线程,但可通过pthreads扩展在CLI模式下实现;合理设置线程数、使用线程池、集成性能监控工具并优化任务分配可显著提升执行效率。 PHP 本身并不支持传统意义上的多线程,因为它默认运行在 Web 服务器(如 Apache 或 Nginx)的 CGI/FPM 模式下,每个请求是…

    2026年9月22日
    200
  • 谷歌浏览器下载文件被标记为病毒怎么办_Chrome下载项被拦截或报毒问题处理

    当Chrome拦截下载时,可尝试保留危险文件、降低安全浏览级别、添加网站白名单或重置下载设置以解决问题。 如果您在使用谷歌浏览器下载文件时,发现文件被标记为病毒或下载项被拦截,这通常是由于浏览器的安全机制检测到潜在风险所致。以下是针对此问题的多种处理方法。 本文运行环境:Dell XPS 13,Wi…

    2026年9月22日
    000
  • VSCode连接Modelsim仿真工具(调试技巧分享,波形分析指南)

    首先确保Modelsim路径加入系统PATH,安装VSCode的HDL扩展,配置tasks.json定义编译、仿真任务,并编写Tcl脚本自动化add wave、run等操作,通过问题匹配器解析错误,利用Tcl实现参数化仿真与自动化测试,结合Makefile或脚本提升大型项目管理效率。 将VSCode…

    2026年9月22日
    400
  • Invideo的AI混合工具怎么用?快速生成专业视频的实用教程

    Invideo的AI混合工具通过智能生成视频初稿并允许创作者精细调整,显著降低制作门槛、提升效率,其优势在于快速生成、易用性强、激发创意,用户可通过优化输入、替换素材、注入个性声音和保持风格统一来最大化潜力,同时需应对素材模式化、理解偏差等挑战。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索,…

    2026年9月22日
    400
  • Java并发编程中Runnable接口使用方法

    Runnable接口用于定义线程任务,通过实现run()方法封装执行逻辑,不返回结果且不能抛出受检异常;可直接传给Thread实例启动线程,也可用Lambda表达式简化代码;推荐结合ExecutorService线程池使用,提升资源利用率;需注意无返回值、异常处理在内部完成、共享变量线程安全等问题。…

    2026年9月22日
    100
  • ChatExcel进行数据分类_ChatExcel数据自动分类与标签管理

    答案:通过内置规则、AI智能打标、多维度交叉分类及手动修正四步实现ChatExcel自动分类与标签管理。首先设定字段匹配规则自动归类数据;其次启用智能打标功能分析文本生成语义标签;再通过组合多个属性构建交叉分类矩阵实现精细化管理;最后支持人工干预修正异常项并同步更新数据库,提升分类准确性与管理效率。…

    2026年9月22日
    000
  • UC浏览器如何阻止网站获取我的位置_UC浏览器阻止网站定位方法

    首先关闭UC浏览器的位置权限,进入手机设置→应用管理→UC浏览器→权限管理→位置信息→选择禁止;再在UC浏览器内依次点击【我的】→【设置】→【隐私设置】→【个人信息收集管理】→关闭【位置信息】开关;最后通过浏览器设置中的网站权限管理,对特定网站的位置访问权限进行拒绝或删除授权,全面阻止未经允许的位置…

    2026年9月22日
    000
  • 抖音流量助推怎么来的?平台流量助推什么意思

    近年来,短视频平台迅速崛起,其中以抖音最为突出。作为一个专注于短视频内容分享的平台,抖音凭借其智能算法和多元化的内容生态,吸引了海量用户。而“抖音流量助推”这一概念,也成为众多创作者和品牌实现快速成长的重要工具。本文将带您深入了解抖音流量助推背后的运作机制。 一、抖音流量助推的核心机制 1. 推荐算…

    2026年9月22日
    100
  • VSCode配置C++项目环境 新手必看VSCode搭建C++教程

    答案:在VSCode中配置C++环境需安装MinGW-w64编译器并将其路径加入系统环境变量,安装VSCode的C/C++扩展以支持代码补全和调试,通过tasks.json配置编译任务,指定g++路径及编译参数,再通过launch.json配置调试任务,设置gdb调试器路径和程序输出路径,确保头文件…

    2026年9月22日
    200
  • 如何使用DeepSpeed训练AI大模型?大规模模型训练的优化技巧

    DeepSpeed通过ZeRO等技术突破显存限制,实现大模型高效训练。它采用ZeRO-1/2/3分级优化,分别对优化器状态、梯度和参数进行分区,显著降低单卡显存占用;结合混合精度、梯度累积和CPU/NVMe卸载进一步节省资源。同时集成流水线并行与张量并行,支持多维并行策略协同,使万亿参数模型训练在普…

    2026年9月22日
    000
  • Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围

    Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围Sublime使用MySQL实现数据权限控制模块_根据用户角色限制访问范围

    在sublime中实现数据权限控制模块的核心在于根据用户角色动态拼接sql语句,具体步骤如下:1. 建立角色表、用户表和权限规则表,明确角色与数据的对应关系;2. 用户登录后获取其角色id,并查询该角色可访问的数据范围;3. 根据权限动态构建sql查询条件,限制访问范围;4. 使用python等语言…

    2026年9月22日 用户投稿
    200
  • PHP 表单验证:确保 HTML select 下拉菜单已正确选择非默认选项

    本文将详细介绍如何在 PHP 后端对 HTML select 下拉菜单进行有效验证,确保用户选择了非默认选项。我们将探讨常见的验证误区,并提供一个简洁高效的解决方案,通过检查 $_POST 数据来判断用户是否已做出有效选择,从而避免表单提交无效数据,提升用户体验和数据准确性。 在构建 web 表单时…

    2026年9月22日
    200
  • win10无法弹出U盘怎么办_win10U盘无法弹出解决方法

    若U盘无法安全移除,首先关闭相关程序,检查任务管理器结束占用进程,清空剪贴板,重启Windows资源管理器,使用handle.exe命令行工具查找并终止占用进程,最后可修改U盘策略为快速删除模式以避免后续问题。 如果您尝试从Windows 10系统中安全移除U盘,但系统提示“设备正在使用”或无法完成…

    2026年9月22日
    100
  • iPhone情侣模式如何设置双人快捷指令?提升效率的设置教程

    iPhone情侣模式如何设置双人快捷指令?提升效率的设置教程iPhone情侣模式如何设置双人快捷指令?提升效率的设置教程iPhone情侣模式如何设置双人快捷指令?提升效率的设置教程iPhone情侣模式如何设置双人快捷指令?提升效率的设置教程

    iPhone情侣模式非官方功能,而是通过“快捷指令”App实现的自动化操作。用户可创建如“晚安模式”等指令,自动发送消息、设置共享提醒。操作步骤包括:打开“快捷指令”App,创建新指令,添加“获取日期”“格式化日期”“文本”“发送信息”及“添加提醒”等操作,最后命名并保存。还可添加到主屏幕或通过Si…

    2026年9月22日 用户投稿
    300
  • python 基准测试(cProfile kcachegrind line_profiler memory_profiler)

    learn from 《python高性能(第2版)》 类似工具:pycharm profile对函数调用效率进行测试 1. 例子 一个圆周运动的动画 代码语言:javascript代码运行次数:0运行复制 from matplotlib import pyplot as pltfrom matpl…

    2026年9月22日
    200
  • NvidiaCanvas的AI混合工具如何使用?创作智能画作的详细教程

    NVIDIA Canvas是一款基于AI的智能图像生成器,它将用户涂鸦的材质色块实时转化为逼真风景,核心在于语义理解与风格化合成。其工作流程包括选择材质笔刷、在输入画布绘制概念图、利用图层与风格预设快速迭代,并导出成果。相比传统绘画工具,Canvas优势在于高效生成、降低创作门槛、支持快速探索与创意…

    2026年9月22日
    300
  • VSCode安装C/C++开发环境 最新VSCode配置C语言教程详解

    答案:搭建VSCode的C/C++环境需安装编译器、C/C++扩展并配置项目文件。首先安装MinGW(Windows)、Clang(macOS)或GCC(Linux),配置环境变量并验证;然后在VSCode中安装Microsoft的C/C++扩展;最后创建.c_cpp_properties.json…

    2026年9月22日
    300
  • diskgenius如何设置Bios启动项

    diskgenius是一款功能全面的磁盘管理软件,在实际操作中,为了顺利运行该工具或进行系统维护,常常需要在bios中调整启动顺序。以下是详细的设置步骤说明。 当计算机开机或重启时,请留意屏幕初始画面中的提示信息,按下指定键进入bios设置界面。不同品牌和型号的主板所使用的快捷键有所区别,常见的包括…

    2026年9月22日
    200
  • MySQL如何设计数据库备份恢复的自动化流程_工具推荐?

    MySQL如何设计数据库备份恢复的自动化流程_工具推荐?MySQL如何设计数据库备份恢复的自动化流程_工具推荐?MySQL如何设计数据库备份恢复的自动化流程_工具推荐?MySQL如何设计数据库备份恢复的自动化流程_工具推荐?

    mysql数据库的备份与恢复自动化流程应从备份类型、工具选择、配置步骤及注意事项四方面入手。1. 明确备份类型与频率:根据rpo要求选择完整+增量备份组合,设定每日/每周任务。2. 推荐使用automysqlbackup(适合中小型系统)、mydumper/myloader(高效逻辑备份)、zrm …

    2026年9月22日 用户投稿
    400

发表回复

登录后才能评论
关注微信