Почему изображения расположены по вертикали с "высотой строки", расположенной на 2 пикселя ниже, где они должны быть?
Рассказ:
jsfiddle здесь. В Chrome 21, Firefox 15 и IE9 поведение постоянно ошибочно, что заставляет меня думать, что я что-то не понимаю о спецификации CSS.
Более длинная история:
Я хочу центрировать изображение вертикально, используя высоту линии. Я установил высоту контейнера изображений, равную высоте линии, поля reset, paddings и border для всех элементов, но изображение на 2 пикселя ниже, где должно быть. Это происходит, если изображение меньше контейнера или больше, чем в нем (в этом случае я использовал max-width: 100; max-height: 100%
для его уменьшения).
В обоих случаях изображение имеет четное число пикселей. Мне было бы безразлично, если бы изображения были меньше контейнера, но для изображений, которые больше, 2-пиксельная линия из фона контейнера истекает в верхней части изображения.
<!DOCTYPE html>
<html lang="en">
<head>
<title>Images centered vertically with line-height have center miscalculated by 2 pixels</title>
<style type="text/css">
* { margin: 0; padding: 0; border: 0px solid cyan; } /* reset all margins, paddings and borders */
html {
font-size: 16px;
line-height: normal;
}
body {
line-height: 100%;
background: gray;
}
.img-wrapper-center {
width: 400px;
height: 200px; /* necessary, besides line-height, if images are taller than it */
line-height: 200px; /* must be equal to line-height */
text-align: center;
background: white;
}
.img-wrapper-center img {
vertical-align: middle;
/* Comment the two rules below. The first image will still be mis-aligned by two pixels, but the second will not. */
max-width: 100%; max-height: 100%; /* force scaling down large images */
}
</style>
</head>
<body>
<div class="img-wrapper-center" id="div1">
<img src="http://gravatar.com/avatar" id="img1"/> <!-- 80x80 -->
</div>
<div class="img-wrapper-center" id="div2" style="background: green">
<img src="http://www.w3.org/html/logo/img/class-header-semantics.jpg" id="img2" /> <!-- 495x370 -->
</div>
<p>
Note how the second image is misaligned down by two pixels.
The first one is mis-aligned the same way. Sizes and coordinates are below.
</p>
<script>
document.writeln('div1 top: ' + document.getElementById('div1').offsetTop + '<br/>');
document.writeln('image 1 height: ' + document.getElementById('img1').offsetHeight + '<br/>');
document.writeln('div1 height: ' + (document.getElementById('div1').offsetHeight) + '<br/>');
document.writeln('image 1 top should be at: ' + (document.getElementById('div1').offsetHeight - document.getElementById('img1').height) / 2 + '<br/>');
document.writeln('image 1 top actually is at: ' + document.getElementById('img1').offsetTop + '<br/>');
document.writeln('div2 top: ' + document.getElementById('div2').offsetTop + '<br/>');
document.writeln('img2 top: ' + document.getElementById('img2').offsetTop + '<br/>');
</script>
</body>
</html>
Ответы
Ответ 1
Вы должны установить нуль font-size
для элементов контейнера div
.
Поскольку изображения отображаются как встроенные элементы, они подвержены воздействию текста в контейнере div
. Zero font-size
исправляет это:
.img-wrapper-center
{
font-size:0;
}
Вот скрипка: http://jsfiddle.net/bZBsR/
Ответ 2
Если у вас также есть текст внутри этого div, вы можете использовать это свойство:
.img-wrapper-center {
display: flex;
justify-content: center;
}
Вот скрипка: https://jsfiddle.net/rjurado/yvanL4k1/2/