设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间23 现在时间23 缓存数据 荣耀也罢,屈辱也罢,都要以平和的心态去面对,少一些无奈与感慨,多一份从容和淡然。晚安!

荣耀也罢,屈辱也罢,都要以平和的心态去面对,少一些无奈与感慨,多一份从容和淡然。晚安!

查看: 282|回复: 1

CSS实现元素撑满剩余空间的五种方法

[复制链接]

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:2
  • 打卡月天数:0
  • 打卡总奖励:29
  • 最近打卡:2024-08-06 02:38:42
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
32
主题
28
精华
0
金钱
131
积分
68
注册时间
2023-9-29
最后登录
2025-9-11

发表于 2025-9-11 12:19:10 | 显示全部楼层 |阅读模式

CSS实现元素撑满剩余空间的5种方法 🎨

在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求,比如侧边栏+主内容区、头部+内容区+底部等布局。本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点。

Flexbox 方法

  1. 📁 详见 [code]./01-flexbox/index.html
复制代码
[/code]

Flexbox 是最现代和推荐的方式。通过设置 

  1. flex-grow: 1
复制代码
,元素会自动扩展占据剩余空间。对于垂直布局,配合 
  1. height: 0
复制代码
 使用效果更好。

聊天应用布局:

1.png

  1. <div class="chat-container">
  2. <header class="chat-header">
  3. <img src="avatar.jpg" alt="用户头像">
  4. <h2>聊天室</h2>
  5. </header>
  6. <main class="chat-messages">
  7. <div class="message received">收到的消息</div>
  8. <div class="message sent">发送的消息</div>
  9. </main>
  10. <footer class="chat-input">
  11. <input type="text" placeholder="输入消息...">
  12. <button>发送</button>
  13. </footer>
  14. </div>
  15. <style>
  16. .chat-container {
  17. display: flex;
  18. flex-direction: column;
  19. height: 100vh;
  20. }
  21. .chat-header {
  22. height: 60px;
  23. background: #075e54;
  24. }
  25. .chat-messages {
  26. flex: 1;
  27. height: 0; /* 关键属性 */
  28. overflow-y: auto;
  29. }
  30. .chat-input {
  31. height: 60px;
  32. background: #f0f0f0;
  33. }
  34. </style>
复制代码

实现思路解析:

  • 垂直布局三要素:

      1. display: flex
      复制代码
       + 
      1. flex-direction: column
      复制代码
       创建垂直伸缩布局
      1. flex: 1
      复制代码
       让中间区域自动占据剩余空间
      1. height: 0
      复制代码
       防止内容撑开,确保严格遵守 flex 规则
  • 滚动区域处理:

    • 设置 
      1. overflow-y: auto
      复制代码
       使内容过多时可滚动
    • 不设置 height: 0 的话,内容会撑开容器,破坏布局
  • 布局结构:
    容器 (100vh)
    ├── 头部 (固定60px)
    ├── 内容 (flex: 1 + height: 0)
    └── 底部 (固定60px)

  • 性能优化:

    • 使用 transform 代替定位提升性能
    • 避免频繁改变高度触发重排

其他适用场景:

  • 后台管理系统布局

    • 顶部固定导航栏
    • 左侧固定菜单栏
    • 右侧自适应内容区
  • 移动端应用布局

    • 固定顶部header
    • 可滚动的内容区域
    • 固定底部导航栏
  • 文档编辑器

    • 工具栏
    • 自适应的编辑区域
    • 状态栏

优点:

  • 灵活且直观
  • 支持动态内容
  • 响应式表现好
  • 一维布局的最佳选择

缺点:

  • IE11及以下版本支持不完善
  • 不适合复杂的二维布局

Grid 方法

  1. 📁 详见 [code]./02-grid/index.html
复制代码
[/code]

Grid 布局通过 

  1. fr
复制代码
 单位或 
  1. auto
复制代码
 来分配剩余空间,特别适合复杂的二维布局。

仪表盘布局:

