Тег center в HTML: чем заменить и почему он устарел

Тег <center> (от английского center, «центр») когда-то был главным способом выровнять содержимое по центру: текст, картинки, таблицы и целые блоки. Он парный, закрывающий тег </center> обязателен, а собственных атрибутов у него нет. Сегодня стандарт HTML запрещает его использовать, а центрирование выполняют средства CSS. Браузеры тег пока понимают, поэтому он встречается в старых сайтах и шаблонах писем.

HTML
<center><p>Этот абзац выровнен по центру.</p></center>

Что делает тег center в HTML

Тег center выравнивает по горизонтали всё, что находится внутри него: строки текста, картинки, таблицы и блоки с заданной шириной. Для браузера это обычный блок на всю ширину родителя, как у <div>, только с выравниванием по центру.

Центрирование наследуют вложенные абзацы, заголовки и списки, поэтому одним тегом можно собрать по центру целый фрагмент страницы. Блок без заданной ширины и так занимает всю строку, сдвигать в нём нечего, а блок шириной 120 пикселей встаёт в середину. Смыслового значения у тега нет: для вспомогательных технологий это такая же обёртка, как div.

Пример: что центрирует тег center, а что оставляет слева div

Результат

Тег center сдвигает к середине и строку, и картинку, и таблицу, и блок шириной 120 пикселей. Такой же div оставляет всё у левого края.

Почему тег center устарел и что покажет валидатор

Тег пришёл из ранних браузеров Netscape, и спецификация HTML 3.2 включила его из-за широкого распространения (описание в HTML 3.2). В HTML 4.01 его объявили устаревшим и приравняли к записи <div align="center"> (описание в HTML 4.01).

Современный стандарт относит center к тегам, которые авторам использовать нельзя, и предлагает взять подходящие элементы или CSS (список устаревших возможностей WHATWG). Браузеры при этом продолжают его выводить ради старых страниц. Проверка кода сообщает об ошибке для каждого такого тега:

Сообщение проверки
Error: The “center” element is obsolete. Use CSS instead.

Если center находится внутри абзаца, к этой ошибке добавляется вторая, про лишний закрывающий тег p. Причина описана в разделе про то, чего тег не делает.

Чем заменить тег center: text-align, margin: 0 auto или Flexbox

Единой замены нет, способ зависит от того, что нужно центрировать. Текст и строчное содержимое выравнивает свойство text-align: center у родителя, блок с заданной шириной центрирует margin: 0 auto у самого блока, а группу элементов собирает по центру display: flex с justify-content: center.

HTML
<p class="line">Текст по центру</p>
<div class="box">Блок шириной 120px</div>
<div class="group">
  <span>Первый</span>
  <span>Второй</span>
</div>
CSS
.line { text-align: center; }
.box { width: 120px; margin: 0 auto; }
.group {
  display: flex;
  justify-content: center;
  gap: 8px;
}

Блок для такого приёма обычно делают тегом div, а таблицы разобраны на странице про тег table. Как работает сам text-align: center, разобрано в уроке курса «Что на самом деле центрирует text-align: center».

Пример: какой способ центрирует какое содержимое

Результат

Кнопки меняют содержимое сразу во всех четырёх рамках. Под рамкой написано, куда оно встало, а внизу собран итог.

В итоге видно главное. Свойство text-align: center у родителя не сдвигает ни таблицу, ни блок с шириной, margin: 0 auto не действует на текст и картинку, а блок без ширины в обычном потоке и так занимает всю строку: сдвинуть его можно, только сделав уже строки: через width: fit-content с margin: 0 auto или через Flexbox у родителя. Тег center справлялся с текстом, картинкой, таблицей и блоком с шириной сразу, поэтому замена одним свойством не всегда равна старому поведению.

Атрибут align=center вместо тега center: p, div, img, table

Те же задачи решал атрибут align у других старых тегов, например <p align="center">. Проверка кода отмечает align на p, div, h2, img и table предупреждением, что атрибут устарел, и советует CSS.

