# Все значения свойства "display"
Свойство `display` имеет много разных значений. Обычно, используются только три из них: `none`, `inline` и `block`, потому что когда-то браузеры другие не поддерживали.
Но, после прихода IE7 и, особенно, IE8+, стало возможным использовать и другие значения тоже. Рассмотрим здесь весь список.
## Значение none
Самое простое значение. Элемент не показывается, вообще. Как будто его и нет.
```html
Невидимый div (
Я - невидим!
) Стоит внутри скобок
```
## Значение block
- **Блочные элементы располагаются один над другим, вертикально** (если нет особых свойств позиционирования, например `float`).
- **Блок стремится расшириться на всю доступную ширину. Можно указать ширину и высоту явно.**
Это значение `display` многие элементы имеют по умолчанию: `DIV`, заголовок, параграф.
```html
```
Блоки прилегают друг к другу вплотную, если у них нет `margin`.
## Значение inline
- **Элементы располагаются на той же строке, последовательно.**
- **Ширина и высота элемента определяются по содержимому. Поменять их нельзя.**
Например, инлайновые элементы по умолчанию: `SPAN`, ссылка.
```html
Ширина
Игнорируется
```
Если вы присмотритесь внимательно к примеру выше, то увидите, что между внутренними `SPAN` и `A` есть пробел. Это потому, что он есть в HTML.
Если расположить элементы вплотную -- его не будет:
```html
БезПробела
```
Содержимое инлайн-элемента может переноситься на другую строку.
При этом каждая строка в смысле отображения является отдельным прямоугольником ("line box"). **Так что инлайн-элемент состоит из объединения прямоугольников, но в целом, в отличие от блока, прямоугольником не является.**
Например:
```html
...
Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля
Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля
Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля Ля
...
```
**Если инлайн-элемент граничит с блоком, то между ними обязательно будет перенос строки:**
```html
```
## Значение inline-block
Это значение -- означает элемент, который продолжает находиться в строке (`inline`), но при этом может иметь важные свойства блока.
Как и инлайн-элемент:
- **Располагается в строке.**
- **Размер устанавливается по содержимому.**
Во всём остальном -- это блок, то есть:
- **Элемент всегда прямоугольный.**
- **Работают свойства `width/height`.**
Это значение `display` используют, чтобы отобразить в одну строку блочные элементы, в том числе разных размеров.
Например:
```html
- Инлайн Блок
3 строки
высота/ширина явно не заданы
- Инлайн
Блок 100x100
- Инлайн
Блок 60x60
- Инлайн
Блок 100x60
- Инлайн
Блок 60x100
```
Свойство `vertical-align` позволяет выровнять такие элементы внутри внешнего блока:
```html
- Инлайн Блок
3 строки
высота/ширина явно не заданы
- Инлайн
Блок 100x100
- Инлайн
Блок 60x60
- Инлайн
Блок 100x60
- Инлайн
Блок 60x100
```
Как и в случае с инлайн-элементами, пробелы между блоками появляются из-за пробелов в HTML. Если элементы списка идут вплотную, например, генерируются в JavaScript -- их не будет.
**IE7 допускает это значение только для элементов, которые по умолчанию `inline`.**
## Значения table-*
Современные браузеры (не IE6,7) позволяют описывать таблицу любыми элементами, если поставить им соответствующие значения `display`.
Для таблицы целиком `table`, для строки -- `table-row`, для ячейки -- `table-cell` и т.д.
Пример использования:
```html
```
Важно то, что это действительно полноценная таблица. Используются табличные алгоритмы вычисления ширины и высоты элемента, [описанные в стандарте](http://www.w3.org/TR/CSS2/tables.html#width-layout).
**Это хорошо для семантической вёрстки и позволяет избавиться от лишних тегов.**
С точки зрения современного CSS, обычные `TABLE`, `TR`, `TD` и т.д. -- это просто элементы с предопределёнными значениями `display`:
```css
table { display: table }
tr { display: table-row }
thead { display: table-header-group }
tbody { display: table-row-group }
tfoot { display: table-footer-group }
col { display: table-column }
colgroup { display: table-column-group }
td, th { display: table-cell }
caption { display: table-caption }
```
Очень подробно об алгоритмах вычисления размеров и отображении таблиц рассказывает стандарт [CSS 2.1 - Tables](http://www.w3.org/TR/CSS2/tables.html).
### Вертикальное центрирование с table-cell
Внутри ячеек свойство [vertical-align](http://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align) выравнивает содержимое по вертикали.
Это можно использовать для центрирования:
```html
Элемент
С неизвестной
Высотой
```
CSS не требует, чтобы вокруг `table-cell` была структура таблицы: `table-row` и т.п. Может быть просто такой одинокий `DIV`, это допустимо.
При этом он ведёт себя как ячейка `TD`, то есть подстраивается под размер содержимого и умеет вертикально центрировать его при помощи `vertical-align`.
Значение `display: table-cell` поддерживается во всех браузерах, кроме IE7-. В IE6,7 можно использовать для центрирования CSS-выражения или реальную таблицу.
## Значения list-item и run-in
У свойства `display` есть и другие значения. Они используются реже, поэтому посмотрим на них кратко:
- `list-item`
- Этот display по умолчанию используется для элементов списка. Он добавляет к блоку содержимым ещё и блок с номером(значком) списка, который стилизуется стандартными списочными свойствами:
```html
Пункт 1
```
- `run-in`
- Если после `run-in` идёт `block`, то `run-in` становится его первым инлайн-элементом, то есть отображается в начале `block`.
Если ваш браузер поддерживает это значение,** то примере ниже `h3`, благодаря `display:run-in`, окажется визуально внутри `div`:
```html
Про пчёл.
Пчёлы - отличные создания, они делают мёд.
```
Если же вы видите две строки, то ваш браузер НЕ поддерживает `run-in`.
Вот, для примера, правильный вариант отображения `run-in`, оформленный другим кодом:
```html
Про пчёл.
Пчёлы - отличные создания, они делают мёд.
```
Если этот вариант отличается от того, что вы видите выше -- ваш браузер не поддерживает `run-in`. На момент написания этой статьи только IE поддерживал `display:run-in`.