Dado este HTML e CSS:
span {
display:inline-block;
width:100px;
background-color:palevioletred;
}
<p>
<span> Foo </span>
<span> Bar </span>
</p>
Como resultado, haverá um espaço de 4 pixels de largura entre os elementos SPAN.
Demonstração: http://jsfiddle.net/dGHFV/
Entendo por que isso acontece e também sei que poderia me livrar desse espaço removendo o espaço em branco entre os elementos SPAN no código-fonte HTML, da seguinte forma:
<p>
<span> Foo </span><span> Bar </span>
</p>
No entanto, eu esperava uma solução CSS que não exija que o código-fonte HTML seja violado.
Eu sei como resolver isso com JavaScript - removendo os nós de texto do elemento contêiner (o parágrafo), da seguinte maneira:
// jQuery
$('p').contents().filter(function() { return this.nodeType === 3; }).remove();
Demonstração: http://jsfiddle.net/dGHFV/1/
Mas esse problema pode ser resolvido apenas com CSS?
Respostas:
Como essa resposta se tornou bastante popular, estou reescrevendo-a significativamente.
Não vamos esquecer a pergunta real que foi feita:
Ele é possível resolver este problema apenas com CSS, mas não há completamente correções de CSS robustos.
A solução que tive na minha resposta inicial foi adicionar
font-size: 0
ao elemento pai e declarar sensatofont-size
os filhos.http://jsfiddle.net/thirtydot/dGHFV/1361/
Isso funciona nas versões recentes de todos os navegadores modernos. Funciona no IE8. Ele não funciona no Safari 5, mas faz o trabalho no Safari 6. Safari 5 é quase um navegador mortos ( 0,33%, agosto 2015 ).
A maioria dos problemas possíveis com tamanhos de fonte relativos não é complicada de corrigir.
Entretanto, embora essa seja uma solução razoável, se você precisar especificamente de uma correção apenas de CSS, não é o que eu recomendo se você estiver livre para alterar seu HTML (como a maioria de nós).
Isto é o que eu, como desenvolvedor web razoavelmente experiente, realmente faço para resolver este problema:
Sim está certo. Eu removo o espaço em branco no HTML entre os elementos do bloco embutido.
É fácil. É simples. Funciona em qualquer lugar. É a solução pragmática.
Às vezes, é necessário considerar cuidadosamente de onde virá o espaço em branco. Acrescentar outro elemento ao JavaScript adicionará espaço em branco?Não, não se você fizer isso corretamente.
Vamos fazer uma jornada mágica de diferentes maneiras de remover o espaço em branco, com um novo HTML:
Você pode fazer isso, como eu costumo fazer:
http://jsfiddle.net/thirtydot/dGHFV/1362/
Ou isto:
Ou use comentários:
Ou, se você estiver usando o PHP ou similar:
Ou você pode até pular certas tags de fechamento completamente (todos os navegadores estão bem com isso):
Agora que eu o aborreci até a morte com "mil maneiras diferentes de remover o espaço em branco, aos trinta pontos", espero que você tenha esquecido tudo
font-size: 0
.Como alternativa, agora você pode usar o flexbox para obter muitos dos layouts usados anteriormente em bloco em linha para: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
fonte
:(
font-size:0
truque não seja uma boa idéia, afinal ...Para navegadores em conformidade com CSS3, há
white-space-collapsing:discard
consulte: http://www.w3.org/TR/2010/WD-css3-text-20101005/#white-space-collapsing
fonte
trim-inner
ao invés dediscard
?text-space-collapse
:
discard
<p>A long text...</p>
onde as tags de abertura e fechamento estão em linhas separadas do conteúdo do texto. É algo que faço o tempo todo para manter meus arquivos HTML organizados e legíveis.float
EDITAR:
hoje, devemos apenas usar o Flexbox .
RESPOSTA ANTIGA:
OK, embora eu tenha votado tanto nas respostas
font-size: 0;
quanto nasnot implemented CSS3 feature
respostas, depois de tentar, descobri que nenhuma delas é uma solução real .Na verdade, não há sequer uma solução alternativa sem fortes efeitos colaterais.
Então eu decidi remover os espaços (estas respostas é sobre este argumento) entre os
inline-block
divs de minhaHTML
fonte (JSP
), transformando esta:para isso
isso é feio, mas está funcionando.
Mas, espere um minuto ... e se eu estou gerando meu divs dentro
Taglibs loops
(Struts2
,JSTL
, etc ...)?Por exemplo:
Não é absolutamente possível alinhar todas essas coisas, isso significaria
que não é legível, difícil de manter e entender, etc ...
A solução que encontrei:
Dessa forma, você terá um código legível e recuado corretamente.
E, como efeito colateral positivo, o resultado
HTML source
, embora infestado por comentários vazios, resultará corretamente recuado;vamos dar o primeiro exemplo. Na minha humilde opinião, isso:
é melhor que isso:
fonte
Adicione comentários entre os elementos para NÃO ter um espaço em branco. Para mim, é mais fácil do que redefinir o tamanho da fonte para zero e depois restaurá-lo.
fonte
Todas as técnicas de eliminação de espaço
display:inline-block
são hacks desagradáveis ...Use o Flexbox
É incrível, resolve todo esse layout de bloco em linha bs e, a partir de 2017, possui 98% de suporte ao navegador (mais se você não se importa com IEs antigos).
fonte
Adicione
display: flex;
ao elemento pai. Aqui está a solução com um prefixo:Versão simplificada 👇
Corrigir com prefixo 👇
fonte
Esta é a mesma resposta que eu dei sobre o relacionado: Display: Bloco embutido - Que espaço é esse?
Na verdade, existe uma maneira muito simples de remover o espaço em branco do bloco embutido que é fácil e semântico. Ele é chamado de fonte personalizada com espaços de largura zero, o que permite recolher o espaço em branco (adicionado pelo navegador para elementos embutidos quando estão em linhas separadas) no nível da fonte usando uma fonte muito pequena. Depois de declarar a fonte, basta alterar
font-family
o contêiner e voltar novamente para os filhos, e pronto. Como isso:Terno a gosto. Aqui está um download para a fonte que acabei de criar no font-forge e convertida com o gerador de fontes da Web FontSquirrel. Levei todos os 5 minutos. A
@font-face
declaração css está incluída: fonte de espaço com largura zero compactada . Está no Google Drive, então você precisa clicar em Arquivo> Download para salvá-lo no seu computador. Você provavelmente também precisará alterar os caminhos da fonte se copiar a declaração no seu arquivo css principal.fonte
flex-wrap
até pelo menos a v28 ( srsly? ), Mas esse é um substituto perfeito até então.Mais duas opções baseadas no nível 3 do módulo de texto CSS (em vez de
white-space-collapsing:discard
serem retiradas do rascunho da especificação):word-spacing: -100%;
Em teoria, ele deve fazer exatamente o que é necessário - reduzir os espaços em branco entre as 'palavras' em 100% da largura dos caracteres do espaço, ou seja, para zero. Infelizmente, parece não funcionar em lugar algum, e esse recurso está marcado como 'em risco' (também pode ser excluído da especificação).
word-spacing: -1ch;
Reduz os espaços entre as palavras pela largura do dígito '0'. Em uma fonte monoespaçada, ela deve ser exatamente igual à largura do caractere de espaço (e de qualquer outro caractere também). Isso funciona no Firefox 10+, Chrome 27+ e quase funciona no Internet Explorer 9+.
Violino
fonte
' '
e'0'
. Em fontes não monoespaçadas, não há proporção mágica totalmente adequada entre larguras' '
e'0'
caracteres, portanto,ch
não ajuda muito.word-spacing
, poderíamos usarletter-spacing
com um valor negativo grande arbitrária como mostrado na minha respostaInfelizmente, é 2019 e
white-space-collapse
ainda não foi implementado.Enquanto isso, forneça o elemento pai
font-size: 0;
e definafont-size
os filhos. Isso deve fazer o truquefonte
Use o flexbox e faça um fallback (das sugestões acima) para navegadores mais antigos:
fonte
Simples:
Não há necessidade de tocar no elemento pai.
Somente condição aqui: o tamanho da fonte do item não deve ser definido (deve ser igual ao tamanho da fonte do pai).
0.25em
é o padrãoword-spacing
W3Schools - propriedade espaçamento de palavras
fonte
tamanho da fonte: 0; pode ser um pouco mais difícil de gerenciar ...
Penso que as duas linhas seguintes são muito melhores, mais reutilizáveis e economizam tempo do que qualquer outro método. Eu pessoalmente uso isso:
Então você pode usá-lo da seguinte forma ...
Tanto quanto eu sei (posso estar errado), mas todos os navegadores suportam esse método.
EXPLICAÇÃO :
Isso funciona (talvez -3px seja melhor) exatamente como você esperaria que funcionasse.
class="items"
o pai de cada bloco embutido.Você NÃO precisará voltar ao css e adicionar outra regra css para seus novos blocos embutidos.
Resolvendo dois problemas ao mesmo tempo.
Observe também que
>
(maior que o sinal) significa que * / todas as crianças devem estar em bloco inline.http://jsfiddle.net/fD5u3/
NOTA: Modifiquei para acomodar para herdar o espaçamento entre letras quando um wrapper tem um wrapper filho.
fonte
-4px
paraletter-spacing
o que pode não ser suficiente para a grande font-tamanhos por exemplo: ver este violino , poderíamos usar um valor maior como no meu postPorém, tecnicamente, não é uma resposta para a pergunta: "Como removo o espaço entre os elementos de bloco embutido?"
Você pode experimentar a solução flexbox e aplicar o código abaixo e o espaço será removido.
Você pode aprender mais sobre isso neste link: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
fonte
Não tenho certeza se você deseja fazer duas extensões azuis sem uma lacuna ou se deseja lidar com outro espaço em branco, mas se deseja remover a lacuna:
E feito.
fonte
Geralmente, usamos elementos como este em linhas diferentes, mas no caso de
display:inline-block
usar tags na mesma linha, o espaço será removido, mas em uma linha diferente não.Um exemplo com tags em uma linha diferente:
Exemplo com tags na mesma linha
Outro método eficiente é um trabalho CSS que está usando
font-size:0
o elemento pai e fornecefont-size
a um elemento filho o quanto você deseja.fonte
Eu estava com esse problema agora e, desde então
font-size:0;
, descobri que no Internet Explorer 7 o problema permanece porque o Internet Explorer pensa "Tamanho da fonte 0?!?! WTF, você é louco?" - Então, no meu caso, redefini o CSS de Eric Meyer e, comfont-size:0.01em;
uma diferença de 1 pixel do Internet Explorer 7 para o Firefox 9, acho que isso pode ser uma solução.fonte
fonte
float
edisplay:inline-block
paraspan
s deveriam ser substitutos para o caso, seflex
não for suportado, masfloat
descartariam efetivamente o efeito deinline-block
, portanto o último parece redundante.Eu estive abordando isso recentemente e, em vez de definir o pai e
font-size:0
depois restaurar o filho para um valor razoável, tenho obtido resultados consistentes configurando o contêiner pailetter-spacing:-.25em
e o filho novamenteletter-spacing:normal
.Em um tópico alternativo, vi um comentarista mencionar que
font-size:0
nem sempre é ideal porque as pessoas podem controlar tamanhos mínimos de fonte em seus navegadores, negando completamente a possibilidade de definir o tamanho da fonte como zero.O uso do ems parece funcionar, independentemente do tamanho da fonte especificado ser 100%, 15pt ou 36px.
http://cdpn.io/dKIjo
fonte
Eu acho que existe um método muito simples / antigo para isso, que é suportado por todos os navegadores, mesmo o IE 6/7. Nós poderíamos simplesmente definir
letter-spacing
um valor negativo grande em pai e depois defini-lo novamentenormal
em elementos filho:fonte
letter-spacing:normal
todos os elementos filhos.letter-spacing
é 99,99% das vezes comonormal
. o tamanho da fonte não tem um valor fixo e depende muito do design. poderia ser um valor pequeno ou grande com base na família de fontes e outras coisas ... Eu nunca me lembro na minha vida de ver / usar um valor especial (diferente de 0 / normal) paraletter-spacing
, então eu acho que é mais seguro e melhor escolhaA resposta mais simples para esta pergunta é adicionar.
css
link do codepen: http://jsfiddle.net/dGHFV/3560/
fonte
Com colchetes PHP:
fonte
Vou expandir um pouco a resposta do user5609829, pois acredito que as outras soluções aqui são muito complicadas / muito trabalho. A aplicação de um
margin-right: -4px
aos elementos do bloco embutido removerá o espaçamento e é suportada por todos os navegadores. Veja o violino atualizado aqui . Para aqueles preocupados com o uso de margens negativas, tente dar esta uma leitura.fonte
A especificação CSS Text Module Level 4 define uma
text-space-collapse
propriedade que permite controlar como o espaço em branco dentro e ao redor de um elemento é processado.Portanto, em relação ao seu exemplo, você apenas teria que escrever isto:
Infelizmente, nenhum navegador está implementando essa propriedade ainda (a partir de setembro de 2016), conforme mencionado nos comentários à resposta da HBP .
fonte
Encontrei uma solução CSS pura que funcionou muito bem para mim em todos os navegadores:
fonte
Adicione
white-space: nowrap
ao elemento container:CSS:
HTML:
Aqui está o Plunker .
fonte
Há muitas soluções, como
font-size:0
,word-spacing
,margin-left
,letter-spacing
e assim por diante.Normalmente eu prefiro usar
letter-spacing
porque-1em
).word-spacing
emargin-left
quando definirmos um valor maior como-1em
.font-size
não é conveniente quando tentamos usarem
comofont-size
unidade.Então,
letter-spacing
parece ser a melhor escolha.No entanto, tenho que avisar você
quando você usa,
letter-spacing
é melhor usar-0.3em
ou-0.31em
não outros.Se você estiver usando o Chrome (versão de teste 66.0.3359.139) ou Opera (versão de teste 53.0.2907.99), o que você vê pode ser:
Se você estiver usando o Firefox (60.0.2), IE10 ou Edge, o que você vê pode ser:
Isso é interessante. Então, verifiquei o espaçamento mdn-letra e encontrei o seguinte:
Parece que esse é o motivo.
fonte
Adicione
letter-spacing:-4px;
nop
CSS pai e adicioneletter-spacing:0px;
ao seuspan
CSS.fonte
Pensei em acrescentar algo novo a esta pergunta, embora muitas das respostas atualmente fornecidas sejam mais que adequadas e relevantes, existem algumas novas propriedades CSS que podem obter uma saída muito limpa, com suporte total em todos os navegadores e pouco a sem 'hacks'. Isso se afasta,
inline-block
mas fornece os mesmos resultados que a pergunta solicitada.Essas propriedades CSS são
grid
CSS Grid é altamente suportado ( CanIUse ), exceto o IE, que precisa apenas de um
-ms-
prefixo para permitir que ele funcione.CSS grade também é altamente flexível, e toma todas as partes boas de
table
,flex
einline-block
elementos e traz-los em um só lugar.Ao criar um,
grid
você pode especificar as lacunas entre as linhas e colunas. A diferença padrão já está definida como,0px
mas você pode alterar esse valor para o que quiser.Para resumir um pouco, aqui está um exemplo de trabalho relevante:
fonte
display:grid
elemento é bloqueado, por isso não é tão exibido: a grade o ajuda a trabalhar com layouts de bloco embutido, mas permite substituir o trabalhoinline-block
por algo em que você pode controlar as "calhas" como esta pergunta quer. Além disso, estou realmente surpreso que ninguém tenha respondido ainda com uma solução CSS Grid Layout antes de agora.inline-block
. E sim, fiquei surpresa também, acho que ninguém comgrid
experiência realmente chegou a isso antes. Foram brincar com ele um pouco e me deparei com esta questão tão pensamento porque não: POutra maneira que encontrei é aplicar margem esquerda como valores negativos, exceto o primeiro elemento da linha.
fonte
Todas as perguntas que tentam remover o espaço entre
inline-block
s parecem um<table>
...Tente algo como isto:
fonte