Как центрировать текст по вертикали с помощью большого значка с отличным шрифтом?

Допустим, у меня есть кнопка начальной загрузки с отличным шрифтом значком и текстом:

<div>
    <i class='icon icon-2x icon-camera'></i>
    hello world
</div>

Как сделать так, чтобы текст отображался вертикально по центру? Текст теперь выровнен по нижнему краю значка: http://jsfiddle.net/V7DLm/1/

РЕДАКТИРОВАТЬ: у меня есть возможное решение: http://jsfiddle.net/CLdeG/1/, но это кажется немного взломанным - вводится дополнительный тег p, используется вытягивание влево и display: table. Может кто подскажет способ попроще.


person Paul    schedule 26.06.2013    source источник
comment
Ты бог. Серьезно, я потратил на это 2 часа сегодня, ваше решение было НАИБОЛЕЕ самым чистым. Не нужно ничего жестко кодировать.   -  person Chuck    schedule 28.02.2018
comment
этот подход проще   -  person Raveen Beemsingh    schedule 27.05.2020


Ответы (14)


Мне просто нужно было сделать это самому, вам нужно сделать наоборот.

  • не играйте с выравниванием текста по вертикали
  • поиграйте с вертикальным выравниванием значка font-awesome
<div>
  <span class="icon icon-2x icon-camera" style=" vertical-align: middle;"></span>
  <span class="my-text">hello world</span>
</div>

Конечно, вы не могли использовать встроенные стили и настраивать их своим собственным классом css. Но это работает в режиме копирования и вставки.

См. Здесь: Вертикальное выравнивание текста и значка в кнопке

Однако, если бы это было на мое усмотрение, я бы не использовал icon-2x. И просто укажите размер шрифта самостоятельно, как показано ниже

<div class='my-fancy-container'>
    <span class='my-icon icon-file-text'></span>
    <span class='my-text'>Hello World</span>
</div>
.my-icon {
    vertical-align: middle;
    font-size: 40px;
}

.my-text {
    font-family: "Courier-new";
}

.my-fancy-container {
    border: 1px solid #ccc;
    border-radius: 6px;
    display: inline-block;
    margin: 60px;
    padding: 10px;
}

рабочий пример см. в JsFiddle

person andxyz    schedule 30.08.2013
comment
да, это лучшее решение, спасибо. По-прежнему, кажется, требуется высота строки, хотя jsfiddle.net/paulftw/F3KyK/41 - person Paul; 03.09.2013
comment
Я обновил ваш jsfiddle, чтобы узнать, как я это сделаю. Я использовал размер шрифта для значка вместо 2x. jsfiddle.net/3GMjp/1 - person andxyz; 05.09.2013
comment
В вашем первом фрагменте кода начальный тег ‹span› не соответствует конечному тегу ‹/i›. - person jzacharuk; 26.05.2015
comment
Не работает с некоторыми иконками. пример fa-angle-left - person steakchaser; 04.03.2017
comment
Важно понимать, что включение js-файлов fontawesome также может изменить внешний вид. Мой значок был слишком далеко вверху, я удалил включение js, чтобы посмотреть, что произойдет, и теперь он слишком далеко внизу -.- - person lucidbrot; 29.07.2018
comment
TDDR; поиграйте с вертикальным выравниванием значка font-awesome, ладно. - person Antoniossss; 07.01.2019
comment
Первая линия мне очень помогла. Хотя я не совсем понимаю, почему. +1 - person Mikkel; 07.10.2020

Я использую значки рядом с текстом в 99% случаев, поэтому я внес глобальные изменения:

.fa-2x {
  vertical-align: middle;
}

При необходимости добавьте к тому же определению 3x, 4x и т. Д.

person Rush Frisby    schedule 01.04.2015
comment
На мой взгляд, это должен быть принятый ответ, поскольку это, безусловно, самое простое решение, если я не упускаю что-то в исходном вопросе. Спасибо @rushonerok! Я не уверен, почему некоторые люди говорят не использовать vertical-align: middle; - возможно, мне здесь что-то не хватает. Пожалуйста, объясните, если да. - person Kendall; 11.02.2016
comment
@Kendall Roth Я думаю, когда люди говорят не использовать vertical-align: middle, они имеют в виду , если вы используете block elements. Если вы используете inline, inline-block или table-cell, у вас все должно быть хорошо. MDN: vertical-align - person rinogo; 30.10.2017
comment
Работает как шарм! Спасибо: D - person Mohammed A. Fadil; 10.10.2019
comment
Я обнаружил, что на значках Bootstrap 5 установка вертикального выравнивания элемента: before на 'baseline' дает трюк: i.bi:before {vertical-align: baseline; } - person Ryan Griggs; 19.05.2021

