Как вертикально выровнять изображение внутри 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 здесь.

.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>
+1308
01 сент. '11 в 16:25
источник поделиться
30 ответа
  • 1
  • 2

Насколько мне известно, единственный (и лучший кросс-браузерный) способ заключается в использовании inline-block вспомогательного inline-block с height: 100% и vertical-align: middle на обоих элементах.

Так что есть решение: 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><img src="http://jsfiddle.net/img/logo.png" height=250px />
</div>
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=25px />
</div>
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=23px />
</div>
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=21px />
</div>
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=19px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=17px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=15px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=13px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=11px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=9px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=7px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=5px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=3px />
</div>

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

Решение с :before и expression() для 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"><img src="http://jsfiddle.net/img/logo.png" height=250px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=25px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=23px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=21px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=19px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=17px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=15px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=13px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=11px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=9px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=7px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=5px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=3px /></div>

Как это устроено:

  1. Когда у вас есть два элемента inline-block рядом друг с другом, вы можете выровнять каждый из них на другую сторону, поэтому с помощью vertical-align: middle вы получите нечто вроде этого:

    Two aligned blocks

  2. Если у вас есть блок с фиксированной высотой (в px, em или другой абсолютной единице), вы можете установить высоту внутренних блоков в %.

  3. Таким образом, добавление одного inline-block с height: 100% в блоке с фиксированной высотой выровняет другой элемент inline-block в нем (<img/> в вашем случае) по вертикали рядом с ним.
+1985
05 сент. '11 в 16:04
источник

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

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/

+485
30 июл. '12 в 5:57
источник

Связанные вопросы


Похожие вопросы

Матейкрамное решение - хорошее начало, но негабаритные изображения имеют неправильное соотношение.

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

Демонстрация: https://jsbin.com/lidebapomi/edit?html,css,output

preview


HTML:

<div class="frame">
  <img src="foo"/>
</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;
}
+440
18 сент. '13 в 9:53
источник

Трехстрочное решение:

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

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

Отсюда

+212
10 февр. '15 в 4:48
источник

Чистое решение CSS:

http://jsfiddle.net/3MVPM/

CSS:

.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;
}

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

// 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
+133
05 сент. '11 в 11:09
источник

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

.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">
    <img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/9988/hand-pointing.png">
</div>

Вот ручка: http://codepen.io/ricardozea/pen/aa0ee8e6021087b6e2460664a0fa3f3e

+112
29 дек. '15 в 20:13
источник

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

div{
  height: 150px; // Internet Explorer 7 fix
  line-height: 150px;
}
img{
  vertical-align: middle;
  margin-bottom: 0.25em;
}
+98
22 нояб. '13 в 16:03
источник

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

.parent {
  align-items: center; /* For vertical align */
  background: red;
  display: flex;
  height: 250px;
  /* justify-content: center; <- for horizontal align */
  width: 250px;
}
<div class="parent">
  <img class="child" src="https://cdn2.iconfinder.com/data/icons/social-icons-circular-black/512/stackoverflow-128.png" />
</div>
+26
24 авг. '18 в 13:09
источник

Вы можете попробовать установить CSS из PI в display: table-cell; vertical-align: middle;

+22
07 сент. '11 в 16:31
источник

Существует супер легкое решение с flexbox!

.frame {
    display: flex;
    align-items: center;
}
+21
21 апр. '16 в 0:56
источник

Вы можете попробовать следующий код:

.frame{
    display: flex;
    justify-content: center;
    align-items: center;
    width: 100%;
}
<div class="frame" style="height: 25px;">
    <img src="http://jsfiddle.net/img/logo.png" />
</div>
+15
15 дек. '16 в 11:17
источник

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

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

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

По крайней мере, это отлично работает в Internet Explorer 8, Firefox 6 и Chrome 13.

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

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

+14
04 сент. '11 в 13:17
источник

Вы могли бы сделать это:

демонстрация

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";
})
+11
04 сент. '11 в 17:34
источник

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

Ключевым свойством является display: table-cell; для .frame. Div.frame отображается как встроенный с этим, поэтому вам нужно обернуть его в элемент блока.

Это работает в Firefox, Opera, Chrome, Safari и Internet Explorer 8 (и более поздних версиях).

ОБНОВИТЬ

Для Internet Explorer 7 нам нужно добавить выражение CSS:

*:first-child+html img {
    position: relative;
    top: expression((this.parentNode.clientHeight-this.clientHeight)/2+"px");
}
+11
04 сент. '11 в 18:04
источник

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

Может быть, это главная проблема с вашим HTML. Вы не используете кавычки при определении гр lass & image height в вашем HTML.

CSS:

.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;
}

Когда я работаю с тегом img он оставляет 3 пикселя на 2 пикселя top. Теперь я уменьшаю line-height, и это работает.

CSS:

    .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 */
    }

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

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

Посмотрите в этом примере разницу между line-height в разных браузерах: разница в высоте ввода в Firefox и Chrome

+7
05 сент. '11 в 12:26
источник

Я не уверен насчет Internet Explorer, но в Firefox и Chrome, если у вас есть img в контейнере div, должен работать следующий контент CSS. По крайней мере, для меня это работает хорошо:

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

div.img-container img {
    max-height: 450px;
    max-width: 490px;
}
+7
29 янв. '14 в 7:10
источник

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

<div class="container">
    <div class="frame">
        <img src="http://jsfiddle.net/img/logo.png" class="img" alt="" />
    </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;
}
+6
23 авг. '13 в 5:52
источник

Это работает для современных браузеров (2016 во время редактирования), как показано в этой демонстрации на codepen

.frame {
    height: 25px;
    line-height: 25px;
    width: 160px;
    border: 1px solid #83A7D3;          
}
.frame img {
    background: #3A6F9A;
    display:inline-block;
    vertical-align: middle;
}

Очень важно, чтобы вы либо присваивали изображениям класс, либо использовали наследование для нацеливания на изображения, которые вам нужно отцентрировать. В этом примере мы использовали .frame img {} чтобы .frame img {} только изображения, заключенные в div с классом .frame.

+6
01 сент. '11 в 17:29
источник

Для центрирования изображения внутри контейнера (это может быть логотип), кроме текста вроде этого:

Enter image description here

В основном вы оборачиваете изображение

.outer-frame {
  border: 1px solid red;
  min-height: 200px;
  text-align: center; /* Only to align horizontally */
}

.wrapper{
  line-height: 200px;
  border: 2px dashed blue;
  border-radius: 20px;
  margin: 50px
}

img {
  /* height: auto; */
  vertical-align: middle;   /* Only to align vertically */
}
<div class="outer-frame">
  <div class="wrapper">
    some text
    <img src="http://via.placeholder.com/150x150">
  </div>
</div>
+5
31 авг. '17 в 1:36
источник

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

Иногда это должно быть решено отображением в виде таблицы/таблицы-ячейки. Например, быстрый заголовок экрана. Это рекомендуемый способ W3 также. Я рекомендую вам проверить эту ссылку, которая называется Центрирование блока или изображения с 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>

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

+5
09 апр. '17 в 15:16
источник

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

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

Это работает для Google Chrome очень хорошо. Попробуйте это в другом браузере.

+5
18 окт. '15 в 17:03
источник

Если вы можете жить с полями размером в пиксель, просто добавьте font-size: 1px; к .frame. Но помните, что теперь на .frame 1em = 1px, что означает, что вам нужно также установить поле в пикселях.

http://jsfiddle.net/feeela/4RPFa/96/

Теперь это больше не сосредоточено в Опере…

+4
07 сент. '11 в 16:49
источник

Используя метод table и table-cell выполнить задание, особенно потому, что вы также нацеливаете на некоторые старые браузеры, я создаю для вас фрагмент, который вы можете запустить и проверить результат:

.wrapper {
  position: relative;
  display: table;
  width: 300px;
  height: 200px;
}

.inside {
  vertical-align: middle;
  display: table-cell;
}
<div class="wrapper">
  <div class="inside">
    <p>Centre me please!!!</p>
  </div>
  <div class="inside">
    <img src="https://cdn2.iconfinder.com/data/icons/social-icons-circular-black/512/stackoverflow-128.png" />
  </div>
