css вертикальне вирівнювання по одній або декількох лініях


80

У мене є заголовок, який може мати один або кілька рядків.

Як я можу вирівняти текст по вертикалі? Якщо це завжди був один рядок, я міг би просто встановити висоту рядка на висоту контейнера.

Я можу це робити за допомогою JavaScript, але мені це не дуже подобається, я шукаю чистий спосіб CSS.

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

введіть тут опис зображення


Якщо висота контейнера може змінюватися ... то як щодо цього? jsbin.com/idiqih/edit#preview
Joonas

Відповіді:


113

Для цього ви можете використовувати display:table-cellвластивість:

.inline {
  display: inline-block;
  margin: 1em;
}
.wrap {
  display: table;
  height:  100px;
  width:   160px;
  padding: 10px;
  border:  thin solid darkgray;
}
.wrap p {
  display:        table-cell;
  vertical-align: middle;
}
<div class="inline">
  <div class="wrap">
    <p>Example of single line.</p>
  </div>
</div>

<div class="inline">
  <div class="wrap">
    <p>To look best, text should really be centered inside.</p>
  </div>
</div>

Але це працює IE8 і вище. Прочитайте цю статтю для отримання додаткової інформації: CSS Tricks: Vertical Center Multi-Line Text .


Я хотів точно те саме, але також потрібно, щоб div повинен споживати всю доступну висоту. Це повинно допомогти в цьому: stackoverflow.com/a/16837667/260665
Радж Паван Gumdal

Якщо ви не хочете, .wrapщоб у вас були магічні числа для heightі width, ви можете встановити для кожного з них значення 100%. Потім застосуйте widthі heightдо батьківських .wrapелементів.
Містер Полівірл,

9

Якщо вам не подобається display:tableфокус (я знаю, що мені не подобається ), ось рішення без нього:

.cen {
  min-height:5em; width:12em; background:red; margin:1em 0;
}
.cen p {
  display:inline-block; vertical-align:middle;
  margin:0 0 0 1em; width:10em;
}
.cen::after {
   display:inline-block; vertical-align:middle; line-height:5em;
   width:0; content:"\00A0"; overflow:hidden;
}

з HTML

<div class="cen">
 <p>Text in div 1</p>
</div>

Це дає Div висоту 5em, якщо вміст не вищий, тоді він зростає.
Живий приклад тут .

Редагувати: О, над якими браузерами це має працювати? IE8 не буде співпрацювати.

(Пізніше редагування: оновлений CSS для вирішення проблем у Chrome)


Класна техніка. Одне питання, з яким я зіткнувся, - це те, коли текст у вікні загортається самостійно (замість <br>тегів, показаних у прикладі), я закінчую значною кількістю зайвого місця внизу кожного елемента в Chrome. Здається, псевдоелемент переноситься на новий рядок. Будь-яка ідея, як це пом'якшити?
Домінік П

@DominicP Ви маєте рацію. Очевидно, ::afterблок вважає, що він має ширину (через його вміст), тому він не поміститься після p. На жаль, йому потрібен вміст, інакше він взагалі розвалиться і не буде працювати. Але я не впевнений, чому він робить це лише із загортаючими рядками, а не з однорядковими ps.
Містер Лістер

У будь-якому разі, я оновив відповідь рішенням. Фокус у тому, щоб зробити pменш широкий, ніж div, тому праворуч від нього є місце для ::afterблоку нульової ширини . Сподіваюся, це допомагає!
Містер Лістер,

Якщо доступність викликає занепокоєння, це правильна відповідь. Не слід класифікувати a <div>як table-item, це заплутає зчитувач з екрана і, звичайно, користувача.
Ктулху

9

Мені дуже подобається це рішення:

<div>
    <span style="display: inline-block; vertical-align: middle; height: --The height of your box here--"></span>
    <span style="display: inline-block; vertical-align: middle;">Put your multi-line content here</span>
</div>

Не соромтеся використовувати таблиці стилів та 100% для висоти ...

Також, можливо, доведеться закоментувати пробіли між тегами span, оскільки це вбудовані блоки

Кредит належить Аїду . Я отримав його звідси

<div style="outline:thin solid red;">
  <span style="display: inline-block; vertical-align: middle; height: 60px;"></span>
  <span style="display: inline-block; vertical-align: middle;">Put your multi-line content here.</span>
</div>

<div style="outline:thin solid red;">
  <span style="display: inline-block; vertical-align: middle; height: 60px;"></span>
  <span style="display: inline-block; vertical-align: middle;">Put your multi-line content here. Put your multi-line content here. Put your multi-line content here. Put your multi-line content here. Put your multi-line content here.</span>
</div>

Примітка. Здається, це не працює з вмістом із декількох рядків.


