Como flutuar 3 divs lado a lado usando CSS?

270

Eu sei como fazer 2 divs flutuar lado a lado, simplesmente flutuar um para a esquerda e outro para a direita.

Mas como fazer isso com 3 divs ou devo apenas usar tabelas para esse fim?

Dameon
fonte
3
Não é informação suficiente. Qual a largura das camadas?
Josh Stodola
8
Eu teria display: inline-blockesses caras em vez de flutuar neles. Se a largura deles for menor que a largura do contêiner, eles ficarão próximos um do outro.
Adam Waite
Eu recomendo usar "display: table". É a solução mais sustentável e confiável. veja stackoverflow.com/questions/14070787/…
John Henckel 11/11

Respostas:

300

Apenas dê a eles uma largura e float: left;, aqui está um exemplo:

<div style="width: 500px;">
 <div style="float: left; width: 200px;">Left Stuff</div>
 <div style="float: left; width: 100px;">Middle Stuff</div>
 <div style="float: left; width: 200px;">Right Stuff</div>
 <br style="clear: left;" />
</div>
Nick Craver
fonte
6
E se você quiser que todos eles se expandam à medida que a página é expandida?
precisa saber é o seguinte
31
@imray basta usar% em vez de px
TehTris
9
Você poderia explicar por que usar <br style="clear: left;" />esse estilo em particular.
Mike de Klerk
2
@MikedeKlerk é uma correção clara, para evitar o colapso dos pais.
precisa
como o @Nick Craver explicou, você deve atribuir a todos os seus elementos a propriedade float: left . Isso está acontecendo porque a propriedade float especifica como o elemento é colocado ao longo do lado esquerdo ou direito do contêiner pai .
Nesha Zoric
130

A maneira moderna é usar o flexbox CSS , consulte as tabelas de suporte .

.container {
  display: flex;
}
.container > div {
  flex: 1; /*grow*/
}
<div class="container">
  <div>Left div</div>
  <div>Middle div</div>  
  <div>Right div</div>
</div>

Você também pode usar a grade CSS , consulte as tabelas de suporte .

.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr; /* fraction*/
}
<div class="container">
  <div>Left div</div>
  <div>Middle div</div>  
  <div>Right div</div>
</div>

Adesivos
fonte
52

É da mesma maneira que você faz para os dois divs, apenas flutue o terceiro para a esquerda ou direita também.

<style>
  .left{float:left; width:33%;}
</style>

<div class="left">...</div>
<div class="left">...</div>
<div class="left">...</div>
Sarfraz
fonte
3
Mas DIV é um elemento de nível de bloco, certo? Então, como é que eles são colocados lado a lado e não nas próximas linhas (como os elementos no nível do bloco começam e terminam com uma quebra de linha). O float também tem algum outro efeito?
Ashwin 31/03
26

flutuar todos eles à esquerda

verifique se uma largura é especificada para que todos possam caber em seu contêiner (outra div ou a janela), caso contrário eles serão agrupados

davidosomething
fonte
23
<br style="clear: left;" />

aquele código que alguém postou lá em cima, deu certo !!! quando colo antes de fechar o DIV do contêiner, ajuda a evitar que todos os DIVs subseqüentes se sobreponham aos DIVs que criei lado a lado na parte superior!

<div>
<div class="left"></div>
<div class="left"></div>
...
...
<div class="left"></div>
<!--  then magic trick comes here  -->
<br style="clear: left;" />
</div>

tadaa !! :)

Migisha
fonte
16

Flutue todos os três divs para a esquerda. Como aqui:

.first-div {
  width:370px;
  height:150px;
  float:left;
  background-color:pink;
}

.second-div {
  width:370px;
  height:150px;
  float:left;
  background-color:blue;
}

.third-div {
  width:370px;
  height:150px;
  float:left;
  background-color:purple;
}
Arwen
fonte
6
O ponto é que minha resposta é a mais correta e, quando uma nova pessoa estiver pesquisando este Q na internet, ela encontrará minha resposta, que seria a mais útil para eles.
Arwen 17/10
2
Isso pode ser. Mas falta uma explicação. Não há problema neste site copiar outras respostas, mesclando várias respostas parciais em uma única resposta combinada. Você pode editar e concluir o seu. No entanto, os novos usuários têm algumas restrições (voto positivo, poucos links), por isso recomendo não focar em perguntas antigas e respondidas.
Cfi
@ CFI obrigado, vou mantê-lo para referência futura.
Arwen 18/10
10

Normalmente, apenas flutuo o primeiro para a esquerda e o segundo para a direita. O terceiro alinha automaticamente entre eles então.

<div style="float: left;">Column 1</div>
<div style="float: right;">Column 3</div>
<div>Column 2</div>
Nick Travers
fonte
5
Isso não causa confusão quando o navegador é redimensionado?
precisa saber é o seguinte
10
<style>
.left-column
{
float:left;
width:30%;
background-color:red;
}
.right-column
{
float:right;
width:30%;
background-color:green;
}
.center-column
{
margin:auto;
width:30%;
background-color:blue;
}
</style>

