Less.js: Wie man mit Mathematik mit gemischten Einheiten umgeht

Erstellt am 9. Apr. 2017  ·  6Kommentare  ·  Quelle: 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 obigen Ergebnisse von d widersprechen der Angabe http://lesscss.org/features/#features -overview-feature-operations, die besagt, dass das Ergebnis eine ganz links stehende Einheit eines Ausdrucks haben sollte (dh alle Ausdrücke oben sollte 1px ). Tests decken nur den a / b / c Ausdruck ab, der versehentlich das erwartete Ergebnis liefert.
Bezogen auf #2418 und #2472.

bug needs decision

Hilfreichster Kommentar

Ehrlich gesagt war ich nie ein Fan davon, Einheiten in Less zu mischen. Es macht aus mathematischer Sicht keinen Sinn, und wie Sie betonen, basiert alles auf der Bewertungsreihenfolge .... was auch keinen Sinn macht.

Als ich mir jedoch den strictUnits Code ansah, machte das auch keinen Sinn für mich. Das scheint auch nicht das zu tun, was ich dachte.

Also, ja, das ist seltsam, aber ich bin nicht geneigt, es behoben zu sehen. Ich neige eher dazu, zu sehen, wie Mathematik mit gemischten Einheiten verschwindet. Aber das bin nur ich. So wie das Ergebnis von 1px * 1px 1px^2 (nicht nützlich, aber wahr). Und das Ergebnis von 1px / 1px sollte 1 . Sass ist in Bezug auf einige Arten von Mathematik zu komplex, verwendet jedoch grundlegende mathematische Prinzipien, um Dinge wie das Umschalten von Einheiten oder Mischeinheiten zu tun. Beispielsweise.

<strong i="13">@value</strong> / 1px * 1rem
Die Mathematik hier ist 10px / 1px . Dies sollte 1 erzeugen (nicht in Less, nur im Prinzip, und würde in Sass). 1 * 1rem = 1rem . Keine Beleidigung für Alexis in den Ursprüngen dieser Funktion, aber die Auswahl der ersten Einheit eines Ausdrucks ist einfach irgendwie seltsam, schwer zu bewerten und kann zu diesen fehlerhaften Randfällen führen.

Nur meine 0,02 $.

Alle 6 Kommentare

Ehrlich gesagt war ich nie ein Fan davon, Einheiten in Less zu mischen. Es macht aus mathematischer Sicht keinen Sinn, und wie Sie betonen, basiert alles auf der Bewertungsreihenfolge .... was auch keinen Sinn macht.

Als ich mir jedoch den strictUnits Code ansah, machte das auch keinen Sinn für mich. Das scheint auch nicht das zu tun, was ich dachte.

Also, ja, das ist seltsam, aber ich bin nicht geneigt, es behoben zu sehen. Ich neige eher dazu, zu sehen, wie Mathematik mit gemischten Einheiten verschwindet. Aber das bin nur ich. So wie das Ergebnis von 1px * 1px 1px^2 (nicht nützlich, aber wahr). Und das Ergebnis von 1px / 1px sollte 1 . Sass ist in Bezug auf einige Arten von Mathematik zu komplex, verwendet jedoch grundlegende mathematische Prinzipien, um Dinge wie das Umschalten von Einheiten oder Mischeinheiten zu tun. Beispielsweise.

<strong i="13">@value</strong> / 1px * 1rem
Die Mathematik hier ist 10px / 1px . Dies sollte 1 erzeugen (nicht in Less, nur im Prinzip, und würde in Sass). 1 * 1rem = 1rem . Keine Beleidigung für Alexis in den Ursprüngen dieser Funktion, aber die Auswahl der ersten Einheit eines Ausdrucks ist einfach irgendwie seltsam, schwer zu bewerten und kann zu diesen fehlerhaften Randfällen führen.

Nur meine 0,02 $.