После рассмотрения всех предложенных вариантов самым чистым решением, похоже, является установка высоты строки и вертикального выравнивания всего:

См. Демонстрация Jsfiddle

CSS:

div {
    border: 1px solid #ccc;
    display: inline-block;
    height: 50px;
    margin: 60px;
    padding: 10px;
}
#text, #ico {
    line-height: 50px;
}

#ico {
    vertical-align: middle;
}
person Paul    schedule 03.09.2013
comment
Что делать, если ваш контейнер больше 50 пикселей? Тогда это не сработает ... У меня есть контент, который меняет размер, и внутри него должен быть центрированный значок ... Есть идеи по этому поводу? - person Slaven Tomac; 17.03.2016
comment
line-height необходим, если высота строки не совпадает с высотой родительского блока. Но это не повлияет. Этот ответ должен помочь повысить скорость реакции, stackoverflow.com/questions/19124255/ - person F.G; 06.07.2021

если что-то не совпадает, простое line-height: inherit; через CSS для определенных элементов i.fa, которые имеют проблемы с выравниванием, может достаточно просто решить эту задачу.

Вы также можете использовать глобальное решение, которое из-за немного более высокой специфичности CSS переопределит правило FontAwesome .fa, которое указывает line-height: 1, не требуя !important в свойстве:

i.fa {
  line-height: inherit;
}

Просто убедитесь, что указанное выше глобальное решение не вызывает никаких других проблем в местах, где вы также можете использовать значки FontAwesome.

person purefusion    schedule 17.03.2014

вариант flexbox - отличный шрифт 4.7 и ниже

Размещенный URL-адрес FA 4.x - https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css.

div {
  display: inline-flex; /* make element size relative to content */
  align-items: center; /* vertical alignment of items */
  line-height: 40px; /* vertically size by height, line-height or padding */
  padding: 0px 10px; /* horizontal with padding-l/r */
  border: 1px solid #ccc;
}

/* unnecessary styling below, ignore */
body {display: flex;justify-content: center;align-items: center;height: 100vh;}div i {margin-right: 10px;}div {background-color: hsla(0, 0%, 87%, 0.5);}div:hover {background-color: hsla(34, 100%, 52%, 0.5);cursor: pointer;}
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>
<div>
    <i class='fa fa-2x fa-camera'></i>
    hello world
</div>

скрипка

http://jsfiddle.net/Hastig/V7DLm/180/


использование гибкости и font awesome 5

Размещенный URL-адрес FA 5.x - https://use.fontawesome.com/releases/v5.0.8/js/all.js

div {
  display: inline-flex; /* make element size relative to content */
  align-items: center; /* vertical alignment of items */
  padding: 3px 10px; /* horizontal vertical position with padding */
  border: 1px solid #ccc;
}
.svg-inline--fa { /* target all FA icons */
  padding-right: 10px;
}
.icon-camera .svg-inline--fa { /* target specific icon */
  font-size: 50px;
}
/* unnecessary styling below, ignore */
body {display: flex;justify-content: center;align-items: center;height: 100vh; flex-direction: column;}div{margin: 10px 0;}div {background-color: hsla(0, 0%, 87%, 0.5);}div:hover {background-color: hsla(212, 100%, 63%, 1);cursor: pointer;}
<script src="https://use.fontawesome.com/releases/v5.0.8/js/all.js"></script>
<div class="icon-camera">
    <i class='fas fa-camera'></i>
    hello world
</div>
<div class="icon-clock">
    <i class='fas fa-clock'></i>
    hello world
</div>

скрипка

https://jsfiddle.net/3bpjvof2/

person Hastig Zusammenstellen    schedule 26.08.2016
comment
Это может центрировать значок по вертикали внутри div, а не только внутри строки текста. Работает отлично! - person Sean the Bean; 17.07.2018

Самый простой способ - установить свойство css с вертикальным выравниванием на средний уровень.

