2012-09-08 3 views
41

Ich weiß, dass Sie Einheiten von Zahlen in SASS abstreifen können, wenn Sie das Gerät vor der Hand wie dies wissen:Wie entfernen Sie das Gerät von einer beliebigen Nummer in SASS?

$number: 16px; 
$without-unit: 16px/1px; 
@warn $without-unit; // 16 

Aber ist es möglich, ohne zu wissen, was das Gerät das Gerät aus einer Reihe abzustreifen erstes ist?

@function strip-unit($number) { 
    // magic code here... 
} 

@warn strip-unit(16px); // 16 
+0

Es erstaunt mich, dass dies nicht eine Kernfunktion SASS ist –

Antwort

101

-

UPDATE: Sie sollten nie wirklich brauchen diese Funktion zu nutzen. Sass Mathe ist sehr schlau in Bezug auf Einheiten, und ich habe noch nie einen Anwendungsfall gesehen, in dem das Abziehen von Einheiten eine bessere Option war, als einfach die richtige Mathematik zu verwenden, um das zu bekommen, was Sie brauchen. Siehe die Sass issue thread, wo dies ausführlich diskutiert wurde.

Es ist eine clevere Funktion, aber wenn Sie es jemals benutzen möchten, gibt es wahrscheinlich ein Problem mit Ihrer Mathematik. Greifen Sie nicht auf diese Funktion zurück. Fixiere stattdessen deine Mathematik.

-

Sie müssen von 1 von der gleichen Einheit teilen. Wenn Sie unit() verwenden, erhalten Sie einen String statt einer Nummer, aber wenn man von Null multiplizieren und 1 hinzufügen, haben Sie, was Sie brauchen:

@function strip-units($number) { 
    @return $number/($number * 0 + 1); 
} 

, das funktioniert. strip-units(13.48cm) wird 13.48 zurückgeben.

+0

Brilliant; Das ist viel einfacher als das, was ich gemacht habe. –

+0

genious, sobald Sie es verstehen. einfach genial! –

+0

Beachten Sie, dass dies nicht generell empfohlen wird. Ich habe noch nie einen guten Grund gefunden, Einheiten von Zahlen in Sass zu streichen. Ich bin auf viele Situationen gestoßen, in denen es eine gute Idee zu sein schien - aber Sass ist so schlau bei der Unit-Mathe, dass die Einheiten am Ende immer die besten/einfachsten Ergebnisse liefern. –

0

Ich glaube, Sie müssen eine benutzerdefinierte Ruby-Funktion hinzufügen, würde die Einheiten strippen (siehe Dokumentation auf adding custom functions). Es wäre in etwa so aussehen, denke ich (Warnung, nicht getestet):

module Sass::Script::Functions 
    def strip_units(num) 
    assert_type num, :Number 
    Sass::Script::Number.new(num.value) 
    end 
end