CSS Grid ืืืื ืืืชื ืืืืืช ืืืื ืืืืฉื ืืฉื fr (ืงืืฆืืจ ืฉื Fractional Unit). 1fr ืืืืฆื ืืืง ืืื ืืชืื ืืฉืื ืืคื ืื ืืชืื grid container.
ืื ืฉืขืื ืขื ืืืืืื ืื px ืืจืืื ืขืืืืืช, ืืจืืืฉ ืืืืช ืขื fr – ืจืง ืฉืืื ืืืคืืช ืืฉืื ืฉื ืืชืจ ืืฆืืจื ืืืืืืืืช, ืืื ืืืฉื ืืืื ืืื ืืช.
ืคืจืืื ืืืจืื ืืืืืืืืช ืืืืืช ืืืืงืืื ืืืืฆืขืืช ืืชืืื ื grid areas:
.grid-wrap {
max-width: 100%;
margin: 3em auto;
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-rows: 50px 150px 50px;
grid-template-areas: "head head2 . side" "main main2 . side" "footer footer footer footer";
}
ืื ืืืช ืืืจืืข ืืขืืืืืช ืชืืคืกืช ืืช ืืืชื ืืงืื ืืืจืื.
ืฉืืื ืื! ืืืืืืืืช ืืคืืกื ืื ืืฆืืืืช ืืช ืืืจืื ืืคื ืฉืืื ืืืคืืข ืืืชืจื RTL (ืืืืืจ ืืืชืจืื ืืฉืคื ืืขืืืืช ืืืืื ืืฉืืื ืืืื ืืฉืคื ืืขืืจืืช). ืืืชืจืื ืืื ืืืืช (LTR) ืืืจืื ืืืฆื ืืคืื.
ืืืืืืืช ืืฉืืืืฉ ื fr
ืื ื ืืจืื ืืืื, ืื ืขื ืขืจืื fr ืฉืื ืื. ืฉืืื ืื ืืืฆื ืจืืื ืืขืืืืืช ืืฉืชื ื:
.grid-wrap {
/* ... */
grid-template-columns: 1fr 1fr 40px 20%;
grid-template-rows: 100px 200px 100px;
/* ... */
}
ืืืืืื ืืืืจืื ื ื-sidebar ืชืืคืก 2fr ืืืฉืื. ืืจืืื ืฉืื ืฉืืื ืืจืืื ืืืฉืืื ืฉื ืืขืืืื ืืจืืฉืื ื ืืืฉื ืืื.
.grid-wrap {
/* ... */
grid-template-columns: 1fr 1fr 40px 2fr;
grid-template-rows: 100px 200px 100px;
/* ... */
}
fr ืืขืืืช ืืืืืื
ืืืื ืจืืฉืื, fr ื-% ื ืจืืื ืืืขื ืืืื. ืฉืืืฉ ืขืืืืืช ืฉื 33.33% ืืืจืื ืืืชื ืืืจ ืืื 1fr 1fr 1fr – ืขื ืฉืืืกืืคืื gap.
ืืืืืื ืืืืฉืืื ืืคื ืืจืืื ืืืืื ืฉื ื-container, ืืื ืืืชืืฉื ื-gaps. ืืจืื ืขื 33.33% 33.33% 33.33% ื-gap ืฉื 20px ืืกืชืื ื-100% ืืืจืืื ืืขืื 40px ืฉื gaps, ืืื ืืืจื ืืืืืฉื ืืืคืงืืช:
/* ืืืืฉ - 99.99% + 40px ืฉื gaps > ืจืืื ื-container */
grid-template-columns: 33.33% 33.33% 33.33%;
gap: 20px;
/* ืขืืื - fr ืืชืืฉื ื-gaps ืืืืืืืืช */
grid-template-columns: 1fr 1fr 1fr;
gap: 20px;
ืขื fr ืืืขืื ืืื ืื ืงืืืืช. ืืืคืืคื ืืืกืืจ ืงืืื ืืช ื-gaps, ืืจืง ืื ืืืืง ืืช ืื ืฉื ืฉืืจ ืืื ื-tracks. ืืื ืืืืฉื, ืืื ืืืฉืืืื.
ืื ืืกืืื ืืืจืืืืช ืืืขืืืฃ fr ืขื % ืืืจืื. ืืืืืืื ืขืืืื ืืฉ ืืงืื ืืฉืฆืจืื ืฉืขืืืื ืชืฉืืืจ ืขื ืคืจืืคืืจืฆืื ืืืืืงืช ืืื ืงืฉืจ ื-gaps, ืืื ืืจืื ืืืงืจืื fr ืคืฉืื ืืืืืจื ืื ืืื ื.
ืขืจืืื ืืืืืืช (Mixed Units)
ืืคืฉืจ ืืขืจืื fr ืขื ืืืืืืช ืืืจืืช ืืืืชื ืืืืจื – ืืืืืื, ืขืจืื px ืงืืืขืื, ืื auto. ืืืคืืคื ืืงืฆื ืงืืื ืืช ืืขืจืืื ืืงืืืขืื ืืืืืืืืื, ืืื ืืืืง ืืช ืื ืฉื ืฉืืจ ืืื ืขืืืืืช ื-fr.
ืืืื ื ืจืื ืืช ืื ืฆืขื ืืืจ ืฆืขื, ืขื container ืืจืืื 800px ืขื grid-template-columns: 300px 10% 1fr 2fr:
- ืขืจืืื ืงืืืขืื ืงืืื: 300px ื ืฉืืจืื.
- ืืืืืื: 10% ืืชืื 800px = 80px.
- ืื ื ืฉืืจ: 800 – 300 – 80 = 420px.
- ืืืืงื ืืื tracks ืฉื fr: 420px รท 3 fr ืกื"ื = 140px ืืื fr. ืืขืืืื ืฉื
1frืืงืืืช 140px, ืืืขืืืื ืฉื2frืืงืืืช 280px.
ืื ืืฉ gap, ืื ืืื ืื ืืื ืืฉืื 3. ืืืฉื, ืขื gap: 20px ื-3 ืืจืืืืื ืืื 4 ืขืืืืืช, ื ืฉืืจืื ืขื 420 – 60 = 360px, ืืืืืจ 120px ืืื fr.
main {
width: 800px;
display: grid;
grid-template-columns: 300px 10% 1fr 2fr;
/* Result: 300px 80px 140px 280px */
grid-template-rows: auto;
}
fr ืืขืืืช auto
auto ืืชืืื ืืช ืืขืืืื ืืืืื ืืชืืื ืฉืื. fr ืืืงื ืืช ืืฉืื ืฉื ืืชืจ, ืื ืืฉื ื ืื ืืฉ ืืชืืื.
ืืฉืืฉืืืื ืืช ืืฉื ืืื, ืขืืืืืช auto ืืืืฉืืืช ืงืืื, ืืขืืืืืช fr ืืชืืืงืืช ืืื ืฉื ืฉืืจ:
grid-template-columns: auto 1fr auto;
/* sidebar | main ืืืืฉ | sidebar */
ืชืื ืืช ื ืคืืฆื ืืขืืืื ืืคืื: ื-sidebar ืจืื ืืชืืื ืฉืื, ืืืืืืจ ืืจืืฉื ืืืื ืืช ืื ืืฉืืจ. ืขืืื ืืคื ืื ืขื ืชืืื ืช aspect-ratio ืืืจืืืกืื ืฉืฆืจืืืื ืืฉืืืจ ืขื ืคืจืืคืืจืฆืืืช.
fr ืขื repeat() ื-minmax()
ืืืืืื fr ืืฉืชืืืช ืืฆืืื ืขื ืชืื ืืืช ืืจืื ืจืกืคืื ืกืืืืืช ืืื media queries. ืฉืืืื ืฉื repeat() ืขื minmax() ืืืฆืจ ืืจืื ืฉืขืืืฃ ืคืจืืืื ืืฉืืจื ืืืื ืืื:
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
ืื ืขืืืื ืจืืื ืืคืืืช 250px. ืืฉื ืฉืืจ ืืงืื, 1fr ืืืืง ืืืชื ืฉืืื ืืฉืืื. ืืื ืฉื-viewport ืืฆืืืฆื, ืขืืืืืช ืืืจืืืช ืืฉืืจื ืืืฉื ืืืงืื ืืืืืืก ืืชืืช ื-250px.
ืืืืื ืืื
auto-fillื-auto-fit:auto-fillืฉืืืจ ืขื tracks ืจืืงืื ืืฉืืฉ ืืงืื ืคื ืื, ืืขืืauto-fitืืงืคื ืืืชื ืื ืฉืืคืจืืืื ืืงืืืืื ื ืืชืืื ืืืื ืืช ืืฉืืจื.
ืืืืืืืช ื ืคืืฆืืช
ืืื ืืืจืื ืฉื ืืืื ืืืืื ืืคืชืืื ืฉืขืืืืื ืขื fr ืืคืขื ืืจืืฉืื ื:
1. fr ืื ืขืืื ืืืืฅ ื-Grid
ืื ืืืื ื-% ืื px, ืืืืืื fr ืขืืืืช ืจืง ืืชืื grid-template-columns ื-grid-template-rows. ืืฉืื ืืืชื ื-width, margin ืื Flexbox? ืืืคืืคื ืคืฉืื ืืชืขืื.
2. ืืืืฉื ืขื ืชืืื ืืืื
ืขืืืืช fr ืขืืืื ืืืืื ืืขืืจ ืืืืง ืฉืืืืข ืื ืื ืืชืืื ืื ื ืื ืก. ืืคืชืจืื – ืืืฉืชืืฉ ื-minmax(0, 1fr) ืืืงืื 1fr:
/* ืืจืืจืช ืืืื: fr ืืฉืชืืฉ ืืืืื ืืชืืื ืืืื ืืืื */
grid-template-columns: 1fr 1fr;
/* ืืคืืืช ืืื ืืืื 0 - ืืชืืื ืืืืืฉ ืืืงืื ืืืจืืื */
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
3. fr ืื ืขืืื ืืชืื calc()
ืืืืืื fr ืืื ืืกืื ื ืชืื ืื <flex>, ืื <length> ืืื px ืื %. ืื ืฉืืืืจ ืฉ-calc(1fr - 20px) ืืื CSS ืื ืชืงืื, ืืืืคืืคื ืืชืขืื ืืื ื. ืฆืจืืืื ืืืื ืืื ืืืื ืขื ืืืืื ืืืืฉื? ืชืฉืชืืฉื ื-minmax(): minmax(200px, 1fr).
4. gaps ื ืกืคืจืื ืืคื ื fr
ืืชืืื ื gap ืื ืืื ืืืฉืื ืืคื ืื ืืคื ื ืืืฉืื ืขืจืื fr. ืืจืื ืขื 3 ืขืืืืืช 1fr 1fr 1fr ื-gap ืฉื 20px ื ืืชื ืืื ืขืืืื (total - 40px) / 3, ืืื total / 3.
ืฉืืืืช ื ืคืืฆืืช
1fr ื-CSS Grid?
1fr ืืืืฆื ืืืง ืืื ืืชืื ืืฉืื ืืคื ืื ื-grid container. ืื ืืืืืจืื grid-template-columns: 1fr 1fr 1fr, ืจืืื ื-container (ืคืืืช gaps) ืืชืืืง ืืฉืืืฉ ืขืืืืืช ืฉืืืช.
fr ืืืืืืื ื-CSS Grid?
fr ืืืืงืช ืืช ืืฉืื ืฉื ืืชืจ ืืืืจ ืฉืืืืื ืงืืืขืื, ืืืืืื ื-gaps ืื ืืืื. ืื ืืืคื ืืช fr ืืืืืื ืืืชืจ ืืืจืื ืขื gaps ืื ืืื ืื ืชืืจืื ืืืืืฉื.
fr ืืืืฅ ื-CSS Grid?
fr ืขืืืืช ืจืง ืืชืื grid-template-columns ื-grid-template-rows. ืืื ืื ืืฉืคืขื ื-Flexbox, width, margin ืื ืื ืชืืื ืช CSS ืืืจืช.
fr ื-auto ื-CSS Grid?
auto ืืืืืจ track ืืคื ืืืื ืืชืืื ืฉืื. fr ืืืืง ืืช ืืฉืื ืฉื ืืชืจ ืืื ืงืฉืจ ืืชืืื. ืืฉืืฉืืืื ืืืชื, tracks ืฉื auto ืืืืฉืืื ืงืืื, ืืื tracks ืฉื fr ืืชืืืงืื ืืื ืฉื ืฉืืจ.
fr ืฉืื ืจืืื ืืืฆืคืื?
fr ืืื auto, ืืืืืจ ืชืืื ืืืื ืืืืืฃ ืืช ืืขืืืื ืืืืืช ืจืืื ืืืืืง ืืืืกื ืฉืื. ืืื ืืคืชืืจ ืืืช, ืืฉืชืืฉื ื-minmax(0, 1fr) ืืืงืื 1fr ืื ืฉืืขืืืื ืชืืื ืืืชืืืืฅ ืืชืืช ืืืืื ืืชืืื.
gap ืืฉืคืืขื ืขื ืขืจืื fr?
fr. ืืืืืื, container ืืจืืื 900px ืขื gap: 30px ื-1fr 1fr 1fr ื ืืชื ืืื ืขืืืื 280px, ืื 300px, ืื ืฉื ื gaps ืฉื 30px ืกื"ื 60px.
fr ืืื ืืกืื <flex>, ืื <length>. ืืชืืืช calc(1fr - 20px) ืืื CSS ืื ืชืงืื ืืืืคืืคื ืืชืขืื ืืื ื. ืื ืฆืจืืืื ืขืืืื ืืืืฉื ืขื ืืืื ืืื ืืืื, ืืฉืชืืฉื ื-minmax(20px, 1fr) ืืืงืื.
1fr ืืื ืืืง ืืืกื ืืืฉืื ืฉื ืืชืจ ืืืืจ ื ืืืื ืืืืื ืงืืืขืื, ืืืืืื ื-gaps. ื-container ืืจืืื 900px ืขื ืขืืืื ืืืช ืฉื 300px ืืฉืชื ืขืืืืืช 1fr, ืื 1fr ืฉืืื 300px. ืฉืื ืื ืจืืื ื-container ืื ืืขืืืื ืืงืืืขื ืืฉื ื ืืช ืขืจื ืืคืืงืกืืื.
ืกืืืื
ืื ื ืืฉืชืืฉ ื-fr ืืืขื ืืื ืืจืื ืฉืื ื ืืื ื. ืื ืฆืจืื ืืืฉื ืืืืืื, ืืืื ืืชืืื ืืช ืขืฆืื ืืฉืืืกืืคืื ืื ืืืจืืืื ืขืืืืืช. ืืฉืืืื ืขื px, auto ื-minmax() ืืคืฉืจ ืืืกืืช ืืช ืจืื ืฆืจืื ืืขืืืื ืืื media query ืืืื.