Dwa elementy div, jeden o stałej szerokości, drugi, reszta

97

Mam dwa kontenery div.

Chociaż jeden musi mieć określoną szerokość, muszę go dostosować, aby drugi element div zajmował resztę miejsca. Czy jest jakiś sposób, żebym mógł to zrobić?

.left {
    float: left;
    width: 83%;
    display: table-cell;
    vertical-align: middle;
    min-height: 50px;
    margin-right: 10px;
    overflow: auto;
}

.right {
    float: right;
    width: 16%;
    text-align: right;
    display: table-cell;
    vertical-align: middle;
    min-height: 50px;
    height: 100%;
    overflow: auto;
}
<div class="left"></div>
<div class="right"></div> <!-- needs to be 250px -->

Niedźwiedź
źródło
4
Nie używaj starych hacków do starożytnych przeglądarek. Przewiń w dół, aby zobaczyć nowoczesne rozwiązanie Flexbox.
Evgeny,
1
Zanim przejdziesz do linku Evgeny'ego, weź pod uwagę przeglądarki, których faktycznie używają Twoi użytkownicy, a nie przeglądarki, których chciałbyś, aby używali. Flexbox nie będzie ładnie renderował się na IE 9 twojego profesora: caniuse.com/#feat=flexbox
duhaime
@duhaime IE9 ma 0,13% globalnego wykorzystania
Evgeny
Czyli 1 na 1000 użytkowników ...
duhaime

Odpowiedzi:

127

Zobacz: http://jsfiddle.net/SpSjL/ (dostosuj szerokość przeglądarki)

HTML:

<div class="right"></div>
<div class="left"></div>

CSS:

.left {
    overflow: hidden;
    min-height: 50px;
    border: 2px dashed #f0f;
}

.right {
    float: right;
    width: 250px;
    min-height: 50px;
    margin-left: 10px;
    border: 2px dashed #00f;
}

Możesz to również zrobić display: table, co zwykle jest lepszym podejściem: Jak umieścić element wejściowy w tym samym wierszu, co jego etykieta?

trzydzieści kropek
źródło
4
Ze mną to nie działa. Lewa strona ma szerokość 100%, a prawa 250 pikseli. Dwie linie :(
niedźwiedź
19
Musisz zamienić kolejność divs, jak w mojej odpowiedzi i moim demo. rightwtedy left.
thirtydot
1
Ogólnie to działa dla mnie, ale czasami, gdy mam tekst w lewym div zamiast zawijania do następnej linii (i jest spacja), jest on po prostu odcinany po prawej stronie (gdzie zaczyna się prawy element div). Jak mogę zawijać tekst w lewym div?
Guy
1
Niepływający DIV wypełnia całą szerokość. Zły pomysł, gdy zawartość jest wyższa niż zmienna DIV lub tekst jest za długi.
netAction
47

Jest rok 2017 i najlepszym sposobem na to jest użycie flexboksa, który jest kompatybilny z IE10 + .

.box {
  display: flex;
}

.left {
  flex: 1;  /* grow */
  border: 1px dashed #f0f;
}

.right {
  flex: 0 0 250px; /* do not grow, do not shrink, start at 250px */
  border: 1px dashed #00f;
}
<div class="box">
  <div class="left">Left</div>
  <div class="right">Right 250px</div>
</div>

Evgeny
źródło
1
Twój komentarz do pytania uchronił mnie przed próbą wsparcia IE6. dzięki!
Mike Davlantes
Jest to również dobre, ale calc () jest znacznie lepsza niż Flex ze względu na kompatybilność z IE9 i Chrome 26.
Don Dilanga
To działało dobrze dla mnie. Nie trzeba było nawet definiować właściwej szerokości.
rotaercz
1
Zabija mnie to, że w 2017/2018/2019 wciąż otrzymujemy komentarze w stylu BEWARE OF IE 9.
Mike Devenney
43

Możesz użyć funkcji calc () w CSS.

Demo: http://jsfiddle.net/A8zLY/543/

<div class="left"></div>
<div class="right"></div>

.left {
height:200px;
width:calc(100% - 200px);
background:blue;
float:left;
}

.right {
width:200px;
height:200px;
background:red;
float:right;   
}

Mam nadzieję, że to ci pomoże !!

Shivali Patel
źródło
dzięki za radę. Sprawdziłem kompatybilność między przeglądarkami i jest trochę wysoka dla stabilnego użytkowania
Farside
1
To powinno być wybrane jako najlepsza odpowiedź, ponieważ w tej odpowiedzi tagi DIV nie są zamienione jak w najlepszej odpowiedzi.
Don Dilanga,
14

Jeśli możesz odwrócić kolejność w kodzie źródłowym, możesz to zrobić w ten sposób:

HTML:

<div class="right"></div> // needs to be 250px    
<div class="left"></div>

CSS:

.right {
  width: 250px;
  float: right;
}   

Przykład: http://jsfiddle.net/blineberry/VHcPT/

Dodaj kontener i możesz to zrobić z aktualną kolejnością kodu źródłowego i pozycjonowaniem bezwzględnym:

HTML:

<div id="container">
  <div class="left"></div>
  <div class="right"></div>
</div>

CSS:

#container {
  /* set a width %, ems, px, whatever */
  position: relative;
}

