在.CSS文件中创建一个变量,以在该.CSS文件中使用

时间:2020-03-05 18:48:42  来源:igfitidea点击:
Possible Duplicate:

  Avoiding repeated constants in CSS

我们的CSS工作表中有一些"主题颜色"可以重复使用。

有没有设置变量然后再使用的方法?

例如。

.css
OurColor: Blue

H1 { 
 color:OurColor;
}

解决方案

回答

CSS不提供任何此类功能。唯一的解决方案是编写一个预处理脚本,该脚本可以手动运行以生成基于某些动态伪CSS的静态CSS输出,也可以连接到Web服务器并在将CSS发送到客户端之前对其进行预处理。

回答

由于CSS尚无此功能(但是,我相信下一个版本会提供),因此请遵循Konrad Rudolphs的建议进行预处理。我们可能想使用已经存在的一种:m4

http://www.gnu.org/software/m4/m4.html

回答

我们不是第一个想知道的人,答案是否定的。艾略特(Elliotte)对它有个好话:http://cafe.elharo.com/web/css-repeats-itself/。我们可以使用JSP或者等效的JSP在运行时生成CSS。

回答

不,但是Sass做到了。它是CSS预处理程序,可让我们使用许多快捷方式来减少需要编写的CSS数量。

例如:

$blue: #3bbfce;
$margin: 16px;

.content-navigation {
  border-color: $blue;
  color:
    darken($blue, 9%);
}

.border {
  padding: $margin / 2;
  margin: $margin / 2;
  border-color: $blue;
}

除了变量之外,它还提供了嵌套选择器的功能,使逻辑上保持分组:

table.hl {
  margin: 2em 0;
  td.ln {
    text-align: right;
  }
}

li {
  font: {
    family: serif;
    weight: bold;
    size: 1.2em;
  }
}

还有更多:mixin的作用类似于函数,并且能够从另一个选择器继承一个选择器。这非常聪明,也非常有用。

如果我们使用Ruby on Rails进行编码,它甚至会自动为我们编译为CSS,但是还有一个通用的编译器可以按需为我们完成此操作。

回答

不需要选择器的所有样式都驻留在一个规则中,并且一个规则可以应用于多个选择器...因此,将其翻转:

/* Theme color: text */
H1, P, TABLE, UL
{ color: blue; }

