suchen
HeimWeb-FrontendCSS-TutorialVerwenden der benutzerdefinierten Eigenschaft 'Stapel', um die Kaskade zu zähmen

CSS benutzerdefinierte Eigenschaften: Neue Möglichkeiten zur Kontrolle von Kaskaden und Vererbung

Verwenden der benutzerdefinierten Eigenschaft

Seit der Geburt von CSS im Jahr 1994 haben Kaskaden und Erbschaft definiert, wie wir auf Webseiten entwerfen. Beide sind leistungsstarke Merkmale, aber als Entwickler haben wir eine sehr begrenzte Kontrolle darüber, wie sie interagieren. Selektorspezifität und Quellcode -Reihenfolge bieten eine minimale "hierarchische" Kontrolle, aber es fehlen Nuancen - und die Vererbung erfordert eine ungebrochene Linie . Mit CSS -benutzerdefinierten Eigenschaften können wir das Kaskadieren und Vererbung auf neue Weise verwalten und steuern.

In diesem Artikel wird angezeigt, wie Sie eine benutzerdefinierte Eigenschaft "Stack" verwenden, um einige häufige Probleme bei der Kaskadierung zu lösen: von Scoped -Komponenten -Stilen bis hin zu expliziteren Absichtenhierarchie.

Erfahren Sie schnell über benutzerdefinierte Eigenschaften

Der Browser verwendet ein Anbieterpräfix (wie -Webkit- oder -moz-), um neue Eigenschaften auf die gleiche Weise zu definieren, und wir können das "leere" verwenden -Präfix, um unsere eigenen benutzerdefinierten Eigenschaften zu definieren. Wie Variablen in Sass oder JavaScript können wir sie verwenden, um Werte zu benennen, zu speichern und abzurufen - aber wie andere Eigenschaften in CSS, sie kaskadieren und mit dem DOM geerbt .

 <code>/* 定义自定义属性*/ html { --brand-color: rebeccapurple; }</code>

Um auf diese erfassten Werte zuzugreifen, verwenden wir die Funktion var (). Es hat zwei Teile: zuerst den Namen der benutzerdefinierten Eigenschaft und dann der Fallback -Wert, wenn die Eigenschaft nicht definiert ist:

 <code>button { /* 如果可用,则使用--brand-color,否则回退到deeppink */ background: var(--brand-color, deeppink); }</code>

Dies ist kein Unterstützung von älteren Browsern. Wenn der Browser die benutzerdefinierten Eigenschaften nicht versteht, ignoriert er die gesamte Var () -DEklaration. Stattdessen ist dies ein integrierter Weg, um mit undefinierten Variablen umzugehen, ähnlich wie der Schriftstapel, der eine Fallback-Schriftfamilie definiert, wenn die Schriftart nicht verfügbar ist. Wenn wir keine Fallback -Werte liefern, wird der Standard nicht festgelegt.

Bauen Sie Variable "Stack" auf

Diese Fähigkeit, Fallback-Werte zu definieren, ähnelt dem "Schriftart", der in der Schriftfamilie verwendet wird. Wenn die erste Serie nicht verfügbar ist, wird die zweite Serie verwendet und so weiter. Die Funktion var () akzeptiert nur einen einzelnen Fallback -Wert, aber wir können die Funktion var () nisten, um einen benutzerdefinierten Attribut -Fallback -Stapel einer beliebigen Größe zu erstellen:

 <code>button { /* 尝试Consolas,然后是Menlo,然后是Monaco,最后是monospace */ font-family: Consolas, Menlo, Monaco, monospace; /* 尝试--state,然后是--button-color,然后是--brand-color,最后是deeppink */ background: var(--state, var(--button-color, var(--brand-color, deeppink))); }</code>

Wenn die verschachtelte Syntax zum Stapeln von Eigenschaften sperrig aussieht, können Sie einen Präprozessor wie SASS verwenden, um ihn kompakter zu machen.

Eine einzelne Fallback -Wertgrenze ist erforderlich, um Fallback -Werte zu unterstützen, die Kommas enthalten - z. B. Schriftstapel oder hierarchische Hintergrundbilder:

 <code>html { /* 后备值为"Helvetica, Arial, sans-serif" */ font-family: var(--my-font, Helvetica, Arial, sans-serif); }</code>

