Bootstrap 5等高列布局

前端开发 2026-07-10

我想让两列高度相等。这意味着菜单列的高度应与主列相同,而主列的高度会根据浏览器窗口大小变化。图片下面有一个Typed.js脚本,在主div中显示特定文本。我该如何实现?我在网上搜索了解决方案,但我找到的内容却把我的页面布局搞乱。

/*html
{
    background-image: url("../images/background_start.jpg");
}*/

body {
  overflow-x: hidden;
}

:root {
  --bs-body-font-family: var(--bs-font-times-new-roman);
}

h1,
.h1 {
  font-weight: 700;
}

#bg {
  background-image: url("../images/background_start.jpg");
}

#container {
  margin-top: 15px;
  margin-left: auto;
  margin-right: auto;
  margin-bottom: 0;
  width: 100%;
  max-width: 960px;
}

header {
  max-width: 960px;
  max-height: 85px;
  background-color: #808080;
}

#logo {
  width: 130px;
  height: 85px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
}

#image_gora {
  box-shadow: 0px 0px 15px 5px rgba(255, 0, 0, 1);
  -webkit-box-shadow: 0px 0px 15px 5px rgba(255, 0, 0, 1);
  -moz-box-shadow: 0px 0px 15px 5px rgba(255, 0, 0, 1);
  -o-box-shadow: 0px 0px 15px 5px rgba(255, 0, 0, 1);
}

.row>* {
  padding-right: 0;
  padding-left: 0;
}

#napis {
  width: 830px;
  height: 85px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
}

#napis_gora {
  color: #830808;
  font-size: 35px;
  text-shadow: 4px 4px 6px rgba(255, 255, 255, 1);
  text-transform: uppercase;
}

.clear {
  clear: both;
}

nav {
  width: 130px;
  height: 600px;
  background-color: #C0C0C0;
  float: left;
}

menu {
  list-style-type: none;
  text-align: center;
  padding: 0;
  position: sticky;
  top: 0;
}

nav menu li a {
  text-decoration: none;
  color: black;
  border-bottom: solid;
  font-size: 25px;
  line-height: 50px;
  font-weight: bold;
}

nav menu li a:hover,
nav menu li a#active {
  font-style: italic;
  font-weight: normal;
  border-bottom: none;
  color: white;
  background-color: #0080C0;
  border-radius: 30px;
  padding: 10px;
  cursor: pointer;
}

.container,
.container-fluid,
.container-xxl,
.container-xl,
.container-lg,
.container-md,
.container-sm {
  padding-left: 0;
}

@media screen and (min-width: 992px) {

  .navbar .container-fluid,
  .navbar-expand-lg .navbar-collapse,
  .navbar-expand-lg .navbar-nav {
    flex-direction: column;
    align-items: center;
  }
}

.navbar {
  --bs-navbar-padding-y: 0;
  display: inline;
}

.nav-link {
  display: inline;
  padding: 0;
  font-size: 25px;
  font-weight: bold;
  color: black;
  text-decoration: none;
  background: none;
  border-bottom: solid;
  transition: none;
}

@media screen and (max-width: 990px) {
  nav {
    width: 80px;
  }

  .nav-link {
    font-size: 12px;
  }
}

.navbar-nav {
  display: inline;
}

.navbar-expand-lg .navbar-nav .nav-link {
  padding-right: 0;
  padding-left: 0;
}

main {
  position: relative;
  width: 830px;
  min-height: 600px;
  background-color: #E0E0E0;
  float: left;
}

#start_chrystus {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  max-width: 808px;
  max-height: 569px;
}

#start_chrystus:hover {
  opacity: 0;
  transition: opacity 1s;
}

footer {
  max-width: 960px;
  max-height: 85px;
  background-color: #808080;
}

#stopka_lewa {
  width: 130px;
  float: left;
}

#html,
#css,
#js {
  width: 43px;
  height: 85px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
}

#html:hover,
#css:hover,
#js:hover {
  opacity: 0.5;
}

#html_rozmiar {
  width: 50px;
  height: 50px;
  cursor: pointer;
}

#css_rozmiar {
  width: 59px;
  height: 50px;
  cursor: pointer;
}

#js_rozmiar {
  width: 90px;
  height: 50px;
  cursor: pointer;
}

#zegar {
  width: 250px;
  height: 85px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 20px;
}

#stopka_prawa {
  width: 580px;
  height: 85px;
  float: left;
  display: flex;
  justify-content: right;
  align-items: center;
  font-size: 20px;
}

#stopka_napis {
  text-decoration: none;
  font-style: italic;
  color: #404040;
  margin-right: 20px;
  cursor: pointer;
}

#stopka_napis:hover {
  color: #008020;
  font-weight: bold;
}

@media screen and (max-width: 576px) {
  #stopka_prawa {
    width: 0;
  }

  #stopka_napis {
    font-size: 0;
  }
}

