CSS dwa div obok siebie

230

Chcę umieścić dwa <div>s obok siebie. Po prawej <div>jest około 200 pikseli; a lewa strona <div>musi wypełnić resztę szerokości ekranu? W jaki sposób mogę to zrobić?

Martijn
źródło

Odpowiedzi:

421

Możesz użyć Flexboksa, aby uporządkować swoje przedmioty:

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

Jest to po prostu skrobanie powierzchni Flexbox. Flexbox potrafi robić niesamowite rzeczy.


Aby obsługiwać starszą przeglądarkę, możesz użyć pływaka CSS i właściwości szerokości , aby go rozwiązać.

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

MN
źródło
14
To jest właściwie poprawna odpowiedź, jest zwięzła i - w przeciwieństwie do dwóch obecnie nad nią - jest całkowicie samodzielna. Najlepsze odpowiedzi na temat SO powinny być takie, IMO. +1
Bobby Jack
Chcesz wyjaśnić, dlaczego lewica musi być float:left? Twój komentarz do mojej odpowiedzi mówi: „lft div jest wymagany dla całego lewego obszaru”, ale float:leftspowoduje ciasne zawinięcie zawartości.
falstro
14
Ta odpowiedź nie jest do końca poprawna i raczej denerwujące jest to, że tak bardzo ją oceniam. Tworzy to układ bardzo niestabilny. Radziłbym umieścić dwa elementy div w kontenerze i użyć właściwości display: inline-block, aby uzyskać wyrównanie elementów div, jak sugerują niektóre inne odpowiedzi. Nie krytykuję nikogo, ponieważ wszyscy jesteśmy tutaj, aby sobie pomagać, więc oprócz mojego wybierania nitów, dziękuję MN za twój wkład w tę społeczność.
Mussser,
1
ALE jedną rzeczą
wartą
3
@Mussser Zgadzam się z twoim komentarzem, ale pamiętaj, że ta odpowiedź pochodzi z 2009 roku ... czasu, w którym to, co nazywacie „starszymi wersjami Ie” (tj. IE8 i starsze), było „aktualnymi” wersjami IE…
Laurent S.
139

Nie wiem, czy to wciąż aktualny problem, czy nie, ale właśnie napotkałem ten sam problem i użyłem display: inline-block;tagu CSS . Zawinięcie ich w div, aby można je było odpowiednio ustawić.

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

Zauważ, że użycie atrybutu stylu wbudowanego zostało użyte tylko dla zwięzłości tego przykładu, oczywiście zostały one przeniesione do zewnętrznego pliku CSS.

russholio
źródło
1
To było dla mnie rozwiązanie. Chciałem sąsiadować z dwoma divami jak [] [] (stary, odkąd to zrobiłem ..) =) Kudos.
Partack
Ten też działał dla mnie. Miałem pewne problemy z inną liczbą zmiennoprzecinkową: div right'd popycha div div prawej kolumny poniżej lewej, więc też użyłem displaya display: blok wbudowany i to rozwiązało.
Martin Carney,
5
To nie działa, gdy zawartość jest duża w Content1 DIV. Rezultat jest taki, że DIV są na dwóch osobnych liniach zamiast obok siebie.
Richard Hollis,
@RichardHollis Byłem w stanie ustawić widthwłaściwość wszystkich moich 2 div obok siebie, aby zapobiec zawijaniu drugiego do nowej linii.
Trindaz
1
dodaj css vertical-align: top; do obu, w przeciwnym razie zepchną się nawzajem, jeśli długość treści będzie się różnić
poszukiwacz
27

Niestety nie jest to trywialna sprawa do rozwiązania w przypadku ogólnym. Najłatwiej byłoby dodać właściwość w stylu css „float: right;” do div 200px, spowodowałoby to jednak, że twoja „główna” -div faktycznie byłaby pełna, a każdy tekst w niej unosiłby się wokół krawędzi div-200px, co często wygląda dziwnie, w zależności od zawartości (właściwie we wszystkich przypadkach, z wyjątkiem sytuacji, gdy jest to obraz pływający).

