目次
過去に CSS の優先順位に存在した問題
非 @layer ラッピング レイヤーと @layer のレイヤー内スタイルの優先順位
匿名层与嵌套层
匿名层
嵌套层
多层嵌套层的优先级关系
!important 对 CSS @layer 的影响
非 @layer 包含块 !important 与 @layer 包含块 !important
CSS Cascade 规范
总结一下
詳細情報
最後に
ホームページ ウェブフロントエンド CSSチュートリアル CSS3 @layer の新機能について 1 つの記事で学びましょう

CSS3 @layer の新機能について 1 つの記事で学びましょう

Mar 28, 2022 am 11:12 AM
css

この記事では、CSS3 の新機能 @layer について詳しく説明します。お役に立てれば幸いです。

CSS3 @layer の新機能について 1 つの記事で学びましょう

2022年に入り、CSSの新機能が続々と登場していますが、最近CSS界隈で最も注目を集めている新機能がCSS @layerに他なりません。 。

この記事では、読者に新しい CSS @layer 仕様が何であるかをすぐに理解してもらうために、最も簡潔な言語を使用します。

過去に CSS の優先順位に存在した問題

ページ開発時にカスタム スタイルなど、ページに多くのスタイルがある場合、コンポーネントライブラリのスタイル。 現時点では、スタイルは非常に混乱しており、管理が困難になります

私たちが作成したものではないスタイルをオーバーライドしたい場合、多くの場合、より優先順位の高いスタイル名を使用して、それらのスタイルをオーバーライドする必要があります。

同時に、スタイルの優先順位を制御するのが難しいと感じる場合、開発者はそれを解決するために #!重要 を悪用することに慣れており、これが将来的にスタイル構造をさらに混乱させることになります。

CSS をより適切に制御および管理できるようにするという背景に基づいて、CSS @layer が誕生しました。

CSS @layer とは何ですか?

CSS @layer は、

CSS Cascading and Inheritance Level 5 から定義されています。

CSS @layer とは何ですか?簡単に言うと、

CSS @rule の @layer はカスケード レイヤーを宣言し、同じレイヤー内のルールは一緒にカスケードされます。これにより、開発者はカスケード メカニズムを制御できるようになり、より多くの制御が可能になります。

構文も非常に単純です。次の例を見てください:

@layer utilities {
  /* 创建一个名为 utilities 的级联层 */
}
ログイン後にコピー

このようにして、utilities という名前の @layer カスケード レイヤーを作成します。

@layer カスケード レイヤーの使用方法?

@layer カスケード レイヤーによるスタイルの優先度の管理

@layer カスケード レイヤーの最大の機能は、異なるスタイル間の優先度を制御することです

次の例を見て、2 つの @layer カスケード レイヤー A と B を定義します。

<div></div>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
div {
    width: 200px;
    height: 200px;
}
@layer A {
    div {
        background: blue;
    }
}
@layer B {
    div {
        background: green;
    }
}
ログイン後にコピー

@layer B の順序は @ レイヤーの後にランク付けされているためA なので、@layer B のすべてのスタイルの優先度は @layer A よりも高く、div の最終色は green:

CSS3 @layer の新機能について 1 つの記事で学びましょう

もちろん、ページ内に @layer が多すぎる場合、すべての @layer の順序を覚えるのは簡単ではない可能性があるため、別の記述方法があります。

複数の @layer レイヤーに同時に名前を付けて、スタイル ルールを追加できます。

<div></div>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
@layer B, C, A;
div {
    width: 200px;
    height: 200px;
}
@layer A {
    div {
        background: blue;
    }
}
@layer B {
    div {
        background: green;
    }
}
@layer C {
    div {
        background: orange;
    }
}
ログイン後にコピー

上記のコードでは、最初に

@layer B、C、A という 3 つの @layer カスケード レイヤーを定義します。次に、各カスケード レイヤーの CSS コードが後続の CSS コードに追加されますが、スタイルの優先順位は次のとおりです:

A > C > B