2
Це чудове рішення :) дякую! Я ненавиджу покладатися на столи!
3066d0

Я не можу повірити, що це спрацювало! На сьогоднішній день єдине рішення, яке спрацювало!
keji

1
Це найчистіше рішення на мій смак. Цікаво, чи специфікації CSS забезпечать невдалий спосіб зробити це у моєму житті.
DannyB,

4

Замість використання vertical-align: centerта display: table-cell, можливо, ви захочете поглянути на новий метод, який називається CSS display flex, який набагато простіший

.box {
    width: 200px;
    height: 50px; 
    padding: 10px;
    margin-bottom: 20px;
    background-color: red;
    
    /* Only add these 2 lines */
    display: flex;
    align-items: center;
  }
<div class="box">Lorem ipsum dolor</div>
<div class="box">Lorem ipsum dolor sit amet ipsum dolor</div>


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

Найкраща відповідь для нових браузерів! Дякуємо за додавання цього нового гнучкого рішення до старого питання.
Kai Noack

3

щось подібне

HTML

<div>
    <p>
       Lorem Ipsum is simply
    </p>
</div>

CSS

div {
   display: table;
}
p {
   display:table-cell;
   vertical-align: middle;
}

3

Якщо ви хочете, щоб ваш текст був чуйним, обтікання слів від одного до кількох рядків, оскільки ширина динамічно змінюється, згаданого вище фокусу з inline-blockпомічником (який тут найкраще поєднується) може бути недостатнім, оскільки це .inlinehelperможе підштовхнути обтікання тексту під себе.
Ось повне рішення для такого simpel-завдання:

HTML:

<div id="responsive_wrap">
    <span class="inlinehelper"><span id="content">        
</div>

CSS:

#responsive_wrap {   
   display: block;    
   height: 100%; //dimensions just for   
   width: 100%;  //example's sake
   white-space: nowrap;
}

#content {   
   display: inline-block;        
   white-space: initial;
}

.inlinehelper {
   height: 100%;    
   width: 0;
   vertical-align: middle;
   display: inline-block;
}

Зверніть увагу на white-space:nowrapвластивість, яка запобігає .inlinehelperі #contentзагортання по відношенню один до одного. white-space:initialна #contentскидає здатність обертати для spanсебе;

Ще один варіант: більше питання особистих уподобань. Ви можете використовувати псевдоелемент замість .inlinehelper. Видаліть .inlinehelperправила та елемент css та додайте цей селектор css псевдоелемента:

#responsive_wrap:before {
    content: "";
    display: inline-block;
    vertical-align: middle;
    height: 100%;
    width: 0px;
}

PS: Я зрозумів, що це справді старе питання занадто пізно, тому нехай буде така відповідь, можливо, це буде для когось корисним.


1

З розумним стилем таблиця буде найкращим способом розміщення вмісту (помістіть теги стилів у CSS):

<table style="border:1;collapse;width:300px;padding:5px;background-color:red;">
<tr>
    <td style="width:250px;vertical-align:middle;">Lorem ipsum dolor sit amet ipswum dolor</td>
    <td style="width:50px;vertical-align:top;color:white;">1 Line</td>
</tr>

Для підрахунку рядків потрібен скрипт JS, подивіться тут:

http://www.webdeveloper.com/forum/archive/index.php/t-44333.html


0

Мені подобається таке рішення. Я десь бачив цей фокус у stackoverflow, але не пам'ятаю, де саме. Дуже корисно! :)

ul {
background: #000; 
  padding-left: 0;
}
ul li {
  height: 130px;
  position: relative;
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
  border-bottom: 3px solid #F7F7F7;
}
ul li:last-of-type {
  border-bottom: none;
}
ul li:after {
  color: #333;
  position: absolute;
  right: 35px;
  font-size: 40px;
  content: ">";
  top: 50%;
  margin-top: -24px;
  color: #FFDA00;
  -webkit-transition: 0.25s all ease;
  transition: 0.25s all ease;
}
ul li a {
  font-size: 35px;
  font-family: Arial;
  color: #fff;
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
  padding-left: 40px;
  height: 100%;
  line-height: 38px;
  display: inline-block;
  width: 100%;
  text-align: left;
  text-decoration: none;
}
ul li a:before {
  display: inline-block;
  vertical-align: middle;
  content: " ";
  height: 100%;
}
ul li a span {
  display: inline-block;
  vertical-align: middle;
}
<ul>
	<li class="dn">
		<a href="kapec.ru.php"><span> Lorem ipsum 1 LINE</span></a>
		</li>
		<li>
			<a href="varianti.ru.php"><span>Lorem ipsum <br> 2 lines </span></a>
		</li>

	</ul>

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