Less.js: 如何处理混合单位数学

创建于 2017-04-09  ·  6评论  ·  资料来源: less/less.js

div {
    <strong i="5">@value</strong>: 1px;
    a: <strong i="6">@value</strong> * 1rem;       // 1px  - ok
    b: <strong i="7">@value</strong> * 1px * 1rem; // 1px  - ok
    d: <strong i="8">@value</strong> / 1px;        // 1px  - ok
    c: <strong i="9">@value</strong> / 1px * 1rem; // 1rem - unexpected
    e: <strong i="10">@value</strong> / 1px + 0rem; // 1rem - unexpected
}

cd结果与http://lesscss.org/features/#features -overview-feature-operations 声明结果应该有一个表达式的最左边单元(即所有表达式上面应该产生1px )。 测试仅涵盖a / b / c表达式,它意外地产生了预期的结果。
与#2418 和#2472 相关。

bug needs decision

最有用的评论

老实说,我从不喜欢能够在 Less 中混合单位。 从数学的角度来看,这是没有意义的,正如您所指出的,这一切都基于评估顺序......这也毫无意义。

但是,当我查看strictUnits代码时,这对我来说也毫无意义。 这似乎也没有做我认为会做的事情。

所以,是的,这很奇怪,但我不想看到它被修复。 我更倾向于看到混合单元数学消失。 但这只是我。 就像1px * 1px应该是1px^2 (没有用,但确实如此)。 而1px / 1px应该是1 。 Sass 在某些类型的数学上过于复杂,但它使用基本的数学原理来完成诸如切换混合单位之类的事情。 例如。

<strong i="13">@value</strong> / 1px * 1rem
这里的数学是10px / 1px 。 这应该产生1 (不是在 Less 中,只是原则上,并且会在 Sass 中)。 1 * 1rem = 1rem 。 无意冒犯 Alexis 此功能的起源,但选择表达式的第一个单元有点奇怪,难以评估,并且可能导致这些有问题的边缘情况。

只是我的 0.02 美元。

所有6条评论

老实说,我从不喜欢能够在 Less 中混合单位。 从数学的角度来看,这是没有意义的,正如您所指出的,这一切都基于评估顺序......这也毫无意义。

但是,当我查看strictUnits代码时,这对我来说也毫无意义。 这似乎也没有做我认为会做的事情。

所以,是的,这很奇怪,但我不想看到它被修复。 我更倾向于看到混合单元数学消失。 但这只是我。 就像1px * 1px应该是1px^2 (没有用,但确实如此)。 而1px / 1px应该是1 。 Sass 在某些类型的数学上过于复杂,但它使用基本的数学原理来完成诸如切换混合单位之类的事情。 例如。

<strong i="13">@value</strong> / 1px * 1rem
这里的数学是10px / 1px 。 这应该产生1 (不是在 Less 中,只是原则上,并且会在 Sass 中)。 1 * 1rem = 1rem 。 无意冒犯 Alexis 此功能的起源,但选择表达式的第一个单元有点奇怪,难以评估,并且可能导致这些有问题的边缘情况。

只是我的 0.02 美元。

我认为应该发生的是,就像数学的变化一样,混合单位发生了变化,因此在两者之间有第三种选择:

  1. strictUnits: false - 尝试做数学和强制单位
  2. strictUnits: ? - 例如1px / 1px // output 1100vh - 10px // output 100vh - 10px即混合单位,保持表达式原样并输出 - 对分配给 vars 并在 calc() 中使用的子表达式很有用 -未来违约?
  3. strictUnits: true - 抛出一个错误(我不知道这有什么用。)

问题不在于个人对单位/算法处理的看法。 这是关于编译器不遵循自己的文档。 (其余的参见例如 https://github.com/less/less.js/issues/1366#issuecomment-342361948)。

问题不在于个人对单位/算法处理的看法。 这是关于编译器不遵循自己的文档

是的,我明白了。 但最终是关于如何“修复”它,对吧? 所以我只是以一种迂回的方式说,我认为这不值得花时间修复,相反,它应该具有更直观的行为。 但是,是的,这只是我的意见,伙计。

@seven-phases-max 请注意:我已经重新编写了大部分单位的操作方法,他们确实有一些奇怪的技巧来确定最终单位。 当强制单位是传入的选项时,左侧单位获胜的情况变得更加直接。

(有几个线程对可能的严格单位改进有不同的看法,但由于它遍布整个跟踪器(或者至少我无法快速找到专用线程)我想我只是听起来是其中的关键部分:)
我个人的看法

严格单位:? - 例如 1px / 1px // 输出 1, 100vh - 10px // 输出 100vh - 10px

是这样的:不值得(因为结果/努力比)。 换句话说,实际上没有什么可以改进的(除了只是修复像上面这样的明显错误)。

请注意,要使其真正通用(反对对这些和极简值/操作模式/示例进行编码),您需要正确处理所有常见的算术等式,从而引入“虚数”单位,如px²和相似的。 例如,对于a: 1px; b: 2px; c: 4px; a*b/c (显然接受(a*b)/c = a*(b/c) )的预期结果将是.5px意味着a*b必须是2px² (至少在内部)。

还有其他实现问题(显然,也计算1/1hz = 1s等东西看​​起来很奇怪,但正式......)以美分计算:我说过CSS Units实在是太大了没有理由戳它(“只是因为1px/1px = 1这样的东西看起来很直观”)。

strictUnits: true - 抛出一个错误(我不知道这有什么用。)

基本上,如果一个人不喜欢单位传播和/或混合单位的事情,他可能会引入一种更严格的编码风格,不允许这种算术(因此当前的strictUnits: true基本上是强制这种编码风格的一种选择)。

此页面是否有帮助?
0 / 5 - 0 等级