Quando usar margem versus preenchimento em CSS [fechado]

2357

Ao escrever CSS, existe uma regra ou diretriz específica que deve ser usada para decidir quando usar margine quando usar padding?

Alex Angas
fonte
Use paddinga <a>tag quando você quiser aumentar a área focusable .
Josh Habdas

Respostas:

1586

TL; DR: Por padrão, uso margem em todos os lugares, exceto quando tenho uma borda ou plano de fundo e quero aumentar o espaço dentro dessa caixa visível.

Para mim, a maior diferença entre preenchimento e margem é que as margens verticais colapsam automaticamente e o preenchimento não.

Considere dois elementos um acima do outro, cada um com preenchimento de 1em. Esse preenchimento é considerado parte do elemento e é sempre preservado.

Portanto, você terminará com o conteúdo do primeiro elemento, seguido pelo preenchimento do primeiro elemento, seguido pelo preenchimento do segundo elemento, seguido pelo conteúdo do segundo elemento.

Assim, o conteúdo dos dois elementos acabará sendo 2emseparado.

Agora substitua esse preenchimento pela margem 1em. As margens são consideradas fora do elemento e as margens dos itens adjacentes se sobrepõem.

Portanto, neste exemplo, você terminará com o conteúdo do primeiro elemento seguido pela 1emmargem combinada seguida pelo conteúdo do segundo elemento. Portanto, o conteúdo dos dois elementos é apenas 1emseparado.

Isso pode ser realmente útil quando você sabe que deseja dizer o 1emespaçamento ao redor de um elemento, independentemente de qual elemento ele está próximo.

As outras duas grandes diferenças são que o preenchimento está incluído na região do clique e na cor / imagem do plano de fundo, mas não na margem.

div.box > div { height: 50px; width: 50px; border: 1px solid black; text-align: center; }
div.padding > div { padding-top: 20px; }
div.margin > div { margin-top: 20px; }
<h3>Default</h3>
<div class="box">
  <div>A</div>
  <div>B</div>
  <div>C</div>
</div>

<h3>padding-top: 20px</h3>
<div class="box padding">
  <div>A</div>
  <div>B</div>
  <div>C</div>
</div>

<h3>margin-top: 20px; </h3>
<div class="box margin">
  <div>A</div>
  <div>B</div>
  <div>C</div>
</div>

preto
fonte
51
+1 Ao estilizar tipografia e seqüências abreviadas de parágrafos, títulos e listas, quase sempre é melhor espaçar os elementos com margens devido ao comportamento de colapso da margem adjacente.
Pete B
17
Por que as margens verticais colapsam enquanto as horizontais não? Isso poderia confundir muita gente
Marcos Pereira
16
As margens verticais são recolhidas apenas para elementos de bloco. Para elementos de bloco embutido, as margens são adicionadas vertical e horizontalmente. Portanto, não tenho certeza de que seja um problema que as margens horizontais não entrem em colapso nos elementos do bloco, pois eles enchem seus contêineres de qualquer maneira.
1655 Mike
2
"Por que as margens verticais colapsam enquanto as horizontais não?" não há mecanismo para ter elementos de bloco lado a lado sem o uso de flutuadores - cujas margens nunca caem de qualquer maneira (mesmo na vertical) ou posicionamento absoluto, onde obviamente não há colapso ou bloco embutido, que usa um modelo diferente em que é considerado inline e conteúdo (espaços, texto) é significativo ou outras coisas, como tabelas, caixas flexíveis, colunas em que a diferença entre colunas tem um comportamento especial. Então, em suma, não há lugar que a margem horizontal colapso poderia ser usado mesmo se possível
thomasrutter
5
Além disso, você deve observar que o preenchimento está incluído na largura / altura total do elemento, quando usado com box-sizing: border-box;isso, se você tiver width: 100px; padding-left: 20px;a largura total ainda será 100px, mas a área de conteúdo será reduzida em 20px, ao contrário de box-sizing: content-box;onde o preenchimento é separado no cálculo da largura do conteúdo o que torna a largura total de 120 pixels na caixa de conteúdo;
Jomar Sevillejo
1494

