In dieser Anleitung zeige ich dir, wie du in Webflow einen Theme Toggle baust, der zwischen Auto, Light und Dark wechseln kann. Das Setup ist leichtgewichtig, arbeitet über Body-Klassen (u-theme-light, u-theme-dark), ist sauber mit Webflow Variables verknüpfbar und bleibt stabil, wenn du den Code global über die Project Settings einbindest.
.theme-active)Lege dir zwei Klassen an, die später vom Script auf den body gesetzt werden:
u-theme-lightu-theme-darkDiese Klassen verknüpfst du mit deinen Webflow Variables (Light und Dark), damit beim Umschalten wirklich dein komplettes Farbsystem wechselt.
Praktisch heißt das:
body.u-theme-light gesetzt istbody.u-theme-dark gesetzt istIm Navigator:
themetheme_toggle (Auto)theme_toggle (Light)theme_toggle (Dark)Elementtyp ist egal (Div/Link/Button) – Hauptsache klickbar.
Bei allen drei Buttons:
theme-role = togglePro Button zusätzlich:
theme-label = autotheme-label = lighttheme-label = darkDen Code am besten global einfügen über:
Project Settings → Custom Code → Head Code
So wird das Script zuverlässig geladen. Wenn du es stattdessen als Code Block/Embed direkt auf einer Seite einfügst, kann es je nach Lade-Reihenfolge dazu kommen, dass die Toggle-Elemente noch nicht verfügbar sind und das Umschalten nicht sauber funktioniert.
<script>
document.addEventListener("DOMContentLoaded", () => {
const darkThemeMq = window.matchMedia("(prefers-color-scheme: dark)");
function applyTheme(theme) {
const body = document.body;
body.classList.remove("u-theme-dark", "u-theme-light");
if (theme === "dark") body.classList.add("u-theme-dark");
else if (theme === "light") body.classList.add("u-theme-light");
else body.classList.add(darkThemeMq.matches ? "u-theme-dark" : "u-theme-light");
}
function setTheme() {
document.querySelectorAll('[theme-role="toggle"]').forEach(el => el.classList.remove("theme-active"));
const savedTheme = localStorage.getItem("theme");
if (!savedTheme) {
document.querySelector('[theme-label="auto"]')?.classList.add("theme-active");
applyTheme("auto");
} else {
document.querySelector(`[theme-label="${savedTheme}"]`)?.classList.add("theme-active");
applyTheme(savedTheme);
}
}
document.querySelectorAll('[theme-role="toggle"]').forEach(button => {
button.addEventListener("click", function () {
const selectedTheme = this.getAttribute("theme-label");
if (selectedTheme === "auto") localStorage.removeItem("theme");
else localStorage.setItem("theme", selectedTheme);
setTheme();
});
});
darkThemeMq.addEventListener("change", () => {
if (!localStorage.getItem("theme")) setTheme();
});
setTheme();
});
</script>