Margem em colapso com elemento flutuante, por que há uma margem extra adicionada?

Atualizar: o comportamento abaixo não é visível no Firefox.

Vamos começar com a seguinte situação:

html {
  background: red;
}

body {
  margin: 0;
  min-height: 100vh;
  background-color: green;
}

div {
  min-height: 50px;
  background-color: pink;
  margin-bottom: 50px;
}
<div></div>

O corpo é definido com ummin-height:100vh e temos uma barra de rolagem que nos permite ver ohtml. Aqui estamos tendo umcolapso da margem, a margem dodiv é recolhido com a margem do corpo e, portanto, cria esse espaço após o corpo e a barra de rolagem.

Se nos referirmos aoespecificação nós temos este caso:

Duas margens são adjacentes se e somente se:

...

margem inferior de um último filho em fluxo e margem inferior de seu pai, se o pai tiver altura computada 'automática'

adiv é oúltimo fluxo elemento ebody possui height auto, pois especificamos apenas min-height.

Agora vamos adicionar mais elementos que podem ser afetados por essa margem e manter as regras de recolhimento de margem. A única maneira de fazer isso é adicionarflutuou elementos para manter a nossadiv sempre o último elemento em fluxo.

Aqui está o novo código:

html {
  background: red;
}

body {
  margin: 0;
  min-height: 100vh;
  background-color: green;
}

div {
  min-height: 50px;
  background-color: pink;
  margin-bottom: 50px;
}
.l {
  width:45%;
  height:50px;
  float:left;
  margin:0;
}
.r {
  width:45%;
  height:50px;
  float:right;
  margin:0;
}
<div></div>
<div class="l"></div>
<div class="r"></div>

Como podemos ver claramente, ainda temos o colapso da margem (por causa do pergaminho) E os elementos flutuantes também são pressionados pela mesma quantidade da margem.

Então, minha pergunta é:por que esse comportamento?

Meu entendimento do colapso da margem é que, no final, teremos apenas1 margem aplicada em algum lugar. Ao adicionar novos elementos, espero ter uma dessas duas situações:

A adição dos elementos flutuantes cancelará de alguma forma o colapso da margem(não pode ser esse o caso, pois não estamos infringindo nenhuma regra)Os elementos flutuantes não serão afetados pela margem, pois este colapsou com a margem do corpo e, portanto, foi movido / aplicado ao corpo.(Este é um caso lógico para mim)

Na especificação, também encontrei estecomplexo declaração:

Observe que as posições dos elementos que foram recolhidas não afetam as posições dos outros elementos cujas margens estão sendo recolhidas; a posição da borda superior da borda é necessária apenas para definir os descendentes desses elementos.

Entendo, acima, que os outros elementos não são afetados pelo colapso da margem e, assim, mantemos sua posição inicial, o que explica por que os elementos flutuantes são empurrados para baixo.(Eu não tenho certeza se este é o caso, a propósito)


Se essa é a explicação, é um pouco confusa e ilógica para mim. Eu adicionei1 margem e acabo tendodois margens que são claramente visíveis?

Então, por que esse comportamento? Ou talvez eu tenha perdido algo na especificação e estamos enfrentando mais do que um simples colapso de margem?

Notícia importante: Antes de responder, observe que não estou procurando uma correção para isso ou como evitá-lo. Conheço pelo menos cinco maneiras de cancelar o colapso de margens (preenchimento, estouro, borda, flexbox, etc.) Estou procurando entender por que isso acontece.

Para a referência: isso iniciado poressa questão Onde@Alohci destaquei isso na minha resposta e depois de alguns comentários, nós dois não ficamos convencidos

questionAnswers(1)

yourAnswerToTheQuestion