したがって、最終 div のカラー値は @layer A で定義されたカラー、つまり

blue:

CSS3 @layer の新機能について 1 つの記事で学びましょう

この時点で、CSS @layer の役割が明確にわかります。

CSS @layer を使用すると、さまざまな CSS モジュールをさまざまな @layer に分割し、その順序を使用してグローバル スタイルの優先順位を制御できます。

@layer カスケード レイヤーの定義を導入する 3 つの方法

@layer カスケード レイヤーの定義を導入するには、上記で説明した 2 つの方法があります。ここでもう一度説明します。 CSS を導入します。 @layer レイヤーをカスケードする方法。

1. レイヤー内で機能する CSS ルールを含む、ブロックレベルの @layer ルールを直接作成します:

@layer utilities {
  p {
    padding: .5rem;
  }
}
ログイン後にコピー

2. カスケード レイヤーを渡すことができます

@import 作成するには、ルールはインポートされたスタイル シートに存在します:

@import(utilities.css) layer(utilities);
ログイン後にコピー

3. 名前付きカスケード レイヤーを作成しますが、スタイルは指定しません。その後、CSS 内の任意の場所にスタイルを追加できます。

@layer utilities;
// ...
// ...
@layer utilities {
    p {
        color: red;
    }
}
ログイン後にコピー

非 @layer ラッピング レイヤーと @layer のレイヤー内スタイルの優先順位

もちろん、別の優先順位もあります。ここでの状況ですが、@layer でラップされていないスタイルの優先順位は、@layer でラップされているスタイルの優先順位とどのように比較されますか?

この例を見てください:

@layer A { a { color: red; } }
@layer B { a { color: orange; } }
@layer C { a { color: yellow; } }
a { color: green; } /* 未被 @layer 包裹的样式 */
ログイン後にコピー

ここで非常に重要な結論が得られます。

@layer でラップされていないスタイルは、@layer でラップされたスタイルよりも優先されます したがって、 、上記のルールの順序は次のとおりです:

@layer> @layer C > @layer B > @layer A

でラップされていないスタイル

匿名层与嵌套层

还有两种层级关系,分别是匿名层嵌套层

匿名层

允许创建一个不带名字的 @layer:

@layer {
  p {
    margin: 1rem;
  }
}
ログイン後にコピー

这里,创建了一个匿名层。匿名层的两个重要特性:

  • 创建后无法向其再添加规则

  • 该层和其他命名层功能一致,优先级也遵循后定义的匿名层,比其他已定义的 @layer 层,优先级更高

看一个例子:

<div></div>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
div {
    width: 200px;
    height: 200px;
}
@layer {
    div {
        background: pink;
    }
}
@layer B, C, A;
@layer A {
    div {
        background: blue;
    }
}
@layer B {
    div {
        background: green;
    }
}
@layer C {
    div {
        background: orange;
    }
}
ログイン後にコピー

上述代码,我们首先定义了一个匿名层,指定了 div 的颜色为 pink,而后又定义了 @layer B, C, A。这里优先级顺序为:

A > C > B > 匿名层

最终的颜色为 @layer A 内的颜色值 -- blue

CSS3 @layer の新機能について 1 つの記事で学びましょう

如果,我们将匿名层放在最后的话:

div {
    width: 200px;
    height: 200px;
}
@layer B, C, A;
@layer A {
    div {
        background: blue;
    }
}
@layer B {
    div {
        background: green;
    }
}
@layer C {
    div {
        background: orange;
    }
}
@layer {
    div {
        background: pink;
    }
}
ログイン後にコピー

此时,样式的优先级顺序为:

匿名层 > A > C > B

最终的颜色为匿名层内的颜色值 -- pink

CSS3 @layer の新機能について 1 つの記事で学びましょう

嵌套层

说完了匿名层,我们再来看看嵌套层。

顾名思义,嵌套层的意思就是在 @layer 内部,我们可以再嵌套使用 @layer 级联层。像是这样:

@layer A {
  @layer B{
    ...
  }
}
ログイン後にコピー

