Como colocar div lado a lado


241

Eu tenho uma div principal do wrapper que está definida como 100% de largura. Dentro disso, eu gostaria de ter dois divs, um com largura fixa e outro que preenche o resto do espaço. Como faço para flutuar a segunda div para preencher o restante do espaço. Obrigado por qualquer ajuda.


2
Da próxima vez, também, colocar o seu código exemplo agradar então a questão torna-se mais claro para os desenvolvedores aqui ..
Rob

1
é posição: absoluta uma opção? você pode definir a posição nas laterais do contêiner e a div assumirá o novo tamanho.
AlexanderMP

Respostas:


363

Há muitas maneiras de fazer o que você está pedindo:

  1. Usando a propriedade CSSfloat :

    <div style="width: 100%; overflow: hidden;">
        <div style="width: 600px; float: left;"> Left </div>
        <div style="margin-left: 620px;"> Right </div>
    </div>
  2. Usando a propriedade CSSdisplay - que pode ser usada para fazer com que divaja como table:

    <div style="width: 100%; display: table;">
        <div style="display: table-row">
            <div style="width: 600px; display: table-cell;"> Left </div>
            <div style="display: table-cell;"> Right </div>
        </div>
    </div>

Existem mais métodos, mas esses dois são os mais populares.


17
Solução HTML 5 da @filoxo, use isso em vez disso
TheMcMurder 13/15

1
O que o comentarista anterior disse: considere adicionar a solução HTML5 por filoxo como nº 3.
Ahmed Fasih

2
@TheMcMurder: para nós que precisamos oferecer suporte a navegadores antigos (por exemplo, IE <11), isso não é uma opção.
Oyvind

@ Ayvind, você está exatamente certo. Depende do seu caso de uso. Se você estiver suportando o IE 8, 9 ou 10, precisará do suporte a polyfill. Eu recomendo um serviço como polyfill.io cdn.polyfill.io/v2/docs ou github.com/10up/flexibility, mas você pode ser realmente rigoroso requisitos que impedem o uso de polyfills.
TheMcMurder

1
o que overflow: hidden faz? isso não é para elementos com uma altura especificada?
22917 Michael

176

O CSS3 introduziu caixas flexíveis (também conhecidas como flex box), que também podem atingir esse comportamento.

Simplesmente defina a largura da primeira div e, em seguida, dê à segunda um flex-growvalor 1que permita preencher a largura restante do pai.

.container{
    display: flex;
}
.fixed{
    width: 200px;
}
.flex-item{
    flex-grow: 1;
}
<div class="container">
  <div class="fixed"></div>
  <div class="flex-item"></div>
</div>

Demonstração do jsFiddle

Observe que as caixas flexíveis não são compatíveis com os navegadores antigos, mas são uma ótima opção para direcionar navegadores modernos (consulte também Caniuse e MDN ). Um ótimo guia abrangente sobre como usar caixas flexíveis está disponível em CSS Tricks .


5
Demorou o dia todo para encontrar uma solução e esta resposta a resolveu! Eu tenho 4 painéis lado a lado com o terceiro e o quarto painéis, às vezes não tendo nada neles. Todos eles vivem em uma div contendo uma borda em torno deles. Toda a flutuação: deixada na primeira situação de div me deixou com uma div passando pela borda na parte inferior porque os rótulos gerados são dinâmicos. Os rótulos são estendidos porque é assim que o ASP os processa. Não tendo o float: left fez apenas 3 dos divs na mesma linha. E usar uma tabela está fora de questão. Obrigado!
Luminous

Existe um método para trás compatível para usar algo como isto, isto é, para nós, sucos pobres que ainda tem que apoiar IE 8-10
Ben A. Hilleli

@ BenA.Hilleli que pode depender de seus requisitos (por exemplo, aprimoramento progressivo ou degradação normal ), mas uma pesquisa rápida produziu este (um pouco desatualizado) guia "Como usar o flexbox no mundo real" , bem como o Flexie.js que suporta IE6-9. Como alternativa, tente qualquer uma das outras respostas para esta pergunta, pois elas alcançam a mesma coisa.
Filoxo

20

Eu não sei muito sobre estratégias de design HTML e CSS, mas se você estiver procurando por algo simples e que caiba na tela automaticamente (como eu sou), acredito que a solução mais direta é fazer com que os divs se comportem como palavras em um parágrafo. Tente especificardisplay: inline-block

