Подтвердить что ты не робот

Добавить тип единицы в результат вычисления

Я недавно пересматривал свой CSS в таблицу стилей SASS. Я использую расширение Mindscape Web Workbench для VS2012, которое перегенерирует CSS каждый раз, когда вы сохраняете свой SCSS. Я начал с кода, подобного этому:

/* Starting point: */
h1 { font-size: 1.5em; /* 24px ÷ 16px */ }

Затем я попытался сначала реорганизовать это:

/* Recfator: */
h1 { font-size: (24px / 16px)em; }

Но это, к сожалению, производит:

/* Result: */
h1 { font-size: 1.5 em; }              /* doesn't work, gives "1.5 em" */

Обратите внимание на дополнительное пространство, которого я там не хочу. Я попробовал несколько альтернатив, вот несколько:

h1 { font-size: (24/16)em; }           /* doesn't work, gives "1.5 em" */
h2 { font-size: 24 / 16em; }           /* doesn't work, gives "24/16em" */
h3 { font-size: (24px / 16px) * 1em; } /* works but "* 1 em" feels unnecessary */
h4 { font-size: (24em) / 16; }         /* works, but without "px" it not 
                                          really conveying what I mean to say */

Я также пробовал эти варианты с переменными (потому что я так хочу их), но это не сильно изменило ситуацию. Чтобы привести примеры в этом вопросе гладко, я забыл переменные. Тем не менее, я с радостью принимаю решение, основанное на использовании переменных (в чистом виде). ​​

Я прошел через релевантную SOC-документацию на '/' и оценил, что это очень сложно для SASS, потому что '/"характер уже имеет смысл в базовом CSS. В любом случае, я надеялся на чистое решение. Я что-то пропустил?

PS. Этот blogpost предлагает одно решение, используя определенную пользователем функцию. Это кажется немного тяжелым, хотя, поэтому мне интересно, если есть "более чистые" решения в соответствии с моими попытками выше. Если кто-то может объяснить, что "функциональный подход" является лучшим (или даже единственным) решением, я также соглашусь с ним в качестве ответа.

PS. Этот связанный вопрос, похоже, примерно то же самое, хотя он определенно хочет делать дальнейшие вычисления. Принятый ответ там - это мое третье решение (умножение на 1em), но мне бы хотелось узнать, есть ли другой (более чистый) способ, если я захочу отказаться от возможности делать дальнейшие расчеты. Возможно, метод, упомянутый в указанном вопросе ( "интерполяция" ), полезен для меня?


Нижняя строка:, как вы можете чисто добавить тип устройства (например, em) к результату вычисления в SASS?

4b9b3361

Ответ 1

Единственный способ добавить единицу к числу - арифметика.

