Dodać div div pozostające * poziome * miejsce w flexbox

203

Mam 2 divy obok siebie w Flexbox. Prawa ręka powinna zawsze mieć tę samą szerokość i chcę, żeby lewa ręka po prostu wzięła pozostałe miejsce. Ale tak się nie stanie, chyba że specjalnie ustawię jego szerokość.

W tej chwili jest on ustawiony na 96%, co wygląda OK, dopóki naprawdę nie zmiażdżysz ekranu - wtedy div prawej ręki będzie trochę głodny miejsca, którego potrzebuje.

Wydaje mi się, że mógłbym to zostawić bez zmian, ale wydaje mi się to złe - tak jak musi być sposób, aby powiedzieć:

właściwy jest zawsze taki sam; ty po lewej - dostajesz wszystko, co zostało

.ar-course-nav {
  cursor: pointer;
  padding: 8px 12px 8px 12px;
  border-radius: 8px;
}
.ar-course-nav:hover {
  background-color: rgba(0, 0, 0, 0.1);
}
<br/>
<br/>
<div class="ar-course-nav" style="display:flex; justify-content:space-between;">
  <div style="width:96%;">
    <div style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">
      <strong title="Course Name Which is Really Quite Long And Does Go On a Bit But Then When You Think it's Stopped it Keeps on Going for even longer!">
                Course Name Which is Really Quite Long And Does Go On a Bit But Then When You Think it's Stopped it Keeps on Going for even longer!
            </strong>
    </div>
    <div style="width:100%; display:flex; justify-content:space-between;">
      <div style="color:#555555; margin-right:8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;" title="A really really really really really really really really really really really long department name">
        A really really really really really really really really really really really long department name
      </div>
      <div style="color:#555555; text-align:right; white-space:nowrap;">
        Created: 21 September 2016
      </div>
    </div>
  </div>
  <div style="margin-left:8px;">
    <strong>&gt;</strong>
  </div>
</div>

Adam Benson
źródło

Odpowiedzi:

324

Użyj flex-growwłaściwości, aby element elastyczny zajął wolne miejsce na głównej osi .

Ta właściwość maksymalnie rozszerzy element, dostosowując długość do dynamicznych środowisk, takich jak zmiana rozmiaru ekranu lub dodawanie / usuwanie innych elementów.

Typowym przykładem jest flex-grow: 1albo za pomocą właściwości skrótowej, flex: 1.

Dlatego zamiast width: 96%na div, użyj flex: 1.


Napisałeś:

W tej chwili jest on ustawiony na 96%, co wygląda OK, dopóki naprawdę nie zmiażdżysz ekranu - wtedy div prawej ręki będzie trochę głodny miejsca, którego potrzebuje.

Zgniatanie div o stałej szerokości jest powiązane z inną właściwością flex: flex-shrink

Domyślnie ustawiane są elementy elastyczne, flex-shrink: 1dzięki czemu mogą się kurczyć, aby zapobiec przepełnieniu kontenera.

Aby wyłączyć tę funkcję, użyj flex-shrink: 0.

Aby uzyskać więcej informacji zobacz The flex-shrinkczynnik sekcję w odpowiedzi tutaj:


Dowiedz się więcej o wyrównaniu elastycznym wzdłuż głównej osi tutaj:

Dowiedz się więcej o wyrównaniu elastycznym wzdłuż osi poprzecznej tutaj:

Michael Benjamin
źródło
1
Miałem tę samą sytuację i używanie flex-grow: 1nie dawało takich samych efektów jak flex: 1. Czy może wiesz, dlaczego jest inaczej? (Naprawiłem problem z tym ostatnim, dzięki)
WhGandalf
4
Z flex-grow: 1The flex-basisnieruchomość pozostaje na autojej wartość domyślną. Z flex: 1The flex-basiswłasność zmienia się 0. Zobacz moją odpowiedź tutaj, aby uzyskać szczegółową recenzję: stackoverflow.com/q/43520932/3597276 @WhGandalf
Michael Benjamin
flex-shrink był dla mnie kluczowy :)
pixelearth
25

Zasadniczo starałem się, aby mój kod miał środkową sekcję w „wierszu”, aby automatycznie dopasować się do zawartości po obu stronach (w moim przypadku separator linii kropkowanej). Jak sugerował @Michael_B, klucz jest używany display:flexw kontenerze wiersza i przynajmniej upewnia się, że środkowy kontener w rzędzie ma flex-growwartość co najmniej 1 wyższą niż kontenery zewnętrzne (jeśli kontenery zewnętrzne nie mają żadnych flex-growzastosowanych właściwości, kontener środkowy potrzebuje tylko 1 dla flex-grow).

Oto zdjęcie tego, co próbowałem zrobić, i przykładowy kod rozwiązania tego problemu.

Edycja: Kropkowana dolna ramka prawdopodobnie będzie wyglądać dziwnie w zależności od sposobu jej wyświetlania w przeglądarce. Osobiście zaleciłbym użycie czarnego koła SVG jako powtarzającego się obrazu tła, odpowiednio dobranego i umieszczonego na spodzie środkowego pojemnika. Dodam to alternatywne rozwiązanie, kiedy będę miał czas.

wprowadź opis zdjęcia tutaj

.row {
  background: lightgray;
  height: 30px;
  width: 100%;
  display: flex;
  align-items:flex-end;
  margin-top:5px;
}
.left {
  background:lightblue;
}
.separator{
  flex-grow:1;
  border-bottom:dotted 2px black;
}
.right {
  background:coral;
}
<div class="row">
  <div class="left">Left</div>
  <div class="separator"></div>
  <div class="right">Right With Text</div>
</div>
<div class="row">
  <div class="left">Left With More Text</div>
  <div class="separator"></div>
  <div class="right">Right</div>
</div>
<div class="row">
  <div class="left">Left With Text</div>
  <div class="separator"></div>
  <div class="right">Right With More Text</div>
</div>

Brett84c
źródło