Верстка заголовка с горизонтальной линией слева и справа от текста

Время от времени возникает необходимость сверстать необычный заголовок, в котором слева и/или справа от текста проходит горизонтальная линия, занимающая все свободное пространство.

Выглядит это следующим образом (живой пример):

Заголовок с выравниванием слева
Заголовок с выравниванием по центру
Заголовок с выравниванием справа

Раньше для решения данной задачи я бы задействовал два тега: первому задал бы верхний бордюр, а второй сместил бы чуть вверх, задав ему белый фон и внутренний отступ слева и справа.

Однако, эту задачу можно решить и другим, более красивым способом – использовав всего один тег. Кроме того, данный способ выручает в том случае, когда нет возможности вставить в исходный код второй тег.

Как несложно догадаться, для добавления линий будут задействованы псевдоэлементы :before и :after.

Вот CSS-код с комментариями для основных свойств, решающих поставленную задачу:

.title {
	/* чтобы линии не выходили за ширину блока заголовка */
	overflow: hidden;
}
.title:before,
.title:after {
	content: '';

	/* делаем линию строчно-блочной */
	display: inline-block;

	/* выравниваем вертикально по середине */
	vertical-align: middle;

	/* не позволяем ширине превысить 100% (будет добавлен бордюр) */
	box-sizing: border-box;

	/* установка ширины в 100% делает линию равной ширине тега заголовка
	** благодаря этому линия заполнит все свободное пространство
	** слева и справа от текста
	*/
	width: 100%;
	height: 3px;
	background: #6CBD83;

	/* добавляем к линии левый и правый бордюр цветом основного фона заголовка
	** благодаря этому создается нужный отступ между линиями и текстом
	*/
	border: solid #FFF;
	border-width: 0 10px;
}
.title:before {
	/* смещаем левую линию влево отрицательным отступом, равным 100% ширины
	** благодаря этому линия встает слева от текста
	*/
	margin-left: -100%;
}
.title:after {
	/* смещаем правую линию вправо отрицательным отступом, равным 100% ширины
	** благодаря этому линия встает справа от текста
	*/
	margin-right: -100%;
}

Вот таким хитрым кодом это и делается.

У меня есть еще один аналогичный вариант решения данной задачи – через абсолютное позиционирование псевдоэлементов :before и :after. Однако, он оказался непригодным к использованию из-за очередного бага в браузере Internet Explorer (даже в последних версиях).

Комментарии (35)

  1. 10 января 2016 г. в 13:37

    А если внутри h1 поставить span и ему дать background-color: #fff; position: relative; а h1:before просто выровнять по вертикали и на всю ширину, получится тот же эффект. Или же нежелательно ставть внутри заголовка span?

    1. 11 января 2016 г. в 10:20 / ответ на коммент Dmondma

      Решать вам. Не вижу смысла плодить теги.

      1. 13 января 2016 г. в 21:25 / ответ на коммент Dimox

        зато css-а меньше)

  2. 16 февраля 2016 г. в 08:45

    В белом цвете шикарно смотрится.

  3. Александр
    22 марта 2016 г. в 10:15

    Если заголовок будет состоять из нескольких строк (например если разбить тегом br), то линии будут показываться не корректно.

    1. Volkano
      20 апреля 2016 г. в 13:45 / ответ на коммент Александр

      Да и без br может быть просто длинный заголовок и/или маленький экран. Скриншот – http://joxi.ru/4Ak3yLeT5EZKAq

  4. Max
    31 марта 2016 г. в 11:46

    Благодарю от души! Чудесно работает :)

  5. MakeUpMan
    13 июля 2016 г. в 14:12

    Спасибо выручили, быстро и самое главное просто! работает как часики

  6. Ant
    10 октября 2016 г. в 22:27

    Спасибо, отличное решение

  7. dzmitry1985
    6 ноября 2016 г. в 22:22

    Классная статья.
    Да и сайт классный! Особенно дизайн нравится. Очень симпатично выглядит

  8. asdasd
    9 ноября 2016 г. в 17:33

    не понимаю зачем нужны

    box-sizing: border-box;
    border: solid #FFF;
    border-width: 0 10px;
    

    Из комментариев к коду, понял что это создаёт отступы от текста до линии, но я сделал таким способом.

    		.content p::before {
    			margin-left: -100%;
    			margin-right: 20px;
    		}
    		.content p::after {
    			margin-right: -100%;
    			margin-left: 20px;
    		}
    

    В чём разница подходов ? Какой метод более приемлем в обращении ?

    1. 9 ноября 2016 г. в 19:20 / ответ на коммент asdasd

      Без разницы. Какой больше нравится, тот и использовать.

    2. Wile E
      30 сентября 2018 г. в 12:50 / ответ на коммент asdasd

      Как по мне Ваш вариант лучше, так как если бэкграундом указана картинка, то бордер выделяется на ее фоне

  9. Андрей
    7 декабря 2016 г. в 08:42

    крутое решение! спасибо

  10. 14 декабря 2016 г. в 10:18

    Здравствуйте. У меня при использовании стилей заголовок отображается “приклеенным” к левой стороне (сразу текст и правая линия до конца блока), левый отрезок появляется лишь немного при исключении из кода box-sizing. В чем может быть причина?

  11. Екатерина
    3 апреля 2017 г. в 16:19

    Спасибо, отличное решение.

  12. 11 июля 2017 г. в 15:52

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

  13. 7 октября 2017 г. в 00:18

    Спасибо большое за полезную статью. Очень помогла.

  14. Ярослав
    3 января 2018 г. в 15:18

    Здравствуйте, я не понимаю как сделать, чтобы текст оказался посередине (пример 2)

    1. 3 января 2018 г. в 16:32 / ответ на коммент Ярослав

      Добавьте text-align: center; для элемента.

  15. 27 мая 2018 г. в 11:16

    Dimox, а можешь сделать раздвижку типа [текст]….[текст] – чтобы там где точечки раздвигалось? Как-то максимально компактно, чтобы не было лишней разметки.

  16. 27 мая 2018 г. в 19:23

    Спасибо! Очень помогла статья.

  17. Kurt
    26 июня 2018 г. в 12:30

    добрый день. как сделать так же, только чтобы линия была вертикальной?

  18. 10 октября 2020 г. в 18:04

    Привет. Статья пригодилась. Сделал нечто подобное.

  19. Илья
    29 ноября 2020 г. в 18:01

    а как сделать чтобы она была адаптивной?

  20. Алексей
    28 мая 2022 г. в 20:08

    Dimox, огромное тебе спасибо! Это очень-очень помогло!

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код