Как вертикально выровнять изображение внутри div

Как можно выровнять изображение внутри содержащего его div?

Пример

В моем примере мне нужно вертикально отцентрировать <img> в <div> с class="frame":

<div class="frame" style="height: 25px;">
    <img src="http://jsfiddle.net/img/logo.png" />
</div>

Высота .frame'фиксирована, а высота изображения неизвестна. Я могу добавить новые элементы в .frame, если это единственное решение. Я'пытаюсь сделать это на Internet Explorer 7 и выше, WebKit, Gecko.

Смотрите jsfiddle [здесь][1].

.frame {
    height: 25px;      /* Equals maximum image height */
    line-height: 25px;
    width: 160px;
    border: 1px solid red;

    text-align: center;
    margin: 1em 0;
}
img {
    background: #3A6F9A;
    vertical-align: middle;
    max-height: 25px;
    max-width: 160px;
}
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=250 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=25 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=23 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=21 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=19 />
</div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=17 />
</div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=15 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=13 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=11 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=9 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=7 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=5 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=3 />
 </div>
Комментарии к вопросу (3)
Решение

Единственный (и лучший кроссбраузерный) способ, насколько я знаю, - использовать помощник "встроенный блок" с "высотой: 100%" и "выравнивание по вертикали: посередине" для обоих элементов.

Итак, есть решение: http://jsfiddle.net/kizu/4RPFa/4570/

.frame {
    height: 25px;      /* Equals maximum image height */
    width: 160px;
    border: 1px solid red;
    white-space: nowrap; /* This is required unless you put the helper span closely near the img */

    text-align: center;
    margin: 1em 0;
}

.helper {
    display: inline-block;
    height: 100%;
    vertical-align: middle;
}

img {
    background: #3A6F9A;
    vertical-align: middle;
    max-height: 25px;
    max-width: 160px;
}
<div class="frame">
    <span class="helper"></span>
</div>
<div class="frame">
    <span class="helper"></span>
</div>
<div class="frame">
    <span class="helper"></span>
</div>
<div class="frame">
    <span class="helper"></span>
</div>
<div class="frame">
    <span class="helper"></span>
</div>
<div class="frame">
    <span class="helper"></span>

</div>
<div class="frame">
    <span class="helper"></span>

</div>
<div class="frame">
    <span class="helper"></span>

</div>
<div class="frame">
    <span class="helper"></span>

</div>
<div class="frame">
    <span class="helper"></span>

</div>
<div class="frame">
    <span class="helper"></span>

</div>
<div class="frame">
    <span class="helper"></span>

</div>
<div class="frame">
    <span class="helper"></span>

</div>

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

Решение с ":до" и "выражение()" для Internet Explorer: http://jsfiddle.net/kizu/4RPFa/4571/

.frame {
    height: 25px;      /* Equals maximum image height */
    width: 160px;
    border: 1px solid red;
    white-space: nowrap;

    text-align: center;
    margin: 1em 0;
}

.frame:before,
.frame_before {
    content: "";
    display: inline-block;
    height: 100%;
    vertical-align: middle;
}

img {
    background: #3A6F9A;
    vertical-align: middle;
    max-height: 25px;
    max-width: 160px;
}

/* Move this to conditional comments */
.frame {
    list-style:none;
    behavior: expression(
        function(t){
            t.insertAdjacentHTML('afterBegin','<span class="frame_before"></span>');
            t.runtimeStyle.behavior = 'none';
        }(this)
    );
}
<div class="frame"></div>
<div class="frame"></div>
<div class="frame"></div>
<div class="frame"></div>
<div class="frame"></div>
<div class="frame"></div>
<div class="frame"></div>
<div class="frame"></div>
<div class="frame"></div>
<div class="frame"></div>
<div class="frame"></div>
<div class="frame"></div>
<div class="frame"></div>

Как это работает:

  1. Когда у вас есть два элемента "встроенного блока" рядом друг с другом, вы можете выровнять их по бокам друг друга, поэтому с помощью "выравнивание по вертикали: посередине" вы получите что-то вроде этого:

![Два выровненных блока][1]

  1. Если у вас есть блок с фиксированной высотой (в px, em или другой абсолютной единице измерения), вы можете
Комментарии (18)

Это может быть полезно:

div {
    position: relative;
    width: 200px;
    height: 200px;
}
img {
    position: absolute;
    top: 0;
    bottom: 0;
    margin: auto;
}
.image {
    min-height: 50px
}

Ссылка: http://www.student.oulu.fi/~laurirai/www/css/middle/

Комментарии (5)

Решение matejkramny - хорошее начало, но большие изображения имеют неправильное соотношение..

Вот моя вилка:

Демо: https://jsbin.com/lidebapomi/edit?html,css,output


HTML:

<div class="frame">

</div>

CSS:

.frame {
    height: 160px; /* Can be anything */
    width: 160px; /* Can be anything */
    position: relative;
}
img {
    max-height: 100%;
    max-width: 100%;
    width: auto;
    height: auto;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}