/* Theme color: emphasis */
B, I, STRONG, EM
{ color: #00006F; }

/* ... */

/* Theme font: header */
H1, H2, H3, H4, H5, H6
{ font-family: Comic Sans MS; }

/* ... */

/* H1-specific styles */
H1
{ 
   font-size: 2em; 
   margin-bottom: 1em;
}

这样,我们可以避免重复概念上相同的样式,同时还要清楚说明它们影响文档的哪些部分。

请注意最后一句中对"概念上"的强调...这只是出现在注释中,所以我将对此稍作扩展,因为在此之前的几年中,我已经看到人们一遍又一遍地犯同样的错误甚至CSS的存在:两个属性共享相同的值并不一定意味着它们表示相同的概念。傍晚的天空可能看起来是红色的,西红柿也是如此,但是出于相同的原因,天空和西红柿不是红色的,它们的颜色会随时间而独立变化。同样,只是因为我们在样式表中碰巧有两个元素被赋予了相同的颜色,或者大小或者位置并不意味着它们将始终共享这些值。天真的设计师使用分组(如此处所述)或者诸如SASS或者LESS之类的变量处理器来避免价值重复的风险,这会导致将来对样式的更改非常容易出错。在寻求减少重复而忽略其当前值时,请始终专注于样式的上下文含义。

回答

我们让它变得太复杂了。这就是级联存在的原因。只需提供元素选择器并对颜色进行分类即可:

h1 {
   color: #000;
}
.a-theme-color {
   color: #333;
}

然后将其应用于HTML中的元素,并在需要使用主题颜色时覆盖。

<h1>This is my heading.</h1>
<h1 class="a-theme-color">This is my theme heading.</h1>

回答

目前尚不支持,除非我们使用一些脚本根据我们定义的某些变量生成CSS。

但是,似乎至少有一些来自浏览器领域的人正在研究它。因此,如果将来真的成为标准,那么我们将不得不等到在所有浏览器中实现它(直到那时它才不可用)。

回答

另请参见避免CSS中的重复常量。正如Farinha所说,已经提出了CSS Variables提案,但是暂时要使用预处理器。

回答

我们可以在HTML元素的class属性中使用mutliple类,每个类都提供样式的一部分。因此,我们可以将CSS定义为:

.ourColor { color: blue; }
.ourBorder { border: 1px solid blue; }
.bigText { font-size: 1.5em; }

然后根据需要组合类:

<h1 class="ourColor">Blue Header</h1>
<div class="ourColor bigText">Some big blue text.</div>
<div class="ourColor ourBorder">Some blue text with blue border.</div>

这样一来,我们就可以重用ourColor类,而不必在CSS中定义多次颜色。如果更改主题,只需更改ourColour的规则。

回答

这听起来像是精神错乱,但是如果我们使用的是NAnt(或者Ant或者某些其他自动构建系统),则可以通过hacky方式将NAnt属性用作CSS变量。从CSS模板文件(可能是styles.css.template之类)开始,其中包含以下内容:

a {
    color: ${colors.blue};
}

    a:hover {
        color: ${colors.blue.light};
    }

p {
    padding: ${padding.normal};
}

然后在构建中添加一个分配所有属性值的步骤(我使用外部构建文件并<include>它们)并使用<expandproperties>过滤器生成实际的CSS:

<property name="colors.blue" value="#0066FF" />
<property name="colors.blue.light" value="#0099FF" />
<property name="padding.normal" value="0.5em" />

<copy file="styles.css.template" tofile="styles.css" overwrite="true">
    <filterchain>
        <expandproperties/>
    </filterchain>
</copy>

当然,缺点是必须运行css生成目标,然后才能在浏览器中检查外观。这可能会限制我们手动生成所有CSS。

但是,我们可以编写NAnt函数来完成各种很酷的事情,而不仅仅是属性扩展(例如动态生成梯度图像文件),所以对我来说,这值得头疼。

回答

CSS尚未使用变量,这对于它的时代是可以​​理解的,并且是一种声明性语言。

这是实现更多动态样式处理的两种主要方法:

  • 内联css示例中的服务器端变量(使用PHP):
<style> .myclass{color:<?php echo $color; ?>;} </style>
  • 使用javascript进行DOM操作以更改CSS客户端示例(使用jQuery库):
$('.myclass').css('color', 'blue');  
  
  OR
  
  //The jsvarColor could be set with the original page response javascript

  // in the DOM or retrieved on demand (AJAX) based on user action.
  $('.myclass').css('color', jsvarColor);

回答

我已经编写了一个宏(在Visual Studio中),该宏不仅使我可以为命名颜色编码CSS,还可以轻松计算这些颜色的阴影或者混合色。它还处理字体。它会在保存时触发并输出单独版本的CSS文件。这与Bert Bos的论点是一致的,即CSS中的任何符号处理都在创作时进行,而不是在解释时进行。

完整的设置以及所有代码可能太复杂了,无法在此处发布,但可能适合以后的博客发布。这是宏中的注释部分,应该足以开始使用。

此方法的目标如下:

  • 允许在中心位置定义基色,字体等,以便可以轻松调整整个货盘或者印刷处理,而不必使用搜索/替换
  • 避免在IIS中映射.CSS扩展名
  • 生成可以用于多种样式的花园文本CSS文件,例如,VisualStudio的设计模式可以使用
  • 在创作时一次生成这些文件,而不是在每次请求CSS文件时都重新计算它们
  • 立即透明地生成这些文件,而无需在调整保存测试工作流程中添加额外的步骤

使用这种方法,颜色,颜色阴影和字体系列都由速记标记表示,这些标记引用XML文件中的值列表。

包含颜色和字体定义的XML文件必须称为Constants.xml,并且必须与CSS文件位于同一文件夹中。

每当VisualStudio保存CSS文件时,EnvironmentEvents都会触发ProcessCSS方法。将扩展CSS文件,并将该文件的扩展的静态版本保存在/ css / static /文件夹中。 (所有HTML页面均应引用CSS文件的/ css / static /版本)。

Constants.xml文件可能如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<cssconstants>
  <colors>
    <color name="Red" value="BE1E2D" />
    <color name="Orange" value="E36F1E" />
    ...
  </colors>
  <fonts>
    <font name="Text" value="'Segoe UI',Verdana,Arial,Helvetica,Geneva,sans-serif" />
    <font name="Serif" value="Georgia,'Times New Roman',Times,serif" />
    ...
  </fonts>
</cssconstants>

在CSS文件中,我们可以定义如下:

font-family:[[f:Text]];
   background:[[c:Background]]; 
   border-top:1px solid [[c:Red+.5]]; /* 50% white tint of red */

回答

通过使用Less CSS,我们可以实现更多目标。