Less.js: Como lidar com matemática de unidade mista

Criado em 9 abr. 2017  ·  6Comentários  ·  Fonte: 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
}

c e d resultados acima contradizem com http://lesscss.org/features/#features -overview-feature-operations informando que o resultado deve ter uma unidade mais à esquerda de uma expressão (ou seja, todas as expressões acima deve produzir 1px ). Os testes cobrem apenas a / b / c expressão que acidentalmente produz o resultado esperado.
Relacionado a # 2418 e # 2472.

bug needs decision

Comentários muito úteis

Honestamente, nunca fui fã de ser capaz de mixar unidades no Less. Não faz sentido do ponto de vista matemático e, como você observou, é tudo baseado na ordem de avaliação ... o que também não faz sentido.

No entanto, quando olhei para o código strictUnits , isso também não fez sentido para mim. Isso também não parece fazer o que eu pensei que faria.

Então, sim, isso é estranho, mas não estou inclinado a ver isso consertado. Estou mais inclinado a ver a matemática de unidades mistas ir embora. Mas isso sou só eu. Como o resultado de 1px * 1px deve ser 1px^2 (não é útil, mas é verdadeiro). E o resultado de 1px / 1px deve ser 1 . Sass é excessivamente complexo em alguns tipos de matemática, mas usa princípios matemáticos básicos para fazer coisas como trocar unidades de unidades mix. Por exemplo.

<strong i="13">@value</strong> / 1px * 1rem
A matemática aqui é 10px / 1px . Isso deve produzir 1 (não em Less, apenas em princípio, e produziria em Sass). 1 * 1rem = 1rem . Sem querer ofender Alexis nas origens desse recurso, mas escolher a primeira unidade de uma expressão é meio estranho, difícil de avaliar e pode levar a esses casos extremos com erros.

Apenas meus $ 0,02.

Todos 6 comentários

Honestamente, nunca fui fã de ser capaz de mixar unidades no Less. Não faz sentido do ponto de vista matemático e, como você observou, é tudo baseado na ordem de avaliação ... o que também não faz sentido.

No entanto, quando olhei para o código strictUnits , isso também não fez sentido para mim. Isso também não parece fazer o que eu pensei que faria.

Então, sim, isso é estranho, mas não estou inclinado a ver isso consertado. Estou mais inclinado a ver a matemática de unidades mistas ir embora. Mas isso sou só eu. Como o resultado de 1px * 1px deve ser 1px^2 (não é útil, mas é verdadeiro). E o resultado de 1px / 1px deve ser 1 . Sass é excessivamente complexo em alguns tipos de matemática, mas usa princípios matemáticos básicos para fazer coisas como trocar unidades de unidades mix. Por exemplo.

<strong i="13">@value</strong> / 1px * 1rem
A matemática aqui é 10px / 1px . Isso deve produzir 1 (não em Less, apenas em princípio, e produziria em Sass). 1 * 1rem = 1rem . Sem querer ofender Alexis nas origens desse recurso, mas escolher a primeira unidade de uma expressão é meio estranho, difícil de avaliar e pode levar a esses casos extremos com erros.

Apenas meus $ 0,02.

Acho que o que deveria acontecer é que, como as mudanças na matemática, há uma mudança nas unidades mistas, de modo que há uma terceira opção entre as duas:

  1. strictUnits: false - tentativa de fazer matemática e coagir unidades
  2. strictUnits: ? - por exemplo, 1px / 1px // output 1 , 100vh - 10px // output 100vh - 10px ou seja, com unidades mistas, deixe a expressão como está e produza - útil para subexpressões atribuídas a vars e usadas em calc () - futuro padrão?
  3. strictUnits: true - lançar um erro (não vejo como isso é útil).

A questão não é sobre opiniões pessoais de unidades / manipulação de aritmos. É sobre o compilador não seguir sua própria documentação. (Para o resto, consulte por exemplo https://github.com/less/less.js/issues/1366#issuecomment-342361948).

A questão não é sobre opiniões pessoais de unidades / manipulação de aritmos. É sobre o compilador não seguir sua própria documentação

Sim, eu entendo. Mas, em última análise, trata-se de como "consertá-lo", certo? Portanto, estou apenas dizendo de forma indireta que não acho que vale a pena consertar isso e, em vez disso, deveria ter um comportamento mais intuitivo. Mas sim, isso é, tipo, minha opinião, cara.

@ seven-phase-max Apenas uma nota: eu reescrevi a maioria dos métodos de operação para unidades, e eles de fato tiveram algumas acrobacias estranhas para determinar a unidade final. Eu comecei a ser muito mais simples onde a unidade do lado esquerdo vence quando coagir unidades é a opção passada.

(Houve alguns tópicos em que opiniões diferentes sobre possíveis melhorias nas unidades restritas, mas como isso foi espalhado por todo o rastreador (ou pelo menos não consigo encontrar um tópico dedicado rapidamente), acho que simplesmente soei a parte principal de :)
Minha opinião pessoal sobre

strictUnits:? - por exemplo, 1px / 1px // saída 1, 100vh - 10px // saída 100vh - 10px

é algo como: não valeria a pena (por causa da relação resultado / esforço). Em outras palavras, não há nada a melhorar na verdade (exceto apenas corrigir os bugs óbvios como acima).

Observe que para tê-lo verdadeiramente genérico (em oposição a codificar estes e aqueles valores / padrões operacionais / exemplos minimalistas), você precisará lidar adequadamente com todas as igualdades aritméticas usuais e, assim, introduzir unidades "imaginárias" como px² e semelhante. Por exemplo, para a: 1px; b: 2px; c: 4px; um resultado esperado de a*b/c (obviamente aceitando (a*b)/c = a*(b/c) ) seria .5px o que significa que o resultado de a*b tem que ser 2px² (pelo menos internamente).

Existem outras questões de implementação (obviamente, pareceria estranho também contar coisas como 1/1hz = 1s etc., mas formalmente ...) Contagem em centavos: Eu disse que CSS Units é simplesmente muito grande cutucá-lo sem um motivo (" só porque algo como 1px/1px = 1 parece intuitivo").

strictUnits: true - gera um erro (não vejo como isso é útil).

Basicamente, se alguém não gosta da propagação de unidades e / ou unidades mistas, ele pode introduzir um estilo de codificação mais rígido, não permitindo tal aritmética (assim, strictUnits: true atuais são basicamente uma opção para forçar este estilo de codificação).

Esta página foi útil?
0 / 5 - 0 avaliações