Почему doctype так сильно влияет на размер? - PullRequest
4 голосов
/ 26 декабря 2011

Следующий код рисует красивую овальную кнопку из частей изображения без доктайпа.Исходное изображение размером 143x45 и правильно нарезано.

<body bgcolor="#000000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">


<div style="position:absolute; left:200px; top:200px">
    <table border="0" cellpadding="0" cellspacing="0">
        <tr>
            <td style="width:19px; height:3px; background-image:url('images/button_01.png')"></td>
            <td style="height:3px; background-image:url('images/button_02.png')"></td>
            <td style="width:20px; height:3px; background-image:url('images/button_03.png')"></td>
        </tr>
        <tr>
            <td style="width:19px; height:19px; background-image:url('images/button_04.png')"></td>
            <td style="background-color:rgb(183,174,130)" rowspan="3">

                Some text

            </td>
            <td style="width:20px; height:19px; background-image:url('images/button_06.png')"></td>
        </tr>
        <tr>
            <td style="width:19px; background-image:url('images/button_07.png')"><img src="images/button_07.png" width="19" height="1" alt=""></td>
            <td style="width:20px; background-image:url('images/button_08.png')"><img src="images/button_08.png" width="20" height="1" alt=""></td>
        </tr>
        <tr>
            <td style="width:19px; height:19px; background-image:url('images/button_09.png')"></td>
            <td style="width:20px; height:19px; background-image:url('images/button_10.png')"></td>
        </tr>
        <tr>
            <td style="width:19px; height:3px; background-image:url('images/button_11.png')"></td>
            <td style="height:3px; background-image:url('images/button_12.png')"></td>
            <td style="width:20px; height:3px; background-image:url('images/button_13.png')"></td>
        </tr>
    </table>
</div>

</body>

Но если я добавлю объявление

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

в начало документа, кнопка станет намного выше, как будто что-то присутствует в центральной части.

Почему это так?Можно ли избежать такого поведения?Что лучше: найти способ заставить это работать на HTML 4.01 или изменить doctype на более современный?

Ответы [ 3 ]

7 голосов
/ 26 декабря 2011

Почему это так?

Понимание почему вещи происходят так, как они это делают в CSS, это не то, о чем беспокоятся большинство веб-дизайнеров или веб-авторов. Часто причина заключается во взаимодействии различных частей спецификации CSS. Вот почему производителям браузеров потребовалось так много времени, чтобы сделать это правильно, и поэтому, когда вы не используете DOCTYPE и, следовательно, получаете режим причуд, вы получаете поведение макета, которое иногда кажется более интуитивным, чем при использовании DOCTYPE для Режим получения стандартов, где строго соблюдаются правила CSS.

Авторам обычно достаточно знать , что что-то происходит, и что делать, когда это происходит. Больше из которых внизу этого ответа.

Однако причины можно найти в спецификации CSS 2.1 с некоторыми поисками.

Во-первых, некоторые определения, которые нам нужно понять:

9.2.1 Элементы уровня блока и блочные блоки

Элементы уровня блока - это те элементы исходного документа, которые визуально форматируются как блоки (например, абзацы). Следующие значения свойства 'display' составляют элемент уровня блока: 'block', 'list-item' и 'table'.

...

9.2.2 Элементы на уровне строки и встроенные блоки

Элементы встроенного уровня - это те элементы исходного документа, которые не образуют новых блоки контента; контент распределяется по строкам (например, выделенные фрагменты текста внутри абзаца, встроенных изображений и т. д.) ....

Встроенные блоки, которые не являются встроенными (например, заменены) элементы встроенного уровня, элементы встроенного блока и встроенная таблица элементы) называются атомными встроенными блоками, потому что они участвовать в их контекстном форматировании в виде единого непрозрачного блока.

Затем нам также необходимо понять концепцию линейного блока :

9.4.2 Контексты встроенного форматирования

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

... Высота линейного блока определяется по правилам, приведенным в разделе Расчет высоты строки .

...

