Spec-Zone.ru › CSS

Макет блочных и инлайновых элементов в нормальном потоке

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

Нормальный поток определен в спецификации CSS 2.1, которая объясняет, что любые блоки в нормальном потоке будут частью форматирующего контекста. Они могут быть либо блочными, либо инлайновыми, но не тем и другим одновременно. Мы описываем блочные элементы как участвующие в блочном форматирующем контексте, а инлайновые элементы — как участвующие во встроенном форматирующем контексте.

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

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

Для элементов с инлайновым форматирующим контекстом:

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

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

Элементы, участвующие в блочном форматирующем контексте

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

Inline direction is horizontal. Block direction is vertical.

В вертикальном режиме записи они выстраивались бы горизонтально.

Inline direction is vertical. Block direction is horizontal.

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

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

<div class="box">
  <p>
    One November night in the year 1782, so the story runs, two brothers sat
    over their winter fire in the little French town of Annonay, watching the
    grey smoke-wreaths from the hearth curl up the wide chimney. Their names
    were Stephen and Joseph Montgolfier, they were papermakers by trade, and
    were noted as possessing thoughtful minds and a deep interest in all
    scientific knowledge and new discovery.
  </p>
  <p>
    Before that night—a memorable night, as it was to prove—hundreds of millions
    of people had watched the rising smoke-wreaths of their fires without
    drawing any special inspiration from the fact.
  </p>
</div>
p {
  border: 2px solid green;
}

Если мы установим отступы для элемента абзаца на 0 , то границы соприкоснутся.

<div class="box">
  <p>
    One November night in the year 1782, so the story runs, two brothers sat
    over their winter fire in the little French town of Annonay, watching the
    grey smoke-wreaths from the hearth curl up the wide chimney. Their names
    were Stephen and Joseph Montgolfier, they were papermakers by trade, and
    were noted as possessing thoughtful minds and a deep interest in all
    scientific knowledge and new discovery.
  </p>
  <p>
    Before that night—a memorable night, as it was to prove—hundreds of millions
    of people had watched the rising smoke-wreaths of their fires without
    drawing any special inspiration from the fact.
  </p>
</div>
p {
  border: 2px solid green;
  margin: 0;
}

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

<div class="box">
  <p>
    One November night in the year 1782, so the story runs, two brothers sat
    over their winter fire in the little French town of Annonay, watching the
    grey smoke-wreaths from the hearth curl up the wide chimney. Their names
    were Stephen and Joseph Montgolfier, they were papermakers by trade, and
    were noted as possessing thoughtful minds and a deep interest in all
    scientific knowledge and new discovery.
  </p>
  <p>
    Before that night—a memorable night, as it was to prove—hundreds of millions
    of people had watched the rising smoke-wreaths of their fires without
    drawing any special inspiration from the fact.
  </p>
</div>
p {
  border: 2px solid green;
  width: 40%;
}

Схлопывание отступов

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

В примере ниже абзацы имеют верхний отступ 20px и нижний отступ 40px. Размер отступа между абзацами составляет 40px , поскольку меньший верхний отступ во втором абзаце схлопнулся с большим нижним отступом первого.

<div class="box">
  <p>
    One November night in the year 1782, so the story runs, two brothers sat
    over their winter fire in the little French town of Annonay, watching the
    grey smoke-wreaths from the hearth curl up the wide chimney. Their names
    were Stephen and Joseph Montgolfier, they were papermakers by trade, and
    were noted as possessing thoughtful minds and a deep interest in all
    scientific knowledge and new discovery.
  </p>
  <p>
    Before that night—a memorable night, as it was to prove—hundreds of millions
    of people had watched the rising smoke-wreaths of their fires without
    drawing any special inspiration from the fact.
  </p>
</div>
p {
  border: 2px solid green;
  margin: 20px 0 40px 0;
}

Вы можете узнать больше о схлопывании отступов в нашей статье Освоение схлопывания отступов.

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

Screen shot box model panel in browser dev tools which shows the four values for margin, border, and padding along with height and width in a graphic at top and lists box-sizing, display, float, line-height, position, and z-index below the graphic.

Элементы, участвующие во встроенном форматирующем контексте

Инлайновые элементы отображаются один за другим в направлении, в котором пишутся предложения в конкретном режиме записи. Хотя мы не склонны думать об инлайновых элементах как о блоках, как и со всем в CSS, они таковыми являются. Эти инлайновые блоки выстраиваются один за другим. Если в содержащем блоке недостаточно места для всех блоков, блок может перейти на новую строку. Созданные строки известны как строковые блоки.

В следующем примере у нас есть три инлайновых блока, созданные абзацем с элементом <strong> внутри него.

<p>
  Before that night—<strong>a memorable night</strong>, as it was to
  prove—hundreds of millions of people had watched the rising smoke-wreaths of
  their fires without drawing any special inspiration from the fact.
</p>

