【问题标题】:How can I define colors as variables in CSS?如何在 CSS 中将颜色定义为变量?
【发布时间】:2010-12-24 22:54:13
【问题描述】:

我正在处理一个很长的 CSS 文件。我知道客户可能会要求更改配色方案,并且想知道:是否可以将颜色分配给变量,以便我可以更改变量以将新颜色应用于使用它的所有元素?

请注意,我不能使用 PHP 来动态更改 CSS 文件。

【问题讨论】:

标签: css variables colors css-variables


【解决方案1】:

编辑:这个答案不再是最新的。您现在应该使用 CSS 变量。

考虑使用 SCSS。它与 CSS 语法完全兼容,因此有效的 CSS 文件也是有效的 SCSS 文件。这使迁移变得容易,只需更改后缀即可。它有许多增强功能,最有用的是变量和嵌套选择器。

您需要通过预处理器运行它以将其转换为 CSS,然后再将其发送到客户端。

多年来,我一直是一名核心 CSS 开发人员,但自从强迫自己在 SCSS 中做一个项目后,我现在不会使用其他任何东西。

【讨论】:

    【解决方案2】:

    Yeeeaaaahhh....您现在可以在 CSS.....

    中使用 var() 函数

    好消息是您可以使用 JavaScript 访问来更改它,这也将在全局范围内更改...

    但是如何声明它们...

    很简单:

    比如你想给var()赋值一个#ff0000,直接赋值给:root,还要注意--

    :root {
        --red: #ff0000; 
    }
    
    html, body {
        background-color: var(--red); 
    }
    

    好在浏览器支持还不错,也不需要像LESSSASS这样的浏览器编译使用...

    另外,这里有一个简单的 JavaScript 脚本,它将红色值更改为蓝色:

    const rootEl = document.querySelector(':root');
    root.style.setProperty('--red', 'blue');
    

    【讨论】:

    • 感谢浏览器图片。解释为什么我的 IE 用户群看不到我的颜色。
    【解决方案3】:

    你可以试试CSS3 variables:

    body {
      --fontColor: red;
      color: var(--fontColor);
    }
    

    【讨论】:

    【解决方案4】:

    CSS 原生支持 CSS Variables

    示例 CSS 文件

    :root {
        --main-color:#06c;
    }
    
    #foo {
        color: var(--main-color);
    }
    

    有关工作示例,请参阅this JSFiddle(该示例显示小提琴中的一个 CSS 选择器将颜色硬编码为蓝色,另一个 CSS 选择器使用原始和当前语法的 CSS 变量来设置颜色为蓝色)。

    在 JavaScript/客户端操作 CSS 变量

    document.body.style.setProperty('--main-color',"#6c0")
    

    所有现代浏览器都支持

    Firefox 31+Chrome 49+Safari 9.1+Microsoft Edge 15+Opera 36+ 提供对 CSS 变量的原生支持。

    【讨论】:

    • 以防万一其他人读到这篇文章并试图让它在 Safari 中运行 - 对 CSS 的支持似乎已在 2013 年春夏从 Webkit 中删除。bugs.webkit.org/show_bug.cgi?id=114119 lists.webkit.org/pipermail/webkit-dev/2013-April/024476.html 在 Chrome 中仍然有效启用上述标志后。
    • 在 chrome 36 上测试,即使启用了标志也无法正常工作。虽然仍然适用于 firefox
    • 刚刚用 Chrome 版本 49.0.2623.110 m 查了一下,还是不行。
    • 你的操作系统是什么?它对我有用:Mac OS X 上的版本 49.0.2623.110(64 位)
    • 也适用于我的 android 的 Chrome 版本 Android 5.1.0 Chrome 49.0.2623.105
    【解决方案5】:

    没有简单的纯 CSS 解决方案。你可以这样做:

    • 在您的 CSS 文件中查找 background-colorcolor 的所有实例,并为每种唯一颜色创建一个类名。

      .top-header { color: #fff; }
      .content-text { color: #f00; }
      .bg-leftnav { background-color: #fff; }
      .bg-column { background-color: #f00; }
      
    • 接下来浏览您网站上涉及颜色的每个页面,并为颜色和背景颜色添加适当的类。

    • 最后,删除 CSS 中除新创建的颜色类之外的所有颜色引用。

    【讨论】:

    • 但是如果客户决定他们想让所有的红色元素都变成绿色怎么办?您必须更改“红色”类以提供“颜色:绿色”,这会变得混乱且难以维护。
    • @singingwolfboy,我应该更具体地说明类的命名。最容易引用它们所属的元素,以便您将来轻松修改它们。
    • @downvoters,这是一个 CSS ONLY 解决方案。有很多涉及脚本或 CLI 的替代解决方案,这适用于不打算这样做的人
    【解决方案6】:

    恐怕不是 PHP,但 Zope 和 Plone 使用类似于 SASS 的东西称为 DTML 来实现这一点。它在 CMS 中非常有用。

    Upfront Systems 在 Plone 中有一个 good example

    【讨论】:

      【解决方案7】:

      由于支持,请勿使用 css3 变量。

      如果您想要纯 css 解决方案,我会执行以下操作。

      1. 使用具有语义名称的颜色类。

        .bg-primary   { background: #880000; }
        
        .bg-secondary { background: #008800; }
        
        .bg-accent    { background: #F5F5F5; }
        
      2. 结构与皮肤分离(OOCSS)

        /* Instead of */
        
        h1 { 
            font-size: 2rem;
            line-height: 1.5rem;
            color: #8000;
        }
        
        /* use this */
        
        h1 { 
            font-size: 2rem;
            line-height: 1.5rem;
        }
        
        .bg-primary {
            background: #880000;
        }
        
        /* This will allow you to reuse colors in your design */
        
      3. 将这些放在单独的 css 文件中,以便根据需要进行更改。

      【讨论】:

        【解决方案8】:

        人们一直支持我的回答,但与 sassless 的乐趣相比,这是一个糟糕的解决方案,特别是考虑到这些天易于使用的 gui's for both 的数量。如果您有任何意义,请忽略我在下面的所有建议。

        您可以在每个颜色之前在 css 中添加注释,以用作一种变量,您可以使用查找/替换来更改值,所以...

        在css文件的顶部

        /********************* Colour reference chart****************
        *************************** comment ********* colour ******** 
        
        box background colour       bbg              #567890
        box border colour           bb               #abcdef
        box text colour             bt               #123456
        
        */
        

        在 CSS 文件的后面

        .contentBox {background: /*bbg*/#567890; border: 2px solid /*bb*/#abcdef; color:/*bt*/#123456}
        

        然后,例如,更改您在其上进行查找/替换的框文本的配色方案

        /*bt*/#123456
        

        【讨论】:

        • 添加 cmets 在少数情况下不起作用,例如在使用 IE 过滤器时。我不能把 cmets 放在这里 -> filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3f5619', endColorstr='#77842f',GradientType=0 ); /* IE6-9 */
        • 投反对票,因为你是对的,这是一个糟糕的解决方案。
        • 我个人更喜欢你的客户端回答风格而不是服务器端解决方案,所以我做了一些事情来做。这并不令人惊讶,但它可以工作stackoverflow.com/a/44936706/4808079
        • 不接受您的回答。如果您认为它很糟糕,您可以随时删除它。
        • 投反对票,因为使用预处理器构建 CSS 是一个不必要的、可怕的想法。
        【解决方案9】:

        当然可以,多亏了多类的美妙世界,可以做到这一点:

        .red {color:red}
        .blackBack {background-color: black}
        

        但我经常会这样组合它们:

        .highlight {color:red, background-color: black}
        

        我知道语义警察会控制你,但它确实有效。

        【讨论】:

        • 我要补充一点:使用不同且更具语义的名称。如果品牌颜色发生变化,您将重做大量 html 代码。使用 .primary、.secondary、.accent 等类名。
        【解决方案10】:

        如果将 css 文件编写为 xsl 模板,则可以从简单的 xml 文件中读取颜色值。然后使用 xslt 处理器创建 css。

        colors.xml:

        <?xml version="1.0"?>
        <colors>
            <background>#ccc</background>
        </colors>
        

        styles.xsl:

        <?xml version="1.0"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:output method="text" version="1.0" encoding="iso-8859-1"/>
            <xsl:template match="/">body {
            background-color: <xsl:value-of select="/colors/background" />;
        }
        </xsl:template>
        </xsl:stylesheet>
        

        渲染 css 的命令:xsltproc -o styles.css styles.xsl colors.xml

        styles.css:

        body {
            background-color: #ccc;
        }
        

        【讨论】:

          【解决方案11】:

          单独使用 CSS 是不可能的。

          您可以通过 JavaScript 和 LESS 使用 less.js 来实现这一点,这会将 LESS 变量实时呈现到 CSS 中,但它仅用于开发,并为实际使用增加了太多开销。

          最接近 CSS 的方法是使用 attribute substring selector,如下所示:

          [id*="colvar-"] {
              color: #f0c69b;
          }
          

          并将所有要调整的元素的ids 设置为以colvar- 开头的名称,例如colvar-header。然后,当您更改颜色时,所有 ID 样式都会更新。这与仅使用 CSS 所能达到的一样接近。

          【讨论】:

          • 我只使用 CSS,它使用 css 变量 Mozilla-example
          • 如果您的所有用户都在使用 mozilla,那就太好了——祝您好运
          • 也适用于 chrome、safari 和 Opera。
          • pmsl OP 在我的帖子中对高中语法的挑剔是怎么回事?还不错。
          【解决方案12】:

          您可以对选择器进行分组:

          #selector1, #selector2, #selector3 { color: black; }
          

          【讨论】:

            【解决方案13】:

            是的,在不久的将来(我在 2012 年 6 月写这篇文章)你可以定义原生 css 变量,而无需使用 less/sass 等! Webkit 引擎刚刚实现了第一个 css 变量规则,因此 Chrome 和 Safari 的尖端版本已经可以使用它们。请参阅带有现场 css 浏览器演示的 Official Webkit (Chrome/Safari) development log

            希望在接下来的几个月中,我们可以期待浏览器对原生 css 变量的广泛支持。

            【讨论】:

            • @Daniel Make that 2015
            • 嗨。 2020 年了,3% 的浏览器仍然不支持它……IE 很棒,不是吗?
            【解决方案14】:

            dicejs.com (formally cssobjs) 是 SASS 的客户端版本。您可以在 CSS 中设置变量(存储在 json 格式的 CSS 中)并重新使用您的颜色变量。

            //create the CSS JSON object with variables and styles
            var myCSSObjs = {
              cssVariables : {
                primaryColor:'#FF0000',
                padSmall:'5px',
                padLarge:'$expr($padSmall * 2)'
              }
              'body' : {padding:'$padLarge'},
              'h1' : {margin:'0', padding:'0 0 $padSmall 0'},
              '.pretty' : {padding:'$padSmall', margin:'$padSmall', color:'$primaryColor'}
            };
            
            //give your css objects a name and inject them
            $.cssObjs('myStyles',myCSSObjs).injectStyles();
            

            这里是一个完整的可下载演示的链接,它比他们的文档更有帮助:dicejs demo

            【讨论】:

            • 这个工具似乎在 2014 年不再可用
            【解决方案15】:

            如果你的系统上有 Ruby,你可以这样做:

            http://unixgods.org/~tilo/Ruby/Using_Variables_in_CSS_Files_with_Ruby_on_Rails.html

            这是为 Rails 制作的,但请参阅下文了解如何修改它以独立运行。

            您可以通过编写一个小的 Ruby 包装脚本独立于 Rails 使用此方法 它与 site_settings.rb 结合使用并考虑您的 CSS 路径,并且 您可以在每次想要重新生成 CSS 时调用它(例如在网站启动期间)

            您可以在几乎任何操作系统上运行 Ruby,因此这应该是完全独立于平台的。

            例如包装器:generate_CSS.rb(在需要生成 CSS 时运行此脚本)

            #/usr/bin/ruby  # preferably Ruby 1.9.2 or higher
            require './site_settings.rb' # assuming your site_settings file is on the same level 
            
            CSS_IN_PATH  = File.join( PATH-TO-YOUR-PROJECT, 'css-input-files')
            CSS_OUT_PATH = File.join( PATH-TO-YOUR-PROJECT, 'static' , 'stylesheets' ) 
            
            Site.generate_CSS_files( CSS_IN_PATH , CSS_OUT_PATH )
            

            site_settings.rb 中的 generate_CSS_files 方法需要这样修改:

            module Site
            #   ... see above link for complete contents
            
              # Module Method which generates an OUTPUT CSS file *.css for each INPUT CSS file *.css.in we find in our CSS directory
              # replacing any mention of Color Constants , e.g. #SomeColor# , with the corresponding color code defined in Site::Color
              #
              # We will only generate CSS files if they are deleted or the input file is newer / modified
              #
              def self.generate_CSS_files(input_path = File.join( Rails.root.to_s , 'public' ,'stylesheets') , 
                                          output_path = File.join( Rails.root.to_s , 'public' ,'stylesheets'))
                # assuming all your CSS files live under "./public/stylesheets"
                Dir.glob( File.join( input_path, '*.css.in') ).each do |filename_in|
                  filename_out = File.join( output_path , File.basename( filename_in.sub(/.in$/, '') ))
            
                  # if the output CSS file doesn't exist, or the the input CSS file is newer than the output CSS file:
                  if (! File.exists?(filename_out)) || (File.stat( filename_in ).mtime > File.stat( filename_out ).mtime)
                    # in this case, we'll need to create the output CSS file fresh:
                    puts " processing #{filename_in}\n --> generating #{filename_out}"
            
                    out_file = File.open( filename_out, 'w' )
                    File.open( filename_in , 'r' ).each do |line|
                      if line =~ /^\s*\/\*/ || line =~ /^\s+$/             # ignore empty lines, and lines starting with a comment
                        out_file.print(line)
                        next
                      end
                      while  line =~ /#(\w+)#/  do                         # substitute all the constants in each line
                        line.sub!( /#\w+#/ , Site::Color.const_get( $1 ) ) # with the color the constant defines
                      end
                      out_file.print(line)
                    end
                    out_file.close
                  end # if ..
                end
              end # def self.generate_CSS_files
            
            end # module Site
            

            【讨论】:

              【解决方案16】:

              我不清楚你为什么不能使用 PHP。然后,您可以根据需要简单地添加和使用变量,将文件另存为 PHP 文件并链接到该 .php 文件作为样式表而不是 .css 文件。

              它不一定是 PHP,但你明白我的意思。

              当我们想要编程的东西时,为什么不使用编程语言,直到 CSS(也许)支持变量之类的东西?

              另外,请查看 Nicole Sullivan 的 Object-oriented CSS

              【讨论】:

              • 我们不能都使用 PHP,因为这项工作要求我们中的一些人不要这样做!
              【解决方案17】:

              您可以通过 javascript 传递 CSS 并将 COLOUR1 的所有实例替换为某种颜色(基本上是正则表达式)并提供备用样式表以防最终用户关闭 JS

              【讨论】:

                【解决方案18】:

                用于 CSS 的“少”Ruby Gem 看起来很棒。

                http://lesscss.org/

                【讨论】:

                • 我认为 LESS 的美妙之处在于它不是 Ruby 或任何特定于框架的。它可以在客户端“编译”或与任何其他框架一起使用,例如 django-css github.com/dziegler/django-css 或其他东西
                【解决方案19】:

                CSS 本身不使用变量。但是,您可以使用另一种语言(如SASS)使用变量定义样式,并自动生成 CSS 文件,然后您可以将其发布到网络上。请注意,每次更改 CSS 时都必须重新运行生成器,但这并不难。

                【讨论】:

                • 我认为现在(2016 年)的答案不正确,不是吗?虽然我认为使用 SASS 等可能会更好。
                • 使用 CSS 变量可能比 SASS 更可取,因为使用 SASS 颜色只能静态更改。使用 CSS vars 可以在运行时更改颜色,即您可以使用 javascript 使用按钮切换到“暗模式”。
                猜你喜欢
                • 2017-07-03
                • 2022-11-16
                • 2020-07-20
                • 2011-07-19
                • 1970-01-01
                • 2017-07-23
                • 1970-01-01
                相关资源
                最近更新 更多