2017-04-09 14 views
5

Wiem, że są podobne pytania, ale to jest właśnie pytanie, jak to zrobić za pomocą CSS Grid Layout.CSS Grid: jak utworzyć kolumnę o pełnej szerokości, gdy nie ma drugiej kolumny?

Więc mamy tę podstawową konfigurację siatki:

HTML (z bocznym):

<div class="grid"> 

    <div class="content"> 
    <p>content</p> 
    </div> 

    <div class="sidebar"> 
    <p>sidebar</p> 
    </div> 

</div> 

CSS:

.grid { 
    display: grid; 
    grid-template-columns: 1fr 200px; 
} 

Aby stworzyć układ, który wygląda mniej więcej tak to:

| content    | sidebar | 

Jeśli strona nie ma paska bocznego, np. html wygląda tak, ale z tego samego CSS:

HTML (nr boczny):

<div class="grid"> 

    <div class="content"> 
    <p>content</p> 
    </div> 

</div> 

Układ strony wygląda następująco (kreski oznaczają pustą przestrzeń)

| content    | ------- | 

I wiedzieć, dlaczego tak się dzieje, kolumna siatki jest nadal zdefiniowana w regule grid-template-columns.

Po prostu zastanawiam się, jak powiedzieć sieci, że jeśli nie ma zawartości, wypełnij pozostałe miejsce podobne do tego, jak flex-grow działa dla flexbox.

Pożądany wynik będzie wyglądał tak, jeśli nie ma paska bocznego.

| content       | 

Odpowiedz

4

można zbliżyć się za pomocą treści słowa kluczowe kalibrujący coś takiego:

.grid { 
    display: grid; 
    grid-template-columns: 1fr fit-content(200px); 
} 

.sidebar { 
    width: 100%; 
} 

fit-content kluczowe będą patrzeć na wielkości zawartości i zachowywać się jak max-content aż niego osiąga wartość, którą przekazujesz.

W rzeczywistości prawdopodobnie nie będziesz potrzebować aby umieścić rozmiar na pasku bocznym, ponieważ zawartość może narzucać rozmiar co najmniej 200 pikseli (na przykład), ale można się z tym bawić.

+0

Myślę, że szerokość ustawienia: 100%; na pasku bocznym najprawdopodobniej pozwoli na to, by pasek boczny opierał swoją szerokość na wartości układu siatki zamiast podawania 200 pikseli dwukrotnie. –

+0

po prostu nie ustawiaj niczego, jeśli chcesz. –

+0

Czy to nie oznacza, że ​​pasek boczny może mieć mniej niż 200 pikseli, ale jeśli na pasku bocznym nie ma zawartości o wartości 200 pikseli? –

4

nie określają kolumny wyraźnie z grid-template-columns.

Zamiast tego ustaw kolumny jako domyślne, a następnie określ ich szerokości za pomocą grid-auto-columns.

Dzięki temu pierwsza kolumna (.content) zużyje całe miejsce w rzędzie, gdy druga kolumna (.sidebar) nie istnieje.

.grid { 
 
    display: grid; 
 
    grid-auto-columns: 1fr 200px; 
 
} 
 

 
.content { 
 
    grid-column: 1; 
 
} 
 

 
.sidebar { 
 
    grid-column: 2; 
 
} 
 

 
.grid > * { 
 
    border: 1px dashed red; /* demo only */ 
 
}
<p>With side bar:</p> 
 

 
<div class="grid"> 
 

 
    <div class="content"> 
 
    <p>content</p> 
 
    </div> 
 
    
 
    <div class="sidebar"> 
 
    <p>sidebar</p> 
 
    </div> 
 

 
</div> 
 

 
<p>No side bar:</p> 
 

 
<div class="grid"> 
 

 
    <div class="content"> 
 
    <p>content</p> 
 
    </div> 
 
    
 
</div>

+0

Zaakceptowałem odpowiedź, ale jeśli jest sposób, aby to zrobić, wciąż definiując kolumny za pomocą 'grid-template-columns', zobaczę to jako bardziej poprawną odpowiedź i przypiszę to jako zaakceptowaną odpowiedź. –

+0

@ Danielleon, odpowiedzi tutaj mogą ci się przydać. https://stackoverflow.com/q/45459151/3597276 –

+0

hmmm ... niezupełnie. Odpowiedzi te wymagają, aby pasek boczny miał minimalną szerokość automatu, a kolumna po prostu zmniejsza się do szerokości 0 pikseli. Robiąc coś takiego oznaczałoby to, że jeśli zawartość paska bocznego nie ma zbyt dużej szerokości, to może zmniejszyć się do mniej niż 200px, co nie jest tym, czego szukam. –

Powiązane problemy