Sass tính phần trăm trừ px


133

Tôi muốn có thể làm như sau:

height: 25% - 5px;

Rõ ràng khi tôi làm điều đó tôi nhận được lỗi:

Incompatible units: 'px' and '%'.

Tôi nhận được Invalid property valuelỗi. Trong mọi trình duyệt bao gồm bản dựng Canary của Chrome.
Mike Fielden

Nếu có chức năng Sass giúp tôi có được thứ mà tôi muốn thì thật tuyệt, tôi chỉ chơi với calc...
Mike Fielden

Có :) Giống như tôi đã nói Tôi không quan tâm làm thế nào nó được thực hiện calclà tôi đã đi trước và nó không hoạt động. Có vẻ như nó calckhông hoạt động trong bất kỳ trình duyệt nào của tôi, vì vậy việc triển khai sass sẽ là tốt nhất tôi đoán.
Mike Fielden

1
Sass không thể hoạt động như một polyfill cho calc (). Nó không biết cách chuyển đổi 25% thành px để nó có thể thực hiện phép toán và tạo CSS. Tùy thuộc vào nhu cầu chính xác của bạn, có thể có một giải pháp thay thế, chẳng hạn như sử dụng họ bảng hiển thị, thay đổi kích thước hộp của bạn hoặc sử dụng lề âm ( jsfiddle.net/5JZGt )
cimmanon

Câu trả lời:


239

Sass không thể thực hiện số học trên các giá trị không thể chuyển đổi từ đơn vị này sang đơn vị tiếp theo. Sass không có cách nào để biết chính xác "100%" rộng bao nhiêu về mặt pixel hay bất kỳ đơn vị nào khác. Đó là điều mà chỉ trình duyệt mới biết.

Bạn cần sử dụng calc()thay thế. Kiểm tra tính tương thích của trình duyệt trên Tôi có thể sử dụng ...

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

Nếu các giá trị của bạn nằm trong các biến, bạn có thể cần sử dụng phép nội suy biến chúng thành các chuỗi (nếu không Sass chỉ cố gắng thực hiện số học):

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

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

5
Tôi muốn nói rằng calc () hoàn toàn không hoạt động trong hầu hết các trình duyệt. Các nền tảng di động cũng quan trọng như máy tính để bàn.
dopedard 7/213

3
Không có đối số ở đó, nhưng đếm các trình duyệt! Nhiều hỗ trợ calc () hơn không, và thậm chí nhiều hơn sẽ hỗ trợ nó trong tương lai gần!
chrisgonzalez

5
Tôi đã gặp vấn đề về chiều rộng khi sử dụng một biến bên trong các hàm calc, nhưng được tìm thấy ở đây: stackoverflow.com/questions/13542164/. Tôi có thể tham chiếu biến như thế này : calc(25% - #{$var}).
mlunoe

Để theo dõi tuyên bố của @ dasmard, về các trình duyệt được phát hành, hiện có, calc không hoạt động nhiều hơn so với hoạt động. Xem: caniuse.com/#search=calc
bắt đầu từ

3
Bạn luôn có thể sử dụng tùy chọn quay lại bằng cách thêm width: 22%ở trên tất cả widthvớicalc
Hengjie

23

Có một calcchức năng trong cả SCSS [compile-time] và CSS [run-time]. Bạn có khả năng gọi cái trước thay vì cái sau.

Vì các lý do rõ ràng, các đơn vị trộn sẽ không hoạt động trong thời gian biên dịch, nhưng sẽ vào thời gian chạy.

Bạn có thể buộc cái sau bằng cách sử dụng unquotehàm SCSS.

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

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

2
Cảm ơn bạn đã gửi câu trả lời cho câu hỏi này! Các câu trả lời chỉ dành cho mã không được khuyến khích trên Stack Overflow, bởi vì một đoạn mã không có ngữ cảnh không giải thích được cách thức hoặc lý do giải pháp sẽ hoạt động, khiến người đăng ban đầu (hoặc bất kỳ độc giả tương lai nào) khó hiểu logic đằng sau nó. Xin vui lòng, chỉnh sửa câu hỏi của bạn và bao gồm một lời giải thích về mã của bạn để người khác có thể hưởng lợi từ câu trả lời của bạn. Cảm ơn!
Maximillian Laumeister

Điều đó đã cứu tôi. width: unquote ("calc (100% - # {$ leftnav-width})");
httpete

5

NẾU bạn biết chiều rộng của container, bạn có thể làm như thế này:

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

Tôi biết rằng trong nhiều trường hợp, #container có thể có chiều rộng tương đối. Sau đó, điều này sẽ không làm việc.


2

Xin lỗi vì đã phục hồi chủ đề cũ - Độ căng của la bàn với: sau bộ chọn giả có thể phù hợp với mục đích của bạn - ví dụ: nếu bạn muốn div lấp đầy chiều rộng từ trái sang (50% + 10px) màn hình bạn có thể sử dụng (theo cú pháp thụt lề SASS):

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

Phần tử: sau khi lấp đầy 50% ở bên phải .example (để lại 50% khả dụng cho chiều rộng của .example), sau đó .example được kéo dài đến chiều rộng đó cộng thêm 10px.


1
Có một ít hoặc sass trộn cho điều này ở đâu đó? calc dường như không hoạt động rất tốt
v3nt

0

Chỉ cần thêm giá trị phần trăm vào một biến và sử dụng #{$variable} ví dụ

$twentyFivePercent:25%;
.selector {
    height: calc(#{$twentyFivePercent} - 5px);
}
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.