Menu

calc() trong CSS: kết hợp đơn vị, quy tắc cú pháp và ví dụ

calc() cho phép bạn tính toán ngay trong CSS và kết hợp nhiều đơn vị, như 100% trừ đi thanh bên cố định 200px. Tìm hiểu quy tắc cú pháp (khoảng trắng rất quan trọng), calc() với biến CSS, các bố cục phổ biến mà nó giải quyết, và vì sao calc() không hợp lệ bị bỏ qua mà không báo lỗi.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

calc() làm gì

calc() thực hiện phép tính bên trong một giá trị CSS, và có thể kết hợp những đơn vị chỉ có kích thước cụ thể lúc dàn trang. Trường hợp kinh điển là "toàn bộ chiều rộng trừ đi thanh bên cố định":

100% chỉ biết được khi trang đã dàn xong, còn 180px là cố định, nên không có đơn vị đơn lẻ nào diễn đạt được điều này. calc() tính giúp bạn: trong bản xem trước rộng 800px, hàng rộng 784px và cột chính được 604px, và dòng bên dưới bố cục in ra các con số thật. Ngày nay flexbox hoặc grid làm được bố cục này mà không cần tính toán, nhưng phép trừ tương tự vẫn xuất hiện ở khắp nơi: chiều cao trừ header, chiều rộng trừ khoảng cách.

Quy tắc cú pháp

width: calc(100% - 2rem);          /* + and - need spaces on both sides */
width: calc(100% / 3);             /* divide by a plain number */
margin: calc(var(--space) * 2);    /* multiply by a plain number */
height: calc(100vh - (64px + 1rem)); /* parentheses group */
Quy tắcHợp lệKhông hợp lệ
Khoảng trắng quanh + và -calc(100% - 20px)calc(100%-20px)
*: ít nhất một vế là số thuầncalc(2 * 1rem)calc(2px * 3px)
/: chia một độ dài cho một số thuầncalc(100% / 3)width: calc(300px / 3px) (không phải độ dài)
Đơn vị phải tương thíchcalc(1rem + 10px)calc(1rem + 2s)

Quy tắc khoảng trắng tồn tại vì 100% -20px sẽ bị đọc thành hai giá trị riêng, giá trị thứ hai là một số âm. Khi calc() không hợp lệ, cả khai báo bị loại bỏ và phần tử giữ nguyên giá trị nó có từ các quy tắc trước đó.

Thử một biểu thức

Gõ biểu thức bất kỳ cho chiều rộng của hộp. Trình duyệt cho biết biểu thức có hợp lệ không, và chiều rộng tính ra là bao nhiêu:

Thử 100%-200px (không hợp lệ, thiếu khoảng trắng), 100% / 3, 50% + 4rem, 2 * 120px, 200px * 2px (không hợp lệ) và (100% - 40px) / 2.

calc() với biến CSS

Biến và calc() đi đôi với nhau: lưu một giá trị gốc một lần và suy ra các giá trị còn lại từ nó. Một biến không đơn vị trở thành độ dài khi bạn nhân nó với một đơn vị:

Đổi --space thành 12px hoặc --cols thành 4 là mọi giá trị suy ra đều thay đổi theo. Trang biến CSS nói về cách khai báo biến và phạm vi của chúng.

Cách dùng phổ biến

Nhu cầucalc()
Lấp khoảng trống cạnh một phần tử cố địnhwidth: calc(100% - 240px)
Phần nằm dưới header cố địnhmin-height: calc(100vh - 64px)
Nửa chiều rộng trừ nửa khoảng cáchwidth: calc(50% - 8px)
Căn giữa hộp 100px định vị tuyệt đốileft: calc(50% - 50px)
Cỡ chữ tăng nhẹ theo màn hìnhfont-size: calc(1rem + 0.5vw)
Biến một biến số thành độ dàicalc(var(--n) * 1px)
Giá trị âm của một biếncalc(var(--space) * -1)

