Непоследовательное выравнивание плавающего элемента - PullRequest
2 голосов
/ 25 апреля 2020

РЕЗЮМЕ

Плавающий элемент демонстрирует непоследовательное вертикальное выравнивание со смежным неплавающим элементом, эта изменчивость зависит от значения border-top-width и значения overflow контейнера или родительского элемента. Что дает?


Фон

Я столкнулся с этой ситуацией, когда практиковался с макетом, включающим <img> элементы. Я только начал самостоятельно изучать HTML / CSS в прошлом месяце, так что прочитайте мне немного лекций, если это связано с чем-то фундаментальным, что я упустил из виду.

Подробности

В контейнере <div> есть плавающий элемент и неплавающий элемент блока.

Плавающий элемент (p1) имеет фиксированную ширину и поле 0. Он плавает в любом левом / правом направлении. Это начальный плавающий элемент (т. Е. Первый в строке для всплытия в сторону ячейки с содержимым).

Смежный элемент (p2) представляет собой неплавающий блок, который оборачивается вокруг p1. Обратите внимание, что ненулевое значение поля преднамеренно задано для p2 здесь, чтобы показать, что p1 и p2 не выровнены под одним из сценариев ios, описанных ниже.

Содержащий элемент <div> имеет 0 padding.

При этой настройке я обнаружил, что существует как минимум два способа, которыми плавающий элемент (p1) может позиционироваться относительно border-top-width и overflow:

  1. Плавающий элемент (p1) выравнивается со смежным неплавающим элементом (p2) (т. Е. Верхняя граница блока p1 совпадает с верхней границей блока p2).

    CSS Правила:
    div {border-top-width: 0px;}
    и
    div {overflow: visible;}

  2. Плавающее вместо этого элемент (p1) выравнивается с верхней границей содержащего ящика или родительского элемента.

    CSS Правила:
    div {border-top-width: non-0px;}
    или
    div {overflow: auto/hidden/scroll/}

Обратите внимание, что в случае 2 достаточно одного правила для включения выравнивания.

Код

Слишком упрощенный код будет выглядеть примерно так:

HTML

<div>
    <img src="example.jpg">
    <p>Random text</p>
</div>


CSS

img {
    float: left;
}

/* floating element aligns with adjacent element */

div {
    border: none;
    overflow: visible;
}

или

/* floating element aligns with top border of container */

div {
    border-top-width: 1px;
    overflow: auto;
}


Я поставил пример на jsfiddle: https://jsfiddle.net/tLumj9x7/

Или вы можете проверить его с помощью фрагмента ниже:

/* <body>, <div> margin set to 0 to avoid interference  */
body {
  margin: 0px;
}

div {
  margin: 0px;
}

/* border drawn above the paragraphs to denote top border of 2nd <div> */
.div1 {
  border-bottom: 1px solid;
}

p {
  border: 1px solid;
}

/* floating paragraph: margin set to 0 to highlight unusual alignment */
.p1 {
  float: left;
  margin: 0px;
  width: 400px;
}

/* note that a <p> element has a default margin of 1em, so this declaration is just for demonstration */
.p2 {
  margin: 16px;
}

input#border:checked~div.div2 {
  border-top: 0.02px solid transparent;
}

input#overflow:checked~div.div2 {
  overflow: auto;
}
<form>
  <input type="checkbox" name="border" id="border" />container border-top-width: non-0<br />
  <input type="checkbox" name="overflow" id="overflow" />container overflow: auto / hidden/ scroll<br />
  <div class="div1">
  </div>
  <div class="div2">
    <p class="p1">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    </p>
    <p class="p2">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
      dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    </p>
  </div>
</form>


Вопросы

  1. Как точно определяется положение исходного плавающего элемента в отношении к содержащему его элементу (в нашем случае блоку <div>)?

  2. Какое свойство border-top-width имеет какое-либо отношение к "привязке" плавающего элемента-стартапа?

  3. То же самое с overflow собственность. С точки зрения свойств, как overflow влияет на коробку контейнера "структурно"?

  4. Из двух сценариев ios выше, которые показывают позиционирование "по умолчанию" для начала плавания элемент, если вообще?

  5. На другом, но связанном примечании. Если я размещу поле вокруг плавающего элемента p1, который плавает влево, его левое поле сжимается с левым полем соседнего неплавающего элемента p2. Это стандартное поведение? Я читал, что поле плавающих элементов не разрушается, поэтому я не уверен, правильно ли я понял эту концепцию.

