CSS duas divs um ao lado do outro


230

Eu quero colocar dois <div>s um ao lado do outro. O direito <div>tem cerca de 200 px; e a esquerda <div>deve preencher o resto da largura da tela? Como posso fazer isso?

Respostas:


421

Você pode usar o flexbox para organizar seus itens:

#parent {
  display: flex;
}
#narrow {
  width: 200px;
  background: lightblue;
  /* Just so it's visible */
}
#wide {
  flex: 1;
  /* Grow to rest of container */
  background: lightgreen;
  /* Just so it's visible */
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>

Basicamente, isso é apenas raspar a superfície do flexbox. O Flexbox pode fazer coisas incríveis.


Para suporte mais antigo ao navegador, você pode usar as propriedades float CSS e a width para resolvê-lo.

#narrow {
  float: right;
  width: 200px;
  background: lightblue;
}
#wide {
  float: left;
  width: calc(100% - 200px);
  background: lightgreen;
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>


14
Esta é realmente a resposta correta, é concisa e - ao contrário das duas atualmente acima - é completamente independente. As melhores respostas para SO devem ser assim, IMO. +1
Bobby Jack

Gostaria de esclarecer por que a esquerda precisa estar float:left? Seu comentário à minha resposta diz 'a div lft é necessária em toda a área esquerda', mas float:leftfará com que ela envolva o conteúdo com força.
falstro

14
Esta resposta não é totalmente correta e é bastante perturbadora ver que ela é tão votada. Isso cria um layout muito instável. Eu recomendaria colocar as duas divs em um contêiner e usar a propriedade display: inline-block para que as divs se alinhem, como sugeriram algumas das outras respostas. Não estou criticando ninguém, pois estamos todos aqui para ajudar um ao outro, portanto, além da minha escolha, obrigado MN por suas contribuições a esta comunidade.
Mussser

1
Mas uma coisa a notar é que inline-block não funcionará em versões mais antigas do IE ...
Mussser

3
@Mussser Concordo com seu comentário, mas tenha em mente que esta resposta vem de 2009 ... uma época em que o que você chama de "versões mais antigas do Ie" (ie: IE8 e abaixo) eram versões "atuais" do IE ...
Laurent S.

139

Não sei se esse ainda é um problema atual ou não, mas encontrei o mesmo problema e usei a display: inline-block;tag CSS . Agrupando-os em uma div para que eles possam ser posicionados adequadamente.

<div>
    <div style="display: inline-block;">Content1</div>
    <div style="display: inline-block;">Content2</div>
</div>

Observe que o uso do atributo de estilo embutido foi usado apenas para a sucessão deste exemplo, é claro que eles foram movidos para um arquivo CSS externo.


1
Esta foi a solução para mim. Eu queria duas divs adjacentes como [] [] (cara, já faz um tempo desde que eu faço isso ..) =) parabéns.
Partack 29/07

Este funcionou para mim também. Eu tive alguns problemas com outro float: div right'd empurrando minha coluna da direita div abaixo da esquerda, então também fiz o container usar display: inline-block, e isso foi resolvido.
Martin Carney

5
Isso não funciona quando o conteúdo é grande no Content1 DIV. O resultado é que os DIVs estão em duas linhas separadas, em vez de lado a lado.
21412 Richard Hollis

@RichardHollis Consegui definir a widthpropriedade de todos os meus 2 divs um ao lado do outro para evitar agrupar o segundo em uma nova linha.
Trindaz

1
adicione o css vertical-align: top; também para os dois, caso contrário, o comprimento do conteúdo é diferente
prospector

27

Infelizmente, isso não é algo trivial para resolver no caso geral. O mais fácil seria adicionar uma propriedade no estilo css "float: right;" para sua div de 200px, no entanto, isso também faria com que o "principal" -div tivesse largura total e qualquer texto ali flutuaria em torno da borda de 200px-div, que geralmente parece estranha, dependendo do conteúdo (praticamente em todos os casos, exceto se for uma imagem flutuante).

EDIT: Como sugerido por Dom, o problema de empacotamento pode, obviamente, ser resolvido com uma margem. Eu tolo.


1
'float: left' será mais adequado, a divisão lft é necessária para abranger toda a área esquerda. Sem ofensas, basta considerar.
MN

