оригинал:Woohoo.smashing magazine.com/2019/07/ругаться…
Переводчик: Front-end Xiaozhi
Ставь лайк и смотри, поиск в WeChat【Переезд в мир】Обратите внимание на этого человека, который не имеет большого фабричного прошлого, но имеет восходящий и позитивный настрой. эта статья
GitHub
GitHub.com/QQ449245884…Он был включен, статьи были классифицированы, и многие мои документы и учебные материалы были систематизированы.
Все говорили, что нет проекта для написания резюме, поэтому я помог вам найти проект, и это было с бонусом.【Учебник по строительству】.
Когда мы изучаем CSS, первое, что большинство из нас изучает, — это детали различных частей блока в CSS, которые называются блоками CSS, моделями. Одним из элементов «коробочной модели» являетсяmargin
, прозрачная область вокруг блока, которая отодвигает другие элементы от содержимого блока.
описано в CSS1margin-top
,margin-right
,margin-bottom
а такжеmargin-left
свойства и сокращение для одновременной установки всех четырех свойствmargin
.
margin
Казалось бы, довольно простая вещь, но в этой статье мы рассмотрим некоторые изmargin
一些让人迷惑有有趣的事情。 особенно,margin
Как взаимодействие между иmargin
Чтобы читать больше качественных статей, пожалуйстаПосетите блог GitHub
Блочная модель CSS
Блочная модель CSS относится к частям блока —content
,padding
,border
а такжеmargin
, как они были выложены и взаимодействовали друг с другом раньше, следующим образом:
коробка из четырехmargin
свойства иmaring
Все сокращения определены в CSS1.
Спецификация CSS2.1 содержит иллюстрацию, демонстрирующую блочную модель, а также определяет термины, используемые для описания различных боксов, в том числеcontent box
,наполнятьpadding box
,border box
а такжеmargin box
.
теперь естьLevel 3 Box Model specificationчерновик. Эта спецификация ссылается на CSS2 как на блочную модель иmargin
, поэтому в большей части этой статьи мы будем использовать определение CSS2.
перекрытие полей
Спецификация CSS1 определяетmargin
, который также определяет вертикальmargin
перекрытие. Если учесть, что в первые дни в качестве языка форматирования документов использовался CSS, тоmargin
margin
margin
Когда двоеmargin
发生重叠时,它们将组合在一起,两个元素之间的空间取较大的一个。 меньшеmargin
В большей внутри.
- соседние братья и сестры
- Полностью пустая коробка
- Родительский элемент и первый или последний дочерний элемент
Обратите внимание, чтобы посмотреть на эти сцены.
соседние братья и сестры
правильноmargin
Первоначальное описание перекрытия должно было продемонстрировать перекрытие между соседними братьями и сестрами.margin
как это пересекается. За исключением случаев, упомянутых ниже, если два элемента отображаются один за другим в обычном потоке, то нижняя часть первого элементаmargin
будет с верхней частью элемента нижеmargin
Перекрываются вместе.
В приведенном ниже примере ниже есть триdiv
элемент. Первыйdiv
верх и низmargin
обе50px
. второйdiv
Верх и низmargin
обе20px
. Третийdiv
верх и низmargin
обе3em
.前两个元素之间的margin
да50px
, потому что меньшая вершинаmargin
с большим дномmargin
Объединить. Поле между вторым элементом и третьим элементом равно3em
,потому что3em
больше основания второго элементаmargin
20 пикселей.
html
<div class="wrapper">
<div class="box example1">
margin-top: 50px; margin-bottom: 50px;
</div>
<div class="box example2">
margin-top: 20px; margin-bottom: 20px;
</div>
<div class="box example3">
margin-top: 3em; margin-bottom: 3em;
</div>
</div>
css
.wrapper {
border: 5px dotted black;
}
.example1 {
margin: 50px 0 50px 0;
}
.example2 {
margin: 20px 0 20px 0;
}
.example3 {
margin: 3em 0 3em 0;
}
body {
font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif;
margin: 2em 3em;
}
.box {
background-color: rgb(55,55,110);
color: white;
padding: 20px;
border-radius: .5em;
}
текущий результат:
совершенно пустая коробка
Если коробка пуста, то ее верх и низmargin
могут перекрывать друг друга. В приведенном ниже примереclass
дляempty
верх и низ элементаmargin
каждый для50px
, но между первым и третьим срокамиmargin
нет100px
, но50px
.这是由于两个margin
margin
сливаться.
html
div class="wrapper">
<div class="box">
A box
</div>
<div class="box empty"></div>
<div class="box">
Another box
</div>
</div>
css
.wrapper {
border: 5px dotted black;
}
body {
font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif;
margin: 2em 3em;
}
.box {
background-color: rgb(55,55,110);
color: white;
border-radius: .5em;
}
.empty {
margin: 50px 0 50px 0;
}
текущий результат:
Родительский элемент и первый или последний дочерний элемент
Перекрывающиеся поля могут удивить, потому что иногда это не очень интуитивно понятно. В приведенном ниже примере есть класс с именемwrapper
изdiv
outline
этоdiv
Три дочерних элемента внутриmargin
обе50px
. Но вы обнаружите, что фактический эффект заключается в том, что первый и последний элементы связаны с родительским элементом.margin
Заподлицо, как будто дочерний элемент находится не между элементами, а родительскими элементами50px
изmargin
Такой же.
html
<div class="wrapper">
<div class="box">
Item 1
</div>
<div class="box">
Item 2
</div>
<div class="box">
Item 3
</div>
</div>
css
.wrapper {
outline: 1px solid red;
}
.box {
margin: 50px;
}
body {
font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif;
margin: 2em 3em;
}
.box {
background-color: rgb(55,55,110);
color: white;
padding: 20px;
border-radius: .5em;
}
текущий результат:
Это потому, что дочерний узелmargin
будет следовать за любой стороной родительского узлаmargin
перекрываются друг с другом и, таким образом, оказываются снаружи родительского узла. Вы можете увидеть это, если вы проверите первый дочерний элемент с помощью DevTools, показанная желтая областьmargin
.
Только блок-элемент Margis перекрывается
В CSS2 указывается только вертикальное направление.margin
Перекрытие, верхнее и нижнее поля элемента. Таким образом, левое и правое поля выше не перекрываются.
Стоит отметить, что поля перекрываются только в направлении блока, например, между абзацами.
Предотвратить перекрывающуюся маржу
Если элемент имеет абсолютное позиционирование или плавающий, то онmargin
Например, полностью пустая коробка, если он имеетborder
илиpadding
margin
Не пересекайтесь. В следующем примере пустая коробка для добавления 1PXpadding
.现在这个空盒子的的上方和下方都有一个50px
изmargin
.
html
<div class="wrapper">
<div class="box">
A box
</div>
<div class="box empty"></div>
<div class="box">
Another box
</div>
</div>
css
.wrapper {
border: 5px dotted black;
}
body {
font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif;
margin: 2em 3em;
}
.box {
background-color: rgb(55,55,110);
color: white;
border-radius: .5em;
}
.empty {
margin: 50px 0 50px 0;
padding: 1px;
}
текущий результат:
border
илиpadding
, это в принципе незаметно. Это может быть элемент абзаца, отмеченный в CMS как пустой. Если ваша CMS добавляет дополнительные элементы абзаца, вы, вероятно, не хотите, чтобы они создавали большие пробелы между другими абзацами, и перекрытие полей имеет смысл.
Для родительского элемента и первого или последнего дочернего элемента поля перекрываются, если мы добавим к родительскомуborder
, то на ребенкаmargin
Мы останемся внутри.
...
.wrapper {
border: 5px dotted black;
}
...
margin
.当web主要是文本时,这很有意义。当我们使用元素来布局设计时,它的重叠行为就没有多大的意义了。
, — это режим рендеринга CSS макета блочной модели на веб-странице, который относится к независимой области рендеринга или изолированному независимому контейнеру.
BFC предотвращает наложение полей. Если мы снова посмотрим на пример родительского элемента и первого или последнего дочернего элемента, мы можем добавить элемент-оболочкуdisplay: flow-root
создаст новый BFC, предотвращаяmargin
сливаться
...
.wrapper {
outline: 1px solid red;
display: flow-root;
}
...
display: flow-root
— это новое свойство в CSS3 для создания BFC без побочных эффектов. Будуoverflow
Значение свойства установлено вauto
Будет иметь тот же эффект, поскольку это также создает новый BFC, хотя также может создавать некоторые полосы прокрутки, которые не нужны в некоторых сценах.
гибкие и сеточные контейнеры
flex
а такжеgrid
Контейнер создается для своих дочерних элементовflex
а такжеgrid
Форматирование контекстов, чтобы они также предотвращалиmargin
перекрытие.
Или возьмите приведенный выше пример в качестве примера, измените оболочку, чтобы использовать flex layout:
...
.wrapper {
outline: 1px solid red;
display: flex;
flex-direction: column;
}
...
маржинальная стратегия сайта
из-заmargin
будут перекрываться, лучше найти последовательный способ обработки сайтаmargin
. Самый простой способ - просто определить вверху или внизу элементаmargin
. Таким образом, вы редко сталкиваетесь с проблемами с перекрывающимися полями, потому чтоmargin
Край всегда безmargin
Края смежны.
Это решение не решает проблемы, с которыми вы можете столкнуться, поскольку дочерний элементmargin
будет перекрываться с родительским элементом. Эта конкретная проблема, как правило, менее распространена, но знание того, почему это происходит, может помочь вам найти решение.
display: flow-root
overflow
СоздайтеBFC
flex
padding
решать.
процентная маржа
Когда вы используете процент в CSS, он должен быть процентом элемента. Margin (или прокладки), использующие процентную настройку, всегда является процентом встроенного размера родительского элемента (ширина в горизонтальном режиме записи). Это означает, что при использовании процента элементы вокругpadding
Размеры все одинаковы.
В приведенном ниже примере есть d шириной 200 пикселей, когда внутри находится класс с именемbox
изdiv
,этоmargin
значение10%
, то есть,20px
(200 * 10%).
html
<div class="wrapper">
<div class="box">
I have a margin of 10%.
</div>
</div>
css
* {
box-sizing: border-box;
}
.wrapper {
border: 5px dotted black;
width: 200px;
}
.box {
background-color: rgb(55,55,110);
color: white;
padding: 20px;
border-radius: .5em;
margin: 10%;
}
body {
font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif;
margin: 2em 3em;
}
Мы говорили о вертикальных полях по всей этой статье, однако современные CSS имеют тенденцию думать о вещах в отношении потока, а не физическим способом. Поэтому, когда мы говорим о вертикальных полях, мы на самом деле говорим о полях в блочном измерении. Если мы находимся в режиме горизонтального письма, этиmargin
будут сверху и снизу, но в режиме вертикального письма этиmargin
будет правым и левым.
Как только используется логическое, связанное с потоком направление, легче говорить о начале и конце блока, а не о его верхней и нижней частях. Чтобы упростить этот процесс, CSS вводит логические спецификации свойств и значений. Это сопоставляет соответствующие свойства потока с физическими свойствами.
- margin-top = margin-block-start
- margin-right = margin-inline-end
- margin-bottom = margin-block-end
- margin-left = margin-inline-start
Есть также две новые комбинации клавиш для установки двух блоков или двух встроенных блоков одновременно.
- margin-block
- margin-inline
В приведенном ниже примере, используя эти ключевые слова, связанные с потоком, а затем изменяя режим записи поля, вы можете увидетьmargin
как следовать направлению текста:
html
<div class="wrapper horizontal-tb">
<div class="box">
A box with a horizontal-tb writing mode.
</div>
</div>
<div class="wrapper vertical-rl">
<div class="box">
A box with a vertical-rl writing mode.
</div>
</div>
css
* {
box-sizing: border-box;
}
.wrapper {
border: 5px dotted black;
inline-size: 200px;
}
.horizontal-tb {
writing-mode: horizontal-tb;
margin-bottom: 1em;
}
.vertical-rl {
writing-mode: vertical-rl;
}
.box {
background-color: rgb(55,55,110);
color: white;
padding: 20px;
border-radius: .5em;
margin-block-start: 30px;
margin-block-end: 10px;
margin-inline-start: 2em;
margin-inline-end: 5%;
}
body {
font: 1.4em/1.3 "Gill Sans", "Gill Sans MT", Calibri, sans-serif;
margin: 2em 3em;
}
Нужно знать больше, вы можете прочитать оMDNДополнительные сведения о логических свойствах и значениях.
Ошибки, которые могут существовать после развертывания кода, не могут быть известны в режиме реального времени.Чтобы решить эти ошибки впоследствии, много времени тратится на отладку журнала.Кстати, я рекомендую всем полезный инструмент мониторинга ошибок.Fundebug.
общаться с
Статья постоянно обновляется каждую неделю. Вы можете выполнить поиск «Big Move to the World» в WeChat, чтобы прочитать и обновить ее как можно скорее (на одну или две статьи раньше, чем в блоге). Эта статья находится на GitHub.GitHub.com/QQ449245884…Он был включен, и многие мои документы были разобраны. Добро пожаловать в Звезду и совершенство. Вы можете обратиться в тестовый центр для ознакомления во время собеседования. Кроме того, обратите внимание на паблик-аккаунт и ответьте в фоновом режиме.Благосостояние, вы можете увидеть преимущества, вы знаете. )