A margem fica do lado de fora dos elementos do bloco, enquanto o preenchimento está do lado de dentro.

  • Use a margem para separar o bloco das coisas fora dele
  • Use estofamento para afastar o conteúdo das bordas do bloco.

insira a descrição da imagem aqui

John Boker
fonte
63
ainda, a resposta correta é por @pavon abaixo. as margens dos elementos adjacentes se sobrepõem, enquanto o preenchimento não se sobrepõe. isto é, a separação total épadding(A) + padding(B) + max(margin(A), margin(B))
necromante
9
Aqui está uma boa prática: use borda vermelha sólida para verificar o preenchimento e a margem. Às vezes, podemos atrapalhar coisas como <a>, que contém algum texto, cercado por preenchimento e margem. Use este truque para verificar quanto espaço podemos clicar.
P3nchan
589

O melhor que eu já vi explicando isso com exemplos, diagramas e até uma visão do tipo 'tente você mesmo' está aqui .

Acho que o diagrama abaixo fornece uma compreensão visual instantânea da diferença.

insira a descrição da imagem aqui

Uma coisa a ter em mente é que os navegadores compatíveis com os padrões (as peculiaridades do IE são uma exceção ) processam apenas a parte do conteúdo na largura especificada, portanto, acompanhe isso nos cálculos de layout. Observe também que a caixa de borda está tendo um retorno com o Bootstrap 3 suportando-a.

Scott
fonte
91

Há mais explicações técnicas para sua pergunta, mas se você estiver procurando uma maneira de pensar em margem e preenchimento que o ajudará a escolher quando e como usá-los, isso pode ajudar.

Compare os elementos do bloco com as imagens penduradas na parede:

  • A janela do navegador é exatamente como a parede.
  • O conteúdo é como uma fotografia.
  • A margem é exatamente como o espaço da parede entre as fotos emolduradas.
  • O preenchimento é exatamente como o tapete em torno de uma foto.
  • A borda é exatamente como a borda de um quadro.

Ao decidir entre margem e preenchimento, é uma boa regra usar margem quando você está espaçando um elemento em relação a outras coisas na parede e preenchimento quando você está ajustando a aparência do próprio elemento. A margem não altera o tamanho do elemento, mas o preenchimento geralmente aumenta o elemento 1 .

1 Este modelo de caixa padrão pode ser alterado com o box-sizingatributo .

stvnrynlds
fonte
Na verdade, eu não concordo em box-sizing: border-boxtornar "o espaço para o conteúdo menor". Aqui está um violino com 2 caixas onde, se eu mantivesse o mesmo preenchimento e adicionasse "Ativo", "Desativar" ao passar o mouse, não importava se eu usasse box-sizing. Ainda expandiria a caixa. Eu tive que maximizar o preenchimento o máximo que a caixa expandir, e usar tentativa e erro para criar uma combinação correspondente para as outras palavras inseridas na caixa que manteriam a mesma largura para cada palavra: jsfiddle.net / navyjax2 / ngzqqjah
vapcguy
3
Ei vapcguy, obrigado pela sua contribuição. Minha declaração geralmente é verdadeira, quando a largura ou a altura são declaradas para um elemento, enquanto um elemento com dimensões não declaradas não é realmente afetado por border-box(consulte: jsfiddle.net/8yravLmL/1 ). Vou tornar minha resposta mais sutil para evitar confusão.
Stvnrynlds
86

MARGIN vs PADDING :

  1. Margem é usada em um elemento para criar distância entre esse elemento e outros elementos da página. Onde o preenchimento é usado para criar distância entre o conteúdo e a borda de um elemento.

  2. A margem não faz parte de um elemento em que o preenchimento faz parte do elemento.

Consulte a imagem abaixo extraída de Margin Vs Padding - CSS Properties

Margin vs Padding

Touhid Rahman
fonte
Fazendo referência à borda, em vez da vaga 'Margem, é do lado de fora dos elementos do bloco, enquanto o preenchimento é do lado de dentro'. fora / dentro de quê? E fora / dentro sugere uma posição estática, não que afete o tamanho do elemento que a contém. Esta resposta esclareceu para mim.
precisa
51

De https://www.w3schools.com/css/css_boxmodel.asp