19

O método sugerido por @roe e @MohitNanda funciona, mas se a div correta estiver definida como float:right;, ela deverá vir primeiro na fonte HTML. Isso interrompe a ordem de leitura da esquerda para a direita, o que pode ser confuso se a página for exibida com os estilos desativados. Se for esse o caso, pode ser melhor usar uma div de wrapper e posicionamento absoluto:

<div id="wrap" style="position:relative;">
    <div id="left" style="margin-right:201px;border:1px solid red;">left</div>
    <div id="right" style="position:absolute;width:200px;right:0;top:0;border:1px solid blue;">right</div>
</div>

Demonstrado:

esquerda direita

Edit: Hmm, interessante. A janela de visualização mostra as divs formatadas corretamente, mas o item de postagem renderizado não. Desculpe, então você terá que tentar por si mesmo.


15

Encontrei este problema hoje. Com base nas soluções acima, isso funcionou para mim:

<div style="width:100%;"> 
    <div style="float:left;">Content left div</div> 
    <div style="float:right;">Content right div</div> 
</div> 

Simplesmente faça com que a div principal abranja toda a largura e flutue as divs contidas nela.


8

ATUALIZAR

Se você precisar colocar elementos em uma linha, poderá usar o Flex Layout . Aqui você tem outro tutorial do Flex . É uma ótima ferramenta de CSS e, embora não seja 100% compatível, a cada dia seu suporte está melhorando. Isso funciona tão simples quanto:

HTML

<div class="container">
    <div class="contentA"></div>
    <div class="contentB"></div>
</div>

CSS

.container {
    display: flex;
    width: 100%;
    height: 200px;
}

.contentA {
    flex: 1;
}

.contentB {
    flex: 3;
}

E o que você obtém aqui é um contêiner com um tamanho total de 4 unidades, que compartilha o espaço com seus filhos em uma relação de 1/4 e 3/4.

Eu fiz um exemplo no CodePen que resolve seu problema. Espero que ajude.

http://codepen.io/timbergus/pen/aOoQLR?editors=110

MUITO VELHO

Talvez isso seja apenas um absurdo, mas você já tentou com uma mesa? Ele não usa CSS diretamente para posicionar as divs, mas funciona bem.

Você pode criar uma tabela 1x2 e colocar seu divsinterior e, em seguida, formatar a tabela com CSS para colocá-las como quiser:

<table>
  <tr>
    <td>
      <div></div>
    </td>
    <td>
      <div></div>
    </td>
  </tr>
</table>

Nota

Se você quiser evitar o uso da mesa, como disse antes, você pode usar float: left;e float: right;e na seguinte elemento, não se esqueça de adicionar um clear: left;, clear: right;ou clear: both;a fim de ter a posição limpa.


As tabelas são uma solução muito mais previsível do que o "flutuador" em constante mudança, que sempre parece atrapalhar algo quando você adiciona ou remove elementos.
Kokodoko

Essa é uma boa solução se você estiver trabalhando com e-mails.
Zac Clancy

6
div1 {
    float: right;
} 
div2 {
    float: left;
}

Isso funcionará bem, desde que você defina clear: botho elemento que separa esse bloco de duas colunas.


3
Ao usar carros alegóricos, você deve definir a propriedade width. Então eu não acho que esta é uma solução boa ..
Martijn

4

Encontrei o mesmo problema e a versão do Mohits funciona. Se você deseja manter sua ordem esquerda-direita no html, tente isso. No meu caso, a div esquerda está ajustando o tamanho, a div direita permanece na largura 260px.

HTML

<div class="box">
<div class="left">Hello</div>
<div class="right">World</div>
</div>

CSS

.box {
    height: 200px;
    padding-right: 260px;
}    

.box .left {
    float: left;
    height: 200px;
    width: 100%;
}

.box .right {
    height: 200px;
    width: 260px;
    margin-right: -260px;
}

O truque é usar um preenchimento à direita na caixa principal, mas use esse espaço novamente colocando a caixa à direita novamente com a margem direita.


Eu não entendo isso sem flutuar: direto.
Jussi Palo

3