Với giá trị phải nằm giữa hai giới hạn, hãy dùng clamp(), hàm này nhận cùng kiểu phép tính trong các đối số mà không cần viết calc().

calc() dùng được ở đâu

Ở bất cứ chỗ nào chấp nhận độ dài, phần trăm, số, góc hoặc thời gian: width, margin, padding, top, font-size, line-height, kích thước track của grid, transition-delay, và góc bên trong transform. calc() có thể lồng nhau, và một calc() lồng bên trong tương đương với cặp ngoặc tròn thông thường.

Góc là một ví dụ hay. Mỗi vạch bên dưới có --i riêng (từ 0 đến 11), và một quy tắc duy nhất đổi nó thành góc bằng calc(var(--i) * 30deg):

Vạch số 3 nhận rotate(90deg), mà Chrome báo là ma trận matrix(0, 1, -1, 0, 0, 0): một phần tư vòng. left: calc(50% - 2px) căn giữa mỗi vạch bằng cách trừ đi một nửa chiều rộng 4px của chính nó.

Lỗi thường gặp

  • Thiếu khoảng trắng quanh - hoặc +. calc(100%-20px) không hợp lệ và bị bỏ qua.
  • Nhân hai độ dài với nhau. calc(10px * 2px) không có nghĩa trong CSS. Một vế của * phải là số thuần.
  • Dùng calc() cho chiều cao phần trăm khi phần tử cha không có chiều cao. calc(100% - 20px) cho height cần phần tử cha có chiều cao xác định, giống như height: 100%.
  • Dùng calc() ở chỗ flexbox hoặc grid làm được. width: calc(33.333% - 10px) cho các cột rất dễ vỡ; display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px không cần tính toán gì.
  • Chờ một thông báo lỗi. Trình duyệt không cảnh báo khi calc() không hợp lệ. Hãy kiểm tra phần tử trong công cụ nhà phát triển: khai báo không hợp lệ sẽ bị gạch ngang.

Câu hỏi thường gặp

calc() trong CSS dùng để làm gì?

Nó tính một giá trị từ biểu thức có +, -, * và /, và có thể kết hợp những đơn vị mà trình duyệt chỉ biết được lúc dàn trang. width: calc(100% - 200px) là toàn bộ chiều rộng phần tử cha trừ đi 200px, dù phần tử cha rộng bao nhiêu.

Vì sao calc() của tôi không hoạt động?

Nguyên nhân phổ biến nhất là thiếu khoảng trắng: + và - phải có khoảng trắng ở cả hai bên, nên calc(100%-20px) không hợp lệ. Các nguyên nhân khác là nhân hai độ dài với nhau (10px * 2px) hoặc chia cho một độ dài, kết quả không ra độ dài. calc() không hợp lệ làm cả khai báo không hợp lệ, nên trình duyệt bỏ qua nó.

Có dùng biến CSS trong calc() được không?

Có. calc(var(--gap) * 2) nhân đôi một biến, còn calc(var(--columns) * 1px) biến một số không đơn vị thành pixel. Giá trị của biến được thay vào trước, rồi mới thực hiện phép tính.

Có cần khoảng trắng quanh * và / trong calc() không?

Không. Chỉ + và - bắt buộc có khoảng trắng, vì nếu thiếu thì -20px sẽ bị đọc thành số âm. Khoảng trắng quanh * và / là tùy chọn, nhưng viết khoảng trắng ở mọi chỗ là quy tắc dễ nhớ nhất.

calc() và clamp() khác nhau thế nào?

calc() tính ra một giá trị từ biểu thức. clamp(MIN, VAL, MAX) giữ một giá trị nằm giữa hai giới hạn. Hai hàm có thể kết hợp: mỗi đối số của clamp() có thể chứa sẵn phép tính kiểu calc, như clamp(1rem, 1rem + 2vw, 3rem).

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu