2014-12-22 43 views

Trả lời

13

Có thể sử dụng calc() bên trong một hàm calc() khác.

Một ví dụ:

div{ 
    width: calc(100% - (1% + 30px));/* calc(1% + 30px) is nested inside calc()*/ 
} 
div p{ 
    width: calc(100% - 30px);/*100% is total width of the div*/ 
} 

Cập nhật trên nested calc với các biến css:

.foo { 
    --widthA: 100px; 
    --widthB: calc(var(--widthA)/2); 
    --widthC: calc(var(--widthB)/2); 
    width: var(--widthC); 
} 

Sau khi tất cả các biến được mở rộng, giá trị widthC sẽ là calc (calc (100px/2)/2), sau đó khi nó được gán cho thuộc tính chiều rộng của .foo, tất cả calc bên trong() s (không có vấn đề như thế nào de eply lồng nhau) sẽ được làm phẳng thành chỉ dấu ngoặc đơn, do đó, giá trị của thuộc tính chiều rộng sẽ cuối cùng là calc ((100px/2)/2), tức là 25px. Trong ngắn hạn: một calc() bên trong của một calc() là giống hệt nhau chỉ là dấu ngoặc đơn.

Vì vậy, thông số hiện tại cũng chứng minh điều này bằng cách sử dụng dấu ngoặc đơn bên trong calc() là lồng nhau calc.

Tìm hiểu thêm về biến css here.

+0

Thats for the reply. Tôi thấy bạn đang sử dụng chỉ một hàm calc. Câu hỏi của tôi là làm thế nào để sử dụng một calc Bên trong một hàm calc khác. –

+3

(1% + 30px) là calc lồng nhau bên trong calc .... –

+2

Đó không phải là những gì được hỏi. – vsync

7

Tham chiếu bạn trích dẫn được thừa nhận là hơi khó hiểu.

Đó là không thể sử dụng một hàm calc bên calc khác.

Từ thông số kỹ thuật ở đây: http://dev.w3.org/csswg/css-values/#calc-notation

... Các thành phần của một biểu thức calc() có thể là các giá trị văn chương, attr() hoặc calc() biểu thức, hoặc giá trị ..

Bạn có thể có biểu thức calc bên trong các biểu thức, nhưng không phải là chính hàm calc().

Và một ví dụ được đưa ra trong đó ref cho các biểu thức lồng nhau:

width: calc(100%/3 - 2*1em - 2*1px); 

Và cũng cho nhiều calc cho nhiều thuộc tính:

margin: calc(1rem - 2px) calc(1rem - 1px); 

Cú pháp từ spec trên:

Cú pháp của hàm calc() là:

<calc()> = calc(<calc-sum>) 
<calc-sum> = <calc-product> [ [ '+' | '-' ] <calc-product> ]* 
<calc-product> = <calc-value> [ '*' <calc-value> | '/' <number> ]* 
<calc-value> = <number> | <dimension> | <percentage> | (<calc-sum>) 

Trường hợp kích thước < > là thứ nguyên.

Ngoài ra, khoảng trắng là bắt buộc trên cả hai mặt của toán tử + và - . (* Và/operaters có thể được sử dụng mà không có khoảng trắng xung quanh.)

UAs phải hỗ trợ biểu thức calc() ít nhất 20 cụm, trong đó mỗi NUMBER, DIMENSION hoặc PERCENTAGE là một thuật ngữ. Nếu biểu thức calc() chứa nhiều hơn số lượng cụm từ được hỗ trợ, nó phải được xử lý như thể nó không hợp lệ.

.

+0

Tôi nghĩ nó đã lỗi thời. Bản sửa đổi ngữ pháp năm ngoái đã gợi ý rằng bạn có thể thực sự tổ chức các cuộc gọi hàm 'calc()': http://www.w3.org/TR/css3-values/#calc-syntax Tất nhiên, đó là năm ngoái. Tôi không biết liệu nó có được thực hiện theo cách đó hay không. – BoltClock

+0

@BoltClock: Thông số bạn đã liên kết là từ ngày 30 tháng 7 năm 2013. Thông số mà tôi liên kết là "dev" của ngày 19 tháng 12 năm 2014. Vì vậy, tôi nghĩ rằng các tài liệu tham khảo chính xác sẽ được các spec bạn liên kết đến. Nhưng, ngay cả điều đó không nói rằng 'calc' có thể được lồng nhau. Có lẽ tôi không nhìn chăm chỉ! – Abhitalks

+0

Bạn có thể thấy sản phẩm 'calc' được lồng trong một sản phẩm khác ... được lồng trong sản xuất' calc'. Dù sao, nó chỉ ra rằng việc triển khai thực hiện theo những gì trong ED vì vậy tôi nghĩ rằng họ chỉ thay đổi spec để phù hợp. – BoltClock

19

Tôi là một trong những người chỉnh sửa Giá trị & Thông số đơn vị, xác định calc().

calc() nên có thể lồng vào bên trong calc(). Có một sự giám sát trong ngữ pháp/định nghĩa trong một thời gian mà về mặt kỹ thuật không cho phép điều đó, nhưng gần đây tôi đã khắc phục điều đó. Triển khai chưa bắt kịp, với kiến ​​thức của tôi (tho nó trông giống như Chrome 51 và Firefox 48 sẽ có sự cố định này, woo!).

Điều đó nói rằng, có không lý do để lồng biểu thức calc() bình thường - chúng là giống hệt nhau chỉ bằng cách sử dụng dấu ngoặc đơn. Lý do duy nhất để làm điều đó là khi sử dụng các thuộc tính/biến tùy chỉnh.

+0

Xin chào Tab! Hãy lưu ý rằng về thời gian bạn đã viết điều này, việc sửa chữa cho điều này đã hạ cánh trong Blink. Nó cũng được sửa trong Gecko trước đó. Tôi đoán bạn đã được tham gia với cả hai bản sửa lỗi, anyway nhờ đó, tôi cần nó (cho các thuộc tính tùy chỉnh;)). Vì vậy, bản sửa lỗi sẽ có trong Chromium 51, Opera 38 và Firefox 48. –

+0

Vẫn không hoạt động trong Safari 10.0. – elliottregan

Các vấn đề liên quan