Для выполнения таких операций, как конкатенация (например, 1 + px) или интерполяция (например, #{1}px), будет создана только строка, которая выглядит как число. Даже если вы абсолютно уверены на 100%, что никогда не будете использовать свое значение в другой арифметической операции, вы не должны этого делать.

Более важно, чем неспособность выполнять арифметические операции, вы не сможете использовать их с другими функциями, которые ожидают число:

$foo: 1; // a number
$foo-percent: $foo + '%'; // a string

.bar {
    color: darken(blue, $foo-percent); //Error: "1%" is not a number!
}

$ сумму: "1%" не является числом для "темнеет"

Ничего не получится, приведя ваши числа к строкам. Всегда используйте арифметику (умножение на 1 или сложение на 0), чтобы добавить единицу:

$foo: 1; // a number
$foo-percent: $foo * 1%; // still a number! //or: $foo + 0%

.bar {
    color: darken(blue, $foo-percent); //works!
}

Выход:

.bar {
  color: #0000fa;
}

Вот миксин, который я написал как часть моей библиотеки миксинов Flexbox, который захлебнется, если вы передадите строку (для тех, кто не знаком с Flexbox, оригинальная спецификация допускает только целые числа для свойства box-flex. flex: auto или flex: 30em не может быть совместимым со сравнимым свойством box-flex, чтобы миксин не беспокоился)

@mixin flex($value: 0 1 auto, $wrap: $flex-wrap-required, $legacy: $flex-legacy-enabled) {
    @if $legacy and unitless(nth($value, 1)) {
        @include legacy-flex(nth($value, 1));
    }

    @include experimental(flex, $value, flex-support-common()...);
}

@mixin legacy-flex($value: 0) {
    @include experimental(box-flex, $value, $box-support...);
}

Ответ 2

Вы можете попробовать любой из них:

font-size: $size * 1px;

или

font-size: $size + unquote("px");

Где $size - результат вашего расчета.

Ответ 3

Выберите метод, который вы предпочитаете

$font: 24px;
$base: 16px;

Без переменных

.item1 { font-size: #{(24px / 16px)}em; }

Использование только переменных

.item2 { font-size: #{$font / $base}em; }

Одна переменная

.item3 { font-size: #{$font / 16px}em; }
.item4 { font-size: #{24px / $base}em; }

Выход для всех них

.item1 { font-size: 1.5em; }
.item2 { font-size: 1.5em; }
.item3 { font-size: 1.5em; }
.item4 { font-size: 1.5em; }

Используемый метод называется интерполяцией # {}

Ответ 4

Я предполагаю, что вы спрашиваете об этом, потому что в окружающем контексте 1 em = 16 px, и вы хотите использовать это отношение для преобразования целевого размера шрифта из пикселей в ems.

Если это так, то нужно сделать следующее: умножить размер шрифта на коэффициент масштабирования 1em/16px, например:

$h1-font-size: 24px;
$body-font-size: 16px;

$body-em-scale: 1em / $body-font-size;

h1 {
  font-size: $h1-font-size * $body-em-scale;  // -> 1.5em
}

или просто:

h1 {
  font-size: $h1-font-size * (1em / $body-font-size);  // -> 1.5em
}

Именно так оно и работает в физике: если есть, скажем, 50 родинки воды, и вы хотите знать, сколько который весит gram, вы умножаете количество воды, которую вы имеете (= 50 моль), с молярная масса воды (& около 18 г/моль), чтобы выяснить, что ваш образец воды весит 50 молей и раз; 18 г/моль & прим. 900 граммов. Преобразование пикселей в ems в SASS работает точно так же: сначала узнайте, сколько ems есть на пиксель, в контексте, в котором вы собираетесь использовать правило, а затем умножьте размер в px с этим соотношением, выраженный в единицах em/пикс.


Ps. Конечно, если единицы, которые вы конвертировали между собой, имели фиксированный коэффициент, о котором SASS уже знал, тогда вы можете просто позволить ему делать автоматическое преобразование для вас, используя "ноль плюс трюк". Например, если вы хотите преобразовать размер шрифта из px в cm, вы можете просто сделать:

h1 {
  font-size: 0cm + $h1-font-size;  // -> 0.635cm
}

Это работает, потому что SASS позволяет вам объединить два значения, указанные в совместимых единицах (например, px и cm), и будет выражать результат в тех же единицах, что и первое значение в сумме. Причина, по которой этот трюк не работает для px → em, заключается в том, что здесь коэффициент преобразования не фиксирован, но зависит от окружающего контекста, и поэтому SASS не знает, как сделать преобразование автоматически.

Ответ 5

Лучший способ добавить юнит - это использовать ... * 1em или ... + 0em где em - юнит, который вы хотите получить:

font-size: (24px/16px) + 0em; // ... + 0px for px
//or
font-size: (24px/16px) * 1em; 
//both produce: font-size: 1.5em;

Таким образом, он останется как число, так что вы можете использовать его в математических операциях или других функциях.

Но если вы хотите получить результат в виде строки или по каким-то причинам не заботиться о числовом значении результата, вы также можете просто получить его следующим образом:

font-size: (24px/16px) + em; //font-size: 1.5em; //em does not include quotations

нет необходимости использовать unquote или #{} здесь (как написано в других ответах)!