2.png

  1. <div class="dashboard">
  2. <!-- 状态卡片 -->
  3. <div class="widget status-card">
  4. <h3>总访问量</h3>
  5. <div class="number">1,234,567</div>
  6. </div>
  7. <div class="widget status-card">
  8. <h3>活跃用户</h3>
  9. <div class="number">45,678</div>
  10. </div>
  11. <!-- 大尺寸部件 -->
  12. <div class="widget large-widget">
  13. <h3>访问趋势图</h3>
  14. </div>
  15. </div>
  16. <style>
  17. .dashboard {
  18. display: grid;
  19. grid-template-columns: repeat(4, 1fr);
  20. grid-template-rows: 100px 200px;
  21. gap: 20px;
  22. }
  23. .widget {
  24. background: white;
  25. border-radius: 10px;
  26. padding: 20px;
  27. }
  28. .large-widget {
  29. grid-column: span 2;
  30. }
  31. /* 响应式布局 */
  32. @media (max-width: 768px) {
  33. .dashboard {
  34. grid-template-columns: repeat(2, 1fr);
  35. }
  36. }
  37. </style>
复制代码

实现思路解析:

  • 网格系统设计:

    • 使用 
      1. repeat(4, 1fr)
      复制代码
       创建均等的四列布局
      1. grid-template-rows
      复制代码
       定义不同的行高
      1. gap: 20px
      复制代码
       统一设置网格间距
  • 响应式布局策略:
    桌面端:4列
    平板端:2列 (media query)
    手机端:1列

  • 组件尺寸控制:

    • 使用 
      1. grid-column: span 2
      复制代码
       让组件跨越两列
    • 通过 
      1. grid-area
      复制代码
       可以实现更复杂的位置控制
  • 自适应处理:

    • fr 单位自动分配剩余空间
    • 结合 minmax() 设置最小尺寸防止挤压

适用场景:

  • 图片画廊/瀑布流

    • 自适应的网格布局
    • 不规则的图片排列
    • 响应式的列数调整
  • 网站首页布局

    • 多区块的内容排列
    • 广告位的灵活布局
    • 响应式的栅格系统
  • 在线商城商品展示

    • 商品网格
    • 不同尺寸的促销位
    • 自适应的分类展示

优点:

  • 二维布局更灵活
  • 代码简洁明了
  • 响应式设计更简单
  • 支持复杂的对齐和间距控制

缺点:

  • 老浏览器兼容性问题
  • 对于简单的一维布局可能显得过重
  • 学习曲线相对较陡

绝对定位方法

  1. 📁 详见 [code]./03-absolute/index.html
复制代码
[/code]

使用绝对定位和固定值来计算剩余空间,通过设置 

  1. top
复制代码
  1. right
复制代码
  1. bottom
复制代码
  1. left
复制代码
 值来精确控制位置。

视频播放器控制层:

3.png

  1. <div class="video-container">
  2. <video poster="thumbnail.jpg">
  3. <source src="video.mp4" type="video/mp4">
  4. </video>
  5. <div class="controls-overlay">
  6. <div class="top-controls">
  7. <h2>视频标题</h2>
  8. <button class="control-button">⚙️</button>
  9. </div>
  10. <div class="progress-bar">
  11. <div class="progress"></div>
  12. </div>
  13. <div class="bottom-controls">
  14. <button class="control-button">▶️</button>
  15. <div class="time-display">02:30 / 10:00</div>
  16. <button class="control-button">🔊</button>
  17. </div>
  18. </div>
  19. </div>
  20. <style>
  21. .video-container {
  22. position: relative;
  23. width: 100%;
  24. height: 100vh;
  25. }
  26. .controls-overlay {
  27. position: absolute;
  28. top: 0;
  29. right: 0;
  30. bottom: 0;
  31. left: 0;
  32. background: linear-gradient(
  33. to bottom,
  34. rgba(0,0,0,0.7) 0%,
  35. rgba(0,0,0,0) 20%,
  36. rgba(0,0,0,0) 80%,
  37. rgba(0,0,0,0.7) 100%
  38. );
  39. }
  40. .bottom-controls {
  41. position: absolute;
  42. bottom: 0;
  43. left: 0;
  44. right: 0;
  45. height: 60px;
  46. padding: 15px;
  47. }
  48. </style>