@media screen and (max-width: 680px) {
  #stopka_napis {
    font-size: 0;
  }
}

@media screen and (max-width: 768px) {
  #stopka_prawa {
    width: 193px;
  }
}

@media screen and (max-width: 992px) {
  #stopka_prawa {
    width: 290px;
  }
}

button {
  margin: 0 auto;
}
<!DOCTYPE html>
<html lang="pl-PL">

<head>
  <title>Zakopane Siostry Zmartwychwstanki</title>
  <meta name="description" content="Zakopane Siostry Zakonne" />
  <meta name="keywords" content="adoracja, apostolstwo, Bóg, cisza, cr, galeria, Giewont, góry, Jezus, kaplica, klasztor, kontakt, kościół, modlitwa, msza, nocleg, noclegi, odpoczynek, pobyt, pokoje, refleksja, rekolekcje, siostry, spotkania, spotkanie, Tatry, wędrówka, wspólnota, wspólnoty, wypoczynek, zakon, zakonnice, Zakopane, zakopanecr, zdjęcia, zdjęcie, zmartwychwstanki, dom modlitwy, dom rekolekcyjny, dom wypoczynkowy, dom zakonny, domy modlitwy, domy rekolekcyjne, domy wypoczynkowe, domy zakonne, Jezus Chrystus, odpoczynek duchowy, organizacja kościelna, organizacje kościelne, Pan Jezus, Regina mundi, rozmowa z Bogiem, siostry zakonne, siostry zmartwychwstanki, spotkanie z Bogiem, ulica Za Strugiem, ulica Za Strugiem 27, wspólnota zakonna, wspólnoty zakonne, Za Strugiem, Za Strugiem 27, zgromadzenia zakonne, zgromadzenie zakonne" />
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <link rel="stylesheet" type="text/css" href="css/bootstrap.css" media="screen" />
  <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
  <link rel="stylesheet" type="text/css" href="css/index.css" media="screen" />
  <link rel="shortcut icon" href="images/favicon.ico" type="image/ico" />
  <style>




  </style>
  <!--typedjs START-->
  <script>
    document.addEventListener("DOMContentLoaded", function() {
      const typed = new Typed('#typed', {
        strings: ["\<span style='font-size:20px;'>\<strong>\<center>\</br>\</br>„Regina mundi” – klasztor sióstr zmartwychwstanek,\</br>z pięknym widokiem na Giewont, w pobliżu Ścieżki pod Reglami,\</br>i u wejścia do malowniczej Doliny Strążyskiej.\</br>Od 27 grudnia 1955 roku mieszka w nim Pan Jezus Zmartwychwstały,\</br>który pragnie być nawiedzany i adorowany.\</br>\</br>^1000Po Panu Jezusie,\</br>czekają na Państwa w progach domu siostry zmartwychwstanki,\</br>które założyła matka z córką – swoisty ewenement – w XIX wieku,\</br>kiedy Polski nie było na mapach świata,\</br>ale była w sercach Polek i Polaków,\</br>którzy nigdy nie zwątpili w jej zmartwychwstanie,\</br>i moralne odrodzenie społeczeństwa.\</br>Tymi ideałami żyją również współczesne pokolenia zmartwychwstanek,\</br>o czym będą się mogli Państwo przekonać, odwiedzając nasz klasztor.\</br>\</br>^1000ZAPRASZAMY\</center>\</strong>\</span>"],
        typeSpeed: 60, // typing speed
        startDelay: 500, // time before typing starts
        backSpeed: 0, // backspacing speed
        backDelay: 15000, // time before backspacing
        loop: true,
        contentType: 'html', // or text
        // defaults to false for infinite loop
        loopCount: false,
        onComplete: function(self) {
          shift();
        }
      });
    });

    function shift() {
      document.querySelector(".head-wrap").classList.add("shift-text");
      terminalHeight();
    }

    function terminalHeight() {
      var termHeight = document.querySelector(".terminal-height");
      var value = termHeight.textContent;
      value = parseInt(value);
      setTimeout(function() {
        if (value > 10) {
          value = value - 1;
          this.txtValue = value.toString();
          termHeight.textContent = this.txtValue;
          terminalHeight();
        } else {
          clearTimeout();
        }
      }, 10);
    }
  </script>
  <!--typedjs END-->
  <script type="text/javascript">
    function odliczanie() {
      var dzisiaj = new Date();
      var dzien = dzisiaj.getDate();
      if (dzien < 10) {
        dzien = "0" + dzien;
      }
      var miesiac = dzisiaj.getMonth() + 1;
      if (miesiac < 10) {
        miesiac = "0" + miesiac;
      }
      var rok = dzisiaj.getFullYear();
      var godzina = dzisiaj.getHours();
      if (godzina < 10) {
        godzina = "0" + godzina;
      }
      var minuta = dzisiaj.getMinutes();
      if (minuta < 10) {
        minuta = "0" + minuta;
      }
      var sekunda = dzisiaj.getSeconds();
      if (sekunda < 10) {
        sekunda = "0" + sekunda;
      }

      document.getElementById("zegar").innerHTML = godzina + ":" + minuta + ":" + sekunda + " | " + dzien + "/" + miesiac + "/" + rok;

      setTimeout("odliczanie()", 1000);
    }
  </script>
