有没有办法一次为 2 个 css 属性分配相同的值?

Posted

技术标签:

【中文标题】有没有办法一次为 2 个 css 属性分配相同的值?【英文标题】:Is there a way to assign the same value to 2 css properties at once? 【发布时间】:2017-02-14 08:27:08 【问题描述】:

使用CSS, LESS, or Sass 可以一次为 2 个 css 属性分配相同的值吗?

就像:

.c1, c2 sameValue

而是像这样:

.c2  background-color:, color: sameValue

【问题讨论】:

好吧,您可以将 sameValue 分配给一个变量,并将该变量用于您的两个属性 - 但我认为不能像您所写的那样完成。 LESS:@c1: red@c2: @c1,在 SASS 中相同:$c1: red$c2: $c1。在 Stylus 中,您可以获得另一个属性的值:stylus-lang.com/docs/variables.html#property-lookup。在 CSS 中,你有 currentColor 和自定义属性来获得类似的东西 【参考方案1】:

使用 Stylus,您可以使用 iteration 和 interpollation 执行此操作:

.modal
  position : absolute
  for bord in top bottom left right
    bord: 1em
  for larg in  width min-width height min-height
    larg: auto
  for maxl in  max-width max-height
    maxl: none

【讨论】:

【参考方案2】:

在Stylus 中可以进行属性查找,它允许您使用当前或最近的父祖先中的属性并将其用于计算。

对于你的具体情况,你可以写:

.demo
  color: red
  background-color: @color

产生这个 CSS:

.demo 
  color: red;
  background-color: red;

它是一个feature asked also for LESS,但目前没有开发它的计划。目前在 LESS(和 SASS)中,您必须使用已经建议的解决方案之一,并传递一个附加变量。

【讨论】:

“但目前还没有开发它的计划”——实际上是一年多以前it's implemented。只是没有足够的人力资源来完善即将发布的 v3 的所有新功能。 抱歉,我不知道。我希望新的 v3 版本能在短时间内到来【参考方案3】:

你不能用 CSS 做到这一点。

最简单的方法是使用变量。以下是您在 LESS 中的做法

@color: red;
.demo 
  background-color: @color;
  color: @color;

在 Sass 中也是一样的

$color: red;
.demo 
  background-color: $color;
  color: $color;

但你也可以实现你想要的力量。这是您可以在 LESS 中完成的一种方法:

.properties(@properties, @value, @i: 0) when (@i < length(@properties)) 
  @property: extract(@properties, @i + 1);   // get the property
  @property: @value;                       // write the style
  .properties(@properties, @value, (@i + 1)) // loop


.demo 
  @props: background-color, color;
  .properties(@props, red)

会编译成你想要的

.demo 
  background-color: red;
  color: red;

它是如何工作的?

.demo 调用 .properties parametric LESS mixin,传递属性(.properties@properties 参数的列表(在其他关于 CSS/etc 的 SO 问题中有时称为数组);在此示例为@props)以及分配给所有这些参数的值(.properties@value 参数;在此示例中为red)。 注意.properties 有一个计数器参数@i,默认值为0.properties 有一个 LESS CSS guard,用于检查 @i 是否小于它通过的属性数量(保存在 @properties 中)。它是! (@i0,属性列表肯定至少是 1)好的,所以我们可以通过警卫。 获取属性名称:在列表的第一项上使用LESS's extract()(我们需要说@i + 1,因为我们在0 开始了@i 计数器。我们也可以开始@i1,并用when (@i &lt; (length(@properties) + 1)) 保护,但这更难阅读) 最后:写样式。 interpolate the variable 将属性名称 (@property) 保存为字符串 (@property),并将我们最初在 @987654357 中传递给 .properties 的值赋予它@(@value) LESS loop! 再次运行.properties,但推进计数器@i 一:.properties(staysTheSame, staysTheSame, (@i + 1)) .properties 将一直运行,直到遍历其 @properties 列表中的所有项目。之后,@i 将等于 length(@properties),所以我们不会通过 when (@i &lt; length(@properties)) 守卫。

请注意,@props 可以在.test 中定义,如上所述,或者.test 可以访问它的任何地方,值也是如此。你最终可能会得到

@props: background-color, color;
@val: red;
@val2: green;
.properties ...
.demo 
  border-color: @val2;
  .properties(@props, @val)

.demo2 
  .properties(@props, @val2)

【讨论】:

编辑:再三考虑,我更喜欢...@i:1) when (@i &lt;= length(@properties)) @property: extract(@properties, @i);...【参考方案4】:

如果您的 browser supports Custom Properties(也称为 CSS 变量),您可以定义一个自定义属性以供重用:

.foo 
  --example: red;
  background-color: var(--example);
  color: var(--example);

否则,您将需要依赖预处理器,例如 LESS:

.foo 
  @example: red;
  background-color: @example;
  color: @example;

或萨斯:

.foo 
  $example: red;
  background-color: $example;
  color: $example;

就能够链接属性而言,我不知道任何允许该语法的预处理器或规范。

【讨论】:

【参考方案5】:

我认为你不能按照你描述的方式,你需要使用一个变量。但是,您可以使用共享相同命名空间的属性来实现类似的效果。

.funky 
  font: 
   family: fantasy;
   size: 30em;
   weight: bold;
  

http://sass-lang.com/documentation/file.SASS_REFERENCE.html#nested_properties

【讨论】:

以上是关于有没有办法一次为 2 个 css 属性分配相同的值?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用循环分配 ctypes 结构的字段?

Joomla:一次为所有文章重新生成别名?

使用 CoreAnimation 一次为多个 UIView 设置动画

使用相同的代码一次为其他文件生成相同的图形

Matlab:为结构数组相同位置的(不同)字段分配相同的值

用一个表达式将两个变量分配给相同的值? [复制]