List CSS custom properties (CSS Variables)

后端 未结 2 1684
醉酒成梦
醉酒成梦 2021-01-02 19:20

I\'ve set some CSS custom properties in my stylesheet:

:root {
    --bc: #fff;
    --bc-primary: #eee;
    --bc-secondary: #ffffd;
}

I can re

相关标签:
2条回答
  • 2021-01-02 19:36

    Based on LGSon's answer here is something similar but using map, filter, and flat to make it easier to read line by line.

    const variables = [].slice.call(document.styleSheets)
        .map(styleSheet => [].slice.call(styleSheet.cssRules))
        .flat()
        .filter(cssRule => cssRule.selectorText === ':root')
        .map(cssRule => cssRule.cssText.split('{')[1].split('}')[0].trim().split(';'))
        .flat()
        .filter(text => text !== "")
        .map(text => text.split(':'))
        .map(parts => ({key: parts[0].trim(), value: parts[1].trim() }))
    ;
    
    console.log(variables);
    :root {
        --foo: #fff;
        --bar: #aaa
    }

    0 讨论(0)
  • 2021-01-02 19:53

    One possible solution would be to parse the document.styleSheets, and then split the rules into properties/values

    var allCSS = [].slice.call(document.styleSheets)
      .reduce(function(prev, styleSheet) {
        if (styleSheet.cssRules) {
          return prev + [].slice.call(styleSheet.cssRules)
            .reduce(function(prev, cssRule) {        
              if (cssRule.selectorText == ':root') {
                var css = cssRule.cssText.split('{');
                css = css[1].replace('}','').split(';');
                for (var i = 0; i < css.length; i++) {
                  var prop = css[i].split(':');
                  if (prop.length == 2 && prop[0].indexOf('--') == 1) {
                    console.log('Property name: ', prop[0]);
                    console.log('Property value:', prop[1]);
                  }              
                }
              }
            }, '');
        }
      }, '');
    :root {
        --bc: #fff;
        --bc-primary: #eee;
        --bc-secondary: #ffffd;
    }

    0 讨论(0)
提交回复
热议问题