Чому контейнер div наполягає на тому, щоб бути трохи більшим за вміст IMG або SVG?


78

Я намагаюся створити ще одну лайтбокс, настільки необхідну практику HTML / CSS / Javascript, але я зіткнувся з проблемою стилізації, яка виглядає тривіальною (і, мабуть, є!), Але я просто не можу її вирішити.

У мене є divщо містить img. Незалежно від того , що я намагаюся ( border, margin, padding, авто висота і т.д.) Я просто не можу зробити divусадку відповідно до розмірів зображення. Я звів проблему до цього:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
        <title>Layout experiments</title>

        <style type="text/css">
            #lightbox {
                margin: 0;
                padding: 0;
                position    : fixed;
                left        : 50%;
                margin-left : -320px;
                top         : 100px;
                border-radius: 22px;
                background  : #e0e0f0;
                color       : #102020;
            }

            #lightbox img {
                border-radius: 15px;
            }
            .imagebg {
                margin      : 7px;
                background  : black;
                border-radius: 15px;
                height      : 100%;
            }

        </style>

    </head>
    <body>

        <div id="lightbox">
            <div class="imagebg">
                <img src="picture.jpg">
            </div>
        </div>
    </body>
</html>

'picture.jpg' дорівнює 640x400, але div div контейнера хоче бути 640x404, різниця відображається як чорна смужка під зображенням. Div існує, щоб я міг перевести зображення в чорний, змішуючи його непрозорість до 0, поміняти його місцями, а потім знову змішати.

Я переглянув обчислювані стилі в багатьох браузерах і не можу зрозуміти, звідки береться дельта 4px.

Відповіді:


162

Спроба додати:

img { display: block; }

до вашого CSS. Оскільки an <img>є вбудованим елементом за замовчуванням, його висота обчислюється по-різному, як відношення до значення висоти рядка за замовчуванням.

Для вбудованих елементів властивість CSS line-height визначає висоту, яка використовується при обчисленні висоти поля рядка.

На елементах рівня блоку line-height задає мінімальну висоту рядків у межах елемента.

Джерело: https://developer.mozilla.org/en/CSS/line-height


Це справді це виправляє. Не могли б ви детальніше пояснити, чому це має значення? (Я не витримую прийняття - ТАК не дозволяють, поки не пройде ще 11 хвилин)
Кріс,

4
@Chris - це причина, яку я тобі назвав: у неї imgє неявний line-heightприсвоєний, що дає йому деяку вертикальну кімнату для дихання. Оскільки line-heightзастосовується лише до inlineелементів, установка imgна display: blockприбирає line-height.
Джозеф Сільбер

@Joseph - Я не бачив вашої відповіді, коли зробив вищезазначений запит. Оскільки вони в основному досягають одних і тих самих речей прямо і опосередковано, вибирати між відповідями не так багато. Здається лише справедливим прийняти відповідь, яка прийшла першою, але дякуємо за пояснення.
Кріс,

1
Це також працює з inline-block. Дякую за пояснення.
Ендрю Мао,


10

спробуйте додати:

vertical-align: middle;

Це використовується в Google Material Lite Lite для усунення розриву між аудіо, полотном, рамками, зображеннями, відео та дном їх контейнерів.

Lite Design Lite: https://getmdl.io

Обговорення Github: https://github.com/h5bp/html5-boilerplate/issues/440


Прийняте рішення змінює дисплей, що в моєму випадку було небажаним. Це спрацювало для мене без жодних недоліків.
Девід Нето,

1

Окрім інших робочих відповідей, встановлення displayвластивості батьків також flexпрацювало для мене:

.imagebg { display: flex }

0

В основному ви отримуєте цю помилку в IE, хоча ви не згадували, але це факт. IE генерує додатковий простір під <img>тегом. Звідси це хороша практика робити зображення img { display: block; }.

EDIT: Ви можете сказати, що це помилка IE


6
Я не згадував IE, оскільки не використовую його. Safari, Chrome та Firefox демонструють однакову поведінку. Відповіді Йосипа та sbeliv01 працюють.
Кріс,

Це не помилка IE. Усі <img> за замовчуванням вертикально вирівняні за базовою лінією. (вертикальне вирівнювання: базова лінія), що означає, що їх найнижча точка суміщена з базовою лінією шрифту (найнижча точка кола, наприклад, буква "p"). Щоб змінити це, потрібно лише встановити інший спосіб його вирівнювання, наприклад, vertical-align: top; або вертикальне вирівнювання: знизу;. Не потрібно перетворювати <img> на елемент блоку, оскільки властиві йому вбудовані властивості можуть бути корисними.
CaspianRoach

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.