Eu uso uma mistura de float e overflow-x: hidden. Código mínimo, sempre funciona.

https://jsfiddle.net/9934sc4d/4/ - MAIS você não precisa limpar o seu carro alegórico!

.left-half{
    width:200px;
    float:left;
}
.right-half{
    overflow-x:hidden;
}

1
É útil quando você conhece a altura da div e sabe que o conteúdo não é maior que essa altura. No entanto, quando há mais conteúdo do que a altura da div, ele está escondido, por causa do estouro ...
Martijn

1
Isso é melhor, na verdade :)
Martijn

1
Agradável! É bom ver as pessoas se alimentando com feedback útil e positivo, em vez de feedback negativo não construtivo. Bom homem @Martijn
Tony Ray Tansley

Obrigado por isso. Eu faço a maior parte do meu trabalho de interface do usuário no React Native e o flex box funciona muito melhor lá do que no HTML + CSS (na minha opinião). Isso tornou minha vida muito mais fácil.
Eric Wiener

2

Como todos apontaram, você fará isso definindo um float:right; conteúdo no RHS e uma margem negativa no LHS.

No entanto ... se você não usar um float: left; no LHS (como o Mohit), obterá um efeito de passo porque a div do LHS ainda consumirá o espaço da margem no layout.

No entanto .. o flutuador LHS reduz o conteúdo do encapsulamento, portanto, você precisará inserir um nó filho de largura definida, se isso não for aceitável; nesse ponto, você também pode ter definido a largura no pai.

No entanto ... como David aponta, você pode alterar a ordem de leitura da marcação para evitar o requisito de flutuação do LHS, mas isso tem problemas de legibilidade e possivelmente de acessibilidade.

No entanto .. esse problema pode ser resolvido com carros alegóricos, com alguma marcação adicional

(ressalva: não aprovo a div .clearing nesse exemplo, veja aqui para detalhes)

Considerando tudo, acho que a maioria de nós gostaria que houvesse uma largura não gananciosa: permanecendo no CSS3 ...


2

Esta não será a resposta para todos, pois não é suportada no IE7-, mas você pode usá-lo e, em seguida, usar uma resposta alternativa para o IE7-. É display: table, display: table-row e display: table-cell. Observe que isso não está usando tabelas para layout, mas denomina divs para que as coisas se alinhem perfeitamente sem todo o aborrecimento de cima. O Mine é um aplicativo html5, por isso funciona muito bem.

Este artigo mostra um exemplo: http://www.sitepoint.com/table-based-layout-is-the-next-big-thing/

Aqui está a aparência da sua folha de estilo:

 .container {
    display: table;
    width:100%;
 }

 .left-column {
    display: table-cell;
 }

 .right-column {
    display: table-cell;
    width: 200px;
 }

-1

Parafraseando um dos meus sites que faz algo semelhante:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <style TYPE="text/css"><!--

.section {
    _float: right; 
    margin-right: 210px;
    _margin-right: 10px;
    _width: expression( (document.body.clientWidth - 250) + "px");
}

.navbar {
    margin: 10px 0;
    float: right;
    width: 200px;
    padding: 9pt 0;
}

  --></style>
 </head>
 <body>
  <div class="navbar">
  This will take up the right hand side
  </div>
  <div class="section">
  This will fill go to the left of the "navbar" div
  </div>
 </body>
</html>

4
Não eu, mas eu acho que os hacks CSS, o doctype de transição ou a falta de explicação?
annakata

Pelo menos tinha um doctype :) Acho que pode ser que as pessoas não gostem dos hacks do navegador pelas margens do IE. Pelo menos eu testei ...
Rowland Shaw

É muito hacky. Existem muitas soluções por aí que são muito mais concisas.
John Bell

@JohnBell talvez esse seja o problema com o tempo - era uma solução razoável na época (mais de 8 anos atrás), mas a tecnologia do navegador mudou desde então. Wierdly alguns dos outros respostas contemporâneas com o meu que propõem a mesma idéia marcou melhor (como Davi, dois minutos após meu)
Rowland Shaw

-7

basta usar um z-index e tudo ficará bem. certifique-se de ter as posições marcadas como fixas ou absolutas. então nada se moverá como em uma tag de flutuação.

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.