Як центрувати текст вертикально з великим значком шрифту?


231

Скажімо, у мене є кнопка завантаження з приголомшливим значком шрифту та текстом:

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

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

EDIT: У мене є можливе рішення : http://jsfiddle.net/CLdeG/1/, але він трохи химерний - вводить додатковий тег p, використовує pull-left та display: table. Можливо, хтось може запропонувати більш простий шлях.


2
Ти бог. Серйозно, сьогодні я витратив на це дві години, ваше рішення було НАЙДОБІ найчистішим. Не потрібно нічого жорстко кодувати.
Чак

такий підхід простіше
Рейвен Бемсінгх

Відповіді:


304

Я просто повинен був зробити це сам, потрібно робити це навпаки.

  • не грайте з вертикальним вирівнюванням тексту
  • пограйте з вертикальним вирівнюванням значка, що відрізняється шрифтом
<div>
  <span class="icon icon-2x icon-camera" style=" vertical-align: middle;"></span>
  <span class="my-text">hello world</span>
</div>

Звичайно, ви не можете використовувати вбудовані стилі та орієнтувати його на свій власний клас css. Але це працює в режимі копіювання пасти.

Дивіться тут: Вертикальне вирівнювання тексту та піктограми у кнопці

Якби це не залежало від мене, я б не використовував іконку-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


1
так, це краще рішення, дякую. Здається, все ще потрібна висота лінії, хоча jsfiddle.net/paulftw/F3KyK/41
Павло

1
Я оновив вашу jsfiddle, як би це зробити. Я використовував розмір шрифту для піктограми замість 2x. jsfiddle.net/3GMjp/1
andxyz

У вашому першому фрагменті коду стартовий тег <span> не відповідає тегу, що закінчується </i>.
jzacharuk

Не працює з деякими з ікон. приклад з кутом ліворуч
стейк-прилад

Важливо усвідомити, що включення файлів fontawesome js також може змінювати зовнішній вигляд. Мій значок був занадто далеко до верху, я видалив включення js, щоб побачити, що буде, і тепер це занадто далеко до низу -.-
lucidbrot

53

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

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

Додайте 3x, 4x та інше до того ж визначення, що і потрібно.


7
На мій погляд, це має бути прийнятою відповіддю, оскільки це, безумовно, найпростіший варіант вирішення, якщо я не пропускаю щось в оригінальному запитанні. Дякую @rushonerok! Я не впевнений, чому деякі люди кажуть не використовувати vertical-align: middle;- я, можливо, щось тут пропускаю. Будь ласка, поясніть, якщо так.
Кендалл

1
@Kendall Roth Я думаю, коли люди говорять, що не використовувати vertical-align: middle, вони мають на увазі, якщо ви використовуєте blockелементи . Якщо ви використовуєте inline, inline-blockабо table-cell, ви повинні бути хорошими. MDN:vertical-align
rinogo

Працює як шарм! Дякую: D
Мохаммед А.

37

Розглянувши всі запропоновані варіанти, найчистішим рішенням здається встановлення висоти лінії та вертикальне вирівнювання всього:

Дивіться демонстрацію 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;
}

2
Що робити, якщо ваш контейнер перевищує 50 пікселів? Тоді це не спрацює ... У мене є вміст, що змінює розмір, і він повинен був мати піктограму по центру всередині ... будь-яка ідея про це?
Славен Томак

24

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

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

i.fa {
  line-height: inherit;
}

Просто переконайтеся, що вищезазначене глобальне рішення не викликає інших проблем у місцях, де ви також можете використовувати піктограми FontAwesome.


16

опція 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/


за допомогою флексу та дивовижного шрифту 5

Розміщена URL-адреса 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/


1
Це може зосереджувати піктограму вертикально в розділі, а не лише в рядку тексту. Чудово працює!
Шон Бін

@ хто намагається редагувати це - це, як правило, мій стиль компонування відповідей. Я вважаю, що це робить його більш зрозумілим / зрозумілим і дозволяє людям краще знати, куди вони йдуть, перш ніж натиснути на посилання. У випадку URL-адреси, розміщеної FA, у деяких людей є звичка виділяти посилання, щоб скопіювати її, тому вона написана повністю. У посиланнях jsfiddle є заголовок, щоб краще розбити сторінку, інакше простіше пропустити, і відповіді можуть виглядати захаращеними.
Hastig Zusammenstellen

11

Найпростіший спосіб - встановити властивість css у вертикальному масштабі на середину

i.fa {
    vertical-align: middle;
}

3
.svg-inline--faдля FontAwesome 5
darylknight

@darylknight, що це означає? Як я можу активувати / використовувати це? Додати щось після мого fa-clockв клас?
Проф. Фолкен

5

Це добре спрацювало для мене.

i.fa {
  line-height: 100%;
}

3

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

Вам не потрібно нічого робити з обгорткою (скажімо, вашою кнопкою).

Для цього потрібен шрифт Awesome 5. Не впевнений, чи він працює для старих версій FA.

.wrap svg {
    height: 100%;
}

Зауважте, що значок насправді є svgграфічним.

Демо


2

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

<span class="align-middle"><i class="fas fa-camera"></i></span>

Це не використовує як вертикальне вирівнювання: середина, яка застосовується цим класом, орієнтована лише на таблиці.
Лукас Манцке

1

Ще один варіант точної настройки висоти рядка піктограми - це використання відсотка vertical-alignвластивості. Зазвичай 0% - це знизу, а 100% вгорі, але можна використовувати негативні значення або більше сотні для створення цікавих ефектів.

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

1

Я б загорнув текст таким чином, щоб ви могли націлити його окремо. Тепер, якщо ви плаваєте як вліво, так і вліво, ви можете використовувати висоту лінії для керування вертикальним інтервалом. Якщо встановити його на тій же висоті, що і (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;
}

4
Вертикально-Align робить нічого на блокових елементах, він працює тільки на вбудованих або таблиці клітинних елементів.
cimmanon

Я бачу, встановлення висоти рядка = висота контейнера та плаваючі речі залишають роботу та потребує меншого набору тексту. Ось оновлена загадка
Пол,

Краще просто встановити vertical-align: middleзначок та текст. Таким чином, ви не робите припущення щодо висоти значка, і CSS менше.
Марос

0

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


0

Що ж, це питання задавали роки тому. Я думаю, що технологія змінилася зовсім небагато, а сумісність браузера набагато краща. Ви можете використовувати вертикальне вирівнювання, але я вважаю, що деякі менш масштабовані та менш багаторазові. Я б рекомендував підхід до флешбоксу .

Ось той самий приклад оригінального плаката, який використовується, але з flexbox. Він стилює єдиний елемент. Якщо розмір кнопки зміниться з будь-якої причини, вона продовжуватиме вертикально та горизонтально розташовуватись по центру.

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

Приклад: JsFiddle


0

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

div .icon {
   vertical-align: middle;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.