复制代码

实现思路解析:

  • 层级控制:
    视频容器 (relative)
    ├── 视频元素
    └── 控制层 (absolute)
    ├── 顶部控件
    ├── 进度条
    └── 底部控件

  • 渐变遮罩设计:

    • 使用 linear-gradient 创建渐变背景
    • 顶部和底部渐变营造层次感
    • 中间区域透明保持视频可见
  • 交互优化:

    • hover 时显示控制层
    • 使用 transition 实现平滑过渡
    • 控件布局考虑触控友好性
  • 响应式考虑:

    • 控件尺寸使用相对单位
    • 移动端适配大小按钮
    • 保持关键控件始终可见

适用场景:

  • 固定元素覆盖

    • 全屏遮罩层
    • 模态框背景
    • 全屏加载指示器
  • 广告位布局

    • 固定位置的广告条
    • 悬浮广告
    • 角标定位
  • 特殊交互界面

    • 拖拽区域
    • 自定义滚动条
    • 图片裁剪区域

优点:

  • 浏览器兼容性好
  • 性能较好
  • 精确控制位置
  • 层级控制容易

缺点:

  • 不够灵活
  • 需要手动计算位置
  • 脱离文档流可能影响其他元素
  • 响应式布局较难维护

calc() 方法

  1. 📁 详见 [code]./04-calc/index.html
复制代码
[/code]

使用 CSS 的 calc() 函数动态计算尺寸,可以混合使用不同单位进行计算。

多栏布局:

4.png

  1. <div class="article-container">
  2. <h2>等宽三栏布局</h2>
  3. <div class="three-columns">
  4. <div class="column">第一栏</div>
  5. <div class="column">第二栏</div>
  6. <div class="column">第三栏</div>
  7. </div>
  8. <h2>混合宽度布局</h2>
  9. <div class="mixed-columns">
  10. <aside class="sidebar">侧边栏</aside>
  11. <main class="main-content">主内容区</main>
  12. </div>
  13. </div>
  14. <style>
  15. /* 三栏等宽布局 */
  16. .three-columns {
  17. display: flex;
  18. gap: 30px;
  19. }
  20. .three-columns .column {
  21. width: calc(100% / 3 - 20px);
  22. /* 减去间距的权重 */
  23. }
  24. /* 混合宽度布局 */
  25. .mixed-columns {
  26. display: flex;
  27. gap: 30px;
  28. }
  29. .mixed-columns .sidebar {
  30. width: 300px;
  31. }
  32. .mixed-columns .main-content {
  33. width: calc(100% - 330px);
  34. /* 减去侧边栏宽度和间距 */
  35. }
  36. @media (max-width: 768px) {
  37. .three-columns,
  38. .mixed-columns {
  39. flex-direction: column;
  40. }
  41. .three-columns .column,
  42. .mixed-columns .sidebar,
  43. .mixed-columns .main-content {
  44. width: 100%;
  45. }
  46. }
  47. </style>
复制代码

实现思路解析:

宽度计算原理:

  1. /* 三栏等宽布局 */
  2. width: calc(100% / 3 - 20px) /* 总宽度均分减去间距 */
  3. /* 混合布局 */
  4. width: calc(100% - 330px) /* 总宽度减去固定宽度和间距 */
复制代码
  • 间距处理策略:

    • 使用 gap 属性设置列间距
    • 在计算时减去对应的间距值
    • 响应式布局时重置间距
  • 精确计算:

    • 考虑边框和内边距的影响
    • 使用 box-sizing: border-box
    • 预留边距防止小数点误差
  • 响应式设计:

    • 断点处切换为垂直布局
    • 重置为 100% 宽度
    • 保持间距的一致性

适用场景:

  • 自定义滚动容器

    • 减去固定高度的滚动区域
    • 考虑padding和边框的精确计算
    • 动态高度的内容区域
  • 表单布局

    • 标签和输入框组合
    • 多列表单布局
    • 自适应的输入区域
  • 媒体播放器

    • 进度条计算
    • 控制栏布局
    • 缩略图网格

