Existe algum motivo para usar um em <div style="display:inline-block">
vez de um <span>
para fazer o layout de uma página da web?
Posso colocar o conteúdo aninhado dentro do intervalo? O que é válido e o que não é?
Tudo bem usar isso para criar uma tabela 3x2 como layout?
<div>
<span> content1(divs,p, spans, etc) </span>
<span> content2(divs,p, spans, etc) </span>
<span> content3(divs,p, spans, etc) </span>
</div>
<div>
<span> content4(divs,p, spans, etc) </span>
<span> content5(divs,p, spans, etc) </span>
<span> content6(divs,p, spans, etc) </span>
</div>
Respostas:
De acordo com a especificação HTML ,
<span>
é um elemento embutido e<div>
é um elemento de bloco. Agora isso pode ser alterado usando adisplay
propriedade CSS, mas há um problema: em termos de validação HTML, você não pode colocar elementos de bloco dentro de elementos inline, portanto:não é estritamente válido, mesmo se você alterar
<div>
parainline
ouinline-block
.Portanto, se o seu elemento for
inline
ouinline-block
use a<span>
. Se for umblock
elemento de nível, use a<div>
.fonte
inline-block
tem um relacionamento mais próximo doinline
queblock
.<span>
e de<div>
fato é diferente, como<span>
é um elemento embutido (válido dentro de um<p>
, por exemplo), enquanto<div>
é um elemento de bloco (não válido dentro de um<p>
).<p>
é um elemento de bloco que "não pode conter elementos em nível de bloco" ( link ); portanto, embora o exemplo seja inválido, não<p>
é porque está embutido.Se você deseja ter um documento xhtml válido, não pode colocar uma div dentro de um parágrafo.
Além disso, uma div com a propriedade display: inline-block funciona de maneira diferente de uma extensão. Uma extensão é, por padrão, um elemento embutido; você não pode definir a largura, a altura e outras propriedades associadas aos blocos. Por outro lado, um elemento com a propriedade inline-block ainda "flui" com qualquer texto circundante, mas você pode definir propriedades como largura, altura etc. Uma extensão com a exibição da propriedade: block não fluirá da mesma maneira como um elemento de bloco embutido, mas criará um retorno de carro e terá margem padrão.
Observe que o bloco embutido não é suportado em todos os navegadores. Por exemplo, no Firefox 2 e menos, você deve usar:
que é exibido ligeiramente diferente de um elemento de bloco embutido no FF3.
Há um ótimo artigo aqui sobre a criação de elementos de bloco em linha entre navegadores.
fonte
Bloco embutido é um ponto intermediário entre definir a exibição de um elemento como embutido ou bloqueado. Ele mantém o elemento no fluxo inline do documento como display: inline mantém, mas você pode manipular os atributos da caixa do elemento (largura, altura e margens verticais) como você pode com o display: block.
Não devemos usar elementos de bloco dentro de elementos embutidos. Isso é inválido e não há razão para fazer essas práticas.
fonte
Eu sei que este Q é antigo, mas por que não usar todos os DIVs em vez dos SPANs? Então tudo toca feliz juntos.
Exemplo:
fonte
Eu acho que isso ajudará você a entender as diferenças básicas entre elementos em linha (por exemplo, span) e elementos em bloco (por exemplo, div), para entender por que "display: inline-block" é tão útil.
Problema : os elementos embutidos (por exemplo, span, a, botão, entrada etc.) mantêm a "margem" apenas horizontalmente (margem esquerda e margem direita), não na vertical. O espaçamento vertical funciona apenas em elementos de bloco (ou se "display: block" estiver definido)
Solução : Somente através de "display: inline-block" também terá a distância vertical (superior e inferior). Razão: Elemento inline Span, agora se comporta como um elemento de bloco para o exterior, mas como um elemento inline dentro
Aqui estão exemplos de código:
fonte
Como outros responderam ...
div
é um "elemento de bloco" (agora redefinido como Flow Content ) espan
é um "elemento em linha" ( Phrasing Content ). Sim, você pode alterar a apresentação padrão desses elementos, mas há uma diferença entre "fluxo" versus "bloco" e "fraseado" versus "embutido".Um elemento classificado como conteúdo de fluxo pode ser usado apenas onde é esperado conteúdo de fluxo e um elemento classificado como conteúdo de fraseado pode ser usado onde é esperado conteúdo de fraseado. Como todo o conteúdo do fraseado é de fluxo, um elemento de fraseado também pode ser usado em qualquer lugar que seja esperado. As especificações fornecem informações mais detalhadas .
Todos os elementos de expressão, como
strong
eem
, podem conter apenas outros elementos de expressão: você não pode colocar umtable
dentro de um,cite
por exemplo. A maioria dos conteúdos de fluxo, comodiv
eli
pode conter todos os tipos de conteúdo de fluxo (assim como fraseado conteúdo), mas há algumas excepções:p
,pre
, eth
são exemplos de conteúdo de fluxo não-fraseado ( “elementos de bloco”) que pode única contêm fraseado conteúdo ("elementos em linha"). E, é claro, existem as restrições de elementos normais, comodl
etable
somente sendo permitido conter determinados elementos.Enquanto ambos
div
ep
são não-fraseado conteúdo de fluxo, odiv
pode conter outras crianças conteúdo de fluxo (incluindo maisdiv
s ep
s). Por outro lado,p
pode conter apenas filhos de conteúdo fraseado. Isso significa que você não pode colocar umdiv
dentro dep
, mesmo que ambos sejam elementos de fluxo sem fraseado.Agora aqui está o kicker. Essas especificações semânticas não estão relacionadas à maneira como o elemento é exibido. Assim, se você tiver um
div
dentro despan
, você receberá um erro de validação, mesmo que tenhaspan {display: block;}
ediv {display: inline;}
em seu CSS.fonte
inline-block
É um estilo CSS, não é um tipo de elemento ou modelo de conteúdo.)