Definieren Sie "Umfang"

Mit dem CSS -Selektor können wir in einen bestimmten verschachtelten Kontext in die HTML -DOM -Baum- und Stilelemente eintauchen.

 <code>/* 所有链接*/ a { color: slateblue; } /* section 内的链接*/ section a { color: rebeccapurple; } /* article 内的链接*/ article a { color: deeppink; }</code>

Dies ist nützlich, erfasst jedoch nicht die Realität von "modularen" objektorientierten oder komponentenorientierten Stilen. Möglicherweise haben wir viele Artikel und Abschnitte, die in verschiedenen Konfigurationen verschachtelt sind. Wir brauchen einen Weg, um zu klären, welcher Kontext oder Umfang Vorrang haben sollte, wenn sie sich überschneiden.

Proximity -Umfang

Angenommen, wir haben ein. Light -Thema und ein .dark -Thema. Wir können diese Klassen im Stammelement verwenden, um die Seitenweiten-Standardwerte zu definieren, aber wir können sie auch auf bestimmte Komponenten anwenden, die auf verschiedene Arten verschachtelt sind:

Jedes Mal, wenn wir eine der Farbmusterklassen anwenden, werden die Hintergrund- und Farbeigenschaften zurückgesetzt und dann durch die verschachtelten Titel und Absätze geerbt. In unserem Hauptkontext erben die Farben aus der Klasse. Die Vererbung basiert auf direkter Blutlinie, sodass der nächste Vorfahren mit definierten Werten Vorrang hat. Wir nennen es die Nähe .

Die Nähe ist wichtig für die Vererbung, hat jedoch keinen Einfluss auf die Selektoren, die auf Spezifität beruhen. Dies wird zu einem Problem, wenn wir etwas im inneren dunklen oder hellen Behälter stylen wollen.

Hier versuche ich, helle und dunkle Knopfvarianten zu definieren. Die Light -Modus -Schaltflächen sollten Rebeccapurple mit weißem Text sein, damit sie hervorstechen, während die Tasten des Dark -Modus mit schwarzem Text Pflaumen sein sollten. Wir wählen die Tasten direkt basierend auf den hellen und dunklen Kontexten aus, aber dies funktioniert nicht:

Einige Schaltflächen sind in beiden Kontexten, mit .Light- und .dark -Vorfahren. In diesem Fall wollen wir, dass das jüngste Thema übernimmt (Erben des Näherungsverhaltens ), aber wir erhalten der zweite Selektor, der den ersten Selektor (Kaskadenverhalten) überschreibt. Da diese beiden Selektoren die gleiche Spezifität haben, bestimmt die Reihenfolge des Quellcodes den Gewinner.

Benutzerdefinierte Eigenschaften und Nähe

Wir brauchen eine Möglichkeit, diese Eigenschaften aus dem Thema zu erben , wenden sie jedoch nur auf bestimmte Kinderelemente wie unsere Schaltflächen an. Benutzerdefinierte Eigenschaften ermöglichen dies! Wir können Werte für helle und dunkle Behälter definieren, aber nur ihre erblichen Werte für verschachtelte Elemente wie unsere Schaltflächen verwenden.

Wir setzen zuerst die Schaltfläche so ein, dass benutzerdefinierte Eigenschaften verwendet werden und fallback "Standard" -Werte verwendet werden, falls diese Eigenschaften undefiniert sind:

 <code>button { background: var(--btn-color, rebeccapurple); color: var(--btn-contrast, white); }</code>

Jetzt können wir diese Werte basierend auf dem Kontext festlegen, sie werden den entsprechenden Vorfahren gemäß der Nähe und Erbschaft gründen :

 <code>.dark { --btn-color: plum; --btn-contrast: black; } .light { --btn-color: rebeccapurple; --btn-contrast: white; }</code>

Als zusätzlicher Bonus verwenden wir insgesamt weniger Code sowie eine einheitliche Taste -Definition:

Ich denke, dies ist eine API, um verfügbare Parameter für die Tastekomponente zu erstellen. Sowohl Sara Soueidan als auch Lea Verou haben dies in jüngsten Artikeln sehr gut behandelt.

