В 2018 году многие браузеры поддерживают Flexbox и Grid , которые являются очень мощными режимами отображения CSS, которые перекрывают классические методы, такие как в качестве искусственных столбцов или табличных дисплеев (которые рассматриваются позже в этом ответе).
Чтобы реализовать это с помощью сетки, достаточно указать display: grid и grid-template-columns на контейнере. grid-template-columns зависит от количества имеющихся у вас столбцов, в этом примере я буду использовать 3 столбца, поэтому свойство будет выглядеть так: grid- template-columns: auto auto auto , что в основном означает, что каждый из столбцов будет иметь автоматическую ширину.
Полный рабочий пример с сеткой:
html, body {
padding: 0;
margin: 0;
}
.grid-container {
display: grid;
grid-template-columns: auto auto auto;
width: 100%;
}
.grid-item {
padding: 20px;
}
.a {
background-color: DarkTurquoise;
}
.b {
background-color: LightSalmon;
}
.c {
background-color: LightSteelBlue;
}
<!DOCTYPE html>
<html>
<head>
<title>Three Columns with Grid</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div class="grid-container">
<div class="grid-item a">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas id sapien auctor, faucibus felis et, commodo magna. Sed eu molestie nibh, ac tincidunt turpis. Pellentesque accumsan nunc non arcu tincidunt auctor eget ut magna. In vel est egestas, ultricies dui a, gravida diam. Vivamus tempor facilisis lectus nec porta.</p>
</div>
<div class="grid-item b">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas id sapien auctor, faucibus felis et, commodo magna. Sed eu molestie nibh, ac tincidunt turpis. Pellentesque accumsan nunc non arcu tincidunt auctor eget ut magna. In vel est egestas, ultricies dui a, gravida diam. Vivamus tempor facilisis lectus nec porta. Donec commodo elit mattis, bibendum turpis eu, malesuada nunc. Vestibulum sit amet dui tincidunt, mattis nisl et, tincidunt eros. Vivamus eu ultrices sapien. Integer leo arcu, lobortis sed tellus in, euismod ultricies massa. Mauris gravida quis ligula nec dignissim. Proin elementum mattis fringilla. Donec id malesuada orci, eu aliquam ipsum. Vestibulum fermentum elementum egestas. Quisque sit amet tempor mi.</p>
</div>
<div class="grid-item c">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas id sapien auctor, faucibus felis et, commodo magna. Sed eu molestie nibh, ac tincidunt turpis.</p>
</div>
</div>
</body>
</html>
Другим способом было бы использовать Flexbox, указав display: flex в контейнере столбцов и присвоив столбцам соответствующую ширину. В примере, который я буду использовать, который состоит из 3 столбцов, вам нужно разделить 100% на 3, так что это 33,3333% (достаточно близко, кого волнует 0,00003333 ... которого все равно не видно).
Полный рабочий пример с использованием Flexbox:
html, body {
padding: 0;
margin: 0;
}
.flex-container {
display: flex;
width: 100%;
}
.flex-column {
padding: 20px;
width: 33.3333%;
}
.a {
background-color: DarkTurquoise;
}
.b {
background-color: LightSalmon;
}
.c {
background-color: LightSteelBlue;
}
<!DOCTYPE html>
<html>
<head>
<title>Three Columns with Flexbox</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div class="flex-container">
<div class="flex-column a">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas id sapien auctor, faucibus felis et, commodo magna. Sed eu molestie nibh, ac tincidunt turpis. Pellentesque accumsan nunc non arcu tincidunt auctor eget ut magna. In vel est egestas, ultricies dui a, gravida diam. Vivamus tempor facilisis lectus nec porta.</p>
</div>
<div class="flex-column b">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas id sapien auctor, faucibus felis et, commodo magna. Sed eu molestie nibh, ac tincidunt turpis. Pellentesque accumsan nunc non arcu tincidunt auctor eget ut magna. In vel est egestas, ultricies dui a, gravida diam. Vivamus tempor facilisis lectus nec porta. Donec commodo elit mattis, bibendum turpis eu, malesuada nunc. Vestibulum sit amet dui tincidunt, mattis nisl et, tincidunt eros. Vivamus eu ultrices sapien. Integer leo arcu, lobortis sed tellus in, euismod ultricies massa. Mauris gravida quis ligula nec dignissim. Proin elementum mattis fringilla. Donec id malesuada orci, eu aliquam ipsum. Vestibulum fermentum elementum egestas. Quisque sit amet tempor mi.</p>
</div>
<div class="flex-column c">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas id sapien auctor, faucibus felis et, commodo magna. Sed eu molestie nibh, ac tincidunt turpis.</p>
</div>
</div>
</body>
</html>
Flexbox и Grid поддерживаются всеми основными браузерами с 2017/2018, факт также подтверждается caniuse.com: Могу ли я использовать сетку , Могу ли я использовать flex .
Существует также ряд классических решений, использовавшихся до появления Flexbox и Grid, таких как Метод OneTrueLayout , Метод искусственных столбцов , Техника табличного отображения CSS , а также есть Техника наложения .
Я не рекомендую использовать эти методы, поскольку они носят хакерский характер и, на мой взгляд, не так уж и элегантны, но хорошо знать их по академическим причинам.
Решением для столбцов одинаковой высоты является Техника табличного отображения CSS , которая означает использование дисплея : таблица ,
Работает для Firefox 2 + , Safari 3 + , Opera 9 + и IE8 .
Код для табличного дисплея CSS :
#container {
display: table;
background-color: #CCC;
margin: 0 auto;
}
.row {
display: table-row;
}
.col {
display: table-cell;
}
#col1 {
background-color: #0CC;
width: 200px;
}
#col2 {
background-color: #9F9;
width: 300px;
}
#col3 {
background-color: #699;
width: 200px;
}
<div id="container">
<div id="rowWraper" class="row">
<div id="col1" class="col">
Column 1<br />Lorem ipsum<br />ipsum lorem
</div>
<div id="col2" class="col">
Column 2<br />Eco cologna duo est!
</div>
<div id="col3" class="col">
Column 3
</div>
</div>
</div>
Даже если есть проблема с автоматическим расширением ширины ячейки таблицы, ее можно легко решить, вставив другой div с ячейкой таблицы и присвоив ей фиксированную ширину. В любом случае, чрезмерное расширение ширины происходит в случае использования чрезвычайно длинных слов (которые, я сомневаюсь, кто-нибудь использовал бы, скажем, 600px длинное слово) или некоторого div, ширина которого больше, чем в таблице ширина ячейки.
Метод Faux Column является наиболее популярным классическим решением этой проблемы, но у него есть некоторые недостатки, такие как, вы должны изменить размер фонового мозаичного изображения, если вы хотите изменить размер колонны и это тоже не изящное решение.
Метод OneTrueLayout состоит из создания отступа на очень большой высоте и его обрезания путем приведения реальной граничной позиции в «нормальную логическую позицию» путем применения отрицательное значение margin-bottom того же огромного значения и скрытие экстента, созданного заполнением с переполнением: скрыто , примененное к обертке содержимого , Упрощенный пример будет:
Рабочий пример:
.wraper {
overflow: hidden; /* This is important */
}
.floatLeft {
float: left;
}
.block {
padding-left: 20px;
padding-right: 20px;
padding-bottom: 30000px; /* This is important */
margin-bottom: -30000px; /* This is important */
width: 33.3333%;
box-sizing: border-box; /* This is so that the padding right and left does not affect the width */
}
.a {
background-color: DarkTurquoise;
}
.b {
background-color: LightSalmon;
}
.c {
background-color: LightSteelBlue;
}
<html>
<head>
<title>OneTrueLayout</title>
</head>
<body>
<div class="wraper">
<div class="block floatLeft a">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras malesuada ipsum pretium tellus condimentum aliquam. Donec eget tempor mi, a consequat enim. Mauris a massa id nisl sagittis iaculis.</p>
</div>
<div class="block floatLeft b">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras malesuada ipsum pretium tellus condimentum aliquam. Donec eget tempor mi, a consequat enim. Mauris a massa id nisl sagittis iaculis. Duis mattis diam vitae tellus ornare, nec vehicula elit luctus. In auctor urna ac ante bibendum, a gravida nunc hendrerit. Praesent sed pellentesque lorem. Nam neque ante, egestas ut felis vel, faucibus tincidunt risus. Maecenas egestas diam massa, id rutrum metus lobortis non. Sed quis tellus sed nulla efficitur pharetra. Fusce semper sapien neque. Donec egestas dolor magna, ut efficitur purus porttitor at. Mauris cursus, leo ac porta consectetur, eros quam aliquet erat, condimentum luctus sapien tellus vel ante. Vivamus vestibulum id lacus vel tristique.</p>
</div>
<div class="block floatLeft c">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras malesuada ipsum pretium tellus condimentum aliquam. Donec eget tempor mi, a consequat enim. Mauris a massa id nisl sagittis iaculis. Duis mattis diam vitae tellus ornare, nec vehicula elit luctus. In auctor urna ac ante bibendum, a gravida nunc hendrerit.</p>
</div>
</div>
</body>
</html>
Техника наслаивания должна быть очень аккуратным решением, которое включает в себя абсолютное позиционирование div'ов внутри основного относительного позиционируемого упаковщика div. В основном он состоит из нескольких дочерних элементов и основного элемента. Основной div имеет обязательное положение : относительно к его коллекции атрибутов css. Все дети этого div обязательно позиция: абсолютная . Дети должны иметь верх и низ , установленный на 0 и влево-вправо Размеры установлены для размещения столбцов друг с другом. Например, если у нас есть два столбца, один из которых имеет ширину 100px , а другой - 200px , учитывая, что нам нужно 100px в левой части и 200px с правой стороны в левой колонке должно быть {left: 0; справа: 200px} и правый столбец {left: 100px; справа: 0;}
По моему мнению, невыполненная 100% высота в контейнере автоматической высоты является серьезным недостатком, и W3C следует рассмотреть возможность пересмотра этого атрибута (который с 2018 года можно решить с помощью Flexbox и Grid).
Другие ресурсы: ссылка1 , ссылка2 , ссылка3 , ссылка4 , ссылка5 (важно)