Blazor izolace základní šablon stylů CSS ASP.NET
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Autor: Dave Brock
Tento článek vysvětluje, jak izolace CSS obory CSS na Razor komponenty, které můžou zjednodušit css a vyhnout se kolizím s jinými komponentami nebo knihovnami.
Izolujte styly CSS na jednotlivé stránky, zobrazení a komponenty, abyste omezili nebo eliminovali:
- Závislosti na globálních stylech, jejichž údržba může být náročná
- Konflikty stylů ve vnořeném obsahu
Povolení izolace šablon stylů CSS
Pokud chcete definovat styly specifické pro jednotlivé komponenty, vytvořte .razor.css
soubor odpovídající názvu .razor
souboru pro komponentu ve stejné složce. Soubor .razor.css
je vymezený soubor CSS.
Example
Pro komponentu Example.razor
v souboru vytvořte soubor společně s komponentou s názvem Example.razor.css
. Soubor Example.razor.css
se musí nacházet ve stejné složce jako Example
součást (Example.razor
). Example
Základní název souboru nerozlišuje velká a malá písmena.
Example.razor
:
@page "/example"
<h1>Scoped CSS Example</h1>
Example.razor.css
:
h1 {
color: brown;
font-family: Tahoma, Geneva, Verdana, sans-serif;
}
Styly definované v Example.razor.css
se použijí pouze na vykreslený výstup Example
komponenty. Izolace CSS se použije u elementů HTML v odpovídajícím Razor souboru. Jakékoli h1
deklarace šablon stylů CSS definované jinde v aplikaci nejsou v konfliktu se Example
styly komponent.
Poznámka:
Aby se zajistila izolace stylu při sdružování, není import šablon stylů CSS v Razor blocích kódu podporován.
Sdružování izolace šablon stylů CSS
K izolaci šablon stylů CSS dochází v okamžiku sestavení. Blazor Přepíše selektory CSS tak, aby odpovídaly revizím vykresleným komponentou. Přepsané styly CSS jsou seskupené a vytvořené jako statický prostředek. Šablona stylů se odkazuje uvnitř <head>
značky (umístění <head>
obsahu). <link>
Následující prvek se přidá do aplikace vytvořené ze Blazor šablon projektu:
Blazor Web Apps:
<link href="@Assets["{ASSEMBLY NAME}.styles.css"]" rel="stylesheet">
Samostatné aplikace Blazor WebAssembly:
<link href="{ASSEMBLY NAME}.styles.css" rel="stylesheet">
<link href="{ASSEMBLY NAME}.styles.css" rel="stylesheet">
Zástupný {ASSEMBLY NAME}
symbol je název sestavení projektu.
Následující příklad pochází z hostované Blazor WebAssemblyClient aplikace. Název sestavení aplikace je BlazorSample.Client
a <link>
šablona projektu se přidá Blazor WebAssembly při vytvoření projektu s možností Hostovaná (-ho|--hosted
možnost pomocí rozhraní příkazového řádku .NET nebo ASP.NET Core hostovaného pomocí sady Visual Studio):
<link href="BlazorSample.Client.styles.css" rel="stylesheet">
V rámci balíčku souboru je každá komponenta přidružena k identifikátoru oboru. Pro každou stylovanou komponentu je atribut HTML připojen s formátem b-{STRING}
, kde {STRING}
zástupný symbol je řetězec deseti znaků vygenerovaný architekturou. Identifikátor je jedinečný pro každou aplikaci. V vykreslené Counter
komponentě Blazor připojí identifikátor oboru k elementu h1
:
<h1 b-3xxtam6d07>
Soubor {ASSEMBLY NAME}.styles.css
používá identifikátor oboru k seskupení deklarace stylu s jeho komponentou. Následující příklad poskytuje styl pro předchozí <h1>
prvek:
/* /Components/Pages/Counter.razor.rz.scp.css */
h1[b-3xxtam6d07] {
color: brown;
}
V době sestavení se vytvoří sada projektu s konvencí obj/{CONFIGURATION}/{TARGET FRAMEWORK}/scopedcss/projectbundle/{ASSEMBLY NAME}.bundle.scp.css
, kde jsou zástupné symboly:
{CONFIGURATION}
: Konfigurace sestavení aplikace (napříkladDebug
,Release
).{TARGET FRAMEWORK}
: Cílová architektura (napříkladnet6.0
).{ASSEMBLY NAME}
: Název sestavení aplikace (napříkladBlazorSample
).
Podpora podřízených komponent
Izolace šablon stylů CSS se vztahuje pouze na komponentu, kterou přidružíte k formátu {COMPONENT NAME}.razor.css
, kde {COMPONENT NAME}
zástupný symbol je obvykle název komponenty. Chcete-li použít změny na podřízenou komponentu, použijte ::deep
pseudo-element na všechny následné prvky v souboru nadřazené komponenty .razor.css
. Pseudo-element ::deep
vybere prvky, které jsou potomky vygenerovaného identifikátoru oboru prvku.
Následující příklad ukazuje nadřazenou komponentu volanou Parent
s podřízenou komponentou s názvem Child
.
Parent.razor
:
@page "/parent"
<div>
<h1>Parent component</h1>
<Child />
</div>
Child.razor
:
<h1>Child Component</h1>
h1
Aktualizujte deklaraci Parent.razor.css
pomocí ::deep
pseudo-elementu, který označuje h1
deklaraci stylu musí platit pro nadřazenou komponentu a její podřízené položky.
Parent.razor.css
:
::deep h1 {
color: red;
}
Styl h1
se teď vztahuje na Parent
komponenty a Child
bez nutnosti vytvořit samostatný soubor CSS s vymezeným oborem pro podřízenou komponentu.
Pseudo-element ::deep
funguje pouze s následníky elementy. Následující kód použije styly h1
na součásti podle očekávání. Identifikátor oboru nadřazené komponenty se použije u elementu div
, takže prohlížeč ví, že dědí styly z nadřazené komponenty.
Parent.razor
:
<div>
<h1>Parent</h1>
<Child />
</div>
Vyloučením elementu div
však odeberete potomkový vztah. V následujícím příkladu se styl nepoužije na podřízenou komponentu.
Parent.razor
:
<h1>Parent</h1>
<Child />
Pseudo-element ::deep
ovlivňuje, kde je atribut oboru použit na pravidlo. Když definujete pravidlo CSS v souboru CSS s vymezeným oborem, použije se obor na správný nejvíce prvků. Příklad: div > a
je transformován na div > a[b-{STRING}]
, kde {STRING}
zástupný symbol je řetězec deseti znaků vygenerovaný architekturou (například b-3xxtam6d07
). Pokud místo toho chcete, aby pravidlo platilo pro jiný selektor, ::deep
pseudo-element to umožňuje. Například div ::deep > a
se transformuje na div[b-{STRING}] > a
(například div[b-3xxtam6d07] > a
).
Možnost připojit pseudo-element k libovolnému ::deep
elementu HTML umožňuje vytvořit vymezené styly CSS, které ovlivňují prvky vykreslené jinými komponentami, když můžete určit strukturu vykreslovaných značek HTML. U komponenty, která vykresluje značku hypertextového odkazu (<a>
) uvnitř jiné komponenty, zajistěte, aby byla komponenta zabalená do div
(nebo jakéhokoli jiného elementu) a pomocí pravidla ::deep > a
vytvořte styl, který se použije jenom u této komponenty, když se nadřazená komponenta vykresluje.
Důležité
Vymezený šablony stylů CSS se vztahuje pouze na elementy HTML, nikoli Razor na součásti nebo pomocné rutiny značek, včetně prvků s použitým pomocným rutinou značky, například <input asp-for="..." />
.
Podpora preprocesorů CSS
Preprocesory CSS jsou užitečné pro zlepšení vývoje šablon stylů CSS díky tomu, že umožňují využívat funkce, jako jsou proměnné, vnořování, moduly, mixiny nebo dědičnost. Izolace šablon stylů CSS sice nativně nepodporuje preprocesory CSS, jako jsou Sass nebo Less, ale integrace preprocesorů CSS je bezproblémová, pokud před Blazor přepsáním selektorů CSS během procesu sestavení dojde k kompilaci preprocesoru. Pokud například používáte sadu Visual Studio, v Průzkumníku spouštěče úloh sady Visual Studio nakonfigurujte kompilaci stávajícího preprocesoru jako úlohu Před sestavením.
Mnoho balíčků NuGet třetích stran, jako AspNetCore.SassCompiler
je například , může kompilovat soubory SASS/SCSS na začátku procesu sestavení předtím, než dojde k izolaci šablon stylů CSS.
Konfigurace izolace šablon stylů CSS
Izolace šablon stylů CSS je navržená tak, aby fungovala bez použití, ale poskytuje konfiguraci pro některé pokročilé scénáře, například pokud existují závislosti na existujících nástrojích nebo pracovních postupech.
Úprava formátu identifikátoru oboru
Identifikátory oboru používají formát b-{STRING}
, kde {STRING}
zástupný symbol je desetimístý řetězec vygenerovaný architekturou. Pokud chcete formát identifikátoru oboru upravit, aktualizujte soubor projektu s použitím požadovaného vzoru:
<ItemGroup>
<None Update="Components/Pages/Example.razor.css" CssScope="custom-scope-identifier" />
</ItemGroup>
Ve výše uvedeném příkladu se v šablonách stylů CSS vygenerovaných pro soubor Example.razor.css
změní identifikátor oboru z formátu b-{STRING}
na custom-scope-identifier
.
Pomocí identifikátorů oboru můžete dosáhnout dědičnosti u souborů CSS s vymezeným oborem. V následujícím příkladu BaseComponent.razor.css
souboru projektu soubor obsahuje společné styly napříč komponentami. Soubor DerivedComponent.razor.css
tyto styly dědí.
<ItemGroup>
<None Update="Components/Pages/BaseComponent.razor.css" CssScope="custom-scope-identifier" />
<None Update="Components/Pages/DerivedComponent.razor.css" CssScope="custom-scope-identifier" />
</ItemGroup>
Pokud chcete sdílet identifikátory oboru mezi několika soubory, použijte operátor zástupného znaku (*
):
<ItemGroup>
<None Update="Components/Pages/*.razor.css" CssScope="custom-scope-identifier" />
</ItemGroup>
Identifikátory oboru používají formát b-{STRING}
, kde {STRING}
zástupný symbol je desetimístý řetězec vygenerovaný architekturou. Pokud chcete formát identifikátoru oboru upravit, aktualizujte soubor projektu s použitím požadovaného vzoru:
<ItemGroup>
<None Update="Pages/Example.razor.css" CssScope="custom-scope-identifier" />
</ItemGroup>
Ve výše uvedeném příkladu se v šablonách stylů CSS vygenerovaných pro soubor Example.razor.css
změní identifikátor oboru z formátu b-{STRING}
na custom-scope-identifier
.
Pomocí identifikátorů oboru můžete dosáhnout dědičnosti u souborů CSS s vymezeným oborem. V následujícím příkladu BaseComponent.razor.css
souboru projektu soubor obsahuje společné styly napříč komponentami. Soubor DerivedComponent.razor.css
tyto styly dědí.
<ItemGroup>
<None Update="Pages/BaseComponent.razor.css" CssScope="custom-scope-identifier" />
<None Update="Pages/DerivedComponent.razor.css" CssScope="custom-scope-identifier" />
</ItemGroup>
Pokud chcete sdílet identifikátory oboru mezi několika soubory, použijte operátor zástupného znaku (*
):
<ItemGroup>
<None Update="Pages/*.razor.css" CssScope="custom-scope-identifier" />
</ItemGroup>
Změna základní cesty ke statickým webovým prostředkům
Soubor scoped.styles.css
se vygeneruje v kořenovém adresáři aplikace. V souboru projektu použijte <StaticWebAssetBasePath>
vlastnost ke změně výchozí cesty. Následující příklad umístí scoped.styles.css
soubor a rest prostředky aplikace do _content
cesty:
<PropertyGroup>
<StaticWebAssetBasePath>_content/$(PackageId)</StaticWebAssetBasePath>
</PropertyGroup>
Zakázání automatického sdružování
Pokud chcete vyjádřit výslovný nesouhlas s tím, jak Blazor publikuje a načítá soubory s vymezeným oborem za běhu, použijte DisableScopedCssBundling
tuto vlastnost. Při použití této vlastnosti to znamená, že za převzetí izolovaných souborů CSS z obj
adresáře a publikování a jejich načítání za běhu zodpovídají jiné nástroje nebo procesy:
<PropertyGroup>
<DisableScopedCssBundling>true</DisableScopedCssBundling>
</PropertyGroup>
Zakázání izolace šablon stylů CSS
Zakažte izolaci šablon stylů CSS pro projekt nastavením <ScopedCssEnabled>
vlastnosti do false
souboru projektu aplikace:
<ScopedCssEnabled>false</ScopedCssEnabled>
Podpora knihovny tříd Razor (RCL)
Izolované styly komponent v balíčku NuGet nebo Razor knihovně tříd (RCL) se automaticky sbalí:
Aplikace používá importy šablon stylů CSS k odkazu na sbalené styly seznamu RCL. Pro knihovnu tříd pojmenovanou
ClassLib
a aplikaci s šablonou BlazorBlazorSample.styles.css
stylů se šablona stylů seznamu RCL naimportuje v horní části šablony stylů aplikace:@import '_content/ClassLib/ClassLib.bundle.scp.css';
Seskupené styly seznamu RCL se nepublikují jako statický webový prostředek aplikace, která styly využívá.
Další informace o knihovnách tříd Razor najdete v následujících článcích:
- Využívání komponent ASP.NET Core Razor v knihovně tříd Razor (RCL)
- Opakovaně použitelné uživatelské rozhraní Razor v knihovnách tříd s využitím ASP.NET Core