CSS β Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ Layout β
π» subgrid β
ΠΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΡΠ°ΡΡΠ²ΡΠ΅Ρ Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΡΠ΅ΡΠΊΠ΅ β ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ:
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
/* ΠΠ°ΡΡΠΎΡΠΊΠ° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ Π²ΡΠ΅ 3 ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ */
.card {
display: grid;
grid-column: span 3;
grid-template-columns: subgrid; /* Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ */
}
/* Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎ ΠΎΠ±ΡΠ΅ΠΉ ΡΠ΅ΡΠΊΠ΅ */
.card__image { grid-column: 1; }
.card__content { grid-column: 2; }
.card__actions { grid-column: 3; }/* Subgrid ΠΏΠΎ ΡΡΡΠΎΠΊΠ°ΠΌ */
.card {
grid-row: span 3;
grid-template-rows: subgrid;
/* header, content, footer Π²ΡΠ΅Ρ
ΠΊΠ°ΡΡΠΎΡΠ΅ΠΊ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ */
}π» ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° β
ΠΠΌΠ΅ΡΡΠΎ top/right/bottom/left β block/inline. ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π°Π΄Π°ΠΏΡΠΈΡΡΡΡΡΡ ΠΊ RTL ΠΈ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ ΡΠ΅ΠΆΠΈΠΌΠ°ΠΌ:
/* ΠΠΌΠ΅ΡΡΠΎ margin-left / margin-right */
.text {
margin-inline: auto; /* ΡΠ΅Π½ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ */
margin-inline-start: 1rem; /* left Π² LTR, right Π² RTL */
margin-inline-end: 1rem;
}
/* ΠΠΌΠ΅ΡΡΠΎ margin-top / margin-bottom */
.section {
margin-block: 2rem;
padding-block: 1rem;
}
/* ΠΠΌΠ΅ΡΡΠΎ top/right/bottom/left Π² position */
.tooltip {
inset: 0; /* top:0; right:0; bottom:0; left:0; */
inset-block-start: 1rem; /* top Π² Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ */
inset-inline-end: 1rem; /* right Π² LTR */
}
/* ΠΠΌΠ΅ΡΡΠΎ width/height */
.box {
inline-size: 200px; /* width */
block-size: 100px; /* height */
max-inline-size: 100%; /* max-width */
}
/* border, border-radius */
.card {
border-block-end: 1px solid #e5e7eb; /* border-bottom */
border-inline-start: 4px solid blue; /* border-left */
border-start-start-radius: 8px; /* top-left */
}π» inset shorthand β
/* ΠΠΌΠ΅ΡΡΠΎ top: 0; right: 0; bottom: 0; left: 0; */
.overlay { inset: 0; }
/* ΠΠ°ΠΊ padding/margin β Π²Π΅ΡΡΠΈΠΊΠ°Π»Ρ / Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»Ρ */
.popup { inset: 10px 20px; }
/* ΠΡΠ΅ ΡΠ΅ΡΡΡΠ΅ */
.modal { inset: 10px 20px 30px 40px; }
/* Π§Π°ΡΡΠΈΡΠ½ΡΠΉ */
.fixed-bottom {
inset: auto 0 0; /* top:auto; right:0; bottom:0; left:0 */
}π» content-visibility: auto β
ΠΡΠ°ΡΠ·Π΅Ρ ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π²Π½Π΅ viewport β ΡΡΠΊΠΎΡΡΠ΅Ρ Π·Π°Π³ΡΡΠ·ΠΊΡ Π΄Π»ΠΈΠ½Π½ΡΡ ΡΡΡΠ°Π½ΠΈΡ:
.article-card {
content-visibility: auto;
contain-intrinsic-size: 0 400px; /* Π·Π°Π³Π»ΡΡΠΊΠ° ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΡΡΠΈΡΠΎΠ²Π°Π½ */
}ΠΠ°ΡΡ ΠΏΡΠΈΡΠΎΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°Ρ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΊΠ°ΡΡΠΎΡΠ΅ΠΊ/ΠΏΠΎΡΡΠΎΠ². ΠΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΠ΅ΠΉ Π² viewport.
π» field-sizing: content β
input ΠΈ textarea Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°ΡΡΡΡ ΠΏΠΎΠ΄ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅:
textarea {
field-sizing: content; /* ΡΠ°ΡΡΡΡ ΠΏΠΎ ΡΠ΅ΠΊΡΡΡ */
min-height: 3lh; /* ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 3 ΡΡΡΠΎΠΊΠΈ */
max-height: 20lh; /* ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ */
}
input[type="text"] {
field-sizing: content;
min-width: 10ch;
}ΠΠ°ΠΌΠ΅Π½Π° JavaScript auto-resize Π΄Π»Ρ textarea.
π» overscroll-behavior β
ΠΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΊΠΎΠ³Π΄Π° ΡΠΊΡΠΎΠ»Π» Π΄ΠΎΡΡΠΈΠ³Π°Π΅Ρ ΠΊΡΠ°Ρ:
/* ΠΠΎΠ΄Π°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π½Π΅ ΡΠΊΡΠΎΠ»Π»ΠΈΡ body ΠΏΠΎΠ΄ ΡΠΎΠ±ΠΎΠΉ */
.modal {
overflow-y: auto;
overscroll-behavior: contain; /* ΡΠΊΡΠΎΠ»Π» Π½Π΅ "ΠΏΠ΅ΡΠ΅ΡΠ΅ΠΊΠ°Π΅Ρ" Π΄Π°Π»ΡΡΠ΅ */
}
/* ΠΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ»Π°ΠΉΠ΄Π΅Ρ Π½Π΅ ΡΠΊΡΠΎΠ»Π»ΠΈΡ ΡΡΡΠ°Π½ΠΈΡΡ */
.slider {
overflow-x: auto;
overscroll-behavior-x: contain;
}
/* ΠΡΠΊΠ»ΡΡΠΈΡΡ pull-to-refresh Π½Π° ΠΌΠΎΠ±ΠΈΠ»Π΅ */
body {
overscroll-behavior-y: none;
}π» scroll-snap β
ΠΠ°ΡΠΈΠ²Π½ΡΠΉ snap-ΡΠΊΡΠΎΠ»Π» Π±Π΅Π· JavaScript:
.slider {
display: flex;
overflow-x: auto;
scroll-snap-type: x mandatory; /* ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ snap ΠΏΠΎ X */
gap: 1rem;
}
.slide {
flex: 0 0 100%;
scroll-snap-align: start; /* start / center / end */
}
/* ΠΠ΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ snap */
.sections {
height: 100dvh;
overflow-y: scroll;
scroll-snap-type: y mandatory;
}
.section {
height: 100dvh;
scroll-snap-align: start;
}π» overflow-anchor β
ΠΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΡΠΆΠΎΠΊ ΡΡΡΠ°Π½ΠΈΡΡ ΠΊΠΎΠ³Π΄Π° Π²ΡΡΠ΅ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅Π½Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΡΠ°ΡΠ΅):
/* ΠΠΊΠ»ΡΡΠ΅Π½ΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ */
.chat-messages {
overflow-anchor: auto; /* Π±ΡΠ°ΡΠ·Π΅Ρ Π΄Π΅ΡΠΆΠΈΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΠΊΡΠΎΠ»Π»Π° */
}
/* ΠΡΠΊΠ»ΡΡΠΈΡΡ β Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΠΏΡΡΠ³Π°ΡΡ Π½Π°Π²Π΅ΡΡ
ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ */
.feed {
overflow-anchor: none;
}β οΈ ΠΠΎΠ΄Π²ΠΎΠ΄Π½ΡΠ΅ ΠΊΠ°ΠΌΠ½ΠΈ β
subgridΠ½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π² Chrome < 117 β ΠΏΡΠΎΠ²Π΅ΡΡΠΉ ΡΠ΅ΡΠ΅Π·@supportsfield-sizing: contentβ ΡΠΎΠ»ΡΠΊΠΎ Chrome/Edge, Safari 2024+. Firefox β Π½Π΅Ρcontent-visibility: autoβ Π½Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠΉ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ Π² viewport, Π±ΡΠ΄Π΅Ρ ΠΌΠΈΠ³Π°Π½ΠΈΠ΅scroll-snap-type: mandatoryβ Π°Π³ΡΠ΅ΡΡΠΈΠ²Π½ΡΠΉ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ snap-ΡΠΎΡΠΊΠ°ΠΌΠΈ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉproximity- ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° β Π½Π΅ ΡΠΌΠ΅ΡΠΈΠ²Π°ΠΉ Ρ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ (
margin-left+margin-inline-start) Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