优点:

  • 精确控制
  • 支持动态计算
  • 可混合不同单位
  • 适合精确的数学计算

缺点:

  • 需要明确知道其他元素的尺寸
  • IE9及以下不支持
  • 计算规则可能复杂
  • 性能略低于固定值

table 布局方法

  1. 📁 详见 [code]./05-table/index.html
复制代码
[/code]

使用 CSS table 布局属性来分配空间,特别适合需要等高列或自动空间分配的场景。

数据表格:

5.png

  1. <div class="table-container">
  2. <div class="data-table">
  3. <div class="table-header">
  4. <div class="table-row">
  5. <div class="table-cell">ID</div>
  6. <div class="table-cell">项目名称</div>
  7. <div class="table-cell">进度</div>
  8. <div class="table-cell">状态</div>
  9. </div>
  10. </div>
  11. <div class="table-body">
  12. <div class="table-row">
  13. <div class="table-cell">001</div>
  14. <div class="table-cell">项目重构</div>
  15. <div class="table-cell">
  16. <div class="progress-bar">
  17. <div class="progress" style="width: 75%"></div>
  18. </div>
  19. </div>
  20. <div class="table-cell">
  21. <span class="status">进行中</span>
  22. </div>
  23. </div>
  24. </div>
  25. </div>
  26. </div>
  27. <style>
  28. .data-table {
  29. display: table;
  30. width: 100%;
  31. border-collapse: collapse;
  32. }
  33. .table-header {
  34. display: table-header-group;
  35. background: #f8f9fa;
  36. }
  37. .table-body {
  38. display: table-row-group;
  39. }
  40. .table-row {
  41. display: table-row;
  42. }
  43. .table-cell {
  44. display: table-cell;
  45. padding: 15px;
  46. border-bottom: 1px solid #dee2e6;
  47. vertical-align: middle;
  48. }
  49. /* 列宽设置 */
  50. .table-cell:nth-child(1) { width: 80px; }
  51. .table-cell:nth-child(2) { width: 200px; }
  52. .table-cell:nth-child(3) { width: 200px; }
  53. .table-cell:nth-child(4) { width: 120px; }
  54. </style>
复制代码

实现思路解析:

  • 表格结构设计:
    table-container
    └── data-table (display: table)
    ├── table-header (table-header-group)
    │ └── table-row
    │ └── table-cell × N
    └── table-body (table-row-group)
    └── table-row × N
    └── table-cell × N

  • 列宽控制策略:

    • 固定列使用具体像素值
    • 自适应列不设宽度自动分配
    • 使用 min-width 防止内容挤压
  • 样式优化:

    • 使用 border-collapse 处理边框
    • 通过 vertical-align 控制对齐
    • nth-child 实现斑马纹效果
  • 特点利用:

    • 自动等高列
    • 自动垂直对齐
    • 天然的响应式行为

适用场景:

  • 数据密集型界面
    • 数据表格
    • 列表展示
    • 价格对比表

最佳实践建议 💡

  • 优先使用 Flexbox

    • 对于大多数现代网站,Flexbox 是最佳选择
    • 代码简单,维护方便
  • 需要考虑兼容性时

    • 如果需要支持旧版浏览器,可以考虑 calc() 或绝对定位方案
    • 可以使用 @supports 进行优雅降级
  • 复杂布局场景

    • 对于复杂的网格布局,优先使用 Grid
    • 可以配合 Flexbox 实现更复杂的布局

总结

每种方法都有其适用场景,选择合适的方法要考虑:

  • 浏览器兼容性要求
  • 布局复杂度
  • 响应式需求
  • 维护成本

建议在实际项目中:

  • 优先使用 Flexbox/Grid 等现代方案
  • 需要兼容老浏览器时,可以采用 calc()/绝对定位方案
  • 结合项目实际情况选择最合适的方案

到此这篇关于CSS实现元素撑满剩余空间的五种方法的文章就介绍到这了,更多相关css元素撑满剩余空间内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章,希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2024-8-27
最后登录
2024-8-27

发表于 半小时前 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表