</div> 
+2
28 июн. '17 в 13:51
источник

Вы можете использовать это:

 .loaderimage {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 60px;
    height: 60px;
    margin-top: -30px; /* 50% of the height */
    margin-left: -30px;
 }
+2
19 сент. '18 в 12:52
источник

У меня такая же проблема. Это работает для меня:

<style type="text/css">
    div.parent {
        position: relative;
    }

    img.child {
        bottom: 0;
        left: 0;
        margin: auto;
        position: absolute;
        right: 0;
        top: 0;
    }
</style>

<div class="parent">
    <img class="child">
</div>
+2
26 янв. '13 в 19:46
источник

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

jsfiddle

<div class='container'>
  <img src='image.jpg' />
</div>

.container {
  padding: 20%;
  background-color: blue;
}

img {
  width: 100%;
}
0
15 дек. '15 в 5:24
источник

Просто для того, чтобы это был правильный ответ, я все еще хочу опубликовать решение jQuery снова. Это работает для каждого элемента, к v_align применен класс v_align. Он будет вертикально центрирован в родительском элементе, и при изменении размера окна он будет пересчитан.

Ссылка на JSFiddle

$(document).ready(function() {
  // Define the class that vertically aligns stuff
  var objects = '.v_align';
  // initial setup
  verticalAlign(objects);

  // Register resize event listener
  $(window).resize(function() {
    verticalAlign(objects);
  });
});

function verticalAlign(selector) {
  $(selector).each(function(val) {
    var parent_height = $(this).parent().height();
    var dif = parent_height - $(this).height()
    // Should only work if the parent is larger than the element
    var margin_top = dif > 0 ? dif/2 : 0;
    $(this).css("margin-top", margin_top + "px");
  });
}
0
10 апр. '14 в 18:44
источник

Хотите выровнять изображение, которое имеет после текста/заголовка и оба внутри div?

Смотрите на JSfiddle или Run Code Snippet.

Просто убедитесь, что у вас есть идентификатор или класс для всех ваших элементов (div, img, title и т.д.).

Для меня это решение работает во всех браузерах (для мобильных устройств вы должны адаптировать свой код с помощью: @media).

h2.h2red {
    color: red;
    font-size: 14px;
}
.mydivclass {
    margin-top: 30px;
    display: block;
}
img.mydesiredclass {
    margin-right: 10px;
    display: block;
    float: left; /* If you want to allign the text with an image on the same row */
    width: 100px;
    heght: 100px;
    margin-top: -40px /* Change this value to adapt to your page */;
}
<div class="mydivclass">
    <br />
    <img class="mydesiredclass" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/2000px-Wikipedia-logo-v2-en.svg.png">
    <h2 class="h2red">Text aligned after image inside a div by negative manipulate the img position</h2>
</div>
0
08 июн. '17 в 7:01
источник

Лучшее решение заключается в том, что

.block{
    /* Decor */
    padding:0 20px;
    background: #666;
    border: 2px solid #fff;
    text-align: center;
    /* Important */
    min-height: 220px;
    width: 260px;
    white-space: nowrap;
}
.block:after{
    content: '';
    display: inline-block;
    height: 220px; /* The same as min-height */
    width: 1px;
    overflow: hidden;
    margin: 0 0 0 -5px;
    vertical-align: middle;
}
.block span{
    vertical-align: middle;
    display: inline-block;
    white-space: normal;
}
0
03 февр. '15 в 6:16
источник

Этот код хорошо работает для меня.

<style>
    .listing_container{width:300px; height:300px;font: 0/0 a;}
    .listing_container:before { content: ' ';display: inline-block;vertical-align: bottom;height: 100%;}
    .listing_container img{ display: inline-block; vertical-align: middle;font: 16px/1 Arial sans-serif; max-height:100%; max-width:100%;}
<style>

<div class="listing_container">
    <img src="http://www.advancewebsites.com/img/theme1/logo.png">
</div>
0
10 окт. '17 в 10:06
источник
  • 1
  • 2

Посмотрите другие вопросы по меткам или Задайте вопрос