Ich denke, was passieren sollte, ist, dass es wie bei den Änderungen in der Mathematik eine Änderung der gemischten Einheiten gibt, sodass es eine dritte Option zwischen den beiden gibt:

  1. strictUnits: false - Versuch, mathematische und erzwungene Einheiten zu machen
  2. strictUnits: ? - zB 1px / 1px // output 1 , 100vh - 10px // output 100vh - 10px dh bei gemischten Einheiten den Ausdruck unverändert lassen und ausgeben - nützlich für Unterausdrücke, die vars zugewiesen und in calc() verwendet werden - zukünftigen Standard?
  3. strictUnits: true - Fehler auslösen (ich sehe nicht, wie das sinnvoll ist.)

Es geht nicht um persönliche Meinungen über die Handhabung von Einheiten / Arithmen. Es geht darum, dass der Compiler nicht seiner eigenen Dokumentation folgt. (Für den Rest siehe zum Beispiel https://github.com/less/less.js/issues/1366#issuecomment-342361948).

Es geht nicht um persönliche Meinungen über die Handhabung von Einheiten / Arithmen. Es geht darum, dass der Compiler nicht seiner eigenen Dokumentation folgt

Ja, das verstehe ich. Aber letztendlich geht es darum, wie man es "repariert", oder? Ich sage nur umständlich, dass ich nicht denke, dass es die Zeit wert ist, dies zu beheben, und stattdessen ein intuitiveres Verhalten haben sollte. Aber ja, das ist nur meine Meinung, Mann.

@seven-phases-max Nur eine Anmerkung: Ich habe die meisten Operationsmethoden für Einheiten neu geschrieben, und sie hatten tatsächlich einige seltsame Akrobatik, um die endgültige Einheit zu bestimmen. Ich habe es viel einfacher gemacht, wo die linke Einheit gewinnt, wenn das Erzwingen von Einheiten die Option ist, die weitergegeben wird.

(Es gab ein paar Threads, in denen unterschiedliche Meinungen zu möglichen strikten Einheitenverbesserungen waren, aber da das über den Tracker verteilt war (oder zumindest kann ich keinen speziellen Thread schnell finden) höre ich einfach den Schlüsselteil von :)
Meine persönliche Meinung zu

striktEinheiten: ? - zB 1px / 1px // Ausgang 1, 100vh - 10px // Ausgang 100vh - 10px

ist so etwas wie: würde sich nicht lohnen (wegen Ergebnis/Aufwands-Verhältnis). Mit anderen Worten, es gibt eigentlich nichts zu verbessern (außer nur die offensichtlichen Fehler wie oben zu beheben).

Beachten Sie, dass Sie, um es wirklich generisch zu haben (im Gegensatz zum Harcoding dieser und dieser minimalistischen Werte / Operationsmuster / Beispiele), alle üblichen arithmetischen Gleichheiten richtig handhaben müssen und daher "imaginäre" Einheiten wie px² einführen müssen und ähnlich. ZB für a: 1px; b: 2px; c: 4px; ein erwartetes Ergebnis von a*b/c (wobei natürlich (a*b)/c = a*(b/c) akzeptiert wird) .5px was bedeutet, dass das Ergebnis von a*b sein muss 2px² (zumindest intern).

Es gibt andere Bedenken bei der Implementierung (natürlich würde es seltsam aussehen, auch Dinge wie 1/1hz = 1s usw. zu zählen, aber formal ...) Zählen in Cent: Ich hatte gesagt, CSS Units ist einfach zu groß um es ohne Grund zu stochern (" nur weil so etwas wie 1px/1px = 1 intuitiv aussieht").

strictUnits: true - einen Fehler auslösen (ich sehe nicht, wie das sinnvoll ist.)

Grundsätzlich, wenn einem die Einheitspropagation und/oder gemischte Einheiten nicht gefallen, kann er einen strengeren Kodierungsstil einführen, der eine solche Arithmetik nicht erlaubt (daher ist das aktuelle strictUnits: true im Grunde eine Option, um diesen Kodierungsstil zu erzwingen).

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen