Сегодня столкнулся с необычной проблемой. К моему удивлению у IE8 не может правильно обработать свойство max-width для элемента который находится в ячейке таблицы или же в блоке с display:table-cell. И что самое удивительное этот баг не проявляется в IE7, а только в IE8.

А теперь детальнее.

Суть проблемы

Предположим, у нас есть таблица в каждой ячейке которой находится по изображению. Причем картинки разных пропорций и величины. Нам нужно аккуратно их выровнять и вместить в ячейках таблицы, так, чтобы получилась равномерная сетка.

У нас должна получится такая структура (упрощенная):

<table>
    <tr>
        <td>
            <img src="image.jpg" alt="" />
        </td>
    </tr>
</table>

C такими стилями:

table td{
    width: 200px;
    height: 200px;
    vertical-align: middle;
    text-align: center;
    border: 1px solid #0F0
    }
table td img{
    max-width: 200px;
    max-height: 200px
    }

И везде все хорошо отображается, даже в IE7. Но в IE8 ячейки таблицы получаются деформированными так, как будто свойство max-width не применяется и картинки имеют свою оригинальную ширину. И что самое интересное, визуально картинки имеют ширину указанную в свойстве max-width. Странно, но факт.
Но, не все потеряно, и решение для такого бага есть.

Решение

Чтобы избавится от этого бага нам всего лишь нужно задать для таблицы ее ширину, а также свойство table-layout fixed:

table{
    table-layout: fixed;
    width: 200px
    }

Вот и все.

Модификации

Если у нас та же самая задача, но мы используем div’ы, то баг в IE8 также проявляется. Решение — аналогичное. В конечном итоге у нас должно получится что-то вроде этого:

<div class="wrapper">
    <div class="inner">
        <img src="image.jpg" alt="" />
    </div>
</div>
div.wrapper{
    display: table;
    table-layout: fixed;
    width: 200px
    }
div.inner{
    display: table-cell;
    width: 200px;
    height: 200px;
    vertical-align: middle;
    text-align: center;
    border: 1px solid #0F0
    }
div.inner img{
    max-width: 200px;
    max-height: 200px
    }