CSS в один или несколько линейных вертикальное выравнивание


У меня есть титул, который может иметь одну или несколько линий.

Как я могу выровнять текст по вертикали? Если бы это всегда была одна строка, я мог бы просто установить высоту строки на высоту контейнера.

Я могу сделать это с помощью JavaScript, но мне это не очень нравится, я ищу чистый способ CSS.

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

7 75

7 ответов:

для этого вы можете использовать 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 трюки: вертикально центр многострочный текст.

Если вам не нравится 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:"A0"; overflow:hidden;
}

в HTML

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

Это дает div высоту 5em, если содержание не heigher, то оно растет.
Живой пример здесь.

Edit: О, какие браузеры это должно работать? IE8 не будет сотрудничать.

(позднее редактирование: обновлен CSS для обработки проблем в Chrome)

мне очень нравится такое решение:

<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, так как это встроенные блоки

кредит идет на ад. Я получил его от!--11-->здесь

<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>

Примечание: это, кажется, не работает с содержимым нескольких строк.

что-то вроде этого

HTML

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

CSS

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

если вы хотите, чтобы ваш текст был отзывчивым, обертывание слов от одной до нескольких строк, поскольку ширина динамически меняется, упомянутый выше трюк с inline-block helper (которые имеют лучшую совместимость здесь) может быть недостаточно, так как .inlinehelper можно нажать обертывание текста под себя.
Полное решение вот такой задачи симпел:

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 on #content сбрасывает возможность обернуть для ;

Другой Вариант: Скорее дело в личных предпочтениях. Вы можете использовать псевдо элемент вместо .inlinehelper. Уберите .inlinehelper css правила и элемент и добавить этот псевдо - элемент css селектор:

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

P. S.: Я понял, что это очень старый вопрос слишком поздно, поэтому пусть это ответьте, может быть, это будет полезно для кого-то.

стиль мудрый, таблица будет лучшим способом компоновки вашего контента (поместите теги стиля в 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

мне нравится такое решение. Я где-то видел этот трюк в 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>