Это мой первый пост на stackoverflow, поэтому спасибо, что прочитали мой вопрос! Я новичок в веб-разработке и с нетерпением жду ваших ответов.

Ответы [ 2 ]

1 голос
/ 25 апреля 2020
  1. Плавающая коробка будет размещена вертикально на уровне, где она была бы, если бы она не была плавающей. В данном случае, когда это первый элемент в его контейнере, его верхний край совпадает с верхом поля содержимого его контейнера. (Разница в эффекте, который вы видите, заключается в том, что поле содержимого контейнера div перемещается вверх и вниз.)

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

  3. Побочным эффектом overflow:auto является то, что он заставляет div устанавливать sh контекст форматирования блока. Поля потомков контекста форматирования блока не будут свернуты с полями элемента, который устанавливает контекст форматирования блока. Более прямой, но более новый способ заставить div устанавливать sh контекст форматирования блока - дать ему настройку display:flow-root.

  4. По умолчанию смежные вертикальные поля блок-боксы в потоке разрушаются. Таким образом, верхнее поле по умолчанию для элемента p (p2) сворачивается с верхними полями элементов div и body, увеличивая поле над верхом поля содержимого элемента div и, следовательно, толкая плавающий элемент ниже.

  5. Сокращение полей влияет на вертикальные поля. При горизонтальных полях вы видите не коллапс, а другой эффект. p1 и p2 перекрывают друг друга. p2 точно не оборачивается вокруг p1, его содержание делает. Что происходит, так это то, что p2 состоит из стека линейных блоков. Левый край каждого линейного блока, который находится рядом с p1, совпадает с правым краем поля p1. Левое поле p2 по-прежнему касается левого края содержимого блока div, точно так же, как p1 вообще не было, поэтому оно не повлияет на положение левого края этих линейных блоков, если только левое поле, граница и отступы p2 не будут больше ширины поля поля p1.

0 голосов
/ 26 апреля 2020

Пытаюсь ответить на мои собственные вопросы, основываясь на ответе Алочи, чтобы понять, правильно ли я понял идеи. Спасибо, Alochi!

  1. По сути, если плавающий блок является первым элементом в его контейнере, его вертикальное выравнивание ведет себя так же, как его неплавающий аналог в своем контейнере (минус поле коллапс). То есть внешний верхний край плавающего блока (в зависимости от его margin, border) совпадает с краем содержимого содержащего блока (т. Е. Родительского элемента).

  2. В случае, если border-top-width имеет значение 0 или нет, позиционирование плавающего блока на самом деле непротиворечиво, так как его внешний верхний край совпадает с краем содержимого его содержащего блока. Разница заключается в следующем: 1) При отсутствии границы вокруг содержащего блока (его border-top-width равен 0), поле неплавающего блока, смежного с плавающим блоком (в нашем случае p2), сжимается с полем содержащий блок, независимо от того, равен ли контейнер margin 0 или нет, оставляя визуальное впечатление, что плавающий блок без полей выровнен с соседним не плавающим элементом; 2) Если border-top-width не равно 0 вокруг содержащего блока, то верхний край поля не плавающего блока совпадает с верхним краем содержимого содержащего блока, так как наличие границы вокруг контейнера отделяет его поле от его потомков, оставляя визуальное впечатление, что плавающий блок без полей выровнен с контейнером, а не с соседним не плавающим блоком.

Спасибо за уточнение. Это также, как я первоначально пытался рационализировать поведение выравнивания. С тех пор я вырыл глубже и нашел правила, регулирующие размещение поплавка здесь . Правило № 8 гласит, что «плавающая коробка должна быть расположена как можно выше», а правило № 4 гласит, что «внешняя верхняя часть плавающей коробки не может быть выше верхней части содержащего ее блока».

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

Спасибо за совет о контексте форматирования блока! Я не знал о концепции. Мне интересно, каким был бы контекст форматирования перед форматированием блока, если он есть?

Поскольку большинство элементов блока по умолчанию не имеют границы (например, <html>, <body>, <div>, а их overflow видимы по умолчанию, сценарий "по умолчанию" будет что плавающий блок, по-видимому, выравнивается с соседним не плавающим блоком, потому что любой запас, который есть у последнего, сворачивается с верхним полем содержащего блока.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...