Komponentenbesitz

Manchmal reicht die Nähe nicht aus, um den Umfang zu definieren. Wenn JavaScript -Frameworks "Scope -Stile" generieren, stellen sie das Eigentum bestimmter Objektelemente fest. Die Tab -Layout -Komponente hat die Registerkarte selbst, hat jedoch nicht den Inhalt hinter jeder Registerkarte. Dies ist auch das, was die BEM -Konvention in komplexen. Block__element -Klassennamen erfassen versucht.

Nicole Sullivan prägte 2011 den Begriff „Donut Scope“, um dieses Problem zu erörtern. Obwohl ich glaube, dass sie Ideen zu diesem Thema aktualisiert hat, hat sich das grundlegende Problem nicht geändert. Selektoren und Spezifität sind großartig, um zu beschreiben, wie wir detaillierte Stile auf einem breiten Muster erstellen, vermitteln jedoch kein klares Eigentumsgefühl.

Wir können einen benutzerdefinierten Eigenschaftsstapel verwenden, um dieses Problem zu lösen. Wir werden zunächst "globale" Eigenschaften auf dem Element erstellen, die für unsere Standardfarben verwendet werden:

 <code>html { --background--global: white; --color--global: black; --btn-color--global: rebeccapurple; --btn-contrast--global: white; }</code>

Jetzt können wir es überall verwenden, wo wir es verweisen möchten. Wir werden die Daten-Themen-Eigenschaft verwenden, um unsere Vordergrund- und Hintergrundfarben anzuwenden. Wir möchten, dass der globale Wert den Standard -Fallback -Wert liefert, aber wir möchten auch die Option, ihn mit einem bestimmten Thema zu überschreiben. Hier kommt der "Stack" ins Spiel:

 <code>[data-theme] { /* 如果没有组件值,则使用全局值*/ background: var(--background--component, var(--background--global)); color: var(--color--component, var(--color--global)); }</code>

Jetzt können wir die umgekehrte Komponente definieren, indem wir die Eigenschaft von *-Komponenten auf die Rückseite der globalen Eigenschaft einstellen:

 <code>[data-theme='invert'] { --background--component: var(--color--global); --color--component: var(--background--global); }</code>

Wir möchten jedoch nicht, dass diese Einstellungen aus dem Eigentümer -Donut erben. Daher setzen wir diese Werte in jedem Thema auf die erste (undefinierte) zurück. Wir müssen dies in einer niedrigeren Spezifität oder früheren Quellcode -Reihenfolge tun, damit es Standardwerte bereitstellt, die jedes Thema überschreiben kann:

 <code>[data-theme] { --background--component: initial; --color--component: initial; }</code>

Das anfängliche Schlüsselwort hat eine besondere Bedeutung, wenn sie für benutzerdefinierte Eigenschaften verwendet werden und es in den garantierten Zustand zurückkehren. Dies bedeutet, dass es nicht an den festen Hintergrund übergeben wird: Initial oder Farbe: Initial, die benutzerdefinierte Eigenschaft wird undefiniert und wir werden auf den nächsten Wert im Stapel zurückgreifen, d. H. Die globalen Einstellungen.

Wir können dasselbe mit der Taste tun und dann sicherstellen, dass das Datenthema auf jede Komponente angewendet wird. Wenn kein spezifisches Thema angegeben ist, standardisch für jede Komponente zum globalen Thema:

Definieren Sie "Quelle"

Eine CSS -Kaskade ist eine Reihe von Filterschichten, mit denen festgestellt wird, welcher Wert bei der Definition mehrerer Werte in derselben Eigenschaft bevorzugt werden sollte. Wir interagieren am häufigsten mit bestimmten Ebenen oder der endgültigen Hierarchie basierend auf der Quellcodesequenz - aber die erste Schicht der Kaskade ist die "Quelle" des Stils. Quelle beschreibt die Quelle des Stils - normalerweise den Browser (Standard), Benutzer (Präferenz) oder Autor (US).

