Sass обчислюють відсотки мінус px


133

Я хочу вміти робити наступне:

height: 25% - 5px;

Очевидно, коли я це роблю, я отримую помилку:

Incompatible units: 'px' and '%'.

Я отримую Invalid property valueпомилку. У кожному веб-переглядачі, включаючи збірку Canary Chrome.
Майк Філден

Якщо є функція Sass, яка отримає мені те, що я хочу, це здорово, я просто грав з calc...
Майком Філден

Так :) Як я сказав, мені все одно, як це робиться calc, якщо я пішов першим, і це не працювало. Схоже, це calcне працює в будь-якому моєму браузері, тому найкраще я б здогадався про реалізацію sass.
Майк Філден

1
Sass не може виконувати роль поліфункції для calc (). Він не знає, як конвертувати 25% у px, щоб він міг робити математику та генерувати CSS. Залежно від ваших точних потреб, може бути альтернатива, наприклад, використання сімейства таблиць дисплеїв, зміна розміру коробки або використання негативних націнок ( jsfiddle.net/5JZGt )
cimmanon

Відповіді:


239

Sass не може виконувати арифметику на значеннях, які неможливо перетворити з однієї одиниці на іншу. Sass не може точно знати, наскільки широкий "100%" у відношенні пікселів чи будь-якого іншого пристрою. Це те, що лише браузер знає.

Вам потрібно використовувати calc()замість цього. Перевірити сумісність браузера на Чи можу я використовувати ...

.foo {
    height: calc(25% - 5px);
}

Якщо ваші значення знаходяться в змінних, можливо, вам доведеться використовувати інтерполяцію, щоб перетворити їх у рядки (інакше Sass просто намагається виконати арифметику):

$a: 25%;
$b: 5px;

.foo {
  width: calc(#{$a} - #{$b});
}

5
Я б сказав, що calc () зовсім не працює в більшості браузерів. Мобільні платформи так само важливі, як і настільні.
далгард

3
Ніяких аргументів немає, але порахуйте браузери! Більше підтримка calc (), ніж ні, і ще більше підтримає його найближчим часом!
chrisgonzalez

5
Я мав проблеми ширини , використовуючи змінну всередині функції вапняно, але тут: stackoverflow.com/questions/13542164 / ... , що я міг би посилатися на змінну , як це: calc(25% - #{$var}).
mlunoe

Для того, щоб стежити за @ заяву Dalgard в, з точки зору існуючих, випущеному браузерів, вапняно не працює в більш ніж працює Дивіться :. Caniuse.com/#search=calc
imjared

3
Ви завжди можете скористатися опцією відкидання, додавши, width: 22%перш за все, widthсcalc
Hengjie

23

Існує calcфункція і в SCSS [час компіляції], і в CSS [час виконання]. Ви, ймовірно, посилаєтесь на першу замість останньої.

Зі зрозумілих причин змішування блоків не працюватиме час компіляції, але працюватиме під час виконання.

Ви можете примусити останнє за допомогою unquoteфункції SCSS.

.selector { height: unquote("-webkit-calc(100% - 40px)"); }

14
$var:25%;
$foo:5px;
.selector {
    height:unquote("calc( #{$var} - #{$foo} )");
}

2
Дякуємо, що опублікували відповідь на це запитання! Відповіді, що стосуються лише коду, відмовляються від переповнення стека, оскільки дамп коду без контексту не пояснює, як і чому це рішення буде працювати, що ускладнює оригінальному плакату (або будь-яким майбутнім читачам) зрозуміти логіку, що стоїть за ним. Відредагуйте своє запитання та додайте пояснення свого коду, щоб інші могли отримати користь від вашої відповіді. Дякую!
Maximillian Laumeister

Це врятувало мене. width: unquote ("calc (100% - # {$ leftnav-width})");
httpete

5

Якщо ви знаєте ширину контейнера, ви можете зробити так:

#container
  width: #{200}px
  #element
    width: #{(0.25 * 200) - 5}px

Я знаю, що у багатьох випадках #container може мати відносну ширину. Тоді це не спрацювало б.


2

Вибачте за відродження старої нитки - Натягнення компаса з: після псевдоселектора може відповідати вашим цілям - наприклад. якщо ви хочете, щоб div заповнив ширину зліва на (50% + 10 пікселів) екрана, який ви можете використовувати (у синтаксисі з відступом SASS):

.example
    background: red
    +stretch(0, -10px, 0, 0)
    &:after
        +stretch(0, 0, 0, 50%)
        content: ' '
        background: blue

Елемент: після заповнення 50% праворуч від .example (залишаючи 50% доступним для ширини .example), тоді .example розтягується на цю ширину плюс 10 px.


1
чи є для цього десь мішання або гасіння? calc, здається, не працює дуже добре.
v3nt

0

Просто додайте значення відсотка в змінну і використовуйте, #{$variable} наприклад

$twentyFivePercent:25%;
.selector {
    height: calc(#{$twentyFivePercent} - 5px);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.