Sass Variable у CSS функції calc ()


1343

Я намагаюся використовувати calc()функцію в таблиці стилів Sass, але у мене виникають деякі проблеми. Ось мій код:

$body_padding: 50px

body
    padding-top: $body_padding
    height: calc(100% - $body_padding)

Якщо я використовую літерал 50pxзамість своєї body_paddingзмінної, я отримую саме те, що хочу. Однак, коли я переключаюсь на змінну, це вихід:

body {
    padding-top: 50px;
    height: calc(100% - $body_padding); }

Як я можу змусити Sass визнати, що йому потрібно замінити змінну в межах calcфункції?


10
можливий дублікат Usa a Variable in Mixin
cimmanon

19
@ user3705055 Вам потрібен calc, оскільки Sass не може обчислити 100% - 50px, оскільки одиниці різні. Це може обчислити лише браузер, як тільки він дізнається, наскільки великий контейнер, щоб перетворити 100% у px, перш ніж додавати значення. Це саме причина існування кальцію.
Mog0

Відповіді:


2541

Інтерполяція :

body
    height: calc(100% - #{$body_padding})

У цьому випадку також вистачить прикордонної коробки :

body
    box-sizing: border-box
    height: 100%
    padding-top: $body_padding

3
box-sizing: border-box;було б ідеальним шляхом, на мою думку, звичайно. Загалом, модель розміру коробки повинна становити т
Brandito

Дуже дякую! Я збирався йти по шляху з допомогою CSScalc(100% - var(--body_padding))
Sylar

51

Для використання $variablesвсередині вашого calc()властивості висоти:

HTML:

<div></div>

SCSS:

$a: 4em;

div {
  height: calc(#{$a} + 7px);
  background: #e53b2c;
}

11
Що це додає до прийнятої відповіді майже 5 років тому?
random_user_name

6
Чомусь я вважаю цю відповідь зрозумілішою. Я не займаюся великою роботою scss, тому це було "простіше" і мені було легше зрозуміти.
2b77bee6-5445-4c77-b1eb-4df3e5

4
Це, безумовно, більш чітка відповідь, ніж прийнята. "Інтерполят:" для мене нічого не означав.
Жак Матьє

3
@JacquesMathieu sass-lang.com/documentation/interpolation - Якщо це для вас нічого не означає, і це відповідь з такою кількістю голосів, напевно, ви повинні зрозуміти, у чому суєта. Всього два мої центи ...
А. Chiesa

1
@A. Chiesa впевнений, що визначає інтерполяцію. Однак ОП і я не знали про інтерполяцію в SASS, інакше цього питання ніколи не задавали б. Таким чином, лише висловлювання слова, яке ви, можливо, ніколи не чули раніше без визначення або будь-яка претензія не допомагає створити всеохоплюючу відповідь. Це посилання, безумовно, корисно, хоча. Було б приємно бачити це на прийнятій відповіді.
Жак Матьє

9

Незважаючи на те, що це не пов'язане безпосередньо. Але я виявив, що код CALC не буде працювати, якщо ви не розмістите пробіли належним чином.

Тож це для мене не вийшло calc(#{$a}+7px)

Але це спрацювало calc(#{$a} + 7px)

Взяв мене колись, щоб зрозуміти це.


2

Я спробував це, тоді я вирішив свою проблему. Він автоматично обчислює всі медіа-точки перерви за заданою швидкістю (базовий розмір / розмір ставки)


$base-size: 16;
$rate-size-xl: 24;

    // set default size for all cases;
    :root {
      --size: #{$base-size};
    }

    // if it's smaller then LG it will set size rate to 16/16;
    // example: if size set to 14px, it will be 14px * 16 / 16 = 14px
    @include media-breakpoint-down(lg) {
      :root {
        --size: #{$base-size};
      }
    }

    // if it is bigger then XL it will set size rate to 24/16;
    // example: if size set to 14px, it will be 14px * 24 / 16 = 21px
    @include media-breakpoint-up(xl) {
      :root {
        --size: #{$rate-size-xl};
      }
    }

@function size($px) {
   @return calc(#{$px} / $base-size * var(--size));
}

div {
  font-size: size(14px);
  width: size(150px);
}

0

Ось дійсно просте рішення з використанням SASS / SCSS та стилю математичної формули:

/* frame circle */
.container {
    position: relative;
    border-radius: 50%;
    background-color: white;
    overflow: hidden;
    width: 400px;
    height: 400px; }

/* circle sectors */
.menu-frame-sector {
    position: absolute;
    width: 50%;
    height: 50%;
    z-index: 10000;
    transform-origin: 100% 100%;
  }

$sector_count: 8;
$sector_width: 360deg / $sector_count;

.sec0 {
    transform: rotate(0 * $sector_width) skew($sector_width);
    background-color: red; }
.sec1 {
    transform: rotate(1 * $sector_width) skew($sector_width);
    background-color: blue; }
.sec2 {
    transform: rotate(2 * $sector_width) skew($sector_width);
    background-color: red; }
.sec3 {
    transform: rotate(3 * $sector_width) skew($sector_width);
    background-color: blue; }
.sec4 {
    transform: rotate(4 * $sector_width) skew($sector_width);
    background-color: red; }
.sec5 {
    transform: rotate(5 * $sector_width) skew($sector_width);
    background-color: blue; }
.sec6 {
    transform: rotate(6 * $sector_width) skew($sector_width);
    background-color: red; }
.sec7 {
    transform: rotate(7 * $sector_width) skew($sector_width);
    background-color: blue; }

На закінчення, я настійно рекомендую , щоб ви зрозуміли transform-origin, rotate()і skew():

https://tympanus.net/codrops/2013/08/09/building-a-circular-navigation-with-css-transforms/


-2

ви можете використовувати своє словесне #{your verbal}


3
Це здається дивною відповіддю. Я припускаю, що ви маєте на увазі, variableале враховуючи, що ОП знає, що таке змінна (вони вказані $body_paddingу своєму коді), що додає ваша відповідь?
Майк Пул

Я маю відповідь
Girraj

-6

Спробуйте це:

@mixin heightBox($body_padding){
   height: calc(100% - $body_padding);
}

body{
   @include heightBox(100% - 25%);
   box-sizing: border-box
   padding:10px;
}

3
Чим це краще, ніж прийнята відповідь вище? Це навіть не здається зробити те саме ...?
Жуль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.