当然,它还有另外一种语法,上述代码等价于:

@layer A.B {
  ...
}
ログイン後にコピー

了解了这个后,那么,看这样一个例子:

<div></div>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
div {
    width: 200px;
    height: 200px;
}
@layer A {
    div {
        background: blue;
    }
    
    @layer B {
        div {
            background: red;
        }
    }
}
ログイン後にコピー

我们在 @layer A 中嵌套一个 @layer B,同时都定义了一个 div 的样式,最终 div 的 background 到底是什么颜色呢?

最终为蓝色 background: blue,为什么呢?这个很好记忆,我们假设如果没有 @layer A 这一层包裹,其实就是上述说的 @layer 层与非 @layer 层的优先级比较,这里,非 @layer 层(我们可以理解为更高级别的一层 @layer)的优先级更高。

因此,对于单个 @layer 内的嵌套关系,样式优先级为:

@layer A > @layer A.B

多层嵌套层的优先级关系

OK,再看这样一种情况:

div {
    width: 200px;
    height: 200px;
}
@layer A {
    div {
        background: blue;
    }
    @layer B {
        div {
            background: red;
        }
    }
}
@layer C {
    div {
        background: yellow;
    }
    @layer D {
        div {
            background: green;
        }
    }
}
ログイン後にコピー

这里存在同时存在多个嵌套 @layer 的情况。那么这种情况优先级又是如何划分呢?

这里的规则是,优先级高的 @layer,无论是否存在嵌套,优先级都整体比优先级低的 @layer(无论是否存在嵌套)高,因此,这里的优先级排序是:

@layer C > @layer C.D > @layer A > @layer A.B

!important 对 CSS @layer 的影响

再来看看 !important 对 CSS @layer 的影响。

这里可以分为几种情况,先看其中一种:

<div></div>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
div {
    width: 200px;
    height: 200px;
    background: black;
}
@layer A {
    div {
        background: blue;
    }
    @layer B {
        div {
            background: red;
        }
    }
}
@layer C {
    div {
        background: yellow;
    }
    @layer D {
        div {
            background: green!important;
        }
    }
}
ログイン後にコピー

上述代码,我们给 @layer C.D 的 <div> 添加了一个 !important 规则。

如果,不考虑 !important 规则,那么实际的 CSS 优先级为(序号越高,优先级越高):

  • @layer A.B

  • @layer A

  • @layer C.D

  • @layer C

  • 非 layer 包裹块

那么,<div> 的颜色应该为黑色 black。然而,这里给 @layer C.D 的 <div> 添加了一个 !important 规则。

实际上,最终 <div> 的颜色为 green,也就是最终的优先级排序为(序号越高,优先级越高):

  • @layer A.B

  • @layer A

  • @layer C

  • 非 layer 包裹块

  • !important 下的 @layer C.D

也就是说,这里 !important 规则的优先级还是凌驾于非 !important 规则之上的。

上述 DEMO 还是比较有意思的,感兴趣的可以看看:CodePen Demo -- CSS Cascade @layer Demo

https://codepen.io/Chokcoco/pen/KKZKBRr

非 @layer 包含块 !important 与 @layer 包含块 !important

到这里,你也许会以为你懂了。好,我们再来看一个 DEMO,如果我们给非 @layer 包含块,也加上一个 !important 规则,事情就变得有趣了。

<div></div>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
div {
    width: 200px;
    height: 200px;
    background: black!important;
}
@layer A {
    div {
        background: blue;
    }
    @layer B {
        div {
            background: red;
        }
    }
}
@layer C {
    div {
        background: yellow;
    }
    @layer D {
        div {
            background: green!important;
        }
    }
}
ログイン後にコピー

仔细看上述代码,非 @layer 包含块,我们也加上了一个 !important 规则,按照上述我能描述的规则来看,非 @layer 包含块的优先级高于 @layer 包含块,那么正常而言,我们不难猜测,这里 background: black!important 的优先级应该要比 background: green!important 高,最终 <div> 应该展示黑色。

