Bootstrap 4:响应式布局中使列高度自适应内容

DDD
发布: 2025-10-19 10:51:28
原创
321人浏览过

bootstrap 4:响应式布局中使列高度自适应内容

本文介绍了如何在使用 Bootstrap 4 构建响应式布局时,使两列在移动设备上折叠成一列后,其高度能够根据内容自适应。通过使用 `@media` 查询和 `display: block!important` 样式,可以有效地解决在没有滚动条时,列高度平均分配的问题,同时保留原有的滚动条功能。

在使用 Bootstrap 4 构建响应式布局时,经常会遇到需要在不同屏幕尺寸下调整列的排列方式和高度的问题。一个常见的场景是,在桌面端,两列并排显示,各自具有滚动条;而在移动端,这两列折叠成一列,垂直排列。在某些情况下,当内容较少,没有滚动条时,这些列可能会平均分配剩余的高度,而不是根据内容自适应。本文将介绍如何解决这个问题,确保在各种情况下列的高度都能正确显示。

问题描述

假设我们有一个包含 Header、两列内容区域和 Footer 的布局。在桌面端,两列内容区域并排显示,并且可以独立滚动。在移动端,我们希望这两列内容区域折叠成一列,垂直排列,并且高度能够自适应内容。

以下是一个基本的 HTML 结构示例:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Bootstrap 4 Responsive Columns</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css">
  <style>
    html,
    body {
      height: 100%;
    }
  </style>
</head>
<body>
  <div class="container-fluid d-flex flex-column vh-100">
    <div class="row border flex-shrink-0">
      Header
    </div>
    <div class="row flex-grow-1 overflow-hidden">
      <div class="col-6 mh-100 overflow-auto">
        Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
        Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
        Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
      </div>
      <div class='col-6 mh-100 overflow-auto'>
        World<br>World<br>World<br>World<br>World<br>World<br>World<br>
        World<br>World<br>World<br>World<br>World<br>World<br>World<br>
        World<br>World<br>World<br>World<br>World<br>World<br>World<br>
      </div>
    </div>
    <div class="row border flex-shrink-0">
      Footer
    </div>
  </div>

  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
登录后复制

在移动端,我们通常会使用 @media 查询来改变列的宽度和溢出属性,使其折叠成一列:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Bootstrap 4 Responsive Columns</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css">
  <style>
    html,
    body {
      height: 100%;
    }
  </style>
</head>
<body>
  <div class="container-fluid d-flex flex-column vh-100">
    <div class="row border flex-shrink-0">
      Header
    </div>
    <div class="row flex-grow-1 mh-100 overflow-auto">
      <div class="col-12 overflow-visible">
        Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
        Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
        Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
      </div>
      <div class='col-12 overflow-visible'>
        World<br>World<br>World<br>World<br>World<br>World<br>World<br>
        World<br>World<br>World<br>World<br>World<br>World<br>World<br>
        World<br>World<br>World<br>World<br>World<br>World<br>World<br>
      </div>
    </div>
    <div class="row border flex-shrink-0">
      Footer
    </div>
  </div>

  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
登录后复制

然而,当内容不足以产生滚动条时,两列的高度会平均分配,这可能不是我们想要的结果。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Bootstrap 4 Responsive Columns</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css">
  <style>
    html,
    body {
      height: 100%;
    }
  </style>
</head>
<body>
  <div class="container-fluid d-flex flex-column vh-100">
    <div class="row border flex-shrink-0">
      Header
    </div>
    <div class="row flex-grow-1 mh-100 overflow-auto">
      <div class="col-12 overflow-visible">
        Hello
      </div>
      <div class='col-12 overflow-visible'>
        World
      </div>
    </div>
    <div class="row border flex-shrink-0">
      Footer
    </div>
  </div>

  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
登录后复制

解决方案

为了解决这个问题,我们可以使用 @media 查询在移动端为包含列的 row 元素添加 display: block!important 样式。这将覆盖 Bootstrap 默认的 flexbox 行为,使得列的高度能够根据内容自适应。

以下是修改后的代码:

AppMall应用商店
AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56
查看详情 AppMall应用商店
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Bootstrap 4 Responsive Columns</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css">
  <style>
    html,
    body {
      height: 100%;
    }

    @media (max-width: 768px) {
      .row.flex-grow-1 {
        display: block !important;
      }
    }
  </style>
</head>
<body>
  <div class="container-fluid d-flex flex-column vh-100">
    <div class="row border flex-shrink-0">
      Header
    </div>
    <div class="row flex-grow-1 mh-100 overflow-auto">
      <div class="col-12 overflow-visible">
        Hello
      </div>
      <div class='col-12 overflow-visible'>
        World
      </div>
    </div>
    <div class="row border flex-shrink-0">
      Footer
    </div>
  </div>

  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
登录后复制

通过添加以下 CSS 规则,我们可以在屏幕宽度小于或等于 768px 时,将 row 元素的 display 属性设置为 block:

@media (max-width: 768px) {
  .row.flex-grow-1 {
    display: block !important;
  }
}
登录后复制

!important 确保这个样式能够覆盖 Bootstrap 默认的样式。

完整示例

以下是包含滚动条和没有滚动条的完整示例代码,展示了如何使用上述方法来解决问题:

包含滚动条的示例:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Bootstrap 4 Responsive Columns</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css">
  <style>
    html,
    body {
      height: 100%;
    }

    @media (max-width: 768px) {
      .row.flex-grow-1 {
        display: block !important;
      }
    }
  </style>
</head>
<body>
  <div class="container-fluid d-flex flex-column vh-100">
    <div class="row border flex-shrink-0">
      Header
    </div>
    <div class="row flex-grow-1 mh-100 overflow-auto">
      <div class="col-12 overflow-visible">
        Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
        Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
        Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>Hello<br>
      </div>
      <div class='col-12 overflow-visible'>
        World<br>World<br>World<br>World<br>World<br>World<br>World<br>
        World<br>World<br>World<br>World<br>World<br>World<br>World<br>
        World<br>World<br>World<br>World<br>World<br>World<br>World<br>
      </div>
    </div>
    <div class="row border flex-shrink-0">
      Footer
    </div>
  </div>

  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
登录后复制

没有滚动条的示例:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Bootstrap 4 Responsive Columns</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css">
  <style>
    html,
    body {
      height: 100%;
    }

    @media (max-width: 768px) {
      .row.flex-grow-1 {
        display: block !important;
      }
    }
  </style>
</head>
<body>
  <div class="container-fluid d-flex flex-column vh-100">
    <div class="row border flex-shrink-0">
      Header
    </div>
    <div class="row flex-grow-1 mh-100 overflow-auto">
      <div class="col-12 overflow-visible">
        Hello
      </div>
      <div class='col-12 overflow-visible'>
        World
      </div>
    </div>
    <div class="row border flex-shrink-0">
      Footer
    </div>
  </div>

  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
登录后复制

总结

通过使用 @media 查询和 display: block!important 样式,我们可以有效地解决在使用 Bootstrap 4 构建响应式布局时,列高度自适应内容的问题。这种方法既能保证在移动端列的高度根据内容自适应,又能保留原有的滚动条功能。在实际开发中,可以根据具体需求调整 @media 查询的断点值,以适应不同的屏幕尺寸。

以上就是Bootstrap 4:响应式布局中使列高度自适应内容的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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