Строчные блоки создаются по мере необходимости для содержания содержимого на уровне встроенный контекст форматирования. ...

Таким образом, <img> - это замененный встроенный элемент, который устанавливает блок встроенного уровня, который устанавливает линейный блок, который располагается в объекте контейнера блока, например <div> или <td>. Высота строки строки затем определяется с помощью этих вычислений высоты строки :

10.8 Расчеты высоты линии: свойства 'line-height' и 'vertical-align'

Как описано в разделе о контекстах встроенного форматирования, пользовательские агенты перетекать встроенные блоки уровня в вертикальный набор линейных блоков. Высота линейного бокса определяется следующим образом:

  1. Высчитывается высота каждого встроенного блока уровня в линейном блоке. Для замененных элементов, элементов inline-block и inline-table элементы, это высота их поля поля; для встроенных ящиков, это их «высота строки». (См. «Расчет высоты и полей» а высота встраиваемых боксов в «Ведущие и наполовину ведущие».)
  2. Инлайн-боксы выровнены по вертикали в соответствии со свойством вертикального выравнивания. В случае, если они выровнены «сверху» или «снизу», они должны быть выровнены так, чтобы минимизировать высоту линейного блока. Если такой ящики достаточно высокие, есть несколько решений и CSS 2.1 делает не определять положение базовой линии линейного блока (то есть, положение стойки, см. ниже).
  3. Высота линейного бокса - это расстояние между самой верхней коробкой и самой нижней коробкой.(Это включает в себя распорку, как объяснено в разделе «высота строки» ниже.)

При работе с шагами сама <img height="1"> заставляет высоту строки только один пиксельвысоко, так что оставляет распорка .Это описано в разделе, посвященном ведущим и наполовину ведущим:

10.8.1 Ведущее и наполовину ведущее

...

В элементе контейнера блока, содержимое которого состоит из элементов встроенного уровня, 'line-height' определяет минимальную высоту линейных блоков внутри элемента.Минимальная высота состоит из минимальной высоты над базовой линией и минимальной глубины под ней, точно так же, как если бы каждый линейный блок начинался со встроенного блока нулевой ширины со свойствами шрифта и высоты строки элемента.Мы называем эту воображаемую коробку "стойкой"....

Высота и глубина шрифта над и под базовой линией предполагаются метриками, содержащимися в шрифте....

Так что у нас это есть.Строчное поле, созданное элементом <img>, имеет в начале воображаемое встроенное поле, высота которого определяется размером шрифта , в результате чего линейное поле становится достаточно высоким, чтобы содержать символэтот шрифт.

Можно ли избежать такого поведения?

Из приведенного выше объяснения доступны две опции:

  1. Линейный блок создается из встроенного элемента <img>.Таким образом, если элемент изменен на элемент уровня блока, в нем нет ни строкового блока, ни проблем.

    т.е. в CSS td img { display:block; }

  2. Так как высота вызвана распоркой, которая зависит от размера шрифта, в этом месте также изменив размер шрифта на 0решает проблему.

    то есть в CSS tr:nth-of-type(3) td { font-size:0px }

    (Вы можете захотеть поместить класс на третий <tr> и использовать его вместо :nth-of-type(3) для совместимости с не CSS 3поддерживающие браузеры)

Что лучше: найдите способ заставить это работать в HTML 4.01 или изменить тип документа на более современный?

самый современный - <!DOCTYPE html>.Ваша страница будет работать точно так же, как и с <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">, потому что обе они вызывают стандартный режим в браузерах.

4 голосов
/ 26 декабря 2011

Без DOCTYPE каждый веб-браузер работает по-своему, мы называем его «режимом причуд».С DOCTYPE результат будет соответствовать стандарту, указанному в теге DOCTYPE, в вашем случае мы называем «Строгий режим», потому что вы предоставляете «... / strict.dtd».

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

1 голос
/ 26 декабря 2011

Каждый браузер имеет свои стандарты, но если вы используете тип документа, он принимает его за стандартыЯ надеюсь, что это поможет вам.

...