而实际上,这里最终 <div> 的颜色还是 green。这里就又有一个非常有意思的知识点了,!important 下样式优先级的规则与非 !important 正常状态下刚好相反。

这是一个非常重要的特性,在比较正常(非 !important)规则时,越是级联(排序较后的 @layer 规则),优先级越低;反之,在比较 !important 规则时,越是级联靠后的(排序较后的 @layer 规则),优先级越高。

这个,更进一步的话,我们需要去了解 CSS Cascading 相关的知识了。

CSS Cascade 规范

在 CSS @layer 之前,我们简单看一张图:

上图表面的是在没有 CSS @layer 之前,CSS 样式申明的优先级排序,根据 CSS Cascading 4(Current Work) 标准,定义的当前规范下申明的层叠顺序优先级如下(越往下的优先级越高,下面的规则按升序排列):

  • Normal user agent declarations
  • Normal user declarations
  • Normal author declarations
  • Animation declarations
  • Important author declarations
  • Important user declarations
  • Important user agent declarations
  • Transition declarations

按照上述算法,可以得到一个样式优先级的排序,大概是这样(越往下的优先级越高,下面的规则按升序排列):

CSS3 @layer の新機能について 1 つの記事で学びましょう

  • User Agent - 用户代理普通样式

  • User - 用户设置的普通样式

  • Author - 页面作者普通样式

  • Animations - 动画样式

  • ❗️Author - 页面作者 !important 样式

  • ❗️User - 用户设置的 !important 样式

  • ❗️User Agent - 用户代理的 !important 样式

  • Transitions - 过渡样式

简单解释一下用户代理样式:浏览器会有一个基本的样式表来给任何网页设置默认样式。这些样式统称用户代理样式页面作者样式:网页的作者可以定义文档的样式,这是最常见的样式表。大多数情况下此类型样式表会定义多个,它们构成网站的视觉和体验,即页面主题,可以理解为页面作者样式用户样式:读者,作为浏览器的用户,可以使用自定义样式表定制使用体验,自定义用户偏好,可以理解为用户样式

关于 CSS Cascading,也就是层叠规范,你可以看看我的这篇文章加深理解 -- 深入理解 CSS(Cascading Style Sheets)中的层叠(Cascading)。

https://github.com/chokcoco/iCSS/issues/76

而当有了 CSS @layer 之后,这个层叠优先级顺序有了更新,具体优先级如下:

CSS3 @layer の新機能について 1 つの記事で学びましょう

整体会变更为复杂一些,但是总体还是遵循了两个规则:

  • !important 样式高于非 !important 样式

  • 在比较 !important 规则时,优先级顺序与正常规则相反,在正常状态下优先级越低的,在 !important 下优先级越高

总结一下

综上,便是关于 CSS @layer 的基础相关知识。

CSS @layer 的诞生,让我们有能力更好的划分页面的样式层级,更好的处理内部样式与外部引用样式的优先级顺序,属于比较重大的一次革新。

同时,它也让我们意识到要逐渐摒弃大规模使用 !important 去覆盖样式优先级的错误做法,避免许多因为优先级问题带来的不必要的副作用。

当然,时至今天(2022-03-14),我们来看一眼兼容性:

CSS3 @layer の新機能について 1 つの記事で学びましょう

人気が高まっていますが、Chrome、Safari、Firefox、Edge の最新バージョンでは CSS @layer のサポートが開始されており、現在はいくつかのポリフィルを通じて最初に使用できます。近い将来、ビジネス CSS コードに不可欠な部分になると考えられます。

詳細情報

CSS @layer については、インターネット上で多くの議論が行われています。質の高い記事をいくつか紹介します。興味があれば、読み続けてください:

最後に

# さて、この記事はここで終わります、お役に立てば幸いです。 )