</head>

<body onload="odliczanie();" id="bg">

  <div id="container" class="container">
    <header>
      <div id="logo">
        <img src="images/logo.png" id="image_gora" alt="logo">
      </div>
      <div class="row">
        <div id="napis">
          <h1 id="napis_gora" class="text-break">Siostry Zmartwychwstanki - Zakopane</h1>
        </div>
      </div>
      <div class="clear"></div>
    </header>
    <nav class="navbar navbar-expand-lg sticky-top">
      <div class="container-fluid">
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                        <span class="navbar-toggler-icon"></span>
                        </button>
        <div class="collapse navbar-collapse" id="navbarSupportedContent">
          <menu class="navbar-nav">
            <li class="nav-item"><a href="zakopane-siostry-zmartwychwstanki" id="active" class="nav-link">Start</a></li>
            <li class="nav-item"><a href="gory" class="nav-link">Góry</a></li>
            <li class="nav-item"><a href="galeria" class="nav-link">Galeria</a></li>
            <li class="nav-item"><a href="kronika" class="nav-link">Kronika</a></li>
            <li class="nav-item"><a href="kontakt" class="nav-link">Kontakt</a></li>
            <li class="nav-item"><a href="bonus" class="nav-link">Bonus</a></li>
            <li class="nav-item"><a href="zagadka" class="nav-link">Zagadka</a></li>
            <li class="nav-item"><a href="frustrator" class="nav-link">Frustr8tor</a></li>
            <li class="nav-item"><a href="szubienica" class="nav-link">Szubienica</a></li>
            <li class="nav-item"><a href="sw-pawel" class="nav-link">Św. Paweł</a></li>
          </menu>
        </div>
      </div>
    </nav>
    <div class="row">
      <main>
        <article>
          <div id="start_chrystus" class="col-12">
            <img src="images/start_chrystus.png" class="img-fluid" alt="chrystus">
          </div>
          <!--typedjs START-->
          <div class="header">
            <div class="head-wrap">
              <div class="text-editor-wrap">
                <div class="title-bar"><span class="title"><span class="terminal-height"></span></span></div>
                <div class="text-body">
                  <span id="typed"></span>
                </div>
              </div>
            </div>
          </div>
          <!--typedjs END-->
        </article>
      </main>
    </div>
    <div class="clear"></div>
    <footer>
      <div id="stopka_lewa">
        <div id="html">
          <a href="https://validator.w3.org/#validate_by_input" target="_blank"><img src="images/belka_dol_html5.png" id="html_rozmiar" alt="html5"></a>
        </div>
        <div id="css">
          <a href="https://jigsaw.w3.org/css-validator/#validate_by_input" target="_blank"><img src="images/belka_dol_css3.png" id="css_rozmiar" alt="css3"></a>
        </div>
        <div id="js">
          <a href="https://www.site24x7.com/tools/javascript-validator.html" target="_blank"><img src="images/belka_dol_javascript.png" id="js_rozmiar" alt="js"></a>
        </div>
      </div>
      <div id="zegar"></div>
      <div id="stopka_prawa">
        <a href="zagadka.php" id="stopka_napis">Created by CSfC & Team</a>
      </div>
      <div class="clear"></div>
    </footer>
  </div>
  <script src="js/typed.umd.js"></script>
  <script src="js/bootstrap.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/typed.js/2.0.10/typed.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</body>

</html>

解决方案

你不应该用固定高度来强制让两列达到相同的高度。真正的问题在于布局把旧的浮动与Bootstrap / flex布局混用,因此实现等高的效果比实际需要的要困难。

在你的代码中,nav和 main都是浮动(float: left),并且main还具有固定宽度,因此Bootstrap的 row/column系统并没有真正用在这两个并排区域。这就是菜单无法随着内容区域自然延展的原因。

一个更简洁的修复方法是把nav和 main放在同一Bootstrap行中,并移除浮动:

<div class="row g-0 align-items-stretch">
  <nav class="col-lg-2">
    ...
  </nav>

  <main class="col-lg-10">
    ...
  </main>
</div>

然后把CSS大致改成如下:

nav,
main {
  float: none;
  width: auto;
  min-height: 600px;
}

.row.equal-cols {
  display: flex;
  align-items: stretch;
}

nav {
  background-color: #C0C0C0;
}

main {
  background-color: #E0E0E0;
  position: relative;
}

更简单地说:

<div class="row g-0 d-flex align-items-stretch">
  <nav class="col-lg-2">
    ...
  </nav>
  <main class="col-lg-10">
    ...
  </main>
</div>
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章