Biến Sass trong hàm CSS calc ()


1346

Tôi đang cố gắng sử dụng calc()chức năng trong biểu định kiểu Sass, nhưng tôi gặp một số vấn đề. Đây là mã của tôi:

$body_padding: 50px

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

Nếu tôi sử dụng nghĩa đen 50pxthay vì body_paddingbiến của tôi , tôi sẽ nhận được chính xác những gì tôi muốn. Tuy nhiên, khi tôi chuyển sang biến, đây là đầu ra:

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

Làm cách nào để Sass nhận ra rằng nó cần thay thế biến trong calchàm?


10
bản sao có thể có của Hoa Kỳ một biến trong Mixin
cimmanon

19
@ user3705055 Bạn không cần calc vì Sass không thể tính toán 100% - 50px vì các đơn vị khác nhau. Điều này chỉ có thể được tính toán bởi trình duyệt, một khi nó biết container lớn đến mức nào để chuyển đổi 100% thành px trước khi thêm các giá trị. Đây là lý do chính xác tại sao calc tồn tại.
Mog0

Câu trả lời:


2544

Nội suy :

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

Trong trường hợp này, hộp viền cũng đủ:

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

3
box-sizing: border-box;Tất nhiên, đó sẽ là con đường lý tưởng để đi. Nói chung, mô hình kích thước hộp sẽ làm cho
Brandito

Cảm ơn nhiều! Tôi chuẩn bị đi theo con đường css vớicalc(100% - var(--body_padding))
Sylar

51

Để sử dụng $variablesbên trong calc()tài sản chiều cao của bạn :

HTML:

<div></div>

SCSS:

$a: 4em;

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

11
Điều này thêm gì vào câu trả lời được chấp nhận từ gần 5 năm trước?
Random_user_name

6
Vì một số lý do, tôi thấy câu trả lời này rõ ràng hơn. Tôi không làm nhiều công việc scss, vì vậy điều này "đơn giản" hơn và dễ hiểu hơn đối với tôi.
2b77bee6-5445-4c77-b1eb-4df3e5

4
Đây chắc chắn là một câu trả lời rõ ràng hơn so với chấp nhận. 'Nội suy:' không có ý nghĩa gì với tôi.
Jacques Mathieu

3
@JacquesMathieu sass-lang.com/documentation/interpolation - Nếu nó không có ý nghĩa gì với bạn và đó là một câu trả lời với rất nhiều phiếu bầu, có lẽ bạn nên hiểu những gì ồn ào. Chỉ hai xu của tôi ...
A. Chiesa

1
@A. Chiesa chắc chắn, điều đó xác định nội suy. Tuy nhiên, OP và tôi không biết nội suy trong SASS, nếu không thì câu hỏi này sẽ không bao giờ được hỏi. Do đó, chỉ cần nói một từ người ta có thể chưa bao giờ nghe trước đây mà không có định nghĩa hoặc bất kỳ giả vờ nào không hỗ trợ trong việc tạo ra một câu trả lời bao gồm tất cả. Liên kết đó chắc chắn là hữu ích mặc dù. Sẽ rất tốt để thấy rằng trên câu trả lời được chấp nhận.
Jacques Mathieu

9

Mặc dù nó không liên quan trực tiếp. Nhưng tôi thấy rằng mã CALC sẽ không hoạt động nếu bạn không đặt dấu cách đúng cách.

Vì vậy, điều này đã không làm việc cho tôi calc(#{$a}+7px)

Nhưng điều này đã làm việc calc(#{$a} + 7px)

Đã cho tôi đôi khi để tìm ra điều này.


2

Tôi đã thử điều này sau đó tôi đã khắc phục vấn đề của tôi. Nó sẽ tự động tính toán tất cả các điểm dừng phương tiện theo tỷ lệ nhất định (kích thước cơ sở / tỷ lệ kích thước)


$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

Đây là một giải pháp thực sự đơn giản sử dụng SASS / SCSS và kiểu công thức toán học:

/* 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; }

Để kết luận, tôi đề nghị bạn nên hiểu transform-origin, rotate()skew():

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


-2

bạn có thể sử dụng lời nói của bạn #{your verbal}


3
Đây dường như là một câu trả lời lạ. Tôi giả sử bạn có ý variablenhưng cho rằng OP biết biến là gì (họ chỉ định $body_paddingtrong mã của họ) câu trả lời của bạn thêm gì?
Mike Poole

Tôi đã đưa ra câu trả lời
Girraj

-6

Thử cái này:

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

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

3
Làm thế nào là tốt hơn so với câu trả lời được chấp nhận ở trên? Nó thậm chí dường như không làm điều tương tự ...?
Jules
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.