Explicação das diferentes partes:

  • Conteúdo - o conteúdo da caixa, onde o texto e as imagens aparecem

  • Preenchimento - Limpa uma área ao redor do conteúdo. O estofamento é transparente

  • Borda - uma borda que circunda o preenchimento e o conteúdo

  • Margem - Limpa uma área fora da borda. A margem é transparente

Ilustração do modelo de caixa CSS

Exemplo ao vivo (altere os valores): https://www.w3schools.com/css/tryit.asp?filename=trycss_boxmodel

Pulkit Anchalia
fonte
1
Obrigado. Uma imagem vale mais que mil palavras!
Catbuilts
33

Aqui está um HTML que demonstra como paddinge marginafeta a clicabilidade e o preenchimento em segundo plano. Um objeto recebe cliques no preenchimento, mas os cliques na área da margem dos objetos vão para o pai.

$(".outer").click(function(e) {
  console.log("outer");
  e.stopPropagation();
});

$(".inner").click(function(e) {
  console.log("inner");
  e.stopPropagation();
});
.outer {
  padding: 10px;
  background: red;
}

.inner {
  margin: 10px;
  padding: 10px;
  background: blue;
  border: solid white 1px;
}
<script src="http://code.jquery.com/jquery-latest.js"></script>

<div class="outer">
  <div class="inner" style="position:relative; height:0px; width:0px">

  </div>
</div>

Frank Schwieterman
fonte
1
você pode executar um código semelhante em jsFiddle: jsfiddle.net/fschwiet/y74Nz/3
Frank Schwieterman
31

O problema das margens é que você não precisa se preocupar com a largura do elemento.

Como quando você dá algo {padding: 10px;}, você terá que reduzir a largura do elemento em 20px para manter o ' ajuste ' e não perturbar outros elementos ao seu redor.

Então, geralmente começo usando almofadas para obter tudo ' packed' e depois uso as margens para pequenos ajustes.

Outra coisa a ter em atenção é que os preenchimentos são mais consistentes em diferentes navegadores e o IE não trata muito bem as margens negativas.

pixeltocode
fonte
28

A margem limpa uma área ao redor de um elemento (fora da borda), mas o preenchimento limpa uma área ao redor do conteúdo (dentro da borda) de um elemento.

insira a descrição da imagem aqui

significa que seu elemento não conhece suas margens externas; portanto, se você estiver desenvolvendo controles dinâmicos da web, recomendo que você use padding vs margin, se puder.

note que algumas vezes você precisa usar margem.

Mohammad Golahi
fonte
24

É bom saber as diferenças entre margine padding. Aqui estão algumas diferenças:

  • Margem é o espaço externo de um elemento, enquanto o preenchimento é o espaço interno de um elemento.

  • Margem é o espaço fora da borda de um elemento, enquanto preenchimento é o espaço dentro da borda dele.

  • A margem aceita o valor de auto:, margin: automas você não pode definir o preenchimento como automático.

  • A margem pode ser definida como qualquer número, mas o preenchimento deve ser não negativo.

  • Quando você estiliza um elemento, o preenchimento também será afetado (por exemplo, cor de fundo), mas não margem.

MAChitgarha
fonte
18

Uma coisa a observar é que quando as margens de recolhimento automático o incomodam (e você não está usando cores de plano de fundo em seus elementos), algo é apenas mais fácil de usar o preenchimento.

alex
fonte
15

Margem avançada versus preenchimento explicado

É inapropriado usar paddingpara espaçar o conteúdo em um elemento; você deve utilizar margino elemento filho . Navegadores mais antigos, como o Internet Explorer, interpretaram mal o modelo da caixa, exceto quando se tratava de usar o marginque funciona perfeitamente no Internet Explorer 4 .

Existem duas exceções quando o uso padding é apropriado:

  1. É aplicado a um elemento embutido que não pode conter nenhum elemento filho, como um elemento de entrada.

  2. Você está compensando um bug no navegador altamente variado que um fornecedor * tosse * Mozilla * tosse * se recusa a corrigir e tem certeza (na medida em que realiza trocas regulares com os editores W3C e WHATWG) de que você deve ter uma solução funcional e esta solução não afetará o estilo de nada além do bug que você está compensando.

