Change css colors based on body class (dark mode)

Viewed 1269

I have <body class="dark"> and <body class="light">

I'm trying to edit css colors based on body class. Is there a better approach than this:

body.light .card {
  color: #292b2c;
  background-color: #CCC;
}

body.dark .card {
  color: #f7f7f7;
  background-color: #444;
}

body.light .jumbotron {
  color: #292b2c;
  background-color: #CCC;
}

body.dark .jumbotron {
  color: #f7f7f7;
  background-color: #444;
}

3 Answers

You can use CSS Variables, so you will only need to set the property once

:root {
  --darkColor: #f7f7f7;
  --darkBackground: #444;
  --lightColor: #292b2c;
  --lightBackground: #ccc;
}

body.light .card,
body.light .jumbotron {
  color: var(--lightColor);
  background-color: var(--lightBackground);
}

body.dark .card,
body.dark .jumbotron {
  color: var(--darkColor);
  background-color: var(--darkBackground);
}

Depending on the support you'll need to give, you can mix CSS Variables with @media (prefers-color-scheme: dark)

:root {
  --darkColor: #f7f7f7;
  --darkBackground: #444;
  --lightColor: #292b2c;
  --lightBackground: #ccc;
}

.card,
.jumbotron {
  color: var(--lightColor);
  background-color: var(--lightBackground);
}

@media (prefers-color-scheme: dark) {
  .card,
  .jumbotron {
    color: var(--darkColor);
    background-color: var(--darkBackground);
  }
}

If it look like your example (same rules on different classes) just use comma to separate classes:

body.light .jumbotron,
body.light .card {
  color: #292b2c;
  background-color: #CCC;
}

body.dark .jumbotron,
body.dark .card {
  color: #f7f7f7;
  background-color: #444;
}

If it more complex then this example, consider using framework: Sass .scss: Nesting and multiple classes?

Related