Решение matejkramny - хорошее начало, но большие изображения имеют неправильное соотношение..

Вот моя вилка:

Демо: https://jsbin.com/lidebapomi/edit?html,css,output


HTML:

<div class="frame">

</div>

CSS:

.frame {
    height: 160px; /* Can be anything */
    width: 160px; /* Can be anything */
    position: relative;
}
img {
    max-height: 100%;
    max-width: 100%;
    width: auto;
    height: auto;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
}
Комментарии (4)

Три линии-решение:

position: relative;
top: 50%;
transform: translateY(-50%);

Это относится ко всему.

Из здесь.

Комментарии (11)

В чистом решение Усс:

в

.frame {
  margin: 1em 0;
  height: 35px;
  width: 160px;
  border: 1px solid red;
  position: relative;
}

img {
  max-height: 25px;
  max-width: 160px;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  margin: auto;
  background: #3A6F9A;
}
<div class=frame>

</div>
<div class=frame>

</div>
<div class=frame>

</div>
<div class=frame>

</div>
<div class=frame>

</div>
<div class=frame>

</div>
<div class=frame>

</div>
<div class=frame>

</div>
<div class=frame>

</div>
<div class=frame>

</div>
<div class=frame>

</div>
<div class=frame>

</div>
<div class=frame>

</div>

в

Ключевые вещи

// position: relative; - in .frame holds the absolute element within the frame
// top: 0; bottom: 0; left: 0; right: 0; - this is key for centering a component
// margin: auto; - centers the image horizontally & vertically
Комментарии (8)

Более современное решение, и если нет необходимости для поддержки старых браузеров, вы можете сделать это:

в

.frame {
    display: flex;
    /**
    Uncomment 'justify-content' below to center horizontally.
    ✪ Read below for a better way to center vertically and horizontally.
    **/

    /* justify-content: center; */
    align-items: center;
}

img {
    height: auto;

    /**
    ✪ To center this image both vertically and horizontally,
    in the .frame rule above comment the 'justify-content'
    and 'align-items' declarations,
    then  uncomment 'margin: auto;' below.
    **/

    /* margin: auto; */
}

/* Styling stuff not needed for demo */
.frame {
    max-width: 900px;
    height: 200px;
    margin: auto;
    background: #222;
}
p {
    max-width: 900px;
    margin: 20px auto 0;
}
img {
    width: 150px;
}
<div class="frame">

</div>

в

Здесь's в ручку: http://codepen.io/ricardozea/pen/aa0ee8e6021087b6e2460664a0fa3f3e

Комментарии (3)

Таким образом, вы можете сосредоточить изображение по вертикали (демо):

div{
  height: 150px; // Internet Explorer 7 fix
  line-height: 150px;
}
img{
  vertical-align: middle;
  margin-bottom: 0.25em;
}
Комментарии (8)

Также, вы можете использованием Flexbox для достижения правильного результата:

в


.parent {
  align-items: center; /* For vertical align */
  background: red;
  display: flex;
  height: 250px;
  /* justify-content: center; 
Комментарии (0)

Есть супер просто решение адаптируемых блоков!

.frame {
    display: flex;
    align-items: center;
}
Комментарии (2)

Вы могли бы попробовать установить CSS-код " пи " с дисплей: ячейки таблицы; вертикального выравнивания: средний;

Комментарии (4)

Вы можете попробовать ниже код:

в

.frame{
    display: flex;
    justify-content: center;
    align-items: center;
    width: 100%;
}
<div class="frame" style="height: 25px;">

</div>

в

Комментарии (0)

Решение фонового изображения

Я полностью удалил элемент изображения и установил его в качестве фона div с классом .frame.

http://jsfiddle.net/URVKa/2/

Это, по крайней мере, работает нормально на Internet Explorer 8, Firefox 6 и Chrome 13.

Я проверил, и это решение не будет работать для уменьшения изображений размером более 25 пикселей в высоту. Есть свойство background-size, которое действительно устанавливает размер элемента, но это CSS 3, что противоречит требованиям Internet Explorer 7.

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

Комментарии (5)

Вы можете сделать это:

Demo

http://jsfiddle.net/DZ8vW/1

CSS

.frame {
    height: 25px;      /* Equals maximum image height */
    line-height: 25px;
    width: 160px;
    border: 1px solid red;

    text-align: center; 
    margin: 1em 0;
    position: relative; /* Changes here... */
}
img {
    background: #3A6F9A;
    max-height: 25px;
    max-width: 160px;
    top: 50%;           /* Here.. */
    left: 50%;          /* Here... */
    position: absolute; /* And here */
}    


JavaScript

$("img").each(function(){
    this.style.marginTop = $(this).height() / -2 + "px";
})
Комментарии (7)

http://jsfiddle.net/MBs64/