Действует он по-разному. На абзаце, div и заголовке выравнивает текст, на таблице двигает весь блок таблицы, а у картинки (тег img) значение center по горизонтали ничего не меняет и задаёт только положение рядом с текстом. Браузер учитывает align и у самого center, хотя в стандарте такого атрибута нет: со значением right текст уходит вправо.

Пример: как атрибут align ведёт себя на разных тегах

Результат

Первый ряд кнопок выбирает тег, второй задаёт значение align. Под рамкой написано, где оказалось содержимое: у картинки значение center меняет только вертикальное положение рядом с текстом.

Безопасно заменяется только выравнивание текста: align превращается в text-align. Таблицу центрирует margin: 0 auto, а картинку, которая считается строчным элементом, центрирует text-align: center у родителя. Вертикальное положение картинки рядом с текстом задаёт vertical-align: middle.

Чего тег center не делает: центр по высоте, Flexbox, внутри p

Тег center работает только по горизонтали и только пока остаётся обычным блоком. По высоте он ничего не центрирует, свойство display: flex отключает его выравнивание, а внутри абзаца тега p он не может находиться: браузер закрывает абзац раньше.

Пример: три случая, где center не помогает

Результат

Вкладки переключают три случая: высота, Flexbox и вложенность в p. Результат записан в строке под рамкой, а в третьей вкладке видна разметка, которую собрал браузер.

Абзац p принимает только строчное содержимое, поэтому span и strong в нём остаются, а center и div браузер выносит наружу и создаёт лишний пустой абзац. Центр по высоте задаёт родитель: display: flex вместе с align-items: center.

Как убрать тег center со страницы и не потерять центрирование

Заменять center нужно так, чтобы сохранилось всё, что он делал. Самый надёжный вариант: превратить тег в div с классом и описать центрирование в CSS.

HTML
<div class="center">
  <h3>Заголовок</h3>
  <p>Текст абзаца</p>
  <table>
    <tr><td>A</td><td>B</td></tr>
  </table>
</div>
CSS
.center { text-align: center; }
.center > table,
.center > div {
  margin-left: auto;
  margin-right: auto;
}

Такая запись повторяет center для прямых потомков: текста, картинок, таблиц и блоков с шириной. Вложенный блок внутри блока она не охватывает, ему нужен собственный margin: 0 auto. Если просто удалить тег, всё сразу уйдёт к левому краю.

На странице с десятками таких тегов замену можно выполнить скриптом, но скрипт меняет только страницу в браузере посетителя, а исходный код остаётся прежним, поэтому для постоянного решения нужно править сам HTML.

JavaScript
document.querySelectorAll('center').forEach(function (old) {
  var box = document.createElement('div');
  box.className = 'center';
  box.append(...old.childNodes);
  old.replaceWith(box);
});

Пример: что происходит с центрированием при разных заменах

Результат

Вторая кнопка убирает тег без замены, и всё уходит влево. Правило text-align возвращает заголовок и абзац, а таблица встаёт на место только после добавления margin.

Частые ошибки с тегом center

Чаще всего центрирование не получается там, где тег заменили одним свойством CSS.

ОшибкаЧто получаетсяКак исправить
Блок с шириной центрируют через text-align: center у родителяТекст внутри блока выровнен, а сам блок остаётся у левого краяЗадать блоку margin: 0 auto
Оборачивают таблицу в div с классом и text-align: centerТаблица остаётся слеваДобавить таблице margin-left: auto и margin-right: auto
Прописывают margin: 0 auto блоку без шириныНичего не меняется, блок занимает всю строкуЗадать блоку width или max-width
Записывают center внутрь абзаца <p>Браузер закрывает абзац раньше, получается лишний пустой p, а проверка кода сообщает о лишнем </p>Вынести center из абзаца или выровнять сам абзац через text-align: center
Ждут центрирования по высотеСодержимое остаётся у верхнего краяЗадать родителю display: flex и align-items: center
Пишут <img align="center">, чтобы сдвинуть картинку по горизонталиКартинка остаётся слева, меняется только положение рядом с текстомЗадать родителю text-align: center
Не пишут закрывающий </center>Центрирование действует до конца родителяЗакрыть тег или заменить его на div с классом
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×