Как сделать колонки одинаковой высоты

В этом материале рассмиотрим различные способы, показывающие как можно сделать колонки одинаковой высоты. Все варианты будут разобраны для двухколоночного макета страницы, но они также будут работать для трёх и более колонок (с небольшой модификацией). Часть примеров реализуется на чистом CSS, другие используют JavaScript.

Псевдоэлемент и абсолютное позиционирование

Суть данного способа следующая: с помощью псевдокласса :after каждой колонке добавляется блок, который залит соответствующим цветом и имеет высоту, равную 100% высоте блока-контейнера. Для блока-контейнера задано свойство overflow: hidden;, которое и обрезает лишнюю высоту.

HTML:

<header>Шапка страницы</header>
  <div class="container">
    <div class="main-content">
      <div>
        <h1>Основной контент</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</p>
      </div>
    </div>
    <aside>
      <div>
        <h2>Боковая колонка</h2>
        <p>Nullam ac imperdiet mi. In efficitur iaculis erat id mattis...</p>
     </div>          
    </aside>
  </div>
<footer>Подвал страницы</footer>
CSS
body {
  margin: 0;
  background: #FAF2D6;
  color: #302E2D;
}
header {
  padding: 30px 60px;
  background: #80C8A0;
}
.container {
  padding: 30px;
  position: relative;
  overflow: hidden;
}
.main-content {
  float: left;
  width: calc(100% - 330px);
  background: #C9CCC8;
}
aside {
  float: right;
  width: 300px;
  background: #EC5A45;
}
.main-content:after, aside:after {
  content: "";
  position: absolute;
  height: 100%;
}
.main-content:after {
  left: 30px;
  right: 360px;
  background: #C9CCC8;
}
aside:after {
  right: 30px;
  width: 300px;
  background: #EC5A45;
}
.main-content div, aside  div {
  padding: 30px 30px 0 30px;
}
footer {
  margin-top: 30px;
  padding: 30px 60px;
  background: #80C8A0;
}
.container:after {
  content: "";
  display: table;
  clear:  both;
}

В медиазапросе, например, для максимальной ширины 860px отменим обрезку содержимого контейнера, обтекание для колонок и скроем содержимое, добавленное с помощью псевдокласса. Ширину колонок сделаем равную ширине блока-контейнера.

CSS

@media (max-width: 860px) {
  .container {
    overflow: visible;
    }
  .main-content {
    float: none;
    margin-bottom: 30px;
    width: 100%;
    }
  aside {
    float: none;
    width: 100%;
    }
  .main-content div, aside  div {
  padding: 30px;
}
  .main-content:after, aside:after {
    display: none;
    }
  footer {
    margin-top: 0;
  }
}

Внутренние и внешние отступы

Для каждой колонки устанавливаем нижнее поле padding с большим значением. В этом случае фон колонки будет распространяться на всю высоту поля. Далее задаём отрицательное нижнее поле с таким же значением. С его помощью мы уменьшаем высоту колонки до её фактических размеров, не затрагивая фоновую заливку. Свойство overflow: hidden;, заданное для блока-контейнера, обрезает высоту каждой колонки, ориентируясь на самую высокую.

CSS:

body {
  margin: 0;
  background: #FAF2D6;
  color: #302E2D;
}
header {
  padding: 30px 60px;
  background: #80C8A0;
}
.container {
  padding: 30px;
  overflow: hidden;
}
.main-content {
  float: left;
  width: calc(100% - 330px);
  background: #C9CCC8;
}
aside {
  float: right;
  width: 300px;
  background: #EC5A45;
}
.main-content, aside {
  padding-bottom: 99999px;
  margin-bottom: -99999px;
}
.main-content div, aside  div {
  padding: 30px 30px 0 30px;
}
footer {
  margin-top: 30px;
  padding: 30px 60px;
  background: #80C8A0;
}

В медиазапросе уберём нижние поля и отступы, отменим обрезку содержимого и установим ширину колонок, равную ширине блока-контейнера.

@media (max-width: 860px) {
  .container {
    overflow: visible;
    }
  .main-content {
    float: none;
    width: 100%;
    margin-bottom: 30px;
    padding-bottom: 0;
    }
  aside {
    float: none;
    width: 100%;
    margin-bottom: 0;
    padding-bottom: 0;
    }
  .main-content div, aside  div {
    padding: 30px;
}
  footer {
    margin-top: 0;
  }
}