Standardmäßig überschreibt der Autorenstil Benutzerpräferenzen und Benutzereinstellungen überschreiben Browser -Standardeinstellungen. Dies ändert sich !important , und die Quelle ist umgekehrt: Der Browser !important Stil hat die höchste Quelle, dann die wichtigen Benutzerpräferenzen, dann unser Autor wichtige Stile, vor allem normale Ebenen. Es gibt einige andere Quellen, aber wir werden hier nicht auf Details eingehen.

Wenn wir eine benutzerdefinierte Eigenschaft "Stack" erstellen, bauen wir ein sehr ähnliches Verhalten auf. Wenn wir eine vorhandene Quelle als benutzerdefinierte Eigenschaftsstapel darstellen möchten, sieht sie so aus:

 <code>.origins-as-custom-properties { color: var(--browser-important, var(--user-important, var(--author-important, var(--author, var(--user, var(--browser)))))); }</code>

Diese Schichten existieren bereits, daher gibt es keinen Grund, sie neu zu erstellen. Wenn wir jedoch über unser "globales" und "Komponenten" -Stile oben geschoben werden, tun wir etwas Ähnliches und erstellen eine "Komponenten" -Er -Quellebene, die unsere "globale" Ebene überschreibt. Die gleiche Methode kann verwendet werden, um verschiedene hierarchische Probleme in CSS zu lösen, die nicht immer mit Spezifität beschrieben werden können:

  • Überschreiben »Komponenten» Thema »Standardwerte
  • Thema »Entwerfen Sie ein System oder ein Framework
  • Status »Typ» Standardwert

Schauen wir uns noch einige Tasten an. Wir benötigen einen Standard -Schaltflächenstil, einen behinderten Status und verschiedene Tastentypen "wie Gefahr, primär und sekundär. Wir möchten, dass der behinderte Zustand die Typvariante immer überschreibt, aber der Selektor kann diesen Unterschied nicht erfassen:

Wir können jedoch einen Stapel definieren, der die "Typ" und "Status" in der Reihenfolge liefert, die wir Prioritäten setzen möchten:

 <code>button { background: var(--btn-state, var(--btn-type, var(--btn-default))); }</code>

Wenn wir nun zwei Variablen festlegen, wird der Zustand immer Vorrang haben:

Ich habe ein Cascading -Farb -Framework mit dieser Technik erstellt, mit der benutzerdefinierte Themeneinstellungen basierend auf Layering:

  • Vordefinierte Themeneigenschaften in HTML
  • Benutzerfarbeinstellungen
  • Helle und dunkle Modi
  • Globales Thema Standardeinstellungen

Mischen und übereinstimmen

Diese Methoden können extrem sein, aber die meisten täglichen Anwendungsfälle können mit zwei oder drei Werten im Stapel verarbeitet werden, normalerweise unter Verwendung der oben genannten Techniken:

  • Definieren Sie den variablen Stapel der Schicht
  • Die Vererbung basiert auf Nähe und Umfang
  • Wenden Sie die Anfangswerte sorgfältig an, um verschachtelte Elemente aus dem Umfang zu entfernen

Wir haben diese benutzerdefinierten Eigenschaften "Stack" in unseren Oddbird -Projekten verwendet. Wir erforschen immer noch, aber sie haben uns geholfen, Probleme zu lösen, die mit nur Selektoren und Spezifität schwer zu lösen sind. Mit benutzerdefinierten Eigenschaften müssen wir keine Cascade oder Erbschaft bekämpfen. Wir können sie wie erwartet erfassen und nutzen und haben eine bessere Kontrolle darüber, wie sie in jedem Fall angewendet werden. Für mich ist dies ein großer Gewinn für CSS - insbesondere bei der Entwicklung von Stilrahmen, Tools und Systemen .

Das obige ist der detaillierte Inhalt vonVerwenden der benutzerdefinierten Eigenschaft 'Stapel', um die Kaskade zu zähmen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
CSS Flexbox vs Grid: Eine umfassende ÜberprüfungCSS Flexbox vs Grid: Eine umfassende ÜberprüfungMay 12, 2025 am 12:01 AM

Die Auswahl von Flexbox oder Grid hängt von den Layoutanforderungen ab: 1) Flexbox ist für eindimensionale Layouts wie die Navigationsleiste geeignet. 2) Das Gitter eignet sich für zweidimensionale Layouts wie Zeitschriftenlayouts. Die beiden können im Projekt verwendet werden, um den Layout -Effekt zu verbessern.

