Блочная модель CSS (поля и отступы) для вертикального расстояния между абзацами - PullRequest
4 голосов
/ 20 февраля 2009

Как использовать CSS 'margin' и 'padding' для вертикального интервала между абзацами:

  • Можно ли определить вертикальное пространство между абзацами, используя отступы и / или поля?
  • Если это можно сделать одним из них, то какой из них лучше или нормальнее использовать?
  • Имеете ли вы тенденцию определять ненулевые отступы и ненулевые поля, и если да, то сколько из каждого?

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


Во-вторых, данная разметка выглядит следующим образом ...

<p>Paragraph.</p>
<ul>
<li>List item.</li>
<li>Another list item.
<p>List paragraph.</p>
</li>
</ul>

Если вам нужно одинаковое вертикальное пространство между каждым абзацем и / или элементом списка, то:

  • Вы бы хотели определить <ul> как имеющий нулевое поле + собственный отступ?
  • Или <ul> обычно имеет ненулевую маржу, которая тогда не будет иметь никакого эффекта, поскольку эта маржа будет свернута с маржей <li> внутри нее и <p>, которая предшествует ей?

В-третьих (и я не уверен, должен ли я задавать этот третий вопрос), спецификация для сворачивающихся полей гласит: «Если верхнее и нижнее поля бокса соприкасаются, то это возможно падение полей через него ". Если у меня есть пустой абзац, как следующий в середине ...

<p>Hello</p>
<p></p>
<p>World</p>

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

  • Что предотвратит свертывание полей этого пустого абзаца и, следовательно, пустой абзац невидимым: делает ли это ненулевое заполнение?
  • В каком сценарии это Полезно ли для бокса иметь смежные верхнюю и нижнюю границу, которые разрушаются?

Ответы на любой или все эти три вопроса приветствуются.

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

Ответы [ 4 ]

3 голосов
/ 20 февраля 2009

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

Чтобы ответить на второй вопрос, просто взгляните на этот код и, возможно, поиграйте с ним:

<html>
<head>
<title>Box Model Tests</title>
<style type="text/css">
/* Just to get rid of the annoying padding/margin setting that is default
 in most browsers on the body tag from messing up our experiments */
body{
margin: 0px;
padding: 0px;
}
p{
margin: 0px;
padding: 0px;
}
/* It appears that if you modify the ul padding it tends
 to remove the bullet points, that is if you set the paddign to zero */
ul{
margin: 0px;
}
</style>
</head>
<body>
<p>Paragraph.</p>
<ul>
<li>List item.</li>
<li>Another list item.
<p>List paragraph.</p>
</li>
</ul>
</body>
</html>

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

И к третьему:

Я думаю, что «борозда» правильна относительно пустого <p> Я не сталкиваюсь с этой проблемой, поскольку часто использую <p> все меньше и меньше в своих макетах, однако эта статья выглядела очень интересно, и я думаю, что предлагает лучшее объяснение, чем W3C.

2 голосов
/ 20 февраля 2009

Чтобы ответить на ваш 3-й вопрос;

Второй

как пустой элемент уровня блока просто не будет отображаться.

Вы можете принудительно отобразить элемент как пустой, задав ему высоту или отступ, или включив неразрывный пробел & nbsp; внутри абзаца (возможно, есть и другие способы сделать это).
Нормальные пробелы (например, новые строки, символы табуляции или пробелы), похоже, не работают в этом отношении.

Edit # 2 :: Чтобы правильно проиллюстрировать, как все это работает, сохраните это локально и посмотрите, что рендерится.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <title>Page Title</title>
        <style type="text/css" media="screen">
            p { margin:10px; background-color:#ccc;}
            p.padding { padding:5px; background-color:#eec; }
            p.height { height:30px; background-color:#cee; }

        </style>
    </head>
    <body>

        <p>text</p>
        <p class="padding">i have padding</p>
        <p class="padding"></p>
        <p></p>
        <p></p>
        <p></p>
        <p></p>
        <p>5 empty paragraphs before this, only one will render. (it has padding)</p>
        <p>& nbsp;</p>
        <p>     </p>
        <p>     </p>
        <p>





        </p>
        <p>3 whitespace before me, one will render, it has &amp;nbsp;</p>
        <p class="height">im 30 px high</p>
        <p class="height"></p>
        <p></p>
        <p></p>
        <p>3 empty before me, 1 will show (it has height)</p>
        <p>text</p>
        <p>text</p>

    </body>
</html>
0 голосов
/ 20 февраля 2009

Главное, что вам нужно знать, это то, что смежные (вертикальные) поля просто так, если у вас есть:

p { margin: 1em 0; }
...
<p>Paragraph one</p>
<p>Paragraph two</p>

Расстояние между ними будет 1em, а не 2em.

Заполнение является отдельным. Если бы абзацы имели отступы, они были бы внутри их ящиков. Источником правды для всех этих вещей является стандарт W3C CSS. Например, сворачивающиеся поля :

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

В CSS2 горизонтальные поля никогда не разрушаться.

Вертикальные поля могут упасть между определенные поля:

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

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

Границы немного отличаются, особенно в таблицах , где они могут сворачиваться друг в друга или не зависеть от CSS.

Теперь история не заканчивается там, конечно. Браузеры могут варьироваться в зависимости от того, как они вычисляют комбинации ширины, полей, границ и отступов, но это в значительной степени уменьшается за счет принудительного включения браузеров в стандартный режим (с DOCTYPE) и большой темы сам по себе (как и то, что вы делаете, чтобы минимизировать эти виды проблемы).

0 голосов
/ 20 февраля 2009

Хе-хе, ну ... веб-браузеры разные, я бы сказал, что то, что хорошо с Firefox, обычно хорошо сочетается со стандартом, но это тоже не совсем так.

Согласно xhtml1-strict.dtd только

может быть дочерним по отношению к
...