Styling von Web Components

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Nolan Lawson hat ein kleines emoji-picker-element, das ist außerordentlich praktisch und unglaublich einfach zu bedienen. Aber da Sie es wahrscheinlich innerhalb Ihrer eigenen Anwendung verwenden würden, sollte es gestaltbar sein, damit es sich überall gut einfügen lässt. Wie man das ermöglicht, ist nicht gerade offensichtlich

Was mir jedoch nicht klar war, war, wie man es Benutzern ermöglichen kann, es zu gestalten. Was, wenn sie eine andere Hintergrundfarbe wünschen? Was, wenn sie möchten, dass die Emojis größer sind? Was, wenn sie eine andere Schriftart für das Eingabefeld wünschen?

Nolan listet vier Möglichkeiten auf (ich werde sie ein wenig umbenennen, um sie besser zu verstehen).

  1. CSS Custom Properties: Gestalten Sie Dinge wie background: var(--background, white);. Custom Properties durchdringen den Shadow DOM, sodass Sie im Wesentlichen Styling-Hooks hinzufügen.
  2. Vorgefertigte Varianten: Sie können dem benutzerdefinierten Element ein class-Attribut hinzufügen, das dank der Pseudo-Selektoren innerhalb des CSS im Shadow DOM leicht zugänglich ist, wie :host(.dark) { background: black; }.
  3. Shadow-Teile: Sie fügen Attribute zu Dingen hinzu, die gestaltbar sein sollen, wie <span part="foo">, dann kann CSS von außen über custom-component::part(foo) { } darauf zugreifen.
  4. Benutzererzwungen: Trotz der Nichts-rein-Nichts-raus-Philosophie des Shadow DOM können Sie immer auf element.shadowRoot zugreifen und ein <style> einfügen, so dass es immer eine Möglichkeit gibt, Stile einzubringen.

Es ist wahrscheinlich erwähnenswert, dass der DOM, den Sie per slot platzieren, wie üblich von „externem“ CSS gestaltet werden kann. style-able from “outside” CSS.

Das ist ein wirklich seltsames Problem. Ich mag den Shadow DOM, weil er das ist, was wir auf der Webplattform den gekapselten Stilen am nächsten kommt, was definitiv eine gute Idee ist. Aber mir gefallen keine dieser Styling-Lösungen. Sie zwingen mich alle dazu, darüber nachzudenken, welche Art von Styling-API ich anbieten möchte und sie zu dokumentieren, während sie keine bestimmte Konsistenz über Komponenten hinweg fördern.

Für mich ist der DOM bereits eine Styling-API. Ich mag den gekapselten Schutz, aber es sollte eine einfache Möglichkeit geben, dort hineinzugreifen und Dinge zu gestalten, wenn ich es möchte. Es scheint, als gäbe es eine sehr einfache CSS-einzige Möglichkeit, hineinzugreifen und dennoch den Kaskadeneffekt usw. zu nutzen. Vielleicht reicht der mit Bindestrichen getrennte benutzerdefinierte Elementname aus? my-custom-elemement li { }. Oder vielleicht ist es expliziter, wie @shadow my-custom-element li { }. Ich denke einfach, es sollte einfacher sein. Constructable Stylesheets scheinen auch keinen Schritt in Richtung einer Vereinfachung zu machen.

Als ich das letzte Mal über das Styling von Web Components nachgedacht habe, habe ich nur versucht herauszufinden, wie es überhaupt funktioniert, und nicht, wie man Styling-Optionen für Verbraucher der Komponente bereitstellt.

Kommt das im täglichen Arbeitsablauf tatsächlich als Problem auf?

Ich sehe in diesem Thread (noch) keine besonders guten Optionen für die Styling-Herangehensweise. Wenn ich Dave wäre, würde ich mich vielleicht nur dafür entscheiden, nichts zu tun. Bieten Sie minimales Styling an, und wenn Leute es gestalten wollen, können sie es tun, wie sie wollen, aus ihrer Kopie der Komponente. Oder sie können die Stile „erzwingen“, was bedeutet, dass Sie die volle Freiheit haben.