Estranho Espaçamento Entre Elementos inline-block em Listas Horizontais

watch_later quinta-feira, julho 30, 2015

Já vi várias vezes isto acontecer e até mesmo eu já me deparei com este problema enquanto trabalhava em projectos.

Quando nós colocamos uma série de elementos inline-block como normalmente costumamos colocar no HTML, por alguma razão estes irão ter um ligeiro espaçamento entre eles.

Como por exemplo:

<nav>
    <a href="#">Um</a>
    <a href="#">Dois</a>
    <a href="#">Três</a>
</nav>

nav a {
    display: inline-block;
    padding: 5px;
    background: #ad9077;
    color:#fff;
}

Vai resultar em algo como:
► https://jsfiddle.net/8886pL5m/

Na maioria das vezes nós queremos que os elementos permaneçam juntos uns dos outros, como no caso de listas de navegação, para evitar o espaço em branco entre eles onde não é clicável.

Isto não é um bug (penso eu). É apenas como funciona a maneira de definir elementos numa linha. Estes espaçamentos são praticamente o mesmo que espaçamentos entre palavras.

Aqui estão alguns "hacks" abaixo de como podes remover o espaçamento entre elementos inline-block e colocá-los juntos uns dos outros.

Remover os espaços

A razão pela qual se obtém espaços, é porque na verdade temos espaços entre os elementos (uma quebra de linha e algumas abas contam como um espaço, só para que fique claro). Minimizar o HTML, ou usar qualquer um destes truques abaixo irá resolver este problema:

<ul><li>one</li><li>two</li><li>three</li></ul>

<ul>
    <li>
    one</li><li>
    two</li><li>
    three</li>
</ul>

<ul>
    <li>one</li
    ><li>two</li
    ><li>three</li>
</ul>

<ul>
    <li>one</li><!--
 --><li>two</li><!--
 --><li>three</li>
</ul>

Aqui está o resultado no jsFiddle:
► https://jsfiddle.net/f8vvt2tk/

Mas todos eles aparentam ser um bocado manhosos, mas dão conta do recado.

Margem Negativa

Podes colocar os elementos de volta nos seus lugares adicionando uma margem negativa de 4px aos elementos (poderá ser necessário ajustar o valor dependendo do tamanho do font-size). Aparentemente isto é problemático em versões mais antigas do Internet Explorer (6 & 7), mas se não te importares com esses navegadores, pelo menos o teu código HTML fica limpo e bem formatado.

nav a {
    display: inline-block;
    margin-right: -4px;
}

Definir o tamanho da fonte para zero no elemento parent e redefini-lo no child

ATÊNÇÃO: Definir o tamanho fonte para zero, pode ser mau!!

Outra opção seria definir o font-size:0; no elemento parent e depois redefinir para o tamanho normal no elemento child como no exemplo abaixo. No entanto já li algures (num artigo qualquer da Google se não estou em erro, se me lembrar adiciono aqui o link) que isto pode ser mau para o SEO. Links com font-size:0px; podem ser considerados como maliciosos. No entanto penso que isto não fará muita diferença se se tratar apenas de uma lista no meio do corpo do site.

nav {font-size: 0;}
nav a {font-size: 16px;}

Não adicionar tags de encerramento

O HTML5 não se importa com a tag de encerramento. Embora tenhamos que admitir que isto parece bastante estranho ver o código assim.

<ul>
    <li>one
    <li>two
    <li>three
</ul>

Related Posts