CSS β ΠΠ°ΡΠΊΠ°Π΄ ΠΈ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΈΡΠΈ β
π» @layer β ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠΊΠ°Π΄ΠΎΠΌ β
Π―Π²Π½ΡΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΡΡΠΈΠ»Π΅ΠΉ β Π±Π΅Π· Π²ΠΎΠΉΠ½ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΎΡΡΠΈ:
css
/* ΠΠ±ΡΡΠ²ΠΈΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠ»ΠΎΡΠ² (ΠΏΠ΅ΡΠ²ΡΠΉ = Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ) */
@layer reset, base, components, utilities;
@layer reset {
* { box-sizing: border-box; margin: 0; }
}
@layer base {
a { color: blue; }
}
@layer components {
.btn { color: white; background: blue; }
}
@layer utilities {
.text-red { color: red; } /* Π²ΡΠΈΠ³ΡΡΠ²Π°Π΅Ρ Ρ Π²ΡΠ΅Π³ΠΎ Π²ΡΡΠ΅ */
}css
/* Π‘ΡΠΈΠ»ΠΈ Π²Π½Π΅ @layer Π²ΡΠ΅Π³Π΄Π° Π²ΡΠΈΠ³ΡΡΠ²Π°ΡΡ Ρ ΡΠ»ΠΎΡΠ² */
a { color: green; } /* ΠΏΠ΅ΡΠ΅Π±ΡΡΡ @layer base a { color: blue; } */
/* ΠΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π² ΡΠ»ΠΎΠΉ */
@import url("reset.css") layer(reset);Π Π΅ΡΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ "!important Π²ΠΎΠΉΠ½" ΠΏΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠΎΡΠΎΠ½Π½ΠΈΡ CSS.
π» @property β ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ CSS-ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ β
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Ρ ΡΠΈΠΏΠΎΠΌ, Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ β ΠΌΠΎΠΆΠ½ΠΎ Π°Π½ΠΈΠΌΠΈΡΠΎΠ²Π°ΡΡ:
css
@property --hue {
syntax: '<number>';
inherits: false;
initial-value: 250;
}
@property --opacity {
syntax: '<number>';
inherits: true;
initial-value: 1;
}
@property --gradient-angle {
syntax: '<angle>';
inherits: false;
initial-value: 0deg;
}
/* ΠΠ½ΠΈΠΌΠ°ΡΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ β Π±Π΅Π· @property Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ */
.btn {
background: oklch(0.6 0.2 var(--hue));
transition: --hue 0.3s;
}
.btn:hover {
--hue: 150; /* ΠΏΠ»Π°Π²Π½ΠΎ ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠ²Π΅Ρ ΡΠ΅ΡΠ΅Π· oklch */
}
/* ΠΠ½ΠΈΠΌΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ */
.card {
background: linear-gradient(var(--gradient-angle), #3b82f6, #8b5cf6);
animation: rotate-gradient 3s linear infinite;
}
@keyframes rotate-gradient {
to { --gradient-angle: 360deg; }
}π» @container β container queries β
Π‘ΡΠΈΠ»ΠΈ ΠΏΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ, Π° Π½Π΅ viewport:
css
/* 1. ΠΠ±ΡΡΠ²ΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ */
.card-wrapper {
container-type: inline-size;
container-name: card; /* ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ */
}
/* 2. Π‘ΡΠΈΠ»ΠΈ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° */
@container (min-width: 400px) {
.card {
display: grid;
grid-template-columns: 150px 1fr;
}
}
@container card (min-width: 600px) {
.card__title {
font-size: 1.5rem;
}
}
/* ΠΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΡΠ°Π·Π½ΡΠΉ layout Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΌΠ΅ΡΡΠ° */
.product-card {
/* Π² ΡΠ·ΠΊΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ β Π²Π΅ΡΡΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ */
display: flex;
flex-direction: column;
}
@container (min-width: 350px) {
.product-card {
/* Π² ΡΠΈΡΠΎΠΊΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ β Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΡΠΉ */
flex-direction: row;
}
}π» @starting-style β Π°Π½ΠΈΠΌΠ°ΡΠΈΡ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ β
ΠΠ½ΠΈΠΌΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΡΠΈ Π΅Π³ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π² DOM (ΠΈΠ»ΠΈ ΠΏΡΠΈ display: none β block):
css
.toast {
transition: opacity 0.3s, transform 0.3s;
opacity: 1;
transform: translateY(0);
}
@starting-style {
.toast {
opacity: 0;
transform: translateY(-10px);
}
}css
/* ΠΠ½ΠΈΠΌΠ°ΡΠΈΡ dialog ΠΏΡΠΈ ΠΎΡΠΊΡΡΡΠΈΠΈ */
dialog[open] {
transition: opacity 0.2s, transform 0.2s;
opacity: 1;
transform: scale(1);
@starting-style {
opacity: 0;
transform: scale(0.95);
}
}π» transition-behavior: allow-discrete β
ΠΠ½ΠΈΠΌΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π½ΡΡΠ΅ Π½Π΅Π»ΡΠ·Ρ Π±ΡΠ»ΠΎ β display, visibility, overlay:
css
/* ΠΠ½ΠΈΠΌΠ°ΡΠΈΡ ΠΈΡΡΠ΅Π·Π½ΠΎΠ²Π΅Π½ΠΈΡ β display: none Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΎΠ±ΡΡΠ²Π°Π΅Ρ transition */
.dropdown {
display: block;
opacity: 1;
transition: opacity 0.2s, display 0.2s;
transition-behavior: allow-discrete;
}
.dropdown.hidden {
display: none;
opacity: 0;
}
/* ΠΠ½ΠΈΠΌΠ°ΡΠΈΡ dialog Π·Π°ΠΊΡΡΡΠΈΡ */
dialog {
transition: opacity 0.2s, display 0.2s allow-discrete;
}
dialog:not([open]) {
opacity: 0;
display: none;
}π» @supports β feature detection β
css
/* ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΠΈΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ */
@supports (content-visibility: auto) {
.card { content-visibility: auto; }
}
@supports (display: grid) and (subgrid: column) {
.grid { grid-template-columns: subgrid; }
}
/* ΠΡΡΠΈΡΠ°Π½ΠΈΠ΅ */
@supports not (field-sizing: content) {
/* JavaScript fallback */
}
/* Selector support */
@supports selector(:has(img)) {
.card:has(img) { display: grid; }
}β οΈ ΠΠΎΠ΄Π²ΠΎΠ΄Π½ΡΠ΅ ΠΊΠ°ΠΌΠ½ΠΈ β
@layerβ ΡΡΠΈΠ»ΠΈ Π²Π½Π΅ ΡΠ»ΠΎΡΠ² Π²ΡΠ΅Π³Π΄Π° Π²ΡΠΈΠ³ΡΡΠ²Π°ΡΡ. Π‘ΡΠΎΡΠΎΠ½Π½ΠΈΠ΅ CSS Π±Π΅Π· ΡΠ»ΠΎΡΠ² ΠΏΠ΅ΡΠ΅Π±ΡΡΡ ΡΠ²ΠΎΠΈ ΡΠ»ΠΎΠΈ@propertyβ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π² Firefox < 128@containerβ ΡΡΠ΅Π±ΡΠ΅Ρcontainer-typeΠ½Π° ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅; Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎ Π²ΡΡΠΎΡΠ΅ Π±Π΅Π·container-type: size@starting-style+transition-behaviorβ Chrome 117+, Safari 17.4+. Firefox β Π½Π΅Ρ@supports selector()β ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π½Π΅ΠΏΠΎΠ»Π½Π°Ρ, ΠΏΡΠΎΠ²Π΅ΡΡΠΉ ΡΠ΅ΡΠ΅Π· caniuse