So füge CSS -Dateien ein: Methoden und Best PracticesSo füge CSS -Dateien ein: Methoden und Best PracticesMay 11, 2025 am 12:02 AM

Der beste Weg, um CSS -Dateien einzubeziehen, besteht darin, Tags zu verwenden, um externe CSS -Dateien in den HTML -Teil einzuführen. 1. Verwenden Sie Tags, um externe CSS -Dateien einzuführen, wie z. 2. Für kleine Anpassungen können Inline -CSS verwendet werden, sollten jedoch mit Vorsicht verwendet werden. 3. Große Projekte können CSS -Präprozessoren wie SASS oder weniger verwenden, um andere CSS -Dateien über @import zu importieren. 4. Für die Leistung sollten CSS -Dateien zusammengeführt und CDN verwendet und mit Tools wie CSSNano komprimiert werden.

Flexbox vs Grid: Soll ich sie beide lernen?Flexbox vs Grid: Soll ich sie beide lernen?May 10, 2025 am 12:01 AM

Ja, youShouldlearnbothflexBoxandgrid.1) FlexBoxiSidealfore-dimensional, flexibelayoutslikenAvigationMenus.2) GridexcelStwo-dimensional, komplexDesignsuchasmagazinelayouts.3) Kombininierungs-Botenhances-Flexible-und-und -Anteilungskraft, und -forsfossivität,

Orbitalmechanik (oder wie ich eine CSS -Keyframes -Animation optimiert habe)Orbitalmechanik (oder wie ich eine CSS -Keyframes -Animation optimiert habe)May 09, 2025 am 09:57 AM

Wie sieht es aus, Ihren eigenen Code neu zu gestalten? John Rhea nimmt eine alte CSS -Animation auseinander, die er geschrieben hat, und geht durch den Denkprozess der Optimierung.

CSS -Animationen: Ist es schwierig, sie zu erstellen?CSS -Animationen: Ist es schwierig, sie zu erstellen?May 09, 2025 am 12:03 AM

CsSanimationsarenotinherenthardbutRequirePractICEANDUnDing-fordertofcsPropertiesandTimingfunktionen.1) StartwithsimpleanimationslikescalingabuttononoversKeyFrames.2) useaSingFunctionslikecubic-BezierForteffects, SuchasabouNects, SuchasabouNects,, zu

@Keyframes CSS: Die am häufigsten verwendeten Tricks@Keyframes CSS: Die am häufigsten verwendeten TricksMay 08, 2025 am 12:13 AM

@KeyFramesispopulardUeToitSverSatility und PowerIncreatingsmoothcsSanimations.KectrickSinclude: 1) DefiningsmoothTransitionSbetTates, 2) AnimatingMultipleProperTiesimultan, 3) mit VendorprefixesforBrowserCompatible, 4) Kombinieren, 4) Kombinieren, 4) Kombinieren, 4) Kombinieren, 4) Kombinieren

CSS -Zähler: Eine umfassende Anleitung zur automatischen NummerierungCSS -Zähler: Eine umfassende Anleitung zur automatischen NummerierungMay 07, 2025 pm 03:45 PM

CSSCOUSTERSSARUSTOMANAGEAUTOMATICNUMBERINGINWEBDEsigns.1) Sie konzipieren SieForsofcontents, ListItems und CustomNumbering.2) AdvanceduSesincnednumberingSystem.3) CHEFORDIGESINCLUDSERCOMPATIBILIBLEISE.4) CreativeuSinvolvecustInance

Moderne Bildlaufschatten mit scrollengetriebenen AnimationenModerne Bildlaufschatten mit scrollengetriebenen AnimationenMay 07, 2025 am 10:34 AM

Die Verwendung von Scroll -Schatten, insbesondere für mobile Geräte, ist ein subtiles Stück UX, das Chris zuvor abgedeckt hat. Geoff deckte einen neueren Ansatz ab, der die Immobilie der Animationszeit verwendet. Hier ist ein anderer Weg.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Nordhold: Fusionssystem, erklärt
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHPStorm Mac-Version

PHPStorm Mac-Version

Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool