Eigene Style-Property über externen StyleSheet zuweisen

framework_developer

Neues Mitglied
Ich habe hier ein eigenes Layout-System kreiert.

CSS:
.layout-default {
    position: relative;
    display: grid;
    grid-template-rows: auto 1fr auto;
    grid-template-columns: auto 1fr auto;
    grid-template-areas:
        "top    top    top"
        "left   client right"
        "bottom bottom bottom";
}

.layout-default > *[style*="--align: top"] {
    grid-area: top;
}

.layout-default > *[style*="--align: bottom"] {
    grid-area: bottom;
}

.layout-default > *[style*="--align: left"] {
    grid-area: left;
}

.layout-default > *[style*="--align: right"] {
    grid-area: right;
}

.layout-default > *[style*="--align: client"] {
    grid-area: client;
}

.layout-default > *[style*="--align: none"] {
    position: absolute;
}

Mein Problem ist, dass --align nur innerhalb eines inline-Styles erkannt wird. Aber ich würde gerne auch in einem externen CSS-Stylesheet einem Element ein --align zuordnen können. Das wäre v.a. bezüglich der Media-Queries sinnvoll.
Hat da jemand eine Lösung?
 
Das sieht ja nach einem spannenden Konstrukt aus. :D

Dieser Attribut-Selektor mit der Adressierung von Inline-Styles ([style]) ergibt keinen Sinn, da ein Inline-Style-Attribut auf einem HTML-Element ja bereits erlaubt, beliebige Styles für das Element zu definieren.

Du kannst dir, wie du auf verrückte Weise ja schon machst, CSS (locally scoped) Custom Properties zu nutze machen, zumindest solange der Wert der Variable identisch ist mit dem entsprechenden Wert der CSS-Eigenschaft, die du setzen willst.

Beispiel:

CSS:
.layout-default > * {
    /* Var-Name, Default-Wert */
    grid-area: var(--align, auto);
}

HTML:
<div class="layout-default">
    <header style="--align: top;">Header</header>
</div>

Es gibt natürlich noch schönere Varianten, die Custom Property oder allgemein Styles lokal für ein bestimmtes Element zu setzen, z.B. mit Klassen oder auch data-Attributen. Dadurch kannst du das Ganze dann auch aus einem Stylesheet heraus steuern, wobei du natürlich bei einer solch allgemeinen Herangehensweise trotzdem noch in irgendeiner Form eine Verbindung zwischen HTML und CSS herstellen musst.

Ein Beispiel mit einer Klasse:

CSS:
.layout-default > * {
    /* Var-Name, Default-Wert */
    grid-area: var(--align, auto);
}

.layout-default > .align-top {
    --align: top;
}

HTML:
<div class="layout-default">
    <header class="align-top">Header</header>
</div>

Wichtig: Je nachdem, was du konkret vorhast, ist es auch völlig in Ordnung und vielleicht sogar besser, das Layout einfach hartgecodet im CSS zu definieren und es nicht so flexibel anpassbar zu gestalten.
Den Ansatz, über Custom Properties eine grid-area zuzuweisen, habe ich noch nicht wirklich gesehen, was jetzt aber nicht zwangsläufig heißt, dass es falsch ist.

I.d.R. hat man halt doch ein recht klares Layout, wo feststeht, dass bestimmte Elemente immer an einer bestimmten Stelle auftauchen, bspw. Header, Footer usw..
Allein die Tatsache, dass du einen Media Query brauchst, um das Layout an bestimmte Viewportgrößen anzupassen, hat wenig damit zu tun, ob sich eine Custom Property zur flexiblen Konfiguration anbietet.

Custom Properties werden häufig für unterschiedliche kleinere Variationen von spezifischen Elementen eingesetzt oder dienen einfach als Variable für seitenweite Einstellungen wie Font Sizes, Farben, usw.
Für Layoutzwecke im Großen betrachtet würde ich eher darauf verzichten.

Was meine ich mit Variationen? Zum Beispiel, um ein Gap für ein Grid flexibel konfigurierbar zu machen (also Abstände), oder um Text in einem bestimmten Element anders auszurichten o.ä.

Häufig geschieht das nicht direkt über die Custom Property (wäre auch möglich, aber im HTML etwas umständlich), sondern über sogenannte Modifier-Klassen bzw. Utility-Klassen, wie wir es ja oben schon praktisch hatten.
Modifier-Klassen wären spezifisch auf ein Element bzw. eine bestimmte Klasse ausgerichtet, bspw. die Größe einer .container-Klasse ändern (.container-sm, .container-md, .container-lg), während Utility-Klassen global eingesetzt werden können, aber einen universellen Einsatzzweck haben, beispielsweise die Textausrichtung zu ändern (.text-left, .text-center, .text-right).

Lass uns gerne mehr zu deinem Anwendungsfall wissen, dann kann man besser beurteilen, was die richtige Lösung wäre.
Wie schon gesagt, würde ich bei großen Layoutfragen dazu tendieren, ruhig den Großteil der Styles einfach fest zu definieren.
Du deutest ja mit deinem .default-layout an, dass es noch weitere Layouts gibt, die dann wiederum ihre eigenen spezifischen Styles hätten. Insofern kann das das zentrale Steuerungselement sein, wenn es ums grobe Layout geht. Kleinigkeiten in "Komponenten" können dann z.B. mit Modifier-Klassen bzw. Utility-Klassen angepasst werden.

Schaue dir vielleicht auch nochmal die MDN-Seite zu Custom Properties an: https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Cascading_variables/Using_custom_properties

Im Grunde vereinfachen sie hauptsächlich die Lesbarkeit und Übersichtlichkeit deines CSS, sodass man über das Projekt hinweg konsistent bleibt und z.B. nicht immer eigene Werte nutzt und stattdessen auf vordefinierte Variablen zurückgreifen kann.
Variationen von bestimmten Styles kann man auch so einfach im Stylesheet definieren bzw. dafür wie oben beschrieben bestimmte Selektoren erstellen.
Man kann halt mit den Custom Properties wie in meinem ersten Beispiel verhindern, dass man wie in deinem Code-Beispiel zehnmal grid-area: xyz; schreibt und stattdessen nur die Custom Property ändern muss und einmal grid-area: var(--align); definiert.

Ich hoffe, dass hilft dir soweit ein bisschen.
 
Danke sehr für die Antwort. Mein Ziel war es, ein Delphi (VCL)-ähnliches Layout-System (top, bottom, left, right, client) zu entwickeln.

CSS:
.frame {
    position: relative;
    display: grid;
    grid-template-rows: auto auto auto 1fr auto auto auto; /* top / client / bottom */
    grid-template-columns: auto auto auto 1fr auto auto auto; /* left / client / right */
    grid-template-areas:
        "top        top         top         top         top         top         top"
        "top-2      top-2       top-2       top-2       top-2       top-2       top-2"
        "top-3      top-3       top-3       top-3       top-3       top-3       top-3"
        "left       left-2      left-3      client      right       right-2     right-3"
        "bottom     bottom      bottom      bottom      bottom      bottom      bottom"
        "bottom-2   bottom-2    bottom-2    bottom-2    bottom-2    bottom-2    bottom-2"
        "bottom-3   bottom-3    bottom-3    bottom-3    bottom-3    bottom-3    bottom-3";
}

.frame > * {
    grid-area: var(--align, auto);
}

Jedes direkte Child-Element eines Elements mit der Klasse frame bekommt über --align die grid-area zugewiesen. Die Selektoren über das style-Attribut sind damit hinfällig. Klar kann man nicht alles haben. Ich hätte am liebsten auch, dass ein top-angeordnetes Element unterhalb einem vorherigen top-angeordnetem Element erscheint (ohne dass man auf top-2/top-3 behaaren muss), aber dafür ist das eben CSS-only und wenn man ein top-4 braucht, dann kommt man nicht um ein neues Frame drumherum ohne hardzucoden.
 
Hm, okay.
Du möchtest also ein universelles Grid im Sinne eines Frameworks haben, ähnlich wie damals Bootstrap ein festes Grid hatte, das man für Layouts verwenden konnte.
Das kann man so machen, allerdings wäre ich tendenziell immer ein Fan davon, ein Layout möglichst individuell auf jedes Projekt auszurichten und keine Universallösung über jedes Projekt drüber zu stülpen.
Aber letztendlich steht dir das natürlich frei, wenn es für deine Arbeit vorteilhaft erscheint.
 
Zurück
Oben Unten