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.
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:
strictUnits: false
- tentativa de fazer matemática e coagir unidadesstrictUnits: ?
- 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?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).
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 ser1px^2
(não é útil, mas é verdadeiro). E o resultado de1px / 1px
deve ser1
. 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 produzir1
(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.