EDYCJA: Jak sugeruje Dom, problem owijania można oczywiście rozwiązać z marginesem. Głupi ja.

falstro
źródło
1
„float: left” będzie bardziej odpowiednie, lewy div jest wymagany na całym lewym obszarze. Żadne przestępstwa nie miały na myśli, tylko zastanów się.
MN
19

Metoda sugerowana przez @roe i @MohitNanda działa, ale jeśli odpowiedni div jest ustawiony jako float:right;, to musi być na pierwszym miejscu w źródle HTML. To łamie kolejność odczytu od lewej do prawej, co może być mylące, jeśli strona jest wyświetlana z wyłączonymi stylami. W takim przypadku lepszym rozwiązaniem może być użycie otoki div i pozycjonowania bezwzględnego:

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

Wykazano:

Lewo prawo

Edycja: Hmm, ciekawe. Okno podglądu pokazuje poprawnie sformatowane div, ale renderowany element postu nie. Przykro mi, więc musisz spróbować sam.

David Hanak
źródło
15

Wpadłem dzisiaj na ten problem. W oparciu o powyższe rozwiązania działało to dla mnie:

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

Po prostu ustaw div nadrzędny na całą szerokość i ułóż div znajdujące się w nim.

Wickyd
źródło
8

AKTUALIZACJA

Jeśli chcesz umieścić elementy w rzędzie, możesz użyć Flex Layout . Tutaj masz kolejny samouczek Flex . To świetne narzędzie CSS i chociaż nie jest w 100% kompatybilne, każdego dnia jego obsługa jest coraz lepsza. Działa to tak prosto, jak:

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

Dostajesz tutaj pojemnik o łącznej wielkości 4 jednostek, które dzielą przestrzeń z dziećmi w stosunku 1/4 i 3/4.

Zrobiłem przykład w CodePen, który rozwiązuje twój problem. Mam nadzieję, że to pomoże.

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

BARDZO STARY

Może to tylko nonsens, ale czy próbowałeś ze stołem? Nie używa bezpośrednio CSS do pozycjonowania div, ale działa dobrze.

Możesz utworzyć tabelę 1x2 i umieścić ją w divsśrodku, a następnie sformatować tabelę za pomocą CSS, aby umieścić je tak, jak chcesz:

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

Uwaga

Jeśli chcesz uniknąć korzystając z tabeli, jak powiedziałem wcześniej, można użyć float: left;a float: right;i następnego elementu, nie zapomnij dodać clear: left;, clear: right;lub clear: both;w celu uzyskania pozycji czyszczona.

Timbergus
źródło
Tabele są znacznie bardziej przewidywalnym rozwiązaniem niż ciągle zmieniający się „float”, który zawsze wydaje się coś zepsuć podczas dodawania lub usuwania elementów.
Kokodoko
To dobre rozwiązanie, jeśli pracujesz z e-mailami.
Zac Clancy
6
div1 {
    float: right;
} 
div2 {
    float: left;
}

Będzie to działało OK, o ile zostanie ustawiony clear: bothelement oddzielający ten blok dwóch kolumn.

ccpizza
źródło
3
Korzystając z pływaków, musisz ustawić właściwość width. Więc nie sądzę, że to dobre rozwiązanie ..
Martijn,
4

Napotkałem ten sam problem i działa wersja Mohitsa. Jeśli chcesz zachować lewą i prawą kolejność w pliku HTML, po prostu spróbuj tego. W moim przypadku lewy div dostosowuje rozmiar, prawy div pozostaje na szerokości 260 pikseli.

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

Sztuką jest użycie prawego dopełnienia głównego pola, ale skorzystaj z tego miejsca ponownie, umieszczając prawe pole ponownie z marginesem prawym.

Andreas
źródło
Nie rozumiem, że działa bez pływaka: bezpośrednio w .right.
Jussi Palo
3

Używam mieszanki float i overflow-x: hidden. Minimalny kod, zawsze działa.

https://jsfiddle.net/9934sc4d/4/ - PLUS, że nie musisz usuwać pływaka!

