【问题标题】:Is it possible to add a (dynamic) unit to a unitless number in sass?是否可以将(动态)单位添加到 sass 中的无单位数?
【发布时间】:2014-10-14 09:13:55
【问题描述】:

首先,我知道要将无单位值转换为有单位的值,我可以将无单位值乘以单个单位:

$value: 25 * 1px; // 25px

但是我想知道当单元是动态的时是否有任何方法可以做到这一点。

$unit: rem;
$value: 23;

.Box {
  // Try interpolation
  $united-value: #{$value}#{$unit};
  value: $united-value; // Appears to be correct
  // Check it is actually a number using unitless 
  check: unitless($united-value); // $number: "23rem" is not a number for `unitless'
}

显然,如果我要创建 $unit 1rem 的值,我可以像我的第一个示例一样乘以,但是有没有办法用裸单位值来做到这一点。

萨斯迈斯特here

[编辑] 正如@zessx 正确指出的那样,CSS 不关心类型,并且在这种情况下会以相同的方式处理字符串和数字值。但是,一旦附加了单位,我需要对值执行操作。

[编辑] 我不知道如何才能更清楚。我不想要/不需要一个在底层使用乘法的函数。我已经知道它是如何工作的以及如何去做。如果有一种方法可以获取一个无单位的值和一个单位并从中得出一个统一的数字,我很感兴趣。

有没有办法将px22 生成22px 这是一个数字并且可以对其进行数学运算?任何向我展示如何使用1px22 并做同样事情的答案都不是在回答我要问的问题。

【问题讨论】:

  • 由于您在$united-value 中使用了插值,因此该变量的类型是字符串,但您不能将unitless sass 函数与字符串一起使用。因此,实现目标的唯一方法是将$unit 设置为1rem。为什么不想将$unit 设置为1rem?看看这个sassmeister
  • @AlexGuerrero 这是一个更大的库的一部分,它使用了大量的验证和动态插值。正如我认为我明确表示的那样,我不想成倍增加。我目前需要两个列表 - 一个普通单位和一个单值单位。我正在尝试消除对第二个列表的需求。
  • 您还没有明确说明为什么涉及乘法是不可接受的。就目前而言,这是您需要与 Sass 的维护者讨论的问题。你知道他们会告诉你什么吗? Please. Just use unit based arithmetic.
  • @cimmanon 上下文与什么有什么关系?我故意从问题中删除了所有上下文以使其简单。如果答案是你做不到,那就是答案。
  • @Pedr 你没有解释为什么乘法是不可接受的。

标签: sass multiplication units-of-measurement


【解决方案1】:

没有 sass native 方法可以实现您的目标。问题是$unit 是一个字符串,并且在 sass 中,与其他语言一样,当您使用字符串和数字进行操作时,它会自动连接两者并返回一个字符串。并且没有执行此操作的本机函数,这就是 sass 的创建者的原因:

这些功能会鼓励更多草率的代码,而不是增加表达能力。

关于这个话题的更多信息here

替代品

所以你只能使用乘法,正如你之前提到的,或者如果你不想使用乘法,你可以使用这个函数将单位字符串转换为数字:

@function length($number, $unit) {
  $strings: 'px' 'cm' 'mm' '%' 'ch' 'pica' 'in' 'em' 'rem' 'pt' 'pc' 'ex' 'vw' 'vh' 'vmin' 'vmax';
  $units:   1px  1cm  1mm  1%  1ch  1pica  1in  1em  1rem  1pt  1pc  1ex  1vw  1vh  1vmin  1vmax;
  $index: index($strings, $unit);

  @if not $index {
    @warn "Unknown unit `#{$unit}`.";
    @return false;
  }

  @return $number * nth($units, $index);
}

如您所见,它接受一个数字和一个单位作为参数,并将它们作为长度数字返回。所以在你的情况下,你只需要改变这个声明:

$united-value: #{$value}#{$unit};

这个别人:

$united-value: lenght($value, $unit);

这是从Hugo Giraudel's blog获取的一个想法

【讨论】:

  • 该函数使用两个列表并通过使用乘法来完成它的工作:$number * nth($units, $index)。这只是我的第一个示例的一个更复杂的版本,根本没有解决我的问题。
  • @Pedr 还有?此函数返回的数字正是您所要求的。这是解决问题的正确方法。
  • @cimmanon 尝试阅读的不仅仅是问题的标题。
  • @Pedr 我不明白你为什么不赞成我的回答,我试图给你另一个没有乘法的解决方法,它不使用1rem,只使用rem 和显然不使用乘法,即使在引擎盖下也是如此。正如我之前所说,没有你想要的原生方式。但无论如何,使用此解决方案,您可以“在附加单元后对值执行操作”
  • 嗯,这是一种令人钦佩的情绪。但是,我担心我会强迫您这样做,同时通过投票给您加分。对此感到抱歉。
【解决方案2】:

即使$united-value 看起来是一个统一的数字,它也不过是一个字符串,因为 Sass 无法区分“rem”字符串和“rem”单位。幸运的是,这个字符串可以被任何 CSS 引擎解释。

您可以通过type-of()查看:

$unit: rem;
$value: 23;

.Box {
  $united-value: #{$value}#{$unit};
  value: $united-value;
  check: type-of($united-value); // check: string;
}

AFAIK,将字符串转换为“rem”的唯一方法是有效地使用* 1 rem

编辑:
正如 Alex Guerrero 所提到的,Hugo Giraudel 构建了一个将字符串转换为数字的函数,你真的应该看看on it blog。它的好处是你可以简单地写这个:

$unit: rem;
$value: 23;

.Box {
  $united-value: number($value+$unit);
  value: $united-value; 
  check: unitless($united-value);
}

【讨论】:

  • 谢谢。但不幸的是,我的用例要求我在附加单位后对值执行乘法运算。如果我只是输出值你是正确的。 CSS 不在乎。不幸的是,Sass 编译器确实在乎。
  • 不明白。使用这个number() 函数,您将获得一个真实 联合数字,就像您手动定义它一样。这意味着您将其相乘:value: number($value + $unit) * 5;
  • 数字函数只是在底层使用乘法。不需要 1. 一个无单位数和 2. 一个单位,并将它们组合成一个可行的数。
  • 这正是本例中_length() 函数的作用。当然它仍然使用乘法,但是你已经为 Sass 支持的每个单元提供了一个通用函数,这对你来说应该足够了,因为在 Sass 中没有原生和干净的方式将字符串转换为数字。
  • 它需要 1. 一个无单位数和 2. 一个值为 1 的有单位数。这不是一回事。
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 2013-03-08
  • 2014-04-08
  • 2020-01-24
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多