.left {
  position: absolute;
  top: 0;
  left: 0;
  right: 250px;
}

.right {
  position: absolute;
  background: red;
  width: 250px;
  top: 0;
  right: 0;
}

Tutaj .leftdiv pobiera domyślnie ustawioną szerokość od top, lefti rightstylów, które pozwala na to, aby wypełnić pozostałą przestrzeń w #container.

Przykład: http://jsfiddle.net/blineberry/VHcPT/3/

Brent
źródło
Pierwszy przykład wydaje się nie działać. .Left div w jsFiddle to właściwie cała szerokość ekranu. Jeśli oba elementy div mają tę samą wysokość, to świetnie, ale w tym przypadku po prostu dodaj 5 pikselowe wypełnienie do .left, a zobaczysz.
user3413723
1
Jednak drugie rozwiązanie zadziałało dla mnie świetnie. Geniusz!
user3413723
6

Jeśli możesz zawinąć je w kontener, <div>możesz użyć pozycjonowania, aby <div>zakotwiczyć lewą stronę left:0;right:250px, zobacz to demo . Powiem teraz, że to nie będzie działać w IE6 jak tylko jeden narożnik <div>może być całkowicie umieszczony na stronie ( patrz tutaj dla pełnego wyjaśnienia).

andyb
źródło
3

1 - Przygotuj element div wrapper, ustaw dopełnienie i margines tak, jak chcesz
2 - Ustaw lewą stronę div o wymaganej szerokości i
ustaw ją tak, by pływała po lewej stronie 3 - Ustaw margines div po prawej stronie równy szerokości lewej strony

.left
{
    ***width:300px;***
    float: left;
    overflow:hidden;

}

.right
{
    overflow: visible;
    ***margin-left:300px;***
}



<div class="wrapper">
    <div class="left">
        ...
    </div>

    <div class="right" >
        ...
    </div>

</div>

Mam nadzieję, że to działa dla Ciebie!

Oscar
źródło
1

ustaw swoją prawą na określoną szerokość i przesuń ją, po lewej ustaw tylko margines prawy na 250px

.left {
vertical-align: middle;
min-height: 50px;
margin-right: 250px;
overflow: auto

}

.right {
width:250px;
text-align: right;
display: table-cell;
vertical-align: middle;
min-height: 50px;
height: 100%;
overflow: auto
}
meteorainer
źródło
wyłącz wyświetlanie typu .right i upewnij się, że nigdzie nie masz wyraźnego ustawienia, które mogłoby mieć wpływ na
.left
czy masz jakiś rodzaj otoki div? Czy jest coś w Internecie, co mogę sprawdzić, czy jest to całkowicie lokalne?
meteorainer
Jest całkowicie lokalny, jednak spróbuję umieścić go na jsfiddle.
niedźwiedź
haha, usunąłeś swój pływak: prawda. Nie zapomnij również wziąć pod uwagę szerokości obramowania, więc jeśli zamierzasz je zostawić, odejmij szerokości od jednej z szerokości div.
meteorainer
0

Jeśli potrzebujesz rozwiązania obejmującego wiele przeglądarek, możesz skorzystać z mojego podejścia, przejrzystego i łatwego.

.left{
        position: absolute;
        height: 150px;
        width:150px;
        background: red;
        overflow: hidden;
        float:left;
}
.right{
        position:relative;
        height: 150px;
        width:100%;
        background: red;
        margin-left:150px;
        background: green;
        float:right;
}

źródło
-1

Użyj prostego, który może ci pomóc

<table width="100%">
    <tr>
         <td width="200">fix width</td>
         <td><div>ha ha, this is the rest!</div></td>
    </tr>
</table>
Huỳnh Hữu Ân
źródło