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

У меня есть простая кнопка HTML, которая содержит текст и изображение:

HTML: (Уже на http://jsfiddle.net/EFwgN)

<span class="Button">
    <img src="http://www.connectedtext.com/Image/ok.gif" />
    Small Icon
</span>

CSS

span.Button {display:inline-block; margin:2px 4px;padding:3px 6px;
             background-color:#ddd; height:24px; line-height:24px;
             vertical-align:middle;}
span.Button img {vertical-align:middle;}

Я не могу придумать комбинацию, которая соответствовала бы этим требованиям:

  • Изображение и текст должны быть вертикально в середине div, причем текст находится в середине изображения. Он должен быть аккуратным.
  • Горизонтально - изображение может быть в любой ширине, и кнопка должна вырасти, чтобы показать его.
  • Вертикально - изображение может быть в любой высоте, меньшей или большей, чем кнопка. Когда изображение больше, я не возражаю, если дополнительные пиксели отображаются или обрезаны, если они центрированы.
  • Кнопка находится на фиксированной высоте. В настоящее время я использую line-height для центрирования текста.
  • Кнопка должна хорошо сочетаться с другими кнопками и текстом.
  • Решение должно работать со всеми новейшими версиями основных браузеров и Internet Explorer 8.

Здесь jsfiddle с моим текущим кодом: http://jsfiddle.net/EFwgN
(обратите внимание, что маленький значок немного ниже центра кнопки)

Ответ 1

Простое решение, если вам нужно не менее IE8 (в режиме стандартов): http://jsfiddle.net/kizu/EFwgN/31/

Просто добавьте margin: -100px 0 в img, поэтому отрицательный запас будет иметь любую большую высоту:

span.Button img {vertical-align:middle; margin:-100px 0;
                 position:relative; top:-2px;}

Я добавил position: relative; top:-2px; только для того, чтобы лучше выглядеть:)

Но если вам понадобится поддержка режима совместимости или IE lt 8 (по какой-то причине), то с запасом не будет работать. Таким образом, вам понадобится дополнительная разметка: http://jsfiddle.net/kizu/EFwgN/28/, но она несколько взламывается и работает только с фиксированной высотой кнопки (как в вашем примере).

Ответ 2

Используйте табличный дисплей. Требуется сжатие изображения из-за конфликта между display:table-cell; и height:24px. Очень похоже на вашу отмененную попытку из комментариев, но включает в себя требуемый display:block; на изображении: http://jsfiddle.net/shanethehat/5ck3s/

Ответ 3

Там вы идете, используя jQuery:

$(".button img").load(function()
          {
              $(this).each(function()
                           {
                               sh = $(this).outerHeight();
                               if (sh > 24){
                               alert(sh);
                              $(this).css("margin-top", - (sh - 24) / 2 + 'px');
                              }
                           });
          });

Edit: Просто увидел, что вам нужен чистый CSS, ну, вот здесь, в коде gulfers!:)

Ответ 4

Почему бы не уменьшить изображение в случае, когда он действительно выше кнопки?

span.Button img {
  vertical-align:middle;
  max-height: 100%;
}

Ответ 5

Я, вероятно, пропустил некоторые из требований, так как установил span.Button height to auto помогло.

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

span.Button {display:inline-block; margin:2px 4px;padding:3px 6px;
             background-color:#ddd; width:auto; height:24px; line-height:24px;overflow:hidden;
             vertical-align:middle;
             }

используя бит javascript для определения высоты img, а затем, соответственно, центрируйте его.

Ответ 6

Как насчет этого?

http://jsfiddle.net/92K8J/

Добавлены display:inline-block к изображениям и удалены фиксированные height контейнера.