CSS: Як вирівняти вертикально «мітку» та «введення» всередині «div»?


91

Розглянемо такий код :

HTML:

<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

CSS:

div {
    height: 50px;
    border: 1px solid blue;
}

Яким буде найпростіший спосіб поставити labelі inputв середині div(вертикально)?


1
Наскільки мені відомо, нижній рядок - "ти не можеш", і найліниший спосіб обійти це використання простої <table>та застосування valign='middle'до її <td>s.
BeemerGuy

Відповіді:


95

div {
    display: table-cell;
    vertical-align: middle;
    height: 50px;
    border: 1px solid red;
}
<div>
    <label for='name'>Name:</label>
    <input type='text' id='name' />
</div>

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

http://jsfiddle.net/53ALd/6/


1
виглядає елегантно :) хтось знає, наскільки браузер сумісний із цим методом?
Завен Нагапетян,

1
Для IE, я думаю, це працює лише на IE8 або вище. Для інших веб-браузерів це нормально.
Марк-Франсуа

1
Я не знав про display: table-cell. Чи підтримується це в певних браузерах?
BeemerGuy

6
@Misha, ти повинен був вказати той факт, що твій ввід / мітка були абсолютно позиціоновані. Це повністю змінює обставини питання. Я даю Марку +1. Чудова відповідь.
jessegavin

2
Я цілком впевнений, що сенс, який намагався вказати Дженсон (і повинен був би бути сформульований), полягає в тому, що використання display: table-cellзмушує divs поводитись так, як вони не очікують, наприклад, наступні div, що відображаються в тому ж рядку / тощо.
taswyn

73

більш сучасним підходом було б використання css flex-box.

div {
  height: 50px;
  background: grey;
  display: flex;
  align-items: center
}
<div>
  <label for='name'>Name:</label>
  <input type='text' id='name' />
</div>

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

div {
  display: flex;
  align-items: center
}

* {
  margin: 10px
}

label {
  align-self: flex-start
}
<div>
  <img src="https://de.gravatar.com/userimage/95932142/195b7f5651ad2d4662c3c0e0dccd003b.png?size=50" />
  <label>Text</label>
  <input placeholder="Text" type="text" />
</div>

його також дуже просто центрувати по горизонталі та вертикалі:

div {
  position:absolute;
  top:0;left:0;right:0;bottom:0;
  background: grey;
  display: flex;
  align-items: center;
  justify-content:center
}
<div>
  <label for='name'>Name:</label>
  <input type='text' id='name' />
</div>


Я хотів би, щоб це спрацювало, коли зображення та текст загорнуті в етикетку. У мене є маленька піктограма, за якою йде текст, але текст не зрушується з місця.
Кевін Шарнхорст,

це працює, якщо мітка та текст є окремими елементами, або якщо ви зробите свою етикетку також гнучкою ...
Холгер Вілл

display:flexмає меншу сумісність, працює на chrome 29+

14

Це працює у крос-браузері, забезпечує більшу доступність та меншу розмітку. скинути div. Оберніть етикетку

label{
     display: block; 
     height: 35px; 
     line-height: 35px; 
     border: 1px solid #000; 
}

input{margin-top:15px; height:20px}

<label for="name">Name: <input type="text" id="name" /></label>

3
Очевидно, це не буде працювати для дворядкової етикетки. І якщо ви впевнені, що ярлик завжди є одним рядком, тоді є мільйони інших варіантів.
Lashae

16
питання стосувалось однорядкової етикетки, і я відповів відповідним чином. Ви не впевнені у своїх пунктах чи намірах тут, але якщо x настільки очевидний, вам слід зробити мільйон прикладів. принаймні, щоб ти міг похвалитися моєю відповіддю і відчути силу своїх мільйонів перемог. браво.
Альберт

2
Це найкраща відповідь для однорядкових міток. У специфікації сказано: "Якщо атрибут for не вказаний, але елемент label має позначений назвою елемент, пов'язаний з формою, то першим таким нащадком у порядку дерева є позначений елемент управління label." Тому це єдиний підхід, при якому ви можете пропустити атрибути forта idдля максимальної простоти.
парламент

8

Я усвідомлюю, що це питання було задано два роки тому, але для останніх глядачів, ось альтернативне рішення, яке має кілька переваг перед рішенням Марка-Франсуа:

div {
    height: 50px;
    border: 1px solid blue;
    line-height: 50px;
}

Тут ми просто додаємо line-heightрівне до висоти div. Перевагою є те, що тепер ви можете змінити властивість відображення div, як вважаєте за потрібне, inline-blockнаприклад, і його вміст залишиться вертикально відцентрованим. Прийняте рішення вимагає, щоб ви розглядали div як комірку таблиці. Це має працювати ідеально, крос-браузер.

Єдиною перевагою є лише одне правило CSS замість двох :)

На здоров’я!


6

Використовуйте paddingна div( зверху і знизу ) та vertical-align:middleна labelі input.

приклад на http://jsfiddle.net/VLFeV/1/


Це не працює на jsfiddle. Я змінив висоту divі вміст усередині не рухався взагалі. Мені чогось не вистачає?
BeemerGuy

На мою думку, макети не повинні мати фіксовану висоту пікселів ... Макети повинні плавно обтікати вміст. Однак я походжу з дня та часу, коли браузери масштабували розміри тексту при збільшенні та зменшенні масштабу. Останні браузери насправді масштабують цілу сторінку, тому встановлення висоти пікселів працює трохи краще. Однак є цілі нові причини уникати встановлення висоти пікселів ... наприклад, адаптивні методи розмітки. Ось чому це був би мій найкращий метод.
thirdender

3

Оберніть мітку та введення в інший div з визначеною висотою. Це може не працювати у версіях IE нижче 8.

position:absolute; 
top:0; bottom:0; left:0; right:0;
margin:auto;

0

Ви можете використовувати display: table-cellвластивість, як у наступному коді:

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