<div style="display: inline-block">
   Content in column A
</div>
<div style="display: inline-block">
   Content in column B
</div>

Você pode ou não precisar especificar a largura dos DIVs


5
Provavelmente display:flexé a melhor solução, mas acho que inline-blocktambém é excelente porque funciona em mais navegadores. A propósito, pode ser necessário agrupar as duas divs com a <div style="white-space:nowrap">para evitar que o redimensionamento seja interrompido.
21816 John Henckel

Esta é uma boa solução para modelagem. O único problema é que ele empurra uma div com menor conteúdo para o fundo. Como empurrá-lo para o topo?
quase um iniciante

1
NVV, apenas necessário para procurá-lo, a solução é: vertical-align: top;
quase um iniciante

@JohnHenckel, significa que não é para todos os navegadores, não poderia estar funcionando para todos os navegadores da mesma maneira? inline-blockcódigo.
Kavindu Gayantha

@guillermo não está funcionando bem. todos os divs não estão colocando lado a lado. por que é que. isso nao esta claro.
Kavindu Gayantha

14

Você pode usar a grade CSS para conseguir isso. Esta é a versão em mão longa para fins de ilustração:

div.container {
    display: grid;
    grid-template-columns: 220px 20px auto;
    grid-template-rows: auto;
}

div.left {
    grid-column-start: 1;
    grid-column-end: 2;
    grid-row-start: row1-start
    grid-row-end: 3;
    background-color: Aqua;
}

div.right {
    grid-column-start: 3;
    grid-column-end: 4;
    grid-row-start: 1;
    grid-row-end; 1;
    background-color: Silver;
}

div.below {
    grid-column-start: 1;
    grid-column-end: 4;
    grid-row-start: 2;
    grid-row-end; 2;
}
<div class="container">
    <div class="left">Left</div>
    <div class="right">Right</div>
    <div class="below">Below</div>
</div>

Ou o método mais tradicional usando float e margin.

Eu incluí uma cor de plano de fundo neste exemplo para ajudar a mostrar onde estão as coisas - e também o que fazer com o conteúdo abaixo da área flutuante.

Não coloque seus estilos alinhados na vida real, extraia-os em uma folha de estilos.

div.left {
    width: 200px;
    float: left;
    background-color: Aqua;
}

div.right {
    margin-left: 220px;
    background-color: Silver;
}

div.clear {
    clear: both;
}
    <div class="left"> Left </div>
    <div class="right"> Right </div>
    <div class="clear">Below</div>

<div style="width: 200px; float: left; background-color: Aqua;"> Left </div>
<div style="margin-left: 220px; background-color: Silver;"> Right </div>
<div style="clear: both;">Below</div>

2

Dê à primeira div um float à esquerda e fixe com, a segunda div 100% de largura e um float à esquerda. Isso deve fazer o truque. Se você deseja colocar itens abaixo dele, é necessário um espaço livre: ambos no item que você deseja colocar abaixo


2
<div class="container" style="width: 100%;">
    <div class="sidebar" style="width: 200px; float: left;">
        Sidebar
    </div>
    <div class="content" style="margin-left: 202px;">
        content 
    </div>
</div>

Isso será compatível com vários navegadores. Sem a margem esquerda, você terá problemas com o conteúdo que vai para a esquerda se o conteúdo for maior que a barra lateral.


1

Se você não estiver etiquetando o IE6, faça flutuar o segundo <div>e dê uma margem igual a (ou talvez um pouco maior que) a <div>largura fixa do primeiro .

HTML:

<div id="main-wrapper">
    <div id="fixed-width"> lorem ipsum </div>
    <div id="rest-of-space"> dolor sit amet </div>
</div>

CSS:

#main-wrapper {
    100%;
    background:red;
}
#fixed-width {
    width:100px;
    float:left
}
#rest-of-space {
    margin-left:101px;
        /* May have to increase depending on borders and margin of the fixd width div*/
    background:blue;
}

A margem é responsável pela possibilidade de que o 'restante espaço' <div>possa conter mais conteúdo do que a 'largura fixa' <div>.

Não dê um segundo plano à largura fixa; se você precisar visualizá-las visivelmente como 'colunas' diferentes, use o truque Colunas do falso .

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.