Heim Web-Frontend CSS-Tutorial Umschalten des dunklen Modus in HTML-Webkomponenten

Umschalten des dunklen Modus in HTML-Webkomponenten

Oct 23, 2024 am 06:14 AM

Als ich meinen digitalen Garten entwarf, wusste ich, dass ich einen niedlichen Dunkelmodus-Schalter haben wollte. Nachdem ich meine SVG-Datei gezeichnet hatte, begann ich mit dem Erstellen einer Webkomponente, die dieselben Funktionen hatte wie mein Dunkelmodus-Schalter in React. Dazu gehört alles, was ich bei der Prüfung der Barrierefreiheit meiner Website gelernt habe.

Zusätzlich zum Ändern des Themas muss das Umschalten die vom Benutzer bevorzugte Farbschemaauswahl berücksichtigen und die Präferenz des Benutzers über alle Neuladevorgänge hinweg beibehalten. Für die Barrierefreiheit muss die Ansage des Bildschirmlesers des Schalters sinnvoll sein (z. B. „Dunkelmodus-Schalter ein“). Da ich anstelle eines Kontrollkästchens mit Text eine SVG-Datei anzeigen möchte, muss ich den Fokus- und Hover-Stil sowie eine Beschriftung hinzufügen, die beim Hover angezeigt wird.

Webkomponente umschalten

Zuerst benötige ich eine Toggle-Klasse, die ein HTML-Element erstellt. Mithilfe der API für benutzerdefinierte Elemente definiere ich mit dieser Klasse.

Mit dem Konstruktor der Klasse habe ich das innerHTML von zu einem

Dark Mode Toggle in HTML Web Components

Sobald der HTML-Code vorhanden ist, füge ich der Klasse eine connectedCallback-Funktion hinzu. Dieser Teil der API für benutzerdefinierte Elemente definiert Funktionen zur Verwendung innerhalb der Komponente und führt Code aus, wenn die Komponente in das DOM eingefügt wird.

// /components/toggle.js

class Toggle extends HTMLElement {
  constructor() {
    super();
    this.innerHTML = `
      <label title="dark mode toggle">
        <input type="checkbox" id="theme-toggle" class="theme-switch" />
        <svg id="daisy">{SVG code removed for brevity}</svg>
      </label>
    `
    this.setAttribute("class", "toggle-component");
  }

  connectedCallback() {
    function switchTheme(e) {
      if (e.target.checked) {
        setTheme('dark');
        return;
      }

      setTheme('light');   
    };

    function setTheme(themeName) {
      localStorage.setItem('theme', themeName);
      document.documentElement.setAttribute('data-theme', themeName);
    };

    function setCheckBox(toggleSwitch, theme) {
      toggleSwitch.checked = theme === 'dark' ? true : false;
    }

    function keepTheme() {
      const toggleSwitch = document.querySelector('#theme-toggle');
      toggleSwitch.addEventListener('change', switchTheme, false);
      const theme = localStorage.getItem('theme');
      if (theme) {
        setTheme(theme);
        setCheckBox(toggleSwitch, theme);
        return;
      };

      const prefersLightTheme = window.matchMedia('(prefers-color-scheme: light)');
      if (prefersLightTheme.matches) {
        setTheme('light');
        return;
      };

      setTheme('dark');
      setCheckBox(toggleSwitch, 'dark');
    };

    document.addEventListener("DOMContentLoaded", keepTheme);    
  }
}

customElements.define("toggle-component", Toggle);
Nach dem Login kopieren
Nach dem Login kopieren

Weil Wird in das DOM eingefügt, bevor die Seite geladen wird, fügt der einzige Code, der sofort ausgeführt wird, einen Ereignis-Listener hinzu. Der Event-Listener ruft keepTheme auf, sobald die Seite geladen wurde. Zunächst fügt keepTheme einen Ereignis-Listener zum hinzu. das switchTheme aufruft, wenn ein Benutzer damit interagiert. switchTheme übergibt „dark“ an setTheme, wenn das Kontrollkästchen aktiviert ist, und „light“, wenn dies nicht der Fall ist. Die an setTheme übergebene Zeichenfolge wird als CSS-Design festgelegt und in localStorage gespeichert, das auch nach erneuten Ladevorgängen bestehen bleibt.