i.fa {
    vertical-align: middle;
}
person ajaali    schedule 08.10.2017
comment
.svg-inline--fa для FontAwesome 5 - person darylknight; 22.02.2018
comment
@darylknight, что это значит? Как мне это активировать / использовать? Добавить что-нибудь после моего fa-clock в классе? - person Prof. Falken; 06.08.2018

У меня это сработало.

i.fa {
  line-height: 100%;
}
person Tom    schedule 03.11.2016

Попробуйте установить свой значок как height: 100%

Вам не нужно ничего делать с оберткой (скажем, с вашей кнопкой).

Для этого требуется Font Awesome 5. Не уверен, работает ли он для более старых версий FA.

.wrap svg {
    height: 100%;
}

Обратите внимание, что значок на самом деле является svg изображением.

Демо

person mriiiron    schedule 26.01.2018

Для тех, кто использует Bootstrap 4, все просто:

<span class="align-middle"><i class="fas fa-camera"></i></span>
person nscherzer    schedule 27.06.2019
comment
Это не имеет смысла как vertical-align: middle, которое применяется этим классом, предназначено только для таблиц. - person Lucas Manzke; 16.01.2020

Другой вариант точной настройки высоты строки значка - использование процентного значения свойства vertical-align. Обычно 0% - это нижний предел, а 100% - верхний, но можно использовать отрицательные значения или более сотни для создания интересных эффектов.

.my-element i.fa {
    vertical-align: 100%; // top
    vertical-align: 50%; // middle
    vertical-align: 0%; // bottom
}
person Arian Acosta    schedule 09.08.2017

Я бы обернул текст в, чтобы вы могли настроить таргетинг отдельно. Теперь, если вы перемещаете оба элемента и влево, вы можете использовать line-height для управления вертикальным интервалом. Установка его на ту же высоту, что и (30 пикселей), выровняет его по центру. См. здесь.

Новая разметка:

 <div>
    <i class='icon icon-2x icon-camera'></i>
    <span id="text">hello world</span>
</div>

Новый CSS:

div {
    border: 1px solid #ccc;
    height: 30px;
    margin: 60px;
    padding: 4px;
    vertical-align: middle;
}
i{
    float: left;
}
#text{
    line-height: 30px;
    float: left;
}
person Webster Gordon    schedule 26.06.2013
comment
Vertical-align не делает ничего с элементами блока, он работает только со встроенными элементами или элементами таблицы-ячейки. - person cimmanon; 26.06.2013
comment
Я вижу, установка line-height = container's height и оставшиеся плавающие объекты работает и требует меньшего набора текста. Вот обновленная скрипка с уменьшенным шумом: jsfiddle.net/F3KyK/7 - person Paul; 26.06.2013
comment
Лучше просто установить vertical-align: middle на иконку и текст. Таким образом, вы не делаете предположений о высоте значка и меньше CSS. - person Maros; 14.08.2013

При использовании гибкого бокса вертикальное выравнивание значков с отличным шрифтом рядом с текстом может быть очень трудным. Я пробовал использовать поля и отступы, но это переместило все элементы. Я пробовал различные варианты выравнивания гибкости, такие как центр, начало, базовая линия и т. Д., Но безрезультатно. Самый простой и чистый способ настроить только значок - установить для него, содержащего div, значение position: relative; top: XX;. Это отлично справилось со своей задачей.

person ADP    schedule 27.12.2017

Ну, этот вопрос был задан много лет назад. Я думаю, что технологии немного изменились, и совместимость с браузерами стала намного лучше. Вы можете использовать vertical-align, но я считаю, что это менее масштабируемое и менее пригодное для повторного использования. Я бы рекомендовал подход flexbox.

Вот тот же пример, который использовался в исходном плакате, но с гибким боксом. Он стилизует один элемент. Если размер кнопки изменится по какой-либо причине, он будет по-прежнему центрирован по вертикали и горизонтали.

.button {
    border: 1px solid #ccc;
    height: 40px;
    margin: 60px;
    padding: 4px;
    display: flex;
    justify-content: space-around;
    align-items: center;
}

Пример: JsFiddle.

person Ian Donahue    schedule 23.10.2018

Просто определите свойство vertical-align для элемента значка:

div .icon {
   vertical-align: middle;
}
person ali6p    schedule 15.05.2020