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.