<div id="container">
<section class="left-column">THIS IS COLUMN 1 LEFT</section>
<section class="right-column">THIS IS COLUMN 3 RIGHT</section>
<section class="center-column">THIS IS COLUMN 2 CENTER</section>
</div>

a vantagem dessa maneira é que você pode definir cada largura de coluna independente da outra, desde que a mantenha abaixo de 100%, se você usar 3 x 30%, os 10% restantes serão divididos como um espaço divisor de 5% entre as colunas

SugaComa
fonte
7

você pode flutuar: deixou para todos eles e defina a largura para 33.333%

Daniel A. White
fonte
7

tente adicionar "display: block" ao estilo

<style>
   .left{
          display: block;
          float:left; 
          width:33%;
    }
</style>


<div class="left">...</div>
<div class="left">...</div>
<div class="left">...</div>
Ann
fonte
6

Não vi a resposta do bootstrap, então quanto vale a pena:

<div class="col-xs-4">Left Div</div>
<div class="col-xs-4">Middle Div</div>
<div class="col-xs-4">Right Div</div>
<br style="clear: both;" />

deixe o Bootstrap descobrir as porcentagens. Eu gosto de limpar os dois, só por precaução.

John Grabauskas
fonte
1
No bootstrap 4, acho que você precisa agrupar tudo em uma div com a classe row.
John Grabauskas
5

Eu prefiro esse método, os carros alegóricos são pouco suportados nas versões mais antigas do IE (realmente? ...)

.column-left{ position:absolute; left: 0px; width: 33.3%; background: red; }
.column-right{position:absolute; left:66.6%; width: 33.3%; background: green; }
.column-center{ position:absolute; left:33.3%; width: 33.3%; background: yellow; }

ATUALIZADO: É claro que, para usar esta técnica e devido ao posicionamento absoluto, você precisa colocar as divs em um contêiner e fazer um pós-processamento para definir a altura de if, algo como isto:

jQuery(document).ready(function(){ 
    jQuery('.main').height( Math.max (
        jQuery('.column-left').height(),
        jQuery('.column‌​-right').height(),
        jQuery('.column-center').height())
    ); 
});

Não é a coisa mais incrível do mundo, mas pelo menos não quebra nos IEs mais antigos.

jpbourbon
fonte
Claro que, para usar esta técnica e devido ao posicionamento absoluto você precisa colocar os divs em um recipiente e fazer um pós-processamento para definir a altura de se, algo como isto:
jpbourbon
jQuery (documento) .ready (função () {jQuery ('. main'). height (Math.max (jQuery ('. coluna-esquerda'). height (), jQuery ('. coluna-direita'). height (), jQuery ('. coluna-centro'). height ()));}); Não é a coisa mais incrível do mundo, mas pelo menos não quebra nos IEs mais antigos.
precisa saber é o seguinte
4

Mas isso funciona no Chrome?

Faça flutuar cada div e defina clear; ambos para a linha. Não há necessidade de definir larguras, se você não quiser. Funciona no Chrome 41, Firefox 37, IE 11

Clique para JS Fiddle

HTML

<div class="stack">
    <div class="row">
        <div class="col">
            One
        </div>
        <div class="col">
            Two
        </div>
    </div>
        <div class="row">
        <div class="col">
            One
        </div>
        <div class="col">
            Two
        </div>
                    <div class="col">
            Three
        </div>
    </div>
</div>

CSS

.stack .row { 
clear:both;

}
.stack .row  .col    {
    float:left;
      border:1px solid;

}
AndrewD
fonte
3

Aqui está como eu consegui fazer algo semelhante a isso dentro de um <footer>elemento:

<div class="content-wrapper">

    <div style="float:left">
        <p>&copy; 2012 - @DateTime.Now.Year @Localization.ClientName</p>
    </div>

    <div style="float:right">
        <p>@Localization.DevelopedBy <a href="http://leniel.net" target="_blank">Leniel Macaferi</a></p>
    </div>

    <div style="text-align:center;">
        <p>☎ (24) 3347-3110 | (24) 8119-1085&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;✉ @Html.ActionLink(Localization.Contact, MVC.Home.ActionNames.Contact, MVC.Home.Name)</p>
    </div>

</div>

CSS:

.content-wrapper
{
    margin: 0 auto;
    max-width: 1216px;
}
Leniel Maccaferri
fonte
2

@Leniel esse método é bom, mas você precisa adicionar largura a todas as divs flutuantes. Eu diria que torná-los iguais ou atribuir largura fixa. Algo como

.content-wrapper > div { width:33.3%; }

você pode atribuir nomes de classe a cada div em vez de adicionar inline style, o que não é uma boa prática.

Certifique-se de usar uma div clearfix ou div limpa para evitar que o conteúdo a seguir permaneça abaixo dessas div.

Você pode encontrar detalhes de como usar o clearfix div aqui

aquaaarian
fonte