Se você observar as especificações do modelo da caixa CSS , observará o seguinte:
A porcentagem [margem] é calculada com relação à largura do bloco contendo a caixa gerada. Observe que isso também é válido para 'margin-top' e 'margin-bottom'. Se a largura do bloco contido depender desse elemento, o layout resultante será indefinido no CSS 2.1. (ênfase minha)
Isto é realmente verdade. Mas porque ? O que diabos obrigaria alguém a projetá-lo dessa maneira? É fácil pensar em cenários em que você deseja, por exemplo, uma certa coisa sempre a 25% abaixo da parte superior da página, mas é difícil encontrar qualquer motivo para desejar que o preenchimento vertical seja relativo ao tamanho horizontal de o pai.
Aqui está um exemplo do fenômeno ao qual estou me referindo:
<div style="border: 1px solid red; margin: 0; padding: 0; width: 200px; height: 800px;">
This div is 200x800.
<div style="border: 1px solid blue; margin: 10% 0 0 10%;">
This div has top-margin of 10% and left-margin of 10% with respect to its parent.
</div>
</div>
margin: 25%
realmente significa. Não seria uma margem uniforme, mesmo que o código sugira que seja. Não tenho evidências para apoiar isso, mas parece razoável.height: 10%; width: 10%
que não receberá um elemento quadrado, também.Note that in a horizontal flow, percentages on ‘margin-top’ and ‘margin-bottom’ are relative to the width of the containing block, not the height (and in vertical flow, ‘margin-left’ and ‘margin-right’ are relative to the height, not the width).
Assim vai ambas as maneirasRespostas:
Transferindo meu comentário para uma resposta, porque faz sentido lógico. No entanto, observe que essa é uma conjectura infundada. O raciocínio real do motivo pelo qual a especificação é escrita dessa maneira ainda é tecnicamente desconhecido.
Atualização: as últimas frases podem não ser totalmente precisas. A altura do elemento folha (filho sem filhos) afeta a altura de todos os elementos acima dele, portanto, isso afeta muitas situações diferentes.
fonte
h_p
. Um preenchimento de 10% aumentará a altura da criançah_c = h_ci + 0.1h_p
, ondeh_ci
está a altura interna da criança e não depende da altura dos pais. Para um filho, basta encontrar a altura dos pais na equaçãoh_p = h_ci + 0.1h_p
=>h_p = h_ci / 0.9
. Você sempre pode fazer isso, não importa quantos filhos você tenha, mesmo para diferentes estofamentos. É apenas uma incógnita (h_p
) e uma equação.width
resultados no mesmo problema horizontalmente.Para que a margem "n%" (e preenchimento) seja a mesma para margem superior / margem direita / margem inferior / margem esquerda, todos os quatro devem ser relativos à mesma base. Se a parte superior / inferior usasse uma base diferente da esquerda / direita ', a margem "n%" (e o preenchimento) não significariam a mesma coisa nos quatro lados.
(Observe também que a margem superior / inferior em relação à largura permite um hack CSS estranho que permite especificar uma caixa com uma proporção imutável ... mesmo que a caixa seja redimensionada.)
fonte
padding: n [type]
. Então, você teriapadding: 5% logical
(o que o OP sugere) em oposição aopadding: 5% width
segundo parâmetro, que é padronizado como "width" para compatibilidade com versões anteriores.Eu voto na resposta do @ChuckKollars depois de jogar com este JSFiddle (no Chrome 46.0.2490.86) e me referir a esta postagem (escrita em chinês).
Um dos principais motivos contra a conjectura de cálculo infinito é que: o uso
width
enfrenta o mesmo problema de cálculo infinito .Dê uma olhada neste JSFiddle , a
parent
telainline-block
é qualificada para definir margem / preenchimento nela. Ochild
valor da margem20%
. Se seguirmos a conjectura de cálculo infinito :child
depende daparent
parent
depende dachild
Mas, como resultado, o Chrome interrompe o cálculo em algum lugar, resultando:
Se você tentar expandir o painel "resultado" horizontalmente no JSFiddle, verá que a largura deles não será alterada. Observe que o conteúdo no
child
é dividido em duas linhas (não, digamos, uma linha), por quê? Eu acho que o Chrome apenas codifica em algum lugar. Se você editar ochild
conteúdo para torná-lo mais ( JSFiddle ), descobrirá que, enquanto houver espaço extra horizontalmente, o Chrome manterá o conteúdo em duas linhas.Então, podemos ver: existe uma maneira de impedir o cálculo infinito .
Concordo com a conjectura de que: esse projeto serve apenas para manter os quatro valores de margem / preenchimento com base na mesma medida.
este post (escrito em chinês) também propõe outro motivo: é por causa da orientação da leitura / composição. Lemos de cima para baixo, com a largura fixa e a altura infinita (virtualmente).
fonte
Percebo que o OP está perguntando por que a especificação CSS define as porcentagens da margem superior / inferior como um% da largura (e não, como seria de se supor, altura), mas achei que também seria útil publicar uma solução em potencial.
A maioria dos navegadores modernos oferece suporte a vw e vh agora, o que permite especificar números de margem em relação à largura e altura da janela de exibição.
100vw / 100vh é igual a 100% de largura / 100% de altura (respectivamente) se não houver barra de rolagem; se houver uma barra de rolagem, os números da janela de visualização não são responsáveis por isso (enquanto os% de números fazem). Felizmente, quase todos os navegadores usam tamanhos de barra de rolagem de 17px ( veja aqui ), para que você possa usar a função css calc para explicar isso. Se você não souber se uma barra de rolagem será exibida ou não, esta solução não funcionará.
Por exemplo: Supondo que nenhuma barra de rolagem horizontal, uma margem superior de 50% da altura, poderia ser definida como "margem superior: 50vh;". Com uma barra de rolagem horizontal, isso pode ser definido como "margem superior: calc (0,5 * (100vh - 17px))"; (lembre-se de que os operadores menos e mais no calc exigem espaços de ambos os lados!).
fonte