Grid przy pomocy HTML i klas oraz Grid:CSS
Opublikowano pon 15 czerwca 2020 w css • 4 min read
Grid -> HTML + klasy CSS
Grid przy pomocy klas (starsza wersja) jest czym innym niż tzw. Grid CSS (nowsza wersja rozwiązania)
W przypadku rozwiązania opartego jedynie o HTML i odpowiednio stylowane klasy css - całość oparta jest na kolumnach (pion) oraz wiersze(poziom)
Kolumna ustala szerokość a wiersz "trzyma" elementy w jednej linii
Wiersze zawsze nazywają się row
i zadaniem wiersza jest ustawienie kolumn
Warunek 1 -> box-sizing
Aby elementy były zawarte w jednej linii box-sizing
musi być ustawiony na bored-box
Warunek 2 -> float lub flex-box
Należy zastosować clearfix
na elementach zawartych w rzędzie jeśli całość oparta jest o float
Clearfix jest sposobem na ujarzmienie problemu z pojemnikami o zerowej wysokości -> elementów pływających
Patrz: Co to jest clearfix?
Alternatywnie zagnieżdżenie wewnątrz jednego rzędu oprzeć można na flex-box
Warunek 3 -> klasy kolumn
Należy stworzyć klasy, które wskazując na szerokość kolumn i je odpowiednio używać np. jeśli całość ma być szeroka na 12 kolumn to jedna kolumna wynosi 100%/12, zatem obiekt zajmująca połowę rodzica w poziomie składać się będzie z 6 kolumn i winien być oznaczony col-6
poniższy mixin to dobrze obrazuje
@mixin grid($cols) {
display: flex; /* rozwiązanie oparte o flex-box */
[class*="col-"] {
// float: left; /* rozwiązanie oparte o float */
min-height: 1px;
}
@for $i from 1 through $cols {
.col-#{$i} {
width: (100% / $cols) * $i;
}
}
}
Wynik (przykładowy fragment kodu wynikowego css):
/* line 33, scss/main.scss */
.container .row .col-6 {
width: 50%;
}
/* line 33, scss/main.scss */
.container .row .col-7 {
width: 58.33333%;
}
/* line 33, scss/main.scss */
.container .row .col-8 {
width: 66.66667%;
}
Warunek 4 -> wiersz
Należy odpowiednio przygotować stylizację wiersza
/row
$gutter: 10px; /* przestrzeń pomiędzy kolumnami */
.container {
max-width: 1000px;
width: 100%;
margin: 0 auto;
.row {
// @extend %clearfix; /* rozwiązanie oparte o float */
height: 60vh; /* tu można podstawić dowolną wartość */
[class*="col-"] {
// float: left; /* rozwiązanie oparte o float */
min-width: 1px;
padding-left: $gutter;
padding-right: $gutter;
}
@include grid(12);
}
}
Warunek 5 -> HTML
Przygotowanie kolumn w pojedynczym wierszu tak aby zajmowały nie więcej niż 100% z ilości kolumn
<main>
<div class="container">
<div class="row">
<div class="col-3">
<div class="box">col-3</div>
<div class="box">col-3</div>
<div class="box">col-3</div>
<div class="box">col-3</div>
</div>
<div class="col-6">
<div class="box">col-6</div>
</div>
<div class="col-3">
<div class="box">col-3</div>
</div>
</div>
</div>
</main>
<footer>
<div class="row">
<div class="col-12">
<div class="box">Footer</div>
</div>
</div>
</footer>
Responsywność
W tym przypadku responsywność jest oparta o dodanie dodatkowych klas, które są aktywowane w przypadku spełnienia określonego warunku w media-query
<div class="row">
<div class="col-sm-2 col-md-4">
<div class="box">1</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="box">2</div>
</div>
</div>
col-lg-*
// large - duży ekran ≥ 1200px
col-md-*
// medium - desktop ≥ 992px
col-sm-*
// small - tablet ≥ 768px
col-xs-*
w przypadku bootstrapu jest to odpowiednik col-*
// extra small - telefon < 768 px
@mixin z media query
@mixin grid($cols) {
@media screen and (max-width: 768px) {
display: flex;
@for $i from 1 through $cols {
.col-sm-#{$i} {
flex: 0 0 (100% / $cols) * $i;
}
}
}
@media screen and (min-width: 767px) {
@for $i from 1 through $cols {
.col-md-#{$i} {
flex: 0 0 (100% / $cols) * $i;
}
}
}
}
Patrz: Bootstrap-Grid system
Budowanie siatki w sposób responsywny nie jest proste więc wykorzystuje się często już przygotowane wcześniej layouty
Przykłady układu Grid
Grid w CSS na 100%
Nie wymaga zaangażowania struktury HTML
<div class="grid-container">
<header>Nagłówek</header>
<aside>Pasek boczny</aside>
<main>Główna treść</main>
<footer>Stopka</footer>
</div>
Grid wprowadza jednostkę fr
(fraction -> ułamek) i na niej opiera podział i pozwala to budować grid oparty o dwa istotne wyrażenia dla kolumn - grid-template-columns
i wierszy - grid-template-rows
grid-template-columns: 1fr 1fr
; -> 2 kolumny, gdzie każda zajmuje jeden ułamek
grid-template-columns: 2fr 1fr
; 2 kolumny, gdzie 1 zajmuje dwa ułamki a druga jeden
grid-template-columns: 200px 1fr 300px
; // 200px auto 300px
grid-template-rows: 200px 1fr
; // pierwszy wiersz ma 200px a kolejny dostosowuje się automatycznie
=========
grid-template-areas
grid-template-areas
- pozwala na wyznaczenie obszarów i rozmieszczenie elementów według określonego wzoru
.grid-container {
display: grid;
grid-template-columns: 300px 1fr; // dwie kolumny
grid-template-rows: 100px 1fr 200px;
grid-template-areas: // wskazanie układu
"header header" // dwie kolumny 1 rząd
"sidebar main" // 2 rząd - część na sidebar (300px) a część na main (1fr/auto)
}
aside {
padding: 20px;
background-color: orangered;
grid-area: header;
}
aside {
padding: 20px;
background-color: orangered;
grid-area: sidebar;
}
====
grid-column-start:
2 // od której kolumny ma się układać element
grid-column-end:
4 // na której kolumnie ma się kończyć
grid-column:
2/4 // skrócony zapis
grid-row-start:
2 // od którego rzędu ma się układać element
grid-row-end:
4 // na którym rzędzie ma się kończyć
grid-row:
2/4 // skrócony zapis
Przykład zastosowania index.html
<div class="grid-container">
<div class="Header"></div>
<div class="aside">
<div class="aside-1"></div>
<div class="aside-2"></div>
</div>
<div class="main"></div>
</div>
style.css
html, body, .grid-container { height: 100%; margin: 0; }
.grid-container {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
gap: 1px 1px;
grid-template-areas: "Header Header Header Header" "aside main main main" "aside main main main";
}
.Header { grid-area: Header; }
.aside {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr;
gap: 1px 1px;
grid-template-areas: "aside-1 aside-1 aside-1" "aside-2 aside-2 aside-2";
grid-area: aside;
}
.aside-1 { grid-area: aside-1; }
.aside-2 { grid-area: aside-2; }
.main { grid-area: main; }
See the Pen Grid-tampleate-example by Mikołaj Kostyrko (@mkostyrko) on CodePen.
====
grid-gap:
10px; // odstęp pomiędzy kafelkami (kolumnami i rzędami)
grid-column-gap:
// odstęp pomiędzy kolumnami
grid-row-gap:
// odstęp pomiędzy rzędami
==== Pozycjonowanie dzieci
align-item
start/end/center/stretch
grid-column-start
grid-column-end
grid-row-start
grid-row-end
grid-area
schemat
====
Pozycjonowanie siebie
justify-self` start/end/center/stretch
align-self
start/end/center/stretch
place-self
- schemat
Patrz więcej A Complete Guide to Grid
====
Media query
.grid-container {
display: grid;
min-height: 100vh;
grid-template-columns: 1fr 1fr;
@media screen and (min-width: 800px) {
grid-template-columns: repeat(3, 1fr);
}
@media screen and (min-width: 1000px) {
grid-template-columns: repeat(4, 1fr);
}
}
Generatory układu Grid w CSS
Wydajność?
A może by tak... flexbox + grid? -> Grid for layout, Flexbox for components
Grid-CSS jest relatywnie nowym dodatkiem w świecie CSS i wciąż charakteryzuje się niską wydajnością (źródło), a do tego nie wszystkie przeglądarki mogą z nim funkcjonować patrz tutaj
Źródła
https://getbootstrap.com/docs/4.0/layout/grid/
https://www.w3schools.com/css/css_grid.asp