Der Rest von keepTheme widmet sich der Auswahl des richtigen Themes beim Laden. Zunächst prüft es localStorage, um zu sehen, ob die Präferenz des Benutzers bereits festgelegt ist. Als nächstes wird geprüft, ob Prefers-Color-Schema auf „Light“ eingestellt ist. Schließlich ist der Dunkelmodus standardmäßig aktiviert. Für den dunklen und hellen Modus rufe ich setTheme auf. Für den Dunkelmodus rufe ich auch setCheckbox auf. Das Kontrollkästchen wird in einem nicht aktivierten Zustand aktiviert. Ein Screenreader gibt den „Dunkelmodus“ bekannt und gibt an, ob das Kontrollkästchen aktiviert ist. Um eine Ankündigung wie „Dunkelmodus umschalten aktiviert“ oder „Dunkelmodus umschalten ein“ zu erhalten, muss ich das Kontrollkästchen programmgesteuert aktivieren, wenn ich das Design beim Laden auf „Dunkel“ setze.

Dark Mode Toggle in HTML Web Components

Dark Mode Toggle in HTML Web Components

Styling umschalten

Ich habe mich für ein recht einfaches Design entschieden, damit ich meinen SVG-Code direkt in die Webkomponente einfügen und die Füllfarbe programmgesteuert ändern kann. Auf diese Weise passt die Hintergrundfarbe des Gänseblümchens immer zum Thema. Als nächstes verwende ich opacity: 0; um das Kontrollkästchen auszublenden und in der Mitte des Bildes zu positionieren. Zum Schluss füge ich die Hover- und Focus-Stile hinzu.

Dark Mode Toggle in HTML Web Components

// /components/toggle.js

class Toggle extends HTMLElement {
  constructor() {
    super();
    this.innerHTML = `
      <label title="dark mode toggle">
        <input type="checkbox" id="theme-toggle" class="theme-switch" />
        <svg id="daisy">{SVG code removed for brevity}</svg>
      </label>
    `
    this.setAttribute("class", "toggle-component");
  }

  connectedCallback() {
    function switchTheme(e) {
      if (e.target.checked) {
        setTheme('dark');
        return;
      }

      setTheme('light');   
    };

    function setTheme(themeName) {
      localStorage.setItem('theme', themeName);
      document.documentElement.setAttribute('data-theme', themeName);
    };

    function setCheckBox(toggleSwitch, theme) {
      toggleSwitch.checked = theme === 'dark' ? true : false;
    }

    function keepTheme() {
      const toggleSwitch = document.querySelector('#theme-toggle');
      toggleSwitch.addEventListener('change', switchTheme, false);
      const theme = localStorage.getItem('theme');
      if (theme) {
        setTheme(theme);
        setCheckBox(toggleSwitch, theme);
        return;
      };

      const prefersLightTheme = window.matchMedia('(prefers-color-scheme: light)');
      if (prefersLightTheme.matches) {
        setTheme('light');
        return;
      };

      setTheme('dark');
      setCheckBox(toggleSwitch, 'dark');
    };

    document.addEventListener("DOMContentLoaded", keepTheme);    
  }
}

customElements.define("toggle-component", Toggle);
Nach dem Login kopieren
Nach dem Login kopieren

Verwenden der Toggle-Webkomponente

Alles, was ich tun muss, ist, mein Stylesheet und mein Komponentenskript in die -Datei zu importieren. einer HTML-Seite. Dann kann ich irgendwo auf der Seite.

/* /styles/styles.css */

[data-theme="light"] {
  --toggle-background: #242D54;
}

[data-theme="dark"] {
  --toggle-background: #282e53;
}

#daisy path {
  fill: var(--toggle-background);
}