Quando você tem um elemento de largura de 100%, padding: 50px;efetivamente obtém width: calc(100% + 100px);. Como nãomargin é adicionado ao item, não causará problemas inesperados de layout quando você o usar, em vez de diretamente no elemento.widthmarginchild elementspadding

Portanto, se você não estiver fazendo uma dessas duas coisas, não adicione preenchimento ao elemento, mas sim ao (s) elemento (s) filho (s) direto (s) para garantir que você obtenha o comportamento esperado em todos os navegadores.

John
fonte
Interessante! Você tem um link para esse bug do fornecedor?
Alex Angas
1
@AlexAngas Hope A Wikipedia funciona para você? en.wikipedia.org/wiki/Internet_Explorer_box_model_bug
John
14

Primeiro, vamos ver quais são as diferenças e qual é a responsabilidade:

1) Margem

As propriedades da margem CSS são usadas para gerar espaço em torno dos elementos.
As propriedades da margem definem o tamanho do espaço em branco fora da borda. Com CSS, você tem controle total sobre as margens.
Existem propriedades CSS para definir a margem para cada lado de um elemento (superior, direito, inferior e esquerdo).


2) Preenchimento

As propriedades de preenchimento CSS são usadas para gerar espaço em torno do conteúdo.
O preenchimento limpa uma área ao redor do conteúdo (dentro da borda) de um elemento.
Com CSS, você tem controle total sobre o preenchimento. Existem propriedades CSS para definir o preenchimento para cada lado de um elemento (superior, direito, inferior e esquerdo).

Então, simplesmente Margens são espaço ao redor de elementos, enquanto Padding é espaço ao redor de conteúdo que faz parte do elemento.

Margem e preenchimento

Esta imagem do codemancers mostra como a margem e as bordas ficam mais juntas e como a caixa de borda e a caixa de conteúdo a diferenciam.

Também eles definem cada seção como abaixo:

  • Conteúdo - define a área de conteúdo da caixa em que residem o conteúdo real, como texto, imagens ou talvez outros elementos.
  • Preenchimento - limpa o conteúdo principal da caixa que o contém.
  • Borda - envolve tanto o conteúdo quanto o preenchimento.
  • Margem - esta área define um espaço transparente que o separa de outros elementos.
Alireza
fonte
Esta resposta parece ter copiado e colado de outro lugar. O link incluído de "codemancers" não tem nada a ver com a resposta.
Alex Angas
2
Alex, o pic e parte da resposta que destacou são de codemancers, certifique-se sobre as coisas antes de deixar um comentário e voto
Alireza
8

Eu sempre uso este princípio:

imagem do modelo de caixa

Este é o modelo de caixa do recurso de elemento de inspeção no Firefox. Funciona como uma cebola:

  • Seu conteúdo está no meio.
  • Preenchimento é o espaço entre o conteúdo e a borda da tag dentro.
  • A fronteira e suas especificações
  • A margem é o espaço ao redor da tag.

Margens maiores criarão mais espaço ao redor da caixa que contém seu conteúdo.

O preenchimento maior aumentará o espaço entre o conteúdo e a caixa em que ele está dentro.

Nenhum deles aumentará ou diminuirá o tamanho da caixa se estiver definida com um valor específico.

Bjamse
fonte
6

Margem

Margem é geralmente usada para criar um espaço entre o próprio elemento e seu entorno.

por exemplo, uso-o quando estou construindo uma barra de navegação para que ela fique grudada nas bordas da tela e sem espaços brancos.

Preenchimento

Eu costumo usar quando tenho um elemento dentro de uma borda, <div>ou algo semelhante, e quero diminuir seu tamanho, mas no momento quero manter a distância ou a margem entre os outros elementos ao seu redor.

Então, brevemente, é situacional; depende do que você está tentando fazer.

Mostafa Osama
fonte
1

A margem está fora da caixa e o estofamento está dentro da caixa

saurabhgoyal795
fonte
Isso não responde à pergunta.
precisa saber é o seguinte
@TylerH ele perguntou sobre isso apenas ??? (quando usar margem e quando usar preenchimento?)
saurabhgoyal795
Sim, foi o que ele perguntou. Como isso responde quando usar cada um?
TylerH