Can I add a classname to CSS variable? The Next CEO of Stack OverflowAdd table row in jQuerySet cellpadding and cellspacing in CSS?Is there a CSS parent selector?When to use margin vs padding in CSSChange an HTML5 input's placeholder color with CSSHow can I transition height: 0; to height: auto; using CSS?How do CSS triangles work?How do I vertically center text with CSS?Sass Variable in CSS calc() functionIs it possible to apply CSS to half of a character?
0-rank tensor vs vector in 1D
How to edit “Name” property in GCI output?
Calculator final project in Python
Would a grinding machine be a simple and workable propulsion system for an interplanetary spacecraft?
Find non-case sensitive string in a mixed list of elements?
What does "Its cash flow is deeply negative" mean?
Why doesn't UK go for the same deal Japan has with EU to resolve Brexit?
Help understanding this unsettling image of Titan, Epimetheus, and Saturn's rings?
Make solar eclipses exceedingly rare, but still have new moons
The exact meaning of 'Mom made me a sandwich'
Proper way to express "He disappeared them"
How to write a definition with variants?
Prepend last line of stdin to entire stdin
Method for adding error messages to a dictionary given a key
Recycling old answers
using pressure sensor with 0-10v output for 0-10bar using arduino but pressure value won't cross 4bar. so is a voltage divider required in this case?
Can MTA send mail via a relay without being told so?
Example of a Mathematician/Physicist whose Other Publications during their PhD eclipsed their PhD Thesis
Does increasing your ability score affect your main stat?
Would a completely good Muggle be able to use a wand?
Is it possible to replace duplicates of a character with one character using tr
Can I add a classname to CSS variable?
What is meant by "large scale tonal organization?"
How to delete every two lines after 3rd lines in a file contains very large number of lines?
Can I add a classname to CSS variable?
The Next CEO of Stack OverflowAdd table row in jQuerySet cellpadding and cellspacing in CSS?Is there a CSS parent selector?When to use margin vs padding in CSSChange an HTML5 input's placeholder color with CSSHow can I transition height: 0; to height: auto; using CSS?How do CSS triangles work?How do I vertically center text with CSS?Sass Variable in CSS calc() functionIs it possible to apply CSS to half of a character?
Is it possible to add a classname to a CSS variable or is there some other way to set it up so that I don't have to manipulate each individual variable directly via javascript? I'd like to keep all my styles in CSS and simply turn on relevant classes with JS. For example, If something like this was possible in CSS:
:root.white --bgcol:#FFF; --col:#000;
:root.black --bgcol:#000; --col:#FFF;
Then I could then just toggle the .black
or .white
class from javascript to trigger all vars to change. What's the best approach for this type of setup?
javascript css css3 css-variables
|
show 2 more comments
Is it possible to add a classname to a CSS variable or is there some other way to set it up so that I don't have to manipulate each individual variable directly via javascript? I'd like to keep all my styles in CSS and simply turn on relevant classes with JS. For example, If something like this was possible in CSS:
:root.white --bgcol:#FFF; --col:#000;
:root.black --bgcol:#000; --col:#FFF;
Then I could then just toggle the .black
or .white
class from javascript to trigger all vars to change. What's the best approach for this type of setup?
javascript css css3 css-variables
apply this to thebody
instead of the root element and your done. CSS variable doesn't need to be defined in root
– Temani Afif
1 hour ago
appy tobody
or some wrappping div instead of:root
...
– kukkuz
1 hour ago
The convention has always been to define global custom properties in :root, even if nobody knows or has ever questioned why. Deviating from convention presents no benefits whatsoever.
– BoltClock♦
1 hour ago
@BoltClock true, but in this case where we need to consider class switching better target body or html where it's easy to manipulate with JS.
– Temani Afif
1 hour ago
3
@Temani Afif: Not understanding :root is not a reason to avoid using it or to break convention in ways that could potentially break stylesheets (specificity, inheritance, etc). It is a reason to learn about it so you can make the most out of it.
– BoltClock♦
47 mins ago
|
show 2 more comments
Is it possible to add a classname to a CSS variable or is there some other way to set it up so that I don't have to manipulate each individual variable directly via javascript? I'd like to keep all my styles in CSS and simply turn on relevant classes with JS. For example, If something like this was possible in CSS:
:root.white --bgcol:#FFF; --col:#000;
:root.black --bgcol:#000; --col:#FFF;
Then I could then just toggle the .black
or .white
class from javascript to trigger all vars to change. What's the best approach for this type of setup?
javascript css css3 css-variables
Is it possible to add a classname to a CSS variable or is there some other way to set it up so that I don't have to manipulate each individual variable directly via javascript? I'd like to keep all my styles in CSS and simply turn on relevant classes with JS. For example, If something like this was possible in CSS:
:root.white --bgcol:#FFF; --col:#000;
:root.black --bgcol:#000; --col:#FFF;
Then I could then just toggle the .black
or .white
class from javascript to trigger all vars to change. What's the best approach for this type of setup?
javascript css css3 css-variables
javascript css css3 css-variables
edited 3 mins ago
kukkuz
29.5k62870
29.5k62870
asked 1 hour ago
cronokleecronoklee
3,31153665
3,31153665
apply this to thebody
instead of the root element and your done. CSS variable doesn't need to be defined in root
– Temani Afif
1 hour ago
appy tobody
or some wrappping div instead of:root
...
– kukkuz
1 hour ago
The convention has always been to define global custom properties in :root, even if nobody knows or has ever questioned why. Deviating from convention presents no benefits whatsoever.
– BoltClock♦
1 hour ago
@BoltClock true, but in this case where we need to consider class switching better target body or html where it's easy to manipulate with JS.
– Temani Afif
1 hour ago
3
@Temani Afif: Not understanding :root is not a reason to avoid using it or to break convention in ways that could potentially break stylesheets (specificity, inheritance, etc). It is a reason to learn about it so you can make the most out of it.
– BoltClock♦
47 mins ago
|
show 2 more comments
apply this to thebody
instead of the root element and your done. CSS variable doesn't need to be defined in root
– Temani Afif
1 hour ago
appy tobody
or some wrappping div instead of:root
...
– kukkuz
1 hour ago
The convention has always been to define global custom properties in :root, even if nobody knows or has ever questioned why. Deviating from convention presents no benefits whatsoever.
– BoltClock♦
1 hour ago
@BoltClock true, but in this case where we need to consider class switching better target body or html where it's easy to manipulate with JS.
– Temani Afif
1 hour ago
3
@Temani Afif: Not understanding :root is not a reason to avoid using it or to break convention in ways that could potentially break stylesheets (specificity, inheritance, etc). It is a reason to learn about it so you can make the most out of it.
– BoltClock♦
47 mins ago
apply this to the
body
instead of the root element and your done. CSS variable doesn't need to be defined in root– Temani Afif
1 hour ago
apply this to the
body
instead of the root element and your done. CSS variable doesn't need to be defined in root– Temani Afif
1 hour ago
appy to
body
or some wrappping div instead of :root
...– kukkuz
1 hour ago
appy to
body
or some wrappping div instead of :root
...– kukkuz
1 hour ago
The convention has always been to define global custom properties in :root, even if nobody knows or has ever questioned why. Deviating from convention presents no benefits whatsoever.
– BoltClock♦
1 hour ago
The convention has always been to define global custom properties in :root, even if nobody knows or has ever questioned why. Deviating from convention presents no benefits whatsoever.
– BoltClock♦
1 hour ago
@BoltClock true, but in this case where we need to consider class switching better target body or html where it's easy to manipulate with JS.
– Temani Afif
1 hour ago
@BoltClock true, but in this case where we need to consider class switching better target body or html where it's easy to manipulate with JS.
– Temani Afif
1 hour ago
3
3
@Temani Afif: Not understanding :root is not a reason to avoid using it or to break convention in ways that could potentially break stylesheets (specificity, inheritance, etc). It is a reason to learn about it so you can make the most out of it.
– BoltClock♦
47 mins ago
@Temani Afif: Not understanding :root is not a reason to avoid using it or to break convention in ways that could potentially break stylesheets (specificity, inheritance, etc). It is a reason to learn about it so you can make the most out of it.
– BoltClock♦
47 mins ago
|
show 2 more comments
2 Answers
2
active
oldest
votes
That's frankly the best (as in most idiomatic) approach — the use of class names, if not altogether separate stylesheets (as has been tradition for many, many years), to theme entire layouts via custom properties. It's the most "fundamentally CSS" approach with JavaScript merely being the glue that makes the theme switching work. You really can't do much better than that.
For those unaware what :root
means and wondering where exactly the class names are being applied, it's the html
element (the parent of body
). So there is nothing special going on here — you're simply switching class names on the html
element. It just happens that global custom properties are conventionally defined for the document root element since it's at the top level of the inheritance chain.
If you have any theme-agnostic custom properties, as well as style properties (i.e. not custom properties) that apply to the root element, keep them in their own unqualified :root
rule, separate from your themed custom properties, so they won't be affected by theme switching. Here's an example:
const root = document.documentElement;
// Default theme - should assign declaratively in markup, not JS
// For a classless default theme, move its custom properties to unqualified :root
// Again, keep it separate from the other :root rule that contains non-theme props
// Remember, the cascade is your friend, not the enemy
root.className = 'white';
document.querySelector('button').addEventListener('click', function()
root.className = root.className == 'black' ? 'white' : 'black';
);
:root
--spacing: 1rem;
color: var(--col);
background-color: var(--bgcol);
:root.white
--bgcol: #FFF;
--col: #000;
:root.black
--bgcol: #000;
--col: #FFF;
p
margin: var(--spacing);
border: thin dashed;
padding: var(--spacing);
<button>Switch themes</button>
<p>Hello world!
Very cool and exactly what I wanted. It's funny I was so close with my hypothetical. I had no idea:root
was just thehtml
tag. Thanks!
– cronoklee
23 mins ago
add a comment |
Using :root
selector is identical to using html
, except its specifity is higher, thus there is no issues in using this approach.
For example:
:root
--bg: red;
:root.blue
--bg: blue;
// ...
div
background: var(--bg);
Later, you should just change html
's class and variables will change.
You can see an example in this fiddle.
add a comment |
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55439391%2fcan-i-add-a-classname-to-css-variable%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
That's frankly the best (as in most idiomatic) approach — the use of class names, if not altogether separate stylesheets (as has been tradition for many, many years), to theme entire layouts via custom properties. It's the most "fundamentally CSS" approach with JavaScript merely being the glue that makes the theme switching work. You really can't do much better than that.
For those unaware what :root
means and wondering where exactly the class names are being applied, it's the html
element (the parent of body
). So there is nothing special going on here — you're simply switching class names on the html
element. It just happens that global custom properties are conventionally defined for the document root element since it's at the top level of the inheritance chain.
If you have any theme-agnostic custom properties, as well as style properties (i.e. not custom properties) that apply to the root element, keep them in their own unqualified :root
rule, separate from your themed custom properties, so they won't be affected by theme switching. Here's an example:
const root = document.documentElement;
// Default theme - should assign declaratively in markup, not JS
// For a classless default theme, move its custom properties to unqualified :root
// Again, keep it separate from the other :root rule that contains non-theme props
// Remember, the cascade is your friend, not the enemy
root.className = 'white';
document.querySelector('button').addEventListener('click', function()
root.className = root.className == 'black' ? 'white' : 'black';
);
:root
--spacing: 1rem;
color: var(--col);
background-color: var(--bgcol);
:root.white
--bgcol: #FFF;
--col: #000;
:root.black
--bgcol: #000;
--col: #FFF;
p
margin: var(--spacing);
border: thin dashed;
padding: var(--spacing);
<button>Switch themes</button>
<p>Hello world!
Very cool and exactly what I wanted. It's funny I was so close with my hypothetical. I had no idea:root
was just thehtml
tag. Thanks!
– cronoklee
23 mins ago
add a comment |
That's frankly the best (as in most idiomatic) approach — the use of class names, if not altogether separate stylesheets (as has been tradition for many, many years), to theme entire layouts via custom properties. It's the most "fundamentally CSS" approach with JavaScript merely being the glue that makes the theme switching work. You really can't do much better than that.
For those unaware what :root
means and wondering where exactly the class names are being applied, it's the html
element (the parent of body
). So there is nothing special going on here — you're simply switching class names on the html
element. It just happens that global custom properties are conventionally defined for the document root element since it's at the top level of the inheritance chain.
If you have any theme-agnostic custom properties, as well as style properties (i.e. not custom properties) that apply to the root element, keep them in their own unqualified :root
rule, separate from your themed custom properties, so they won't be affected by theme switching. Here's an example:
const root = document.documentElement;
// Default theme - should assign declaratively in markup, not JS
// For a classless default theme, move its custom properties to unqualified :root
// Again, keep it separate from the other :root rule that contains non-theme props
// Remember, the cascade is your friend, not the enemy
root.className = 'white';
document.querySelector('button').addEventListener('click', function()
root.className = root.className == 'black' ? 'white' : 'black';
);
:root
--spacing: 1rem;
color: var(--col);
background-color: var(--bgcol);
:root.white
--bgcol: #FFF;
--col: #000;
:root.black
--bgcol: #000;
--col: #FFF;
p
margin: var(--spacing);
border: thin dashed;
padding: var(--spacing);
<button>Switch themes</button>
<p>Hello world!
Very cool and exactly what I wanted. It's funny I was so close with my hypothetical. I had no idea:root
was just thehtml
tag. Thanks!
– cronoklee
23 mins ago
add a comment |
That's frankly the best (as in most idiomatic) approach — the use of class names, if not altogether separate stylesheets (as has been tradition for many, many years), to theme entire layouts via custom properties. It's the most "fundamentally CSS" approach with JavaScript merely being the glue that makes the theme switching work. You really can't do much better than that.
For those unaware what :root
means and wondering where exactly the class names are being applied, it's the html
element (the parent of body
). So there is nothing special going on here — you're simply switching class names on the html
element. It just happens that global custom properties are conventionally defined for the document root element since it's at the top level of the inheritance chain.
If you have any theme-agnostic custom properties, as well as style properties (i.e. not custom properties) that apply to the root element, keep them in their own unqualified :root
rule, separate from your themed custom properties, so they won't be affected by theme switching. Here's an example:
const root = document.documentElement;
// Default theme - should assign declaratively in markup, not JS
// For a classless default theme, move its custom properties to unqualified :root
// Again, keep it separate from the other :root rule that contains non-theme props
// Remember, the cascade is your friend, not the enemy
root.className = 'white';
document.querySelector('button').addEventListener('click', function()
root.className = root.className == 'black' ? 'white' : 'black';
);
:root
--spacing: 1rem;
color: var(--col);
background-color: var(--bgcol);
:root.white
--bgcol: #FFF;
--col: #000;
:root.black
--bgcol: #000;
--col: #FFF;
p
margin: var(--spacing);
border: thin dashed;
padding: var(--spacing);
<button>Switch themes</button>
<p>Hello world!
That's frankly the best (as in most idiomatic) approach — the use of class names, if not altogether separate stylesheets (as has been tradition for many, many years), to theme entire layouts via custom properties. It's the most "fundamentally CSS" approach with JavaScript merely being the glue that makes the theme switching work. You really can't do much better than that.
For those unaware what :root
means and wondering where exactly the class names are being applied, it's the html
element (the parent of body
). So there is nothing special going on here — you're simply switching class names on the html
element. It just happens that global custom properties are conventionally defined for the document root element since it's at the top level of the inheritance chain.
If you have any theme-agnostic custom properties, as well as style properties (i.e. not custom properties) that apply to the root element, keep them in their own unqualified :root
rule, separate from your themed custom properties, so they won't be affected by theme switching. Here's an example:
const root = document.documentElement;
// Default theme - should assign declaratively in markup, not JS
// For a classless default theme, move its custom properties to unqualified :root
// Again, keep it separate from the other :root rule that contains non-theme props
// Remember, the cascade is your friend, not the enemy
root.className = 'white';
document.querySelector('button').addEventListener('click', function()
root.className = root.className == 'black' ? 'white' : 'black';
);
:root
--spacing: 1rem;
color: var(--col);
background-color: var(--bgcol);
:root.white
--bgcol: #FFF;
--col: #000;
:root.black
--bgcol: #000;
--col: #FFF;
p
margin: var(--spacing);
border: thin dashed;
padding: var(--spacing);
<button>Switch themes</button>
<p>Hello world!
const root = document.documentElement;
// Default theme - should assign declaratively in markup, not JS
// For a classless default theme, move its custom properties to unqualified :root
// Again, keep it separate from the other :root rule that contains non-theme props
// Remember, the cascade is your friend, not the enemy
root.className = 'white';
document.querySelector('button').addEventListener('click', function()
root.className = root.className == 'black' ? 'white' : 'black';
);
:root
--spacing: 1rem;
color: var(--col);
background-color: var(--bgcol);
:root.white
--bgcol: #FFF;
--col: #000;
:root.black
--bgcol: #000;
--col: #FFF;
p
margin: var(--spacing);
border: thin dashed;
padding: var(--spacing);
<button>Switch themes</button>
<p>Hello world!
const root = document.documentElement;
// Default theme - should assign declaratively in markup, not JS
// For a classless default theme, move its custom properties to unqualified :root
// Again, keep it separate from the other :root rule that contains non-theme props
// Remember, the cascade is your friend, not the enemy
root.className = 'white';
document.querySelector('button').addEventListener('click', function()
root.className = root.className == 'black' ? 'white' : 'black';
);
:root
--spacing: 1rem;
color: var(--col);
background-color: var(--bgcol);
:root.white
--bgcol: #FFF;
--col: #000;
:root.black
--bgcol: #000;
--col: #FFF;
p
margin: var(--spacing);
border: thin dashed;
padding: var(--spacing);
<button>Switch themes</button>
<p>Hello world!
edited 12 mins ago
answered 1 hour ago
BoltClock♦BoltClock
528k13011701207
528k13011701207
Very cool and exactly what I wanted. It's funny I was so close with my hypothetical. I had no idea:root
was just thehtml
tag. Thanks!
– cronoklee
23 mins ago
add a comment |
Very cool and exactly what I wanted. It's funny I was so close with my hypothetical. I had no idea:root
was just thehtml
tag. Thanks!
– cronoklee
23 mins ago
Very cool and exactly what I wanted. It's funny I was so close with my hypothetical. I had no idea
:root
was just the html
tag. Thanks!– cronoklee
23 mins ago
Very cool and exactly what I wanted. It's funny I was so close with my hypothetical. I had no idea
:root
was just the html
tag. Thanks!– cronoklee
23 mins ago
add a comment |
Using :root
selector is identical to using html
, except its specifity is higher, thus there is no issues in using this approach.
For example:
:root
--bg: red;
:root.blue
--bg: blue;
// ...
div
background: var(--bg);
Later, you should just change html
's class and variables will change.
You can see an example in this fiddle.
add a comment |
Using :root
selector is identical to using html
, except its specifity is higher, thus there is no issues in using this approach.
For example:
:root
--bg: red;
:root.blue
--bg: blue;
// ...
div
background: var(--bg);
Later, you should just change html
's class and variables will change.
You can see an example in this fiddle.
add a comment |
Using :root
selector is identical to using html
, except its specifity is higher, thus there is no issues in using this approach.
For example:
:root
--bg: red;
:root.blue
--bg: blue;
// ...
div
background: var(--bg);
Later, you should just change html
's class and variables will change.
You can see an example in this fiddle.
Using :root
selector is identical to using html
, except its specifity is higher, thus there is no issues in using this approach.
For example:
:root
--bg: red;
:root.blue
--bg: blue;
// ...
div
background: var(--bg);
Later, you should just change html
's class and variables will change.
You can see an example in this fiddle.
answered 1 hour ago
StyxStyx
4,66562737
4,66562737
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55439391%2fcan-i-add-a-classname-to-css-variable%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
apply this to the
body
instead of the root element and your done. CSS variable doesn't need to be defined in root– Temani Afif
1 hour ago
appy to
body
or some wrappping div instead of:root
...– kukkuz
1 hour ago
The convention has always been to define global custom properties in :root, even if nobody knows or has ever questioned why. Deviating from convention presents no benefits whatsoever.
– BoltClock♦
1 hour ago
@BoltClock true, but in this case where we need to consider class switching better target body or html where it's easy to manipulate with JS.
– Temani Afif
1 hour ago
3
@Temani Afif: Not understanding :root is not a reason to avoid using it or to break convention in ways that could potentially break stylesheets (specificity, inheritance, etc). It is a reason to learn about it so you can make the most out of it.
– BoltClock♦
47 mins ago