.theme-switch {
  position: relative;
  bottom: 30px;
  left: 55px;
  width: 1em;
  height: 1em;
  opacity: 0;
}

.theme-switch:focus + #daisy path,
.theme-switch:hover + #daisy path {
  fill: white;
}

.theme-switch:focus + #daisy {
  outline: 3px solid white;
  outline-offset: 5px;
}
Nach dem Login kopieren

Dark Mode Toggle in HTML Web Components

Dark Mode Toggle in HTML Web Components

Abschluss

Es hat mir Spaß gemacht, dass meine Dunkelmodus-Umschaltung in einer Webkomponente genauso gut funktioniert wie in React. Sie können dies live in meinem digitalen Garten und den vollständigen Code im GitHub-Repo sehen.

Das obige ist der detaillierte Inhalt vonUmschalten des dunklen Modus in HTML-Webkomponenten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

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

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1665
14
PHP-Tutorial
1270
29
C#-Tutorial
1249
24
Ein Beweis für das Konzept, um Sass schneller zu machen Ein Beweis für das Konzept, um Sass schneller zu machen Apr 16, 2025 am 10:38 AM

Zu Beginn eines neuen Projekts erfolgt die SASS -Zusammenstellung im Blinzeln eines Auges. Dies fühlt sich gut an, besonders wenn es mit Browsersync kombiniert ist, das nachlädt

Ein Vergleich statischer Formanbieter Ein Vergleich statischer Formanbieter Apr 16, 2025 am 11:20 AM

Versuchen wir, hier einen Begriff zu prägen: "Statischer Formanbieter". Sie bringen Ihre HTML

Wöchentliche Plattformnachrichten: HTML -Ladeattribut, die Haupt -ARIA -Spezifikationen und Wechsel von Iframe zu Shadow Dom Wöchentliche Plattformnachrichten: HTML -Ladeattribut, die Haupt -ARIA -Spezifikationen und Wechsel von Iframe zu Shadow Dom Apr 17, 2025 am 10:55 AM

In der Zusammenfassung der Plattformnachrichten in dieser Woche stellt Chrome ein neues Attribut für das Laden, Zugänglichkeitspezifikationen für Webentwickler und die BBC -Bewegungen ein

Der Deal mit dem Abschnittselement Der Deal mit dem Abschnittselement Apr 12, 2025 am 11:39 AM

Zwei Artikel veröffentlichten genau den selben Tag:

Einige praktisch mit dem HTML-Dialogelement Einige praktisch mit dem HTML-Dialogelement Apr 16, 2025 am 11:33 AM

Ich schaue mir das HTML -Element zum ersten Mal an. Ich habe es für eine Weile dessen bewusst, aber Haven &#039; Es wurde es noch nicht für einen Dreh genommen. Es hat einige ziemlich cool und

Wie wir Google -Schriftarten getaggt und Goofonts.com erstellt haben Wie wir Google -Schriftarten getaggt und Goofonts.com erstellt haben Apr 12, 2025 pm 12:02 PM

Goofonts ist ein Nebenprojekt, das von einer Entwicklerin und einem Designer-Ehemann signiert wurde, beide große Fans der Typografie. Wir haben Google markiert

Multi-Daumen-Schieberegler: Allgemeiner Fall Multi-Daumen-Schieberegler: Allgemeiner Fall Apr 12, 2025 am 10:52 AM

In dem ersten Teil dieser zweiteiligen Serie werden beschrieben, wie wir einen Zwei-Daumen-Schieberegler erhalten können. Jetzt sehen wir uns einen allgemeinen Multi-Thumb-Fall an, aber mit einem anderen und

Wohin sollte 'Podcast' -Link abonnieren? Wohin sollte 'Podcast' -Link abonnieren? Apr 16, 2025 pm 12:04 PM

Für eine Weile war iTunes der große Hund im Podcasting. Wenn Sie also "Abonnieren Sie Podcast" verlinkt haben, um zu mögen:

See all articles