Jak unosić 3 div obok siebie za pomocą CSS?

270

Wiem, jak sprawić, by 2 divy unosiły się obok siebie, po prostu unosić jeden w lewo, a drugi w prawo.

Ale jak to zrobić z 3 divami, czy powinienem po prostu używać do tego celu tabel?

Dameon
źródło
3
Za mało informacji. Jak szerokie są warstwy?
Josh Stodola
8
Wolę display: inline-blocktych facetów, niż ich unosić. Jeśli ich szerokości są w sumie mniejsze niż szerokość pojemnika, usiądą obok siebie.
Adam Waite
Polecam użycie „display: table”. Jest to najbardziej konserwowalne i niezawodne rozwiązanie. patrz stackoverflow.com/questions/14070787/…
John Henckel,

Odpowiedzi:

300

Po prostu podaj im szerokość, a float: left;oto przykład:

<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
źródło
6
Co zrobić, jeśli chcesz, aby wszystkie rozwijały się podczas rozwijania strony?
CodyBugstein
31
@imray wystarczy użyć% zamiast px
TehTris
9
Czy mógłbyś wyjaśnić, dlaczego używać <br style="clear: left;" />tego stylu w szczególności.
Mike de Klerk,
2
@MikedeKlerk to poprawka, aby uniknąć zawalenia się rodzica.
Angel Politis,
jak wyjaśnił @Nick Craver, powinieneś nadać wszystkim swoim elementom właściwość float: left . Dzieje się tak, ponieważ właściwość float określa sposób umieszczenia elementu wzdłuż lewej lub prawej strony kontenera nadrzędnego .
Nesha Zoric
130

Współczesnym sposobem jest użycie Flexbox CSS , patrz tabele wsparcia .

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

Możesz także użyć siatki CSS , zobacz tabele wsparcia .

.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>

Naklejki
źródło
52

Jest tak samo jak w przypadku dwóch div, po prostu przestaw trzeci na lewą lub prawą.

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

<div class="left">...</div>
<div class="left">...</div>
<div class="left">...</div>
Sarfraz
źródło
3
Ale DIV jest elementem na poziomie bloku, prawda? Jak to się dzieje, że są umieszczane obok siebie, a nie w następnych wierszach (gdy elementy na poziomie bloku zaczynają się i kończą podziałem linii). Czy float ma na to jakiś wpływ?
Ashwin
26

unosić je wszystkie w lewo

upewnij się, że określono szerokość, aby wszystkie mogły zmieścić się w kontenerze (innym div lub oknie), w przeciwnym razie zostaną zawinięte

davidosomething
źródło
23
<br style="clear: left;" />

ten kod, który ktoś tam opublikował, załatwił sprawę !!! kiedy wklejam go tuż przed zamknięciem DIV kontenera, pomaga wyczyścić wszystkie kolejne DIV z nakładania się z DIV, które utworzyłem obok siebie u góry!

<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
źródło
16

Przesuń wszystkie trzy divy w lewo. Jak tutaj:

.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
źródło
6
Chodzi o to, że moja odpowiedź jest najbardziej poprawna i kiedy nowa osoba będzie przeszukiwać to Q w Internecie, natknie się na moją odpowiedź, która byłaby dla niej najbardziej pomocna.
Arwen
2
To może być. Ale nie ma żadnego wyjaśnienia. Na tej stronie można kopiować inne odpowiedzi, łącząc wiele odpowiedzi częściowych w jedną połączoną lepszą odpowiedź. Możesz edytować i uzupełniać swoje. Jednak nowi użytkownicy mają kilka ograniczeń (upvoting, kilka linków), dlatego nadal zalecałbym, aby nie skupiać się na starych i udzielanych odpowiedziach.
por.
@ cfi dziękuję, zachowam to na przyszłość.
Arwen,
10

Zwykle pływam pierwszy w lewo, drugi w prawo. Trzeci automatycznie dopasowuje się wtedy między nimi.

<div style="float: left;">Column 1</div>
<div style="float: right;">Column 3</div>
<div>Column 2</div>
Nick Travers
źródło
5
Czy to nie powoduje bałaganu przy zmianie rozmiaru przeglądarki?
CodyBugstein
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>

zaletą tego sposobu jest to, że możesz ustawić szerokość każdej kolumny niezależnie od drugiej, o ile utrzymasz ją poniżej 100%, jeśli użyjesz 3 x 30%, pozostałe 10% zostanie podzielone jako 5% przestrzeń dzieląca między kolumnami

SugaComa
źródło
7

możesz unosić się: pozostawiony dla wszystkich i ustawić szerokość na 33,333%

Daniel A. White
źródło
7

spróbuj dodać styl „display: block”

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


<div class="left">...</div>
<div class="left">...</div>
<div class="left">...</div>
Ann
źródło
6

Nie widziałem odpowiedzi bootstrap, więc po co to jest warte:

<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;" />

niech Bootstrap obliczy wartości procentowe. Na wszelki wypadek lubię je usuwać.

John Grabauskas
źródło
1
W bootstrap 4 myślę, że musisz zawinąć całość w div z klasą row.
John Grabauskas,
5

Wolę tę metodę, zmienne są słabo obsługiwane w starszych wersjach IE (naprawdę? ...)

.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; }

ZAKTUALIZOWANO: Oczywiście, aby skorzystać z tej techniki i ze względu na bezwzględne pozycjonowanie, musisz zamknąć div na pojemniku i wykonać postprocessing, aby określić wysokość if, coś takiego:

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

Nie jest to najbardziej niesamowita rzecz na świecie, ale przynajmniej nie psuje się na starszych IE.

jpbourbon
źródło
Oczywiście, aby skorzystać z tej techniki i ze względu na bezwzględne pozycjonowanie, musisz zamknąć div na pojemniku i wykonać postprocessing, aby określić wysokość if, coś takiego:
jpbourbon
jQuery (dokument) .ready (function () {jQuery ('. main'). height (Math.max (jQuery ('. column-left'). height (), jQuery ('. column-right'). wysokość (), jQuery ('. center-center'). height ()));}); Nie jest to najbardziej niesamowita rzecz na świecie, ale przynajmniej nie psuje się na starszych IE.
jpbourbon
4

Ale czy to działa w Chrome?

Unieś każdy div i wyczyść; oba dla rzędu. Nie musisz ustawiać szerokości, jeśli nie chcesz. Działa w Chrome 41, Firefox 37, IE 11

Kliknij, aby pobrać 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
źródło
3

Oto jak udało mi się zrobić coś podobnego do tego wewnątrz <footer>elementu:

<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
źródło
2

@Leniel ta metoda jest dobra, ale musisz dodać szerokość do wszystkich pływających elementów div. Powiedziałbym, aby uczynić je równymi szerokościami lub przypisać stałą szerokość. Coś jak

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

możesz przypisywać nazwy klas każdemu divowi, zamiast dodawać inline style, co nie jest dobrą praktyką.

Pamiętaj, aby użyć div div Clearfix lub Clear div, aby uniknąć, że treść pozostanie poniżej tych div.

Szczegółowe informacje na temat korzystania z div Clearfix można znaleźć tutaj

aquaaarian
źródło