.frame {
    height: 35px;      /* Equals maximum image height */
    width: 160px;
    border: 1px solid red;
    text-align: center;
    margin: 1em 0;
    display: table-cell;
    vertical-align: middle;
}
img {
    background: #3A6F9A;
    display: block;
    max-height: 35px;
    max-width: 160px;
}

Ключевым свойством является дисплей: стол-клеток; "за".рамка.Див.кадр отображается как inline с этим, так что вы должны обернуть его в блочный элемент.

Это работает в Firefox, Опера, хром, сафари и Internet&ампер;усилитель; nbsp;Обозреватель&ампер;усилитель; nbsp;8 (и более поздних).

Обновление

Для Internet&ампер;усилитель; nbsp;Обозреватель&ампер;усилитель; nbsp;7 мы должны добавить выражения в CSS:

*:first-child+html img {
    position: relative;
    top: expression((this.parentNode.clientHeight-this.clientHeight)/2+"px");
}
Комментарии (3)

Я не уверен, что интернет&ампер;усилитель; nbsp;Explorer, но под Firefox и Chrome, Если у вас есть ИМГ в див контейнер, следующий контент CSS должен работать. По крайней мере для меня это работает хорошо:

div.img-container {
    display: table-cell;
    vertical-align: middle;
    height: 450px;
    width: 490px;
}

div.img-container img {
    max-height: 450px;
    max-width: 490px;
}
Комментарии (2)

Попробуйте это решение на чистом CSS http://jsfiddle.net/sandeep/4RPFa/72/

Может быть, это основная проблема с ваш HTML. Вы'повторно не использовать цитаты, Когда вы определить с'lass&высота изображения в HTML.

Усс:

.frame {
    height: 25px;      /* Equals maximum image height */
    width: 160px;
    border: 1px solid red;
    position: relative;
    margin: 1em 0;
    top: 50%;
    text-align: center;
    line-height: 24px;
    margin-bottom: 20px;
}

img {
    background: #3A6F9A;
    vertical-align: middle;
    line-height: 0;
    margin: 0 auto;
    max-height: 25px;
}

Когда я работаю с тегом ИМГ это'уходя 3 пикселя на 2 пикселя пространства от топ. Сейчас высота строки мне умаляться``, и это's работает.

Усс:

    .frame {
        height: 25px;      /* Equals maximum image height */
        width: 160px;
        border: 1px solid red;
        margin: 1em 0;
        text-align: center;
        line-height: 22px;
        *:first-child+html line-height:24px; /* For Internet Explorer 7 */
    }

    img {
        background: #3A6F9A;
        vertical-align: middle;
        line-height: 0;    
        max-height: 25px;
        max-width: 160px;
    }
@media screen and (-webkit-min-device-pixel-ratio:0) {
    .frame {
        line-height:20px; /* WebKit browsers */
    }

Свойство строки-высота отображается по-разному в разных браузерах. Итак, мы должны определить различные линии-высота браузеров собственность.

Проверить этот пример: http://jsfiddle.net/sandeep/4be8t/11/

Проверить этот пример про линии-высота-разному в разных браузерах: https://stackoverflow.com/questions/7229568/input-height-differences-in-firefox-and-chrome

Комментарии (1)

Мое решение: [http://jsfiddle.net/XNAj6/2/][1]

<div class="container">
    <div class="frame">

    </div>
</div>

.container {
    display: table;
    float: left;
    border: solid black 1px;
    margin: 2px;
    padding: 0;
    background-color: black;
    width: 150px;
    height: 150px;
}
.frame {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    border-width: 0;
}
.img {
    max-width: 150px;
    max-height: 150px;
    vertical-align: middle;
}
Комментарии (0)

Решение с помощью таблицы и ячеек таблицы

Иногда она должна быть решена путем отображения таблицы/таблицы-ячейка. Например, быстрый экран. Это рекомендуемый способ на В3 тоже. Я рекомендую вам проверить эту ссылку, называется центрирования блока или изображения от W3C.org.

Советы, используемые здесь, являются:

  • Абсолютная контейнер позиционирования отображаются в виде таблицы
  • Отображается вертикально выравнивается по материалам Центра как ячейки таблицы

в

.container {
    position: absolute;
    display: table;
    width: 100%;
    height: 100%;
}
.content {
    display: table-cell;
    vertical-align: middle;
}
<div class="container">
  <div class="content">
    <h1 style="text-align:center">Peace in the world</h1>
 </div>
</div>

в

Лично я вообще не согласен по поводу использования помощников для этой цели.

Комментарии (0)

Представьте, что у вас есть

<div class="wrap">

</div>

И CSS:

.wrap {
    display: flex;
}
.wrap img {
    object-fit: contain;
}
Комментарии (0)

Простой способ, который работает для меня:

img {
    vertical-align: middle;
    display: inline-block;
    position: relative;
}

Она работает очень хорошо для Гугл Хром. Попробовать в другом браузере.

Комментарии (0)