@layer
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since маÑÑ 2022 г..
CSS @-пÑавило @layer иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÐºÐ°Ñкадного ÑлоÑ, а Ñакже позволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð¿ÑиоÑиÑеÑÑ Ð¿Ñи налиÑии неÑколÑкиÑ
каÑкаднÑÑ
ÑлоÑв.
ÐнÑеÑакÑивнÑй пÑимеÑ
@layer module, state;
@layer state {
.alert {
background-color: brown;
}
p {
border: medium solid limegreen;
}
}
@layer module {
.alert {
border: medium solid violet;
background-color: yellow;
color: white;
}
}
<p class="alert">ÐÑÑеÑегайÑеÑÑ Ð·Ð¾Ð¼Ð±Ð¸!</p>
СинÑакÑиÑ
@layer layer-name {rules}
@layer layer-name;
@layer layer-name, layer-name, layer-name;
@layer {rules}
где:
- layer-name
-
Ðазвание каÑкадного ÑлоÑ.
- rules
-
ÐÐ°Ð±Ð¾Ñ CSS-пÑавил каÑкадного ÑлоÑ.
ÐпиÑание
ÐÑавила внÑÑÑи каÑкадного ÑÐ»Ð¾Ñ ÐºÐ°ÑкадиÑÑÑÑÑÑ Ð²Ð¼ÐµÑÑе, пÑедоÑÑавлÑÑ Ð²ÐµÐ±-ÑазÑабоÑÑикам болÑÑий конÑÑÐ¾Ð»Ñ Ð½Ð°Ð´ каÑкадом ÑÑилей. ÐÑе ÑÑили, не оÑноÑÑÑиеÑÑ Ðº какомÑ-либо ÑлоÑ, ÑобиÑаÑÑÑÑ Ð² один анонимнÑй Ñлой, коÑоÑÑй ÑаÑполагаеÑÑÑ Ð¿Ð¾Ñле вÑÐµÑ Ð¾Ð±ÑÑвлÑннÑÑ ÑлоÑв, именованнÑÑ Ð¸ анонимнÑÑ . ÐÑо ознаÑаеÑ, ÑÑо лÑбÑе ÑÑили, заданнÑе вне ÑлоÑ, бÑдÑÑ Ð¿ÐµÑеопÑеделÑÑÑ ÑÑили, обÑÑвлÑннÑе внÑÑÑи ÑлоÑ, незавиÑимо Ð¾Ñ Ð¸Ñ ÑпеÑиÑиÑноÑÑи.
@-пÑавило @layer иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ°Ñкадного ÑÐ»Ð¾Ñ Ð¾Ð´Ð½Ð¸Ð¼ из ÑÑÑÑ
ÑпоÑобов.
ÐеÑвÑй ÑпоÑоб â ÑоздаÑÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñй каÑкаднÑй Ñлой Ñ Ð½Ð°Ð±Ð¾Ñом CSS-пÑавил внÑÑÑи ÑÑого ÑлоÑ:
@layer utilities {
.padding-sm {
padding: 0.5rem;
}
.padding-lg {
padding: 0.8rem;
}
}
ÐÑоÑой ÑпоÑоб â ÑоздаÑÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñй каÑкаднÑй Ñлой без ÑÑилей. Ðожно опÑеделиÑÑ Ð¾Ð´Ð¸Ð½ Ñлой:
@layer utilities;
Ðли неÑколÑко ÑлоÑв одновÑеменно:
@layer theme, layout, utilities;
ÐÑо полезно, поÑÐ¾Ð¼Ñ ÑÑо пеÑвонаÑалÑнÑй поÑÑдок обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑлоÑв ÑказÑÐ²Ð°ÐµÑ Ð½Ð° иÑ
пÑиоÑиÑеÑ. ÐÑли обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½Ð°Ð¹Ð´ÐµÐ½Ñ Ð² неÑколÑкиÑ
ÑлоÑÑ
, Ñо наивÑÑÑим пÑиоÑиÑеÑом Ð¾Ð±Ð»Ð°Ð´Ð°ÐµÑ Ð¿Ð¾Ñледний Ñлой. Таким обÑазом, в пÑедÑеÑÑвÑÑÑем пÑимеÑе, еÑли Ð±Ñ Ð² ÑлоÑÑ
theme и utilities бÑло найдено одинаковое пÑавило, Ð¿Ð¾Ð±ÐµÐ´Ñ Ð¾Ð´ÐµÑжало Ð±Ñ Ð¿Ñавило из utilities и оно бÑло Ð±Ñ Ð¿Ñименено.
ÐÑавило в Ñлое utilities бÑÐ´ÐµÑ Ð¿Ñименено даже еÑли Ñ Ð½ÐµÐ³Ð¾ менÑÑÐ°Ñ ÑпеÑиÑиÑноÑÑÑ, Ñем пÑавило в Ñлое theme. ÐÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ÑомÑ, ÑÑо поÑле опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑдка ÑлоÑв игноÑиÑÑÑÑÑÑ ÑпеÑиÑиÑноÑÑÑ Ð¸ поÑÑдок поÑвлениÑ. ÐÑо позволÑÐµÑ ÑоздаваÑÑ Ð±Ð¾Ð»ÐµÐµ пÑоÑÑÑе ÑелекÑоÑÑ Ð² CSS, поÑколÑÐºÑ Ð½Ðµ нÑжно обеÑпеÑиваÑÑ Ð²ÑÑокÑÑ ÑпеÑиÑиÑноÑÑÑ ÑелекÑоÑа Ð´Ð»Ñ Ð¿ÐµÑеопÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑликÑÑÑÑиÑ
пÑавил, важно ÑолÑко, ÑÑÐ¾Ð±Ñ Ð¾Ð½ поÑвлÑлÑÑ Ð² более позднем Ñлое.
ÐÑимеÑание: ÐбÑÑвив имена ÑлоÑв и ÑÑÑановив Ð¸Ñ Ð¿Ð¾ÑÑдок, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе добавиÑÑ CSS-пÑавила в Ñлой, повÑоÑно обÑÑвив его имÑ. Таким обÑазом ÑÑили добавÑÑÑÑ Ðº ÑлоÑ, и поÑÑдок ÑлоÑв не измениÑÑÑ.
ТÑеÑий ÑпоÑоб â ÑоздаÑÑ ÐºÐ°ÑкаднÑй Ñлой без имени:
@layer {
p {
margin-block: 1rem;
}
}
ÐÑо ÑоздаÑÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñй каÑкаднÑй Ñлой. Такой Ñлой ÑабоÑÐ°ÐµÑ Ñак же, как и именованнÑе Ñлои, однако ÐµÐ¼Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð¿Ð¾Ð·Ð¶Ðµ пÑиÑвоиÑÑ Ð¿Ñавила. ÐоÑÑдок пÑиоÑиÑеÑа Ð´Ð»Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½ÑÑ ÑлоÑв опÑеделÑеÑÑÑ Ð¿Ð¾ÑÑдком Ð¸Ñ Ð¾Ð±ÑÑвлениÑ, Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ или без, и ниже ÑÑилей, обÑÑвленнÑÑ Ð²Ð½Ðµ ÑлоÑ.
ÐÑÑ Ð¾Ð´Ð¸Ð½ ÑпоÑоб ÑоздаÑÑ ÐºÐ°ÑкаднÑй Ñлой â иÑполÑзоваÑÑ @import. Ð ÑÑом ÑлÑÑае пÑавила бÑдÑÑ Ð½Ð°Ñ
одиÑÑÑÑ Ð² импоÑÑиÑованном Ñайле ÑÑилей. ÐомниÑе, ÑÑо @-пÑавило @import должно пÑедÑеÑÑвоваÑÑ Ð²Ñем дÑÑгим Ñипам пÑавил, за иÑклÑÑением пÑавил @charset и @layer.
@import "theme.css" layer(utilities);
Ðложение ÑлоÑв
Слои могÑÑ Ð±ÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñми, напÑимеÑ:
@layer framework {
@layer layout {
}
}
ÐÐ»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñавил в Ñлой layout, коÑоÑÑй наÑ
одиÑÑÑ Ð²Ð½ÑÑÑи framework, иÑполÑзÑйÑе запиÑÑ ÑеÑез ÑоÑкÑ.
@layer framework.layout {
p {
margin-block: 1rem;
}
}
ФоÑмалÑнÑй ÑинÑакÑиÑ
@layer =
@layer <layer-name>? { <rule-list> } |
@layer <layer-name># ;
<layer-name> =
<ident> [ '.' <ident> ]*
ÐÑимеÑÑ
>ÐÑоÑÑой пÑимеÑ
Ð ÑÑом пÑимеÑе ÑоздаÑÑÑÑ Ð´Ð²Ð° CSS пÑавила: одно Ð´Ð»Ñ ÑлеменÑа <p> вне какого-либо ÑÐ»Ð¾Ñ Ð¸ одно внÑÑÑи ÑÐ»Ð¾Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ type Ð´Ð»Ñ .box p.
Ðез ÑлоÑв ÑелекÑÐ¾Ñ .box p имел Ð±Ñ Ð½Ð°Ð¸Ð²ÑÑÑÑÑ ÑпеÑиÑиÑноÑÑÑ Ð¸ ÑекÑÑ Hello, world! оÑобÑазилÑÑ Ð±Ñ Ð·ÐµÐ»ÑнÑм. Ðо Ñак как Ñлой type Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÐ½ÑÑий пÑиоÑиÑеÑ, Ñем анонимнÑй Ñлой, ÑекÑÑ Ð±ÑÐ´ÐµÑ ÑиолеÑовÑм.
Также обÑаÑиÑе внимание на поÑÑдок. ÐеÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо Ð¼Ñ ÑнаÑала обÑÑвлÑем ÑÑÐ¸Ð»Ñ Ð±ÐµÐ· ÑлоÑв, он вÑÑ Ñавно пÑименÑеÑÑÑ Ð¿Ð¾Ñле ÑÑилей ÑлоÑ.
HTML
<div class="box">
<p>ÐÑивеÑ, миÑ!</p>
</div>
CSS
p {
color: rebeccapurple;
}
@layer type {
.box p {
font-weight: bold;
font-size: 1.3em;
color: green;
}
}
РезÑлÑÑаÑ
ÐÑиÑвоение пÑавил ÑÑÑеÑÑвÑÑÑим ÑлоÑм
Ð ÑÑом пÑимеÑе ÑоздаÑÑÑÑ Ð´Ð²Ð° ÑÐ»Ð¾Ñ Ð±ÐµÐ· пÑименÑннÑÑ
пÑавил. ÐаÑем пÑименÑÑÑÑÑ CSS-пÑавила к обоим ÑлоÑм. Слой base опÑеделÑÐµÑ color, border, font-size и padding. Слой special опÑеделÑÐµÑ Ð´ÑÑгой ÑвеÑ. ÐоÑколÑÐºÑ special идÑÑ Ð¿Ð¾Ñледним пÑи опÑеделении ÑлоÑв, иÑполÑзÑеÑÑÑ Ð¾Ð¿ÑеделÑннÑй в нÑм ÑвеÑ, и ÑекÑÑ Ð¾ÑобÑажаеÑÑÑ Ñ Ð¸ÑполÑзованием rebeccapurple. ÐÑе оÑÑалÑнÑе пÑавила пÑименÑÑÑÑÑ Ð¸Ð· base.
HTML
<div class="item">
Я оÑобÑажаÑÑÑ ÑиолеÑовÑм ÑвеÑом, поÑÐ¾Ð¼Ñ ÑÑо Ñлой <code>special</code> идÑÑ
поÑле ÑÐ»Ð¾Ñ <code>base</code>. ÐнаÑÐµÐ½Ð¸Ñ ÑвойÑÑв border, font-size и padding
беÑÑÑÑÑ Ð¸Ð· ÑÐ»Ð¾Ñ <code>base</code>.
</div>
CSS
@layer base, special;
@layer special {
.item {
color: rebeccapurple;
}
}
@layer base {
.item {
color: green;
border: 5px solid green;
font-size: 1.3em;
padding: 0.5em;
}
}
РезÑлÑÑаÑ
СпеÑиÑикаÑии
| Specification |
|---|
| CSS Cascading and Inheritance Level 5> # layering> |