@property: cung cấp siêu năng lực cho các biến CSS

CSS Houdini là một thuật ngữ bao quát một tập hợp các API cấp thấp hiển thị các phần của công cụ kết xuất CSS, đồng thời cho phép nhà phát triển truy cập vào Mô hình đối tượng CSS. Đây là một thay đổi lớn đối với hệ sinh thái CSS, vì nó cho phép các nhà phát triển cho trình duyệt biết cách đọc và phân tích cú pháp CSS tuỳ chỉnh mà không cần chờ các nhà cung cấp trình duyệt cung cấp tính năng hỗ trợ tích hợp cho các tính năng này. Thú vị quá!

Một trong những tính năng bổ sung thú vị nhất cho CSS trong ô Houdini là Properties and Values API.

API này tăng cường các thuộc tính tuỳ chỉnh CSS của bạn (còn gọi là biến CSS) bằng cách cung cấp cho các thuộc tính đó ý nghĩa ngữ nghĩa (được xác định bằng cú pháp) và thậm chí cả các giá trị dự phòng, nhờ đó có thể kiểm thử CSS.

Viết thuộc tính tùy chỉnh Houdini

Dưới đây là ví dụ về cách đặt một thuộc tính tuỳ chỉnh (ví dụ: biến CSS). Tuy nhiên, giờ đây, bạn có thể sử dụng cú pháp (loại), giá trị ban đầu (dự phòng) và boolean kế thừa (thuộc tính này có kế thừa giá trị của thuộc tính mẹ hay không?). Hiện tại, bạn có thể thực hiện việc này thông qua CSS.registerProperty() trong JavaScript, nhưng trong các trình duyệt hỗ trợ, bạn có thể sử dụng @property:

Tệp JavaScript riêng biệt (Chromium 78)
CSS.registerProperty({
  name: '--colorPrimary',
  syntax: '',
  initialValue: 'magenta',
  inherits: false
});
Có trong tệp CSS (Chromium 85)
@property --colorPrimary {
  syntax: '';
  initial-value: magenta;
  inherits: false;
}

Giờ đây, bạn có thể truy cập vào --colorPrimary như mọi thuộc tính tuỳ chỉnh CSS khác thông qua var(--colorPrimary). Tuy nhiên, sự khác biệt ở đây là --colorPrimary không chỉ được đọc dưới dạng chuỗi. Ứng dụng này có dữ liệu!

Giá trị dự phòng

Giống như mọi thuộc tính tuỳ chỉnh khác, bạn có thể nhận (bằng cách sử dụng var) hoặc đặt (ghi/ghi lại) giá trị, nhưng với các thuộc tính tuỳ chỉnh Houdini, nếu bạn đặt một giá trị falsey khi ghi đè thuộc tính đó, công cụ hiển thị CSS sẽ gửi giá trị ban đầu (giá trị dự phòng của nó) thay vì bỏ qua dòng này.

Hãy xem ví dụ dưới đây. Biến --colorPrimaryinitial-valuemagenta. Tuy nhiên, nhà phát triển đã gán giá trị không hợp lệ là "23". Nếu không có @property, trình phân tích cú pháp CSS sẽ bỏ qua mã không hợp lệ. Bây giờ, trình phân tích cú pháp sẽ quay lại sử dụng magenta. Điều này cho phép tạo bản dự phòng và kiểm thử thực sự trong CSS. Tuyệt vời!

.card {
  background-color: var(--colorPrimary); /* magenta */
}

.highlight-card {
  --colorPrimary: yellow;
  background-color: var(--colorPrimary); /* yellow */
}

.another-card {
  --colorPrimary: 23;
  background-color: var(--colorPrimary); /* magenta */
}

Cú pháp

Với tính năng cú pháp, giờ đây, bạn có thể viết CSS ngữ nghĩa bằng cách chỉ định một loại. Sau đây là các loại hình được phép hiện tại:

  • length
  • number
  • percentage
  • length-percentage
  • color
  • image
  • url
  • integer
  • angle
  • time
  • resolution
  • transform-list
  • transform-function
  • custom-ident (chuỗi giá trị nhận dạng tuỳ chỉnh)

Việc đặt cú pháp sẽ cho phép trình duyệt kiểm tra loại thuộc tính tuỳ chỉnh. Việc này có nhiều lợi ích.

Để minh hoạ cho điểm này, tôi sẽ hướng dẫn bạn cách tạo hiệu ứng chuyển màu. Hiện tại, không có cách nào để tạo ảnh động (hoặc nội suy) một cách suôn sẻ giữa các giá trị chuyển màu, vì mỗi nội dung khai báo chuyển màu được phân tích cú pháp dưới dạng một chuỗi.

Sử dụng thuộc tính tuỳ chỉnh có cú pháp "số", độ dốc ở bên trái cho thấy quá trình chuyển đổi suôn sẻ giữa các giá trị dừng. Dải chuyển màu ở bên phải sử dụng một thuộc tính tuỳ chỉnh mặc định (không xác định cú pháp) và hiển thị sự chuyển đổi đột ngột.

Trong ví dụ này, tỷ lệ phần trăm dừng chuyển màu sẽ được tạo ảnh động từ giá trị bắt đầu là 40% đến giá trị kết thúc là 100% thông qua tương tác di chuột. Bạn sẽ thấy sự chuyển đổi mượt mà của màu chuyển màu trên cùng xuống dưới.

Trình duyệt ở bên trái hỗ trợ Houdini Properties and Values API (API Giá trị và thuộc tính Houdini), cho phép chuyển đổi điểm chuyển màu mượt mà. Trình duyệt bên phải thì không. Trình duyệt không hỗ trợ chỉ có thể hiểu thay đổi này dưới dạng một chuỗi đi từ điểm A đến điểm B. Không có cơ hội để nội suy các giá trị và do đó, bạn sẽ không thấy quá trình chuyển đổi suôn sẻ đó.

Tuy nhiên, nếu khai báo loại cú pháp khi viết thuộc tính tuỳ chỉnh, sau đó sử dụng các thuộc tính tuỳ chỉnh đó để bật ảnh động, thì bạn sẽ thấy hiệu ứng chuyển đổi. Bạn có thể tạo thực thể cho thuộc tính tuỳ chỉnh --gradPoint như sau:

/* Check for Houdini support & register property */
@supports (background: paint(something)) {
  @property --gradPoint {
    syntax: '<percentage>';
    inherits: false;
    initial-value: 40%;
  }
}

Sau đó, đến lúc tạo ảnh động, bạn có thể cập nhật giá trị từ 40% ban đầu thành 100%:

@supports (background: paint(something)) {
  .post:hover,
  .post:focus {
    --gradPoint: 100%;
  }
}

Bây giờ, thao tác này sẽ bật hiệu ứng chuyển đổi chuyển màu mượt mà.

Chuyển đổi đường viền chuyển màu mượt mà. Xem bản minh hoạ về sự cố nhiễu

Kết luận

Quy tắc @property giúp một công nghệ thú vị dễ tiếp cận hơn nữa bằng cách cho phép bạn viết CSS có ý nghĩa về mặt ngữ nghĩa trong chính CSS. Để tìm hiểu thêm về CSS Houdini cũng như API Thuộc tính và giá trị, hãy tham khảo các tài nguyên sau:

Ảnh chụp của Cristian Escobar trên Unsplash.