- text-align
- Синтаксис
- Значения
- Центрирование горизонтальное и вертикальное
- Горизонтальное
- text-align
- margin: auto
- Вертикальное
- position:absolute + margin
- Одна строка: line-height
- Таблица с vertical-align
- Центрирование в строке с vertical-align
- Центрирование с vertical-align без таблиц
- Центрирование с использованием модели flexbox
- Итого
- Difference between Text-Align-Center and Margin-Auto
- Both properties are:
- The difference:
- By the way,
- Summary
text-align
text-align CSS-свойство описывает, как линейное содержимое, наподобие текста, выравнивается в блоке его родительского элемента. text-align не контролирует выравнивание элементов самого блока, но только их линейное содержимое.
Начальное значение | start , или неназванное значение, которое действует как left , если direction : ltr или как right , если direction : rtl , а если start не поддерживается браузером. |
---|---|
Применяется к | блочные контейнеры |
Наследуется | да |
Обработка значения | как указано, кроме значения match-parent , которое вычисляется вместо значения его родителя direction , а результаты в вычисленном значении left или right |
Animation type | discrete |
Синтаксис
text-align =
start | (en-US)
end | (en-US)
left | (en-US)
right | (en-US)
center | (en-US)
justify | (en-US)
match-parent | (en-US)
justify-all
text-align: left text-align: right text-align: center text-align: justify text-align: start text-align: end text-align: match-parent text-align: start end text-align: "." text-align: start "." text-align: "." end text-align: inherit
Значения
Подобно left если направление слева направо, и right если наоборот.
end Экспериментальная возможность
Подобно right если направление слева направо, и left если наоборот.
Линейное содержимое выравнивается по левому краю линейного блока.
Линейное содержимое выравнивается по правому краю линейного блока.
Линейное содержимое центрируется в линейном блоке.
Первое появление односимвольной строки — это элемент используемый для выравнивания. Ключевое слово, следует или предшествует, и определяет, как это выравнивается. Это позволяет выравнять численные значения с десятичной точкой, к примеру.
Текст выравнивается. Тексту следует выстраивать свои левые и правые границы по левым и правым границам содержимого параграфа.
match-parent Экспериментальная возможность
Наподобие inherit с различием, что значение start и end вычисляются в соответствии direction и заменяются соответствующим left или right значением.
Центрирование горизонтальное и вертикальное
В CSS есть всего несколько техник центрирования элементов. Если их знать, то большинство задач решаются просто.
Горизонтальное
text-align
Для центрирования инлайновых элементов – достаточно поставить родителю text-align: center :
Для центрирования блока это уже не подойдёт, свойство просто не подействует. Например:
margin: auto
Блок по горизонтали центрируется margin: auto :
В отличие от width/height , значение auto для margin само не появляется. Обычно margin равно конкретной величине для элемента, например 0 для DIV . Нужно поставить его явно.
Значение margin-left:auto/margin-right:auto заставляет браузер выделять под margin всё доступное сбоку пространство. А если и то и другое auto , то слева и справа будет одинаковый отступ, таким образом элемент окажется в середине. Детали вычислений описаны в разделе спецификации Calculating widths and margins.
Вертикальное
Для горизонтального центрирования всё просто. Вертикальное же изначально не было предусмотрено в спецификации CSS и по сей день вызывает ряд проблем.
Есть три основных решения.
position:absolute + margin
Центрируемый элемент позиционируем абсолютно и опускаем до середины по вертикали при помощи top:50% :
Это, конечно, не совсем центр. По центру находится верхняя граница. Нужно ещё приподнять элемент на половину своей высоты.
Высота центрируемого элемента должна быть известна. Родитель может иметь любую высоту.
Если мы знаем, что это ровно одна строка, то её высота равна line-height .
Приподнимем элемент на пол-высоты при помощи margin-top :
При стандартных настройках браузера высота строки line-height: 1.25 , если поделить на два 1.25em / 2 = 0.625em .
Конечно, высота может быть и другой, главное чтобы мы её знали заранее.
Можно аналогично центрировать и по горизонтали, если известен горизонтальный размер, при помощи left:50% и отрицательного margin-left .
Одна строка: line-height
Вертикально отцентрировать одну строку в элементе с известной высотой height можно, указав эту высоту в свойстве line-height :
Это работает, но лишь до тех пор, пока строка одна, а если содержимое вдруг переносится на другую строку, то начинает выглядеть довольно уродливо.
Таблица с vertical-align
У свойства vertical-align, которое управляет вертикальным расположением элемента, есть два режима работы.
В таблицах свойство vertical-align указывает расположение содержимого ячейки.
baseline Значение по умолчанию. middle , top , bottom Располагать содержимое посередине, вверху, внизу ячейки.
Например, ниже есть таблица со всеми 3-мя значениями:
table < border-collapse: collapse; >td top middle bottom
Обратим внимание, что в ячейке с vertical-align: middle содержимое находится по центру. Таким образом, можно обернуть нужный элемент в таблицу размера width:100%;height:100% с одной ячейкой, у которой указать vertical-align:middle , и он будет отцентрирован.
Но мы рассмотрим более красивый способ, который поддерживается во всех современных браузерах, и в IE8+. В них не обязательно делать таблицу, так как доступно значение display:table-cell . Для элемента с таким display используются те же алгоритмы вычисления ширины и центрирования, что и в TD . И, в том числе, работает vertical-align :
Этот способ замечателен тем, что он не требует знания высоты элементов.
Однако у него есть особенность. Вместе с vertical-align родительский блок получает табличный алгоритм вычисления ширины и начинает подстраиваться под содержимое. Это не всегда желательно.
Чтобы его растянуть, нужно указать width явно, например: 300px :
Можно и в процентах, но в примере выше они не сработают, потому что структура таблицы «сломана» – ячейка есть, а собственно таблицы-то нет.
Это можно починить, завернув «псевдоячейку» в элемент с display:table , которому и поставим ширину:
Если дополнительно нужно горизонтальное центрирование – оно обеспечивается другими средствами, например margin: 0 auto для блочных элементов или text-align:center на родителе – для других.
Центрирование в строке с vertical-align
Для инлайновых элементов ( display:inline/inline-block ), включая картинки, свойство vertical-align центрирует сам инлайн-элемент в окружающем его тексте.
В этом случае набор значений несколько другой:
Это можно использовать и для центрирования, если высота родителя известна, а центрируемого элемента – нет.
Допустим, высота внешнего элемента 120px . Укажем её в свойстве line-height :
Работает во всех браузерах и IE8+.
Свойство line-height наследуется, поэтому надо знать «правильную» высоту строки и переопределять её для inner .
Центрирование с vertical-align без таблиц
Если центрирование должно работать для любой высоты родителя и центрируемого элемента, то обычно используют таблицы или display:table-cell с vertical-align .
Если центрируются не-блочные элементы, например inline или inline-block , то vertical-align может решить задачу без всяких таблиц. Правда, понадобится вспомогательный элемент (можно через :before ).
.before < display: inline-block; height: 100%; vertical-align: middle; >.inner Центрированный
Элемент
- Перед центрируемым элементом помещается вспомогательный инлайн-блок before , занимающий всю возможную высоту.
- Центрируемый блок выровнен по его середине.
Для всех современных браузеров и IE8 можно добавить вспомогательный элемент через :before :
.outer:before < content: ''; display: inline-block; height: 100%; vertical-align: middle; >.inner < display: inline-block; vertical-align: middle; >/* добавим горизонтальное центрирование */ .outer Центрированный
Элемент
В пример выше добавлено также горизонтальное центрирование text-align: center . Но вы можете видеть, что на самом деле внутренний элемент не центрирован горизонтально, он немного сдвинут вправо.
Это происходит потому, что центрируется весь текст, а перед inner находится пробел, который занимает место.
- Убрать лишний пробел между div и началом inner , будет .
- Оставить пробел, но сделать отрицательный margin-left у inner , равный размеру пробела, чтобы inner сместился левее.
.outer:before < content: ''; display: inline-block; height: 100%; vertical-align: middle; >.inner < display: inline-block; vertical-align: middle; margin-left: -0.35em; >.outer Центрированный
Элемент
Центрирование с использованием модели flexbox
Данный метод поддерживается всеми современными браузерами.
Центрированный
Элемент
- Не требуется знания высоты центрируемого элемента.
- CSS чистый, короткий и не требует дополнительных элементов.
Итого
Обобщим решения, которые обсуждались в этой статье.
Для горизонтального центрирования:
- text-align: center – центрирует инлайн-элементы в блоке.
- margin: 0 auto – центрирует блок внутри родителя. У блока должна быть указана ширина.
Для вертикального центрирования одного блока внутри другого:
Если размер центрируемого элемента известен, а родителя – нет
Родителю position:relative , потомку position:absolute; top:50% и margin-top:- . Аналогично можно отцентрировать и по горизонтали.
Если нужно отцентрировать одну строку в блоке, высота которого известна
Поставить блоку line-height: . Нужны конкретные единицы высоты ( px , em …). Значение line-height:100% не будет работать, т.к. проценты берутся не от высоты блока, а от текущей line-height .
Высота родителя известна, а центрируемого элемента – нет.
Поставить line-height родителю во всю его высоту, а потомку поставить display:inline-block .
Высота обоих элементов неизвестна.
- Сделать элемент-родитель ячейкой таблицы при помощи display:table-cell (IE8) или реальной таблицы, и поставить ему vertical-align:middle . Отлично работает, но мы имеем дело с таблицей вместо обычного блока.
- Решение со вспомогательным элементом outer:before и инлайн-блоками. Вполне универсально и не создаёт таблицу.
- Решение с использованием flexbox.
Difference between Text-Align-Center and Margin-Auto
In CSS to center an element horizontally, you might think that Flex and Grid can solve your problem. BUT, text-align: center or margin: auto can also do the trick 🪄 Therefore, knowing the difference between text-align: center and margin: auto will help a lot, it’s also a bit tricky in CSS, let me explain their similarities:
Both properties are:
- used ONLY in block elements.
- used ONLY to specify horizontal alignment.
The difference:
- margin: auto used to center an HTML element.
- text-align: center used to center an element content.
By the way,
- HTML Element is everything from the start tag to the end tag including HTML tags.
- Element Content is everything between the tags.
It looks a bit overwhelming 😅, look at the picture.
#first-green-box background: green; text-align: center; >
- First green box we have a width of 100%, because by default a block element takes up the full width available of its parent, in our case, is the Body element, therefore, the element content, the text, will be centered horizontally within its container, opening and closing tag ( ).
If we centered the element content to the right, will get this result:
#first-green-box background: green; text-align: right; >
#second-green-box width: 500px; // new background: green; text-align: center; >
- Second green box is the same as the first, we are just showing and confirming that text-align: center depends on the width of its container, opening and closing tag, not on the Body element.
From it, we conclude that the text inside our
Tag will be centered horizontally within the width of opening and closing tag.
#third-green-box width: 500px; margin: auto; // new background: green; text-align: center; >
- Third box, if we added a specific width to our HTML element, and we want to center it within its parent horizontally, I Emphasize here we want to center an element horizontally the HTML Element, not the Element Content, not within its opening and closing tag. we want to center the HTML Element itself within another HTML Element.
In other words, make a block element in the center of another block element.
In this case, we will use the power of margin: auto , no Flex, no Grid only auto, auto, can solve our problem. Therefore, left and right margins will be split equally.
Notice if we remove text-align, the element content will return to the default value of text-align, left, and will have no effect on the HTML element, to be in the center.
#third-green-box width: 500px; margin: auto; background: green; >
We conclude that margin: auto has an effect on the HTML element, not on the element content, this is why when we apply margin: auto on HTML element that its full-width depends on Body element, will not work, nor will it have any effect.
Summary
In a nutshell, if you’re trying to center an element horizontally and it doesn’t work for you, ask yourself three things:
- Is this element an HTML element or Element Content?
- Does this element have a specific width or not?
- What is its parent?
To be honest with you, the key to this is if you understand the difference between HTML Element and Element Content, you’re good to go.
The full code for this image below is available on CodePen.