【问题标题】:Avoiding repeated constants in CSS避免 CSS 中的重复常量
【发布时间】:2010-09-07 00:11:15
【问题描述】:

有没有什么有用的技术可以减少 CSS 文件中常量的重复?

(例如,一堆不同的选择器应该都应用相同的颜色或相同的字体大小)?

【问题讨论】:

标签: css


【解决方案1】:

最近,variables have been added 加入了官方 CSS 规范。

变量允许你做这样的事情:

body, html {
    margin: 0;
    height: 100%;
}

.theme-default {
    --page-background-color: #cec;
    --page-color: #333;
    --button-border-width: 1px;
    --button-border-color: #333;
    --button-background-color: #f55;
    --button-color: #fff;
    --gutter-width: 1em;
    float: left;
    height: 100%;
    width: 100%;
    background-color: var(--page-background-color);
    color: var(--page-color);
}

button {
    background-color: var(--button-background-color);
    color: var(--button-color);
    border-color: var(--button-border-color);
    border-width: var(--button-border-width);
}

.pad-box {
    padding: var(--gutter-width);
}
<div class="theme-default">
    <div class="pad-box">
        <p>
            This is a test
        </p>
        <button>
           Themed button
        </button>
    </div>
</div>

不幸的是,浏览器支持仍然很差。 According to CanIUse,目前(2016 年 3 月 9 日)唯一支持此功能的浏览器是 Firefox 43+、Chrome 49+、Safari 9.1+ 和 iOS Safari 9.3+:


替代方案:

在广泛支持 CSS 变量之前,您可以考虑使用 CSS 预处理器语言,如 LessSass

CSS 预处理器不仅允许您使用变量,而且几乎允许您做任何可以用编程语言做的事情。

例如,在 Sass 中,您可以创建这样的函数:

@function exponent($base, $exponent) {
    $value: $base;
    @if $exponent > 1 {
        @for $i from 2 through $exponent {
            $value: $value * $base;
        }
    }
    @if $exponent < 1 {
        @for $i from 0 through -$exponent {
            $value: $value / $base;
        }
    }
    @return $value; 
}

【讨论】:

  • 建议将 CSS 自定义属性(又名变量)定义放入 :root{} 选择器中,以免破坏不了解变量的解析器。
  • @VolkerE。自定义属性/变量的定义与任何其他属性一样。它们需要放在选择器中。如果要全局应用它们,这可能是:root,但也可以是任何其他选择器。不支持自定义属性/变量的浏览器(应该)忽略这些属性,因为 CSS 规范指定应该忽略所有未知属性!
【解决方案2】:
    :root {
      --primary-color: red;
    }

    p {
      color: var(--primary-color);
    } 

<p> some red text </p>

你可以通过JS改变颜色

var styles = getComputedStyle(document.documentElement);
var value = String(styles.getPropertyValue('--primary-color')).trim(); 


document.documentElement.style.setProperty('--primary-color', 'blue');