(学習ビデオ共有:webfrontend

以上がCSS3 @layer の新機能について 1 つの記事で学びましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ブートストラップボタンの使用方法 ブートストラップボタンの使用方法 Apr 07, 2025 pm 03:09 PM

ブートストラップボタンの使用方法は?ブートストラップCSSを導入してボタン要素を作成し、ブートストラップボタンクラスを追加してボタンテキストを追加します

ブートストラップのサイズを変更する方法 ブートストラップのサイズを変更する方法 Apr 07, 2025 pm 03:18 PM

Bootstrapの要素のサイズを調整するには、次のものを含むDimensionクラスを使用できます。

ブートストラップに写真を挿入する方法 ブートストラップに写真を挿入する方法 Apr 07, 2025 pm 03:30 PM

ブートストラップに画像を挿入する方法はいくつかあります。HTMLIMGタグを使用して、画像を直接挿入します。ブートストラップ画像コンポーネントを使用すると、レスポンシブ画像とより多くのスタイルを提供できます。画像サイズを設定し、IMG-Fluidクラスを使用して画像を適応可能にします。 IMGボーダークラスを使用して、境界線を設定します。丸い角を設定し、IMGラウンドクラスを使用します。影を設定し、影のクラスを使用します。 CSSスタイルを使用して、画像をサイズ変更して配置します。背景画像を使用して、背景イメージCSSプロパティを使用します。

ブートストラップにファイルをアップロードする方法 ブートストラップにファイルをアップロードする方法 Apr 07, 2025 pm 01:09 PM

ファイルアップロード機能は、Bootstrapを介して実装できます。手順は次のとおりです。BootstrapCSSおよびJavaScriptファイルを紹介します。ファイル入力フィールドを作成します。ファイルアップロードボタンを作成します。ファイルのアップロードを処理します(FormDataを使用してデータを収集し、サーバーに送信します)。カスタムスタイル(オプション)。

ブートストラップの日付を確認する方法 ブートストラップの日付を確認する方法 Apr 07, 2025 pm 03:06 PM

ブートストラップの日付を確認するには、次の手順に従ってください。必要なスクリプトとスタイルを紹介します。日付セレクターコンポーネントを初期化します。 Data-BV-Date属性を設定して、検証を有効にします。検証ルール(日付形式、エラーメッセージなどなど)を構成します。ブートストラップ検証フレームワークを統合し、フォームが送信されたときに日付入力を自動的に検証します。

ブートストラップリストでデフォルトスタイルを削除する方法は? ブートストラップリストでデフォルトスタイルを削除する方法は? Apr 07, 2025 am 10:18 AM

ブートストラップリストのデフォルトスタイルは、CSSオーバーライドで削除できます。より具体的なCSSルールとセレクターを使用し、「近接原理」と「重量原理」に従って、ブートストラップのデフォルトスタイルをオーバーライドします。スタイルの競合を避けるために、よりターゲットを絞ったセレクターを使用できます。オーバーライドが失敗した場合は、カスタムCSSの重量を調整します。同時に、パフォーマンスの最適化に注意を払い、重要な!の過剰使用を避け、簡潔で効率的なCSSコードを書いてください。

ブートストラップナビゲーションバーの設定方法 ブートストラップナビゲーションバーの設定方法 Apr 07, 2025 pm 01:51 PM

ブートストラップは、ナビゲーションバーをセットアップするための簡単なガイドを提供します。ブートストラップライブラリを導入してナビゲーションバーコンテナを作成するブランドアイデンティティの作成ナビゲーションリンクの作成他の要素の追加(オプション)調整スタイル(オプション)

ブートストラップのフレームワークをセットアップする方法 ブートストラップのフレームワークをセットアップする方法 Apr 07, 2025 pm 03:27 PM

Bootstrapフレームワークをセットアップするには、次の手順に従う必要があります。1。CDNを介してブートストラップファイルを参照してください。 2。独自のサーバーでファイルをダウンロードしてホストします。 3。HTMLにブートストラップファイルを含めます。 4.必要に応じてSASS/LESSをコンパイルします。 5。カスタムファイルをインポートします(オプション)。セットアップが完了したら、Bootstrapのグリッドシステム、コンポーネント、スタイルを使用して、レスポンシブWebサイトとアプリケーションを作成できます。

See all articles