.left-half{
    width:200px;
    float:left;
}
.right-half{
    overflow-x:hidden;
}
Tony Ray Tansley
źródło
1
Jest przydatny, gdy znasz wysokość div i wiesz, że zawartość nie jest dłuższa niż ta wysokość. Jednak gdy zawartość jest większa niż wysokość div, jest ona ukryta z powodu przepełnienia ...
Martijn
1
Rzeczywiście tak jest lepiej :)
Martijn
1
Miły! dobrze widzieć, jak ludzie karmią się wsparciem dzięki przydatnym i pozytywnym opiniom, a nie niekonstruktywnym negatywnym opiniom. Dobry człowiek @Martijn
Tony Ray Tansley
Dziękuję Ci za to. Większość pracy z interfejsem użytkownika wykonuję w React Native, a flex box działa tam o wiele lepiej niż w HTML + CSS (moim zdaniem). To znacznie ułatwiło mi życie.
Eric Wiener
2

Jak wszyscy zauważyli, zrobisz to, ustawiając float:right;na treści RHS i ujemny margines na LHS.

Jednak .. jeśli nie użyjesz float: left;LHS (tak jak Mohit), otrzymasz efekt stopniowy, ponieważ div LHS nadal będzie zajmował margines miejsca w układzie.

Jednak ... zmiennoprzecinkowe LHS zawinie zawartość, więc musisz wstawić childnode o zdefiniowanej szerokości, jeśli nie jest to dopuszczalne, w którym momencie równie dobrze możesz zdefiniować szerokość dla rodzica.

Jednak ... jak zauważa David, możesz zmienić kolejność odczytu znaczników, aby uniknąć wymogu zmiennoprzecinkowego LHS, ale ma to problemy z czytelnością i być może z dostępnością.

Jednak .. ten problem można rozwiązać za pomocą zmiennoprzecinkowych elementów z dodatkowymi znacznikami

(zastrzeżenie: Nie akceptuję div .clearing w tym przykładzie, zobacz szczegóły tutaj )

Biorąc wszystko pod uwagę, myślę, że większość z nas żałuje, że nie było chciwej szerokości: pozostanie w CSS3 ...

annakata
źródło
2

To nie będzie odpowiedź dla wszystkich, ponieważ nie jest obsługiwana w IE7-, ale możesz jej użyć, a następnie użyć alternatywnej odpowiedzi dla IE7-. Wyświetlane są: tabela, wyświetlanie: wiersz tabeli i wyświetlanie: komórka tabeli. Zwróć uwagę, że nie używa to tabel do układania, ale stylizuje div, aby rzeczy ładnie układały się bez problemów z góry. Mój jest aplikacją HTML5, więc działa świetnie.

W tym artykule pokazano przykład: http://www.sitepoint.com/table-based-layout-is-the-next-big-thing/

Oto jak będzie wyglądał twój arkusz stylów:

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

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

 .right-column {
    display: table-cell;
    width: 200px;
 }
dwaz
źródło
-1

Parafrazując jedną z moich stron internetowych, która robi coś podobnego:

<!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>
Rowland Shaw
źródło
4
Nie ja, ale zgaduję, że hacki CSS, przejściowy typ dokumentu lub brak wyjaśnienia?
annakata
Przynajmniej miał doctype :) Wydaje mi się, że ludzie nie lubią hacków przeglądarki za marginesy w IE. Przynajmniej przetestowałem to ...
Rowland Shaw
To jest zbyt zuchwałe. Istnieje wiele rozwiązań, które są znacznie bardziej zwięzłe.
John Bell
@JohnBell może to jest problem z czasem - w tym czasie było to rozsądne rozwiązanie (ponad 8 lat temu), ale od tego czasu technologia przeglądarek się rozwija. Dziwnie niektóre inne odpowiedzi współczesne z moim, które proponują ten sam pomysł, uzyskały lepsze wyniki (takie jak David, dwie minuty po moim)
Rowland Shaw
-7

wystarczy użyć indeksu Z, a wszystko będzie ładnie siedzieć. upewnij się, że pozycje są oznaczone jako stałe lub bezwzględne. wtedy nic nie będzie się poruszać, jak w przypadku pływaka.

Imbir
źródło