Блоки вокруг слов перед элементом <strong> и после элемента </strong> называются анонимными блоками, блоками, добавленными для обеспечения того, что всё содержится в блоке, но которыми мы не можем напрямую управлять.

Размер строкового блока в направлении блока (то есть высота при работе в английском языке) определяется самым высоким блоком внутри него. В следующем примере элемент <strong> имеет высоту 300%; так как это содержимое занимает две строки, оно теперь определяет высоту строковых блоков этих двух строк.

<p>
  Before that night—<strong>a memorable night</strong>, as it was to
  prove—hundreds of millions of people had watched the rising smoke-wreaths of
  their fires without drawing any special inspiration from the fact.
</p>
strong {
  font-size: 300%;
}

Узнайте больше о поведении блочных и инлайновых блоков в нашем руководстве по Визуальной модели форматирования.

END_OF_DOCUMENT_MARKER ```

Свойство display и выстраивание элементов

Помимо правил, существующих в CSS2.1, новые уровни CSS описывают поведение блочных и инлайновых блоков. Свойство display определяет, как ведут себя блок и любые блоки внутри него. В модели отображения CSS уровня 3 мы можем узнать больше о том, как свойство display изменяет поведение блоков и блоков, которые они генерируют.

Тип отображения элемента определяет внешний тип отображения; это диктует, как блок отображается рядом с другими элементами в том же контексте форматирования. Он также определяет внутренний тип отображения, который диктует, как блоки внутри этого элемента ведут себя. Мы можем очень наглядно увидеть это, рассматривая гибкую компоновку. В примере ниже у меня есть <div>, которому я присвоил display: flex. Контейнер с гибкой компоновкой ведет себя как блочный элемент: он отображается на новой строке и занимает все доступное пространство в направлении в строку. Это внешний тип отображения block.

Однако элементы с гибкой компоновкой участвуют в контексте форматирования гибкой компоновки, потому что их родительский элемент имеет display: flex, который имеет внутренний тип отображения flex, устанавливая контекст форматирования гибкой компоновки для непосредственных дочерних элементов.

<div class="container">
  <div>Flex Item</div>
  <div>Flex Item</div>
  <div>
    <div>Children</div>
    <div>are in</div>
    <div>normal flow</div>
  </div>
</div>
.container {
  display: flex;
}

.container > * {
  border: 1px solid green;
}

Таким образом, вы можете представить себе, что каждый блок в CSS работает таким образом. Сам блок имеет внешний тип отображения, поэтому он знает, как вести себя рядом с другими блоками. Затем у него есть внутренний тип отображения, который изменяет поведение его дочерних элементов. Эти дочерние элементы также имеют внешний и внутренний тип отображения. Элементы с гибкой компоновкой в предыдущем примере становятся блоками уровня гибкой компоновки, поэтому их внешний тип отображения определяется тем, что они являются частью контекста форматирования гибкой компоновки. Однако их внутренний тип отображения — поток, что означает, что их дочерние элементы участвуют в обычном потоке. Элементы, вложенные внутри нашего элемента с гибкой компоновкой, выстраиваются как блочные и инлайновые элементы, если только что-то не изменит их тип отображения.

Это понятие внешнего и внутреннего типа отображения важно, так как оно показывает, что контейнер, использующий метод компоновки, такой как flexbox (display: flex) и сетку (display: grid), по-прежнему участвует в блочной и инлайновой компоновке, поскольку внешний тип отображения этих методов равен block.

Изменение контекста форматирования, в котором участвует элемент

Браузеры отображают элементы в блочном или инлайновом контекстах форматирования, основываясь на том, что обычно имеет смысл для данного элемента. Например, элемент <strong> используется для выделения фрагмента текста и по умолчанию отображается в браузере жирным шрифтом. Обычно не имеет смысла отображать этот <strong> элемент как блочный элемент, разбивая его на новую строку. Если вам нужно, чтобы все <strong> элементы отображались как блочные, вы можете сделать это, задав strong { display: block; }. Возможность стилизовать контент с помощью CSS означает, что вы всегда можете использовать наиболее подходящие семантические HTML-элементы для разметки контента, а затем изменять способ их отображения с помощью CSS.

<p>
  Before that night—<strong>a memorable night</strong>, as it was to
  prove—hundreds of millions of people had watched the rising smoke-wreaths of
  their fires without drawing any special inspiration from the fact.
</p>
strong {
  display: block;
}

Заключение

В этом руководстве мы рассмотрели, как элементы отображаются в обычном потоке, как блочные и инлайновые элементы. Благодаря этому поведению по умолчанию HTML-документ без стилей CSS будет отображаться в читаемом виде. Понимание работы обычного потока упростит компоновку, поскольку вы поймёте начальную точку для внесения изменений в способ отображения элементов.

См. также

  • Базовая модель блоков CSS
  • Обычный поток - Изучение компоновки
  • Элементы инлайнового уровня
  • Элементы блочного уровня

© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_flow_layout/Block_and_inline_layout_in_normal_flow

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API