Проблема вызвана форматированием вашего HTML. Спецификации W3C не ясны в этом вопросе, но встроенные элементы не всегда игнорируют элементы пробела, которые вы можете использовать для форматирования кода. Они могут свернуть пробелы до одного символа (если это не неразрывный пробел), но он все еще там.
Проблема
Прямо сейчас ваш код выглядит так:
<a href="...">
<img src="..."/>
</a>
Вы можете подумать, что это должно быть так же, как:
<a href="..."><img src="..."/></a>
но это не так; он интерпретируется Firefox как:
<a href="..."> <img src="..."/> </a>
К сожалению, спецификации W3C специально не требуют, чтобы пользовательские агенты игнорировали или отображали пробелы сразу после начального тега или непосредственно перед конечным тегом, поэтому некоторые браузеры будут отображать их, некоторые будут полностью игнорировать их, и некоторые будут игнорировать их, но не полностью.
В вашем случае это последнее. Пробел на самом деле не отображается (по крайней мере, не горизонтально), но тег img
теперь обрабатывается как отображаемый внутри блока текста. Дополнительное вертикальное пространство, которое вы видите, вызвано вертикальным выравниванием img
относительно базовой линии текстового блока.
Решение
Так вот, у меня никогда не было проблем с vertical-align
, но есть несколько решений этой проблемы:
- Вы можете просто установить
vertical-align: top
для тега img
.
- Вы можете избавиться от форматирования кода и устранить пробелы с обеих сторон
img
.
- Вы можете изменить
font-size
на что-то очень маленькое, например 1px
.
- Вы можете использовать правильное фоновое изображение для контейнера (т.е.
table
) вместо рендеринга элемента в срезах.
Лично по стилистическим и практическим причинам я бы сделал 2 и 4. Для встроенных элементов, таких как a
, просто безопаснее не заполнять содержимое пробелами. А использование правильного фона означает, что вам не нужно беспокоиться о точном выравнивании пикселей, и вы можете уменьшить размеры изображения. Хотя я бы тоже не стал использовать таблицу в этом случае.