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?










7















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?










share|improve this question
























  • 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















7















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?










share|improve this question
























  • 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













7












7








7


1






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?










share|improve this question
















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 3 mins ago









kukkuz

29.5k62870




29.5k62870










asked 1 hour ago









cronokleecronoklee

3,31153665




3,31153665












  • 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

















  • 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
















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












2 Answers
2






active

oldest

votes


















3














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!








share|improve this answer

























  • 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



















2














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.






share|improve this answer























    Your Answer






    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
    );



    );













    draft saved

    draft discarded


















    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









    3














    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!








    share|improve this answer

























    • 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
















    3














    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!








    share|improve this answer

























    • 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














    3












    3








    3







    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!








    share|improve this answer















    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!






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited 12 mins ago

























    answered 1 hour ago









    BoltClockBoltClock

    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 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

















    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














    2














    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.






    share|improve this answer



























      2














      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.






      share|improve this answer

























        2












        2








        2







        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.






        share|improve this answer













        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.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 1 hour ago









        StyxStyx

        4,66562737




        4,66562737



























            draft saved

            draft discarded
















































            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.




            draft saved


            draft discarded














            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





















































            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







            Popular posts from this blog

            Андора Зьмест Гісторыя | Палітыка | Адміністрацыйны падзел | Геаграфія | Эканоміка | Дэмаграфія | Крыніцы | Вонкавыя спасылкі | Навігацыйнае мэню"CIA World Factbook entry: Andorra"."Andorra 2008, Departament d'estadística d'Andorra"Андорарр

            Інфармацыя пра «Том Ўэйтс» Асноўныя зьвесткіАбарона старонкіГісторыя рэдагаваньняўУласьцівасьці старонкіНавігацыйнае мэню