【讨论】:

    【解决方案3】:

    据我所知,如果不以编程方式生成 CSS 文件,就无法在一处且仅一处定义您最喜欢的蓝色阴影 (#E0EAF1)。

    您可以很容易地编写一个计算机程序来生成该文件。执行一个简单的查找和替换操作,然后保存为 .css 文件。

    从这个 source.css 开始……

    h1,h2 {
      color: %%YOURFAVORITECOLOR%%;
    }
    
    div.something {
      border-color: %%YOURFAVORITECOLOR%%;
    }
    

    到这个target.css…

    h1,h2 {
      color: #E0EAF1;
    }
    
    div.something {
      border-color: #E0EAF1;
    }
    

    使用这样的代码... (VB.NET)

    Dim CssText As String = System.IO.File.ReadAllText("C:\source.css")
    CssText = CssText.Replace("%%YOURFAVORITECOLOR%%", "#E0EAF1")
    System.IO.File.WriteAllText("C:\target.css", CssText)
    

    【讨论】:

      【解决方案4】:

      尝试全局变量以避免重复编码

      h1 {
        color: red;
      }
      p {
        font-weight: bold;
      }
      

      或者你可以创建不同的类

      .deflt-color {
        color: green;
      }
      .dflt-nrml-font {
        font-size: 12px;
      }
      .dflt-header-font {
        font-size: 18px;
      }
      

      【讨论】:

        【解决方案5】:

        您应该用逗号分隔每个 id 或类,例如:

        h1,h2 {
          color: #fff;
        }
        

        【讨论】:

        • 简单但有用
        【解决方案6】:

        您可以使用全局变量来避免重复。

        p{
          background-color: #ccc; 
        }
        
        h1{
          background-color: #ccc;
        }
        

        这里可以在:root伪类选择器中初始化一个全局变量。 :root 是 DOM 的顶层。

        :root{
            --main--color: #ccc; 
        }
        
        p{
          background-color: var(--main-color);
        }
        
        h1{
          background-color: var(--main-color);
        }
        

        注意:这是一项实验性技术 由于该技术的规范尚未稳定,请查看兼容性表以了解在各种浏览器中使用的正确前缀。另请注意,随着规范的变化,实验技术的语法和行为可能会在未来版本的浏览器中发生变化。 More Info here

        但是,您始终可以使用语法上很棒的样式表,即

        如果是 Sass,则必须在顶部使用 $variable_name 来初始化全局变量。

        $base : #ccc;
        
        p{
          background-color: $base;
        }
        
        h1{
           background-color: $base;
        }
        

        【讨论】:

          【解决方案7】:

          您可以使用动态 css 框架,例如 less

          【讨论】:

            【解决方案8】:

            CSS Variables,如果它在所有主流浏览器中实现,也许有一天会解决这个问题。

            在那之前,您要么必须复制和粘贴,要么使用任何类型的预处理器,就像其他人建议的那样(通常使用服务器端脚本)。

            【讨论】:

              【解决方案9】:

              就个人而言,我只是使用逗号分隔的选择器,但是有一些以编程方式编写 css 的解决方案。也许这对于您更简单的需求来说有点矫枉过正,但看看CleverCSS(Python)

              【讨论】:

                【解决方案10】:

                元素可以属于多个类,所以你可以这样做:

                .DefaultBackColor
                {
                    background-color: #123456;
                }
                .SomeOtherStyle
                {
                    //other stuff here
                }
                .DefaultForeColor
                {
                    color:#654321;
                }
                

                然后在某处的内容部分:

                <div class="DefaultBackColor SomeOtherStyle DefaultForeColor">Your content</div>
                

                这里的缺点是它在正文中变得很罗嗦,而且你不太可能把它归结为只列出一次颜色。但是你可能只能做两到三遍,你可以将这些颜色组合在一起,也许在他们自己的工作表中。现在,当您要更改配色方案时,它们都在一起,更改非常简单。

                但是,是的,我对 CSS 的最大抱怨是无法定义自己的常量。

                【讨论】:

                • >“但是,是的,我对 CSS 最大的抱怨是无法定义自己的常量。”。我也没有错过任何基本的算术计算,也没有 if 条件。我希望能够说“宽度:100% - 10px”
                • @Hoffmann [稍后] 繁荣,现在(很快)我们有calc()。 :-)
                • @VictorZamanian 当所有主流浏览器都支持它时,我会非常高兴。对于好奇的这里有一些文档:developer.mozilla.org/en-US/docs/CSS/calc#Browser_compatibility
                • 啊,如果没有一些疯狂,它永远不可能成为 CSS 规范的一部分:“注意:+ 和 - 运算符必须始终被空格包围。calc(50% -8px) 的操作数例如将被解析为百分比后跟负长度,无效表达式,而 calc(50% - 8px) 的操作数是百分比后跟减号和长度。"
                • @VictorZamanian 是的,C 在编译时进行这种解析,因此不会影响性能。 CSS 需要动态解析,所以我想这可能是他们故意的。无论如何,我对 calc() 也很满意,但我想知道我们是否可以说:“width: calc(100% - border-right - border-left)”,例如,从 mozilla 网站看来我们不会能够。
                【解决方案11】:

                您可以在 html 元素中使用多重继承(例如 &lt;div class="one two"&gt;),但我不知道在 CSS 文件本身中使用常量的方法。

                这个链接(在谷歌搜索你的问题时发现的第一个)似乎对这个问题有相当深入的了解:

                http://icant.co.uk/articles/cssconstants/

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-03-29
                  • 2012-01-28
                  • 2018-05-25
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多