Bloco de exibição sem largura de 100%


94

Quero definir um elemento span para aparecer abaixo de outro elemento usando a propriedade display. Tentei aplicar bloco embutido, mas sem sucesso, e descobri que poderia usar bloco se de alguma forma conseguisse evitar dar ao elemento uma largura de 100% (não quero que o elemento "estique"). Isso pode ser feito, ou se não, qual é a boa práxis para resolver esse tipo de problema?

Exemplo: uma lista de notícias onde desejo definir um link "leia mais" no final de cada postagem (nota: em <a>vez de <span>)

<li>
<span class="date">11/15/2012</span>
<span class="title">Lorem ipsum dolor</span>
<a class="read-more">Read more</a> 
</li>


Atualização: resolvido. Em CSS, aplique

li {
    clear: both;
}
li a {
    display: block;
    float: left;
    clear: both;
}

1
Você tem alguma marcação (HTML ou CSS) para nos mostrar? É difícil trabalhar no problema sem nada em que realmente trabalhar. Além disso, uma demonstração no jsfiddle seria bom.
— Tom Oakley,

Achei que não precisava de nenhum código de amostra, pois se trata apenas de posicionar um elemento span. Veja a postagem atualizada.
— Staffan Estberg

Você pode reduzir seriamente toda essa marcação usando apenas uma linha de código, como mencionei abaixo.
— ha404

Respostas:


71

Se estou entendendo sua pergunta corretamente, o seguinte CSS irá flutuar seu a abaixo dos spans e evitar que ele tenha uma largura de 100%:

a {
    display: block; 
    float: left; 
    clear: left; 
}

Tentei aplicar isso, mas como os elementos do span (título e data, no exemplo) não têm float, o link é posicionado antes do último período. Acho que uma solução seria fazer todos os elementos filhos no li flutuarem.
— Staffan Estberg

Isso funciona se eu aplicar um clearfix para o pai li. Vou com essa solução, obrigado PJ.
— Staffan Estberg,

157

Use display: table.

Essa resposta deve ter pelo menos 30 caracteres; Eu digitei 20, então aqui estão mais alguns.


13
Solução genial. margin: 0 auto;se você precisar centralizado.
— Mafia

4
Eu acho você incrível.
— billynoah

1
display: table;funciona, mas não aceita nenhum preenchimento.
— donquixote de

@ ha404 você está certo, o enchimento funciona! jsfiddle.net/wgj7xvLe/4 pelo menos no meu navegador (Chromium).
— donquixote

3
@donquixote ele deve aceitar preenchimento, desde que você use border-collapse: separe. só tive esse problema.
— Brad

30

você pode usar:

width: max-content;

Observação: o suporte é limitado, verifique aqui uma análise completa dos navegadores compatíveis


Eu nunca tinha ouvido falar disso! Interessante.
— Ryan

Estava bom desde o Chrome 46 e FF 66. Deve ser aceita resposta. inline-blocket al estava quebrando meu layout.
— i336_

1
@ i336_ A partir de hoje, ainda não é compatível com o navegador Edge.
— ChrisW

Edge ou Chromium Edge? (Para ser claro; o primeiro estará em transição por um bom tempo ...)
— i336_

7

Eu manteria cada linha com seu próprio div, então ...

<div class="row">
    <div class="cell">Content</div>
</div>
<div class="row">
    <div class="cell">Content</div>
</div>

E então para o CSS:

.cell{display:inline-block}

É difícil fornecer uma solução sem ver seu código original.


1
Obrigado, mas prefiro não misturar nenhum elemento div.
— Staffan Estberg

5

Novamente: uma resposta que pode ser um pouco tarde demais (mas para aqueles que encontram esta página para a resposta de qualquer maneira).

Em vez de display:block;usardisplay:inline-block;


2

Experimente isto:

li a {
    width: 0px;
    white-space:nowrap;
}

1

Eu tive esse problema, resolvi assim:

.parent {
  white-space: nowrap;
  display: table;
}

.child {
  display: block;
}

o "white-space: nowrap" garante que os filhos do filho (se houver) não quebrem para uma nova linha se não houver espaço suficiente.

sem "espaço em branco: nowrap":

insira a descrição da imagem aqui

com "espaço em branco: nowrap":

insira a descrição da imagem aqui


editar: parece que também funciona sem a parte do bloco filho para mim, então apenas isso parece funcionar bem.

.parent {
  white-space: nowrap;
  display: table;
}

0

Você pode usar o seguinte:

display: inline-block;

Funciona bem em links e outros elementos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.