По типу таблицы

В данном примере используется особенность html-таблиц, благодаря которой все ячейки одного ряда принимают одинаковую высоту, равную высоте самой высокой ячейки.

HTML:

<header>Шапка страницы</header>
  <div class="container">
    <div class="main-content">
      <div class="content-wrap">
        <h1>Основной контент</h1>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</p>
      </div>
      <aside>
        <h2>Боковая колонка</h2>
        <p>Nullam ac imperdiet mi. In efficitur iaculis erat id mattis...</p>
      </aside>
    </div>
  </div>
<footer>Подвал страницы</footer>
CSS:
body {
  margin: 0;
  background: #FAF2D6;
  color: #302E2D;
}
header {
  padding: 30px 60px;
  background: #80C8A0;
  margin-bottom: 30px;
}
.container {
  display: table;
  border-collapse: separate;
  border-spacing: 30px 0;
}
.main-content {
  display: table-row;
}
.content-wrap { 
  background: #C9CCC8;
}
aside {
  width: 300px;
  background: #EC5A45;
}
.content-wrap, aside {  
  display: table-cell;
  padding: 30px;
}
footer {
  margin-top: 30px;
  padding: 30px 60px;
  background: #80C8A0;
}

С помощью медиазапроса сделаем все элементы блочными и установим для боковой колонки ширину 100%.

CSS:

@media (max-width: 860px) {
  .container {
    padding: 0 30px;
  }
  .container, .main-content, .content-wrap, aside {
    display: block;
  }
  .content-wrap {
    margin-bottom: 30px;
  }
  aside {
    width: 100%;
    box-sizing: border-box;
  }
}

Flexbox

В Flexbox-модели каждый дочерний элемент выстраивается в ряд (вдоль главной оси) колонками одинаковой высоты, равной высоте блока-контейнера. Зафиксируем ширину боковой колонки с помощью flex-basis: 300px; и добавим ей значение flex-shrink: 0;, которое предотвратит сужение.

HTML:

<header>Шапка страницы</header>
  <div class="container">
    <div class="main-content">
      <h1>Основной контент</h1>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</p>
    </div>
    <aside>
      <h2>Боковая колонка</h2>
      <p>Nullam ac imperdiet mi. In efficitur iaculis erat id mattis...</p>
    </aside>
  </div>
<footer>Подвал страницы</footer>
CSS:
body {
  margin: 0;
  background: #FAF2D6;
  color: #302E2D;
}
header {
  padding: 30px 60px;
  background: #80C8A0;
}
.container {
  padding: 30px;
}
.main-content {
  margin-right: 30px;
  background: #C9CCC8;
  padding: 30px;
}
aside {
  background: #EC5A45;
  padding: 30px;
  flex-basis: 300px;
  flex-shrink: 0;
}
footer {
  padding: 30px 60px;
  background: #80C8A0;
}

Укажем медиазапрос, в котором флекс-модель будет применяться к элементам для ширины области просмотра от 860px.

@media (min-width: 860px) {
  .container {
    display: flex;
  }
}
@media (max-width: 859px) {
  .main-content {
    margin: 0 0 30px 0;
  }
}

Плагин Jquery matchHeight

Самый простой способ, который будет работать во всех современных браузерах и IE8+. Скачать плагин можно со страницыразработчика. Эта библиотека позволяет устанавливать одинаковую высоту как в одном ряду, так и во всех рядах одновременно. Для всех колонок задаём одинаковый класс (в данном примере item), который будет использоваться при активации плагина:

JavaScript:

jQuery(document).ready(function($) {
  $('.item').matchHeight();
});
HTML:
<header>Шапка страницы</header>
  <div class="container">
    <div class="item main">
      <h1>Основной контент</h1>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</p>
    </div>
    <aside class="item">
      <h2>Боковая колонка</h2>
      <p>Nullam ac imperdiet mi. In efficitur iaculis erat id mattis...</p>
    </aside>
  </div>
<footer>Подвал страницы</footer>
CSS:
*{box-sizing:border-box}
body {
  margin: 0;
  background: #FAF2D6;
  color: #302E2D;
}
header {
  padding: 30px 60px;
  background: #80C8A0;
}
.container {
  padding: 30px;
}
.container:after {
  content:"";
  display: table;
  clear: both;
}
.item {
  background: #EC5A45;
  padding: 30px;
}
.main {
  float: left;
  width: calc(100% - 330px);
}
aside {
  width: 300px;
  float: right;
}
footer {
  padding: 30px 60px;
  background: #80C8A0;
}

С помощью медиазапроса отменим обтекание колонок и укажем определение высоты колонок в зависимости от высоты их содержимого.

CSS:

@media (max-width: 860px) {
  .item {
    height: auto !important;
    float: none;
    width: 100%;
  } 
  .main {
    margin-bottom: 30px;
  }
}

jQuery функция css()

В данном примере определяется высота каждой колонки и проверяется условие, в результате чего колонки принимают одинаковую (наибольшую) высоту.

HTML:

<header>Шапка страницы</header>
<div class="container">
  <div class="main">
    <h1>Основной контент</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</p>
  </div>
  <aside>
    <h2>Боковая колонка</h2>
    <p>Nullam ac imperdiet mi. In efficitur iaculis erat id mattis...</p>
  </aside>
</div>
<footer>Подвал страницы</footer>
CSS:
*{box-sizing:border-box}
body {
  margin: 0;
  background: #FAF2D6;
  color: #302E2D;
}
header {
  padding: 30px 60px;
  background: #80C8A0;
}
.container {
  padding: 30px;
}
.container:after {
  content:"";
  display: table;
  clear: both;
}
.main {
  float: left;
  width: calc(100% - 330px);
  background: #EC5A45;
  padding: 30px;
}
aside {
  width: 300px;
  float: right;
  background: #EC5A45; 
  padding: 30px;
}
footer {
  padding: 30px 60px;
  background: #80C8A0;
}

С помощью медиазапроса отменим обтекание колонок и укажем определение минимальной высоты колонок в зависимости от высоты их содержимого.

CSS:

@media (max-width: 860px) {
  .main, aside {
   min-height: auto !important;
   float: none;
   width: 100%;
 } 
  .main {
   margin-bottom: 30px;
 }
}
Javascript:
jQuery(document).ready(function($) {
  var content = $('.main');
  var sidebar = $('aside');
  var getContentHeight = content.outerHeight();
  var getSidebarHeight = sidebar.outerHeight();
  if (getContentHeight > getSidebarHeight) {
    sidebar.css('min-height', getContentHeight);
    }
  if (getSidebarHeight > getContentHeight) {
    content.css('min-height', getSidebarHeight);
    }
});

Пример для Bootstrap

При использовании сетки разметки Bootstrap часто возникает необходимость сделать блоки, которые находятся рядом, одинаковой высоты. Для решения этой задачи подойдет модуль Flexbox из CSS3

Рассмотрим работу с размером элементов. Для того, чтобы активировать Flexbox назначим свойство display: flex; display: -webkit-flex;. Чтобы уместить элементы на одной строке и сделать их одинаковой высоты, назначим свойство -webkit-flex-wrap: wrap; -ms-flex-wrap: wrap; flex-wrap: wrap;.

CSS:

.row-flex{
display: flex; 
display: -webkit-flex; 
-webkit-flex-wrap: wrap; 
-ms-flex-wrap: wrap; 
flex-wrap: wrap; 
}
.thumb{
border: 1px solid #ccc; 
border-radius: 4px; 
background-color: #ecf3e6; 
height: calc(100% - 15px); 
padding:10px; 
}
HTML:
<div class="row row-flex">
  <div class="col-xs-6">
    <div class="thumb">
      <h4>Блок 1</h4>
      <p>Текст блока 1</p>
    </div>
  </div>
  <div class="col-xs-6">
    <div class="thumb" >
      <h4>Блок 2</h4>
      <p>Текст блока 2.</p>
      <p>Дополнительный текст блока 2, чтобы увеличить высоту блока.</p>
    </div>
  </div>
</div>

Источник материала https://html5book.ru/kak-sdelat-kolonki-odinakovoy-vysoti/

03:37
43