Làm quen với hình dạng CSS

Bao bọc nội dung quanh đường dẫn tuỳ chỉnh

Razvan Caliman
Razvan Caliman

Trong một thời gian dài, các nhà thiết kế web đã buộc phải tạo ra trong những hạn chế của hình chữ nhật. Hầu hết nội dung trên web vẫn bị mắc kẹt trong các hộp đơn giản bởi vì hầu hết mạo hiểm sáng tạo vào bố cục không phải hình chữ nhật sẽ kết thúc với sự thất vọng. Khả năng này sẽ thay đổi khi CSS Shapes ra mắt kể từ Chrome 37. Hình dạng CSS cho phép nhà thiết kế web bao bọc nội dung quanh đường dẫn tuỳ chỉnh, như hình tròn, hình elip và đa giác, nhờ đó có thể thoát khỏi các hạn chế của hình chữ nhật.

Hình dạng có thể được xác định theo cách thủ công hoặc có thể được suy ra từ hình ảnh.

Hãy xem một ví dụ rất đơn giản.

Có lẽ bạn cũng ngây thơ như tôi khi lần đầu tiên làm nổi một hình ảnh có các phần trong suốt, hy vọng nội dung sẽ gói và lấp đầy các khoảng trống, nhưng rồi thất vọng vì hình dạng bao bọc hình chữ nhật vẫn tồn tại xung quanh phần tử. Bạn có thể sử dụng Hình dạng CSS để giải quyết vấn đề này.

Trích xuất hình dạng từ hình ảnh
<img class="element" src="image.png" />
<p>Lorem ipsum…</p>

<style>
.element{
  shape-outside: url(image.png);
  shape-image-threshold: 0.5;
  float: left;
}
</style>

Phần khai báo CSS shape-outside: url(image.png) yêu cầu trình duyệt trích xuất một hình dạng từ hình ảnh.

Thuộc tính shape-image-threshold xác định mức độ mờ tối thiểu của pixel sẽ dùng để tạo hình dạng. Giá trị của thuộc tính này phải nằm trong khoảng từ 0.0 (trong suốt hoàn toàn) đến 1.0 (mờ hoàn toàn). Vì vậy, shape-image-threshold: 0.5 có nghĩa là chỉ các pixel có độ mờ 50% trở lên mới được dùng để tạo hình dạng.

Thuộc tính float đóng vai trò quan trọng ở đây. Mặc dù thuộc tính shape-outside xác định hình dạng của vùng xung quanh nội dung sẽ bao bọc, nhưng nếu không có dấu phẩy động, thì bạn sẽ không thấy hiệu ứng của hình dạng đó.

Các phần tử có vùng nổi ở phía đối diện giá trị float của chúng. Ví dụ: nếu một phần tử có hình ảnh cốc cà phê đang được nổi ở bên trái, thì vùng nổi sẽ được tạo ở bên phải của cốc. Mặc dù bạn có thể thiết kế hình ảnh với các khoảng trống ở cả hai bên, nhưng nội dung sẽ chỉ bao quanh hình dạng ở phía đối diện được chỉ định bởi thuộc tính độ chính xác đơn, bên trái hoặc bên phải, không được bao quanh cả hai.

Trong tương lai, bạn có thể sử dụng shape-outside trên các phần tử không nổi cùng với phần Loại trừ CSS ra mắt.

Tạo hình dạng theo cách thủ công

Ngoài việc trích xuất hình dạng từ hình ảnh, bạn cũng có thể lập trình cho hình dạng đó theo cách thủ công. Bạn có thể chọn trong số một vài giá trị hàm để tạo hình dạng: circle(), ellipse(), inset()polygon(). Mỗi hàm hình dạng chấp nhận một tập hợp các toạ độ và nó đi kèm với một hộp tham chiếu để thiết lập hệ toạ độ. Vui lòng chờ để biết thêm thông tin về hộp tham chiếu.

Hàm rotation()

Hình minh hoạ giá trị hình dạng vòng tròn()

Ký hiệu đầy đủ cho giá trị hình tròn là circle(r at cx cy), trong đó r là bán kính của hình tròn, còn cxcy là các toạ độ của tâm đường tròn trên trục X và trục Y. Không bắt buộc phải có toạ độ của tâm đường tròn. Nếu bạn bỏ qua các phần tử này, tâm của phần tử (giao điểm của các đường chéo) sẽ được dùng làm giá trị mặc định.

.element{
  shape-outside: circle(50%);
  width: 300px;
  height: 300px;
  float: left;
}

Trong ví dụ trên, nội dung sẽ bao quanh bên ngoài một đường tròn. Đối số đơn 50% chỉ định bán kính của hình tròn, mà trong trường hợp cụ thể này, bán kính tương đương với một nửa chiều rộng hoặc chiều cao của phần tử. Việc thay đổi kích thước của phần tử sẽ ảnh hưởng đến bán kính của hình tròn. Đây là ví dụ cơ bản về cách CSS Shapes có thể thích ứng.

Trước khi tiếp tục, lưu ý nhỏ: bạn cần nhớ rằng Hình dạng CSS chỉ ảnh hưởng đến hình dạng của vùng nổi xung quanh một phần tử. Nếu phần tử có nền, nền đó sẽ không bị cắt theo hình dạng. Để đạt được hiệu ứng đó, bạn phải sử dụng các thuộc tính trong CSS Masking (Tạo mặt nạ CSS) clip-path hoặc mask-image. Thuộc tính clip-path rất hữu ích vì tuân theo cùng ký hiệu như Hình dạng CSS, vì vậy, bạn có thể sử dụng lại các giá trị.

Hình minh hoạ hình dạng &quot;circle()&quot; + đường dẫn đoạn video

Hình minh hoạ trong tài liệu này sử dụng tính năng cắt xén để làm nổi bật hình dạng và giúp bạn hiểu được các hiệu ứng.

Quay lại hình tròn.

Khi sử dụng tỷ lệ phần trăm cho bán kính hình tròn, giá trị thực sự được tính bằng công thức phức tạp hơn một chút: sqrt(width^2 + height^2) / sqrt(2). Việc hiểu được điều này là rất hữu ích vì nó sẽ giúp bạn hình dung hình tròn thu được sẽ như thế nào nếu kích thước của các phần tử không bằng nhau.

Bạn có thể sử dụng tất cả các loại đơn vị CSS trong toạ độ của hàm hình dạng – px, em, rem, vw, vh, v.v. Bạn có thể chọn loại đủ linh hoạt hoặc cứng theo nhu cầu của bạn.

Bạn có thể điều chỉnh vị trí của đường tròn bằng cách đặt giá trị rõ ràng cho các toạ độ của tâm đường tròn.

.element{
  shape-outside: circle(50% at 0 0);
}

Thao tác này định vị tâm vòng tròn tại gốc toạ độ của hệ toạ độ. Hệ toạ độ là gì? Đây là nơi chúng tôi giới thiệu các hộp tham chiếu.

Hộp tham chiếu cho Hình dạng CSS

Hộp tham chiếu là một hộp ảo xung quanh phần tử, có tác dụng thiết lập hệ toạ độ được dùng để vẽ và định vị hình dạng. Điểm gốc của hệ toạ độ nằm ở góc trên bên trái với trục X trỏ sang phải và trục Y chỉ xuống.

Hệ thống toạ độ cho các Hình dạng CSS

Hãy nhớ rằng shape-outside thay đổi hình dạng của vùng nổi xung quanh nội dung sẽ bao bọc. Vùng dấu phẩy động mở rộng đến các cạnh ngoài của hộp được xác định theo thuộc tính margin. Thuộc tính này được gọi là margin-box và là hộp tham chiếu mặc định cho một hình dạng nếu không có mục nào được đề cập rõ ràng.

Hai nội dung khai báo CSS sau đây có kết quả giống nhau:

.element{
  shape-outside: circle(50% at 0 0);
  /* identical to: */
  shape-outside: circle(50% at 0 0) margin-box;
}

Chúng ta chưa đặt lề cho phần tử. Tại thời điểm này, có thể giả định rằng gốc của hệ toạ độ và tâm vòng tròn nằm ở góc trên bên trái của vùng nội dung của phần tử. Điều này sẽ thay đổi khi bạn đặt lề:

.element{
  shape-outside: circle(50% at 0 0) margin-box;
  margin: 100px;
}

Điểm gốc của hệ toạ độ hiện nằm bên ngoài vùng nội dung của phần tử (100 px phía trên và 100 px bên trái), cũng như tâm vòng tròn. Giá trị tính toán của bán kính hình tròn cũng tăng để bù cho bề mặt tăng lên của hệ toạ độ do hộp tham chiếu margin-box thiết lập.

Hệ toạ độ hộp lề có và không có lề
Có một vài loại hộp tham chiếu để bạn lựa chọn: "margin-box", "border-box", "padding-box" và "content-box". Tên của những hộp tham chiếu này thể hiện ranh giới của chúng. Trước đây, chúng tôi đã giải thích về "hộp lề". "Hộp đường viền" bị hạn chế bởi các cạnh ngoài của đường viền phần tử, còn "hộp khoảng đệm" bị hạn chế bởi khoảng đệm của phần tử, trong khi "hộp nội dung" giống với diện tích bề mặt thực tế mà nội dung sử dụng trong một phần tử.
Hình minh hoạ tất cả các hộp tham chiếu

Mỗi lần, bạn chỉ có thể sử dụng một hộp tham chiếu với phần khai báo shape-outside. Mỗi hộp tham chiếu sẽ ảnh hưởng đến hình dạng theo một cách khác nhau và đôi khi tinh tế. Có một bài viết khác tìm hiểu sâu hơn và giúp bạn hiểu các hộp tham chiếu cho Hình dạng CSS.

Hàm ellipse()

Hình minh hoạ giá trị hình dạng elip()

Dấu ba chấm trông giống như các vòng tròn bị bóp méo. Các giá trị này được định nghĩa là ellipse(rx ry at cx cy), trong đó rxry là bán kính của hình elip trên trục X và trục Y, còn cxcy là các toạ độ cho tâm của hình elip.

.element{
  shape-outside: ellipse(150px 300px at 50% 50%);
  width: 300px;
  height: 600px;
}

Giá trị phần trăm sẽ được tính từ kích thước của hệ toạ độ. Ở đây không cần phải dùng đến các phép toán vui nhộn. Bạn có thể bỏ qua toạ độ của tâm hình elip và toạ độ sẽ được suy ra từ tâm của hệ toạ độ.

Các bán kính trên trục X và Y cũng có thể được xác định bằng từ khoá: farthest-side tạo ra bán kính bằng khoảng cách giữa tâm hình elip và cạnh của hộp tham chiếu cách xa nhất của hình elip, trong khi closest-side có nghĩa là ngược lại hoàn toàn – sử dụng khoảng cách ngắn nhất giữa tâm và cạnh.

.element{
  shape-outside: ellipse(closest-side farthest-side at 50% 50%);
  /* identical to: */
  shape-outside: ellipse(150px 300px at 50% 50%);
  width: 300px;
  height: 600px;
}

Điều này có thể hữu ích khi kích thước của phần tử (hoặc hộp tham chiếu) có thể thay đổi theo cách khó dự đoán, nhưng bạn muốn hình elip thích ứng.

Bạn cũng có thể sử dụng các từ khoá farthest-sideclosest-side tương tự cho bán kính trong hàm hình dạng circle().

Hàm đa giác()

Hình minh hoạ giá trị hình dạng đa giác()

Nếu hình tròn và hình elip có giới hạn quá mức, hàm hình dạng đa giác sẽ mở ra nhiều tuỳ chọn. Định dạng là polygon(x1 y1, x2 y2, ...), trong đó bạn chỉ định cặp toạ độ x y cho mỗi đỉnh (điểm) của đa giác. Số cặp tối thiểu để chỉ định một đa giác là ba, một hình tam giác.

.element{
  shape-outside: polygon(0 0, 0 300px, 300px 600px);
  width: 300px;
  height: 600px;
}

Các đỉnh nằm trên hệ toạ độ. Đối với đa giác thích ứng, bạn có thể sử dụng giá trị phần trăm cho một số hoặc tất cả toạ độ.

.element{
  /* polygon responsive to font-size*/
  shape-outside: polygon(0 0, 0 100%, 100% 100%);
  width: 20em;
  height: 40em;
}

Có một tham số fill-rule không bắt buộc, nhập từ SVG, hướng dẫn trình duyệt cách xem xét "bên trong" của đa giác trong trường hợp có các đường dẫn tự giao nhau hoặc các hình dạng kèm theo. Joni trythall giải thích rất rõ về cách hoạt động của thuộc tính quy tắc lấp đầy trong SVG. Nếu không được xác định, fill-rule mặc định là nonzero.

.element{
  shape-outside: polygon(0 0, 0 100%, 100% 100%);
  /* identical to: */
  shape-outside: polygon(nonzero, 0 0, 0 100%, 100% 100%);
}

Hàm inset()

Hàm hình dạng inset() cho phép bạn tạo các hình chữ nhật xung quanh để gói nội dung. Điều này nghe có vẻ khác thường khi xét đến tiền đề ban đầu là CSS Định hình nội dung web miễn phí từ các hộp đơn giản. Rất có thể là như vậy. Tôi chưa tìm thấy một trường hợp sử dụng cho inset(). Trường hợp này chưa thể đạt được bằng độ chính xác đơn và lề hoặc với polygon(). Mặc dù inset() cung cấp biểu thức dễ đọc hơn cho các hình chữ nhật so với polygon().

Ký hiệu đầy đủ cho hàm hình dạng lồng ghép là inset(top right bottom left border-radius). Bốn đối số vị trí đầu tiên có các độ lệch vào phía trong so với các cạnh của phần tử. Đối số cuối cùng là bán kính đường viền cho hình chữ nhật. Không bắt buộc, vì vậy bạn có thể bỏ qua. Mã này tuân theo ký hiệu viết tắt border-radius mà bạn đã sử dụng trong CSS.

.element{
  shape-outside: inset(100px 100px 100px 100px);
  /* yields a rectangular shape which is 100px inset on all sides */
  float: left;
}

Tạo hình dạng từ các ô tham chiếu

Nếu không chỉ định hàm hình dạng cho thuộc tính shape-outside, bạn có thể cho phép trình duyệt lấy hình dạng qua hộp tham chiếu của phần tử. Hộp tham chiếu mặc định là margin-box. Chưa có gì kỳ lạ từ trước đến nay. Đó là cách hoạt động của độ chính xác đơn. Tuy nhiên, khi áp dụng kỹ thuật này, bạn có thể sử dụng lại hình dạng của một phần tử. Hãy xem thuộc tính border-radius.

Nếu sử dụng nút này để bo tròn các góc của một phần tử nổi, bạn sẽ có được hiệu ứng cắt xén, nhưng vùng nổi vẫn là hình chữ nhật. Thêm shape-outside: border-box để bao bọc xung quanh đường viền do border-radius tạo.

Trích xuất hình dạng từ bán kính đường viền của một phần tử bằng hộp tham chiếu hộp đường viền
.element{
  border-radius: 50%;
  shape-outside: border-box;
  float: left;
}

Tất nhiên, bạn có thể sử dụng tất cả các hộp tham chiếu theo cách này. Sau đây là một cách sử dụng khác cho các hình dạng dẫn xuất – trích dẫn giá trị chênh lệch (offset-ren).

Tạo trích dẫn giá trị chênh lệch bằng cách sử dụng hộp tham chiếu hộp nội dung

Bạn có thể đạt được hiệu ứng trích dẫn giá trị bù trừ bằng cách chỉ sử dụng các thuộc tính độ chính xác đơn và lề. Nhưng bạn phải đặt phần tử trích dẫn trong cây HTML tại thời điểm bạn muốn nó hiển thị.

Sau đây là cách để đạt được hiệu ứng trích dẫn giá trị chênh lệch tương tự kèm theo tính linh hoạt tăng cường:

.pull-quote{
  shape-outside: content-box;
  margin-top: 200px;
  float: left;
}

Chúng ta đặt hộp tham chiếu content-box cho hệ toạ độ của hình dạng một cách rõ ràng. Trong trường hợp này, lượng nội dung trong dấu ngoặc kép sẽ xác định hình dạng mà nội dung bên ngoài sẽ bao bọc. Thuộc tính margin-top được dùng ở đây để định vị (phần bù trừ) trích dẫn, bất kể vị trí của trích dẫn đó trong cây HTML.

Lề hình dạng

Bạn sẽ nhận thấy rằng việc bao bọc nội dung xung quanh một hình dạng có thể khiến nội dung đó chà quá sát với phần tử. Bạn có thể thêm khoảng cách xung quanh hình dạng bằng thuộc tính shape-margin.

.element{
  shape-outside: circle(40%);
  shape-margin: 1em;
  float: left;
}

Hiệu ứng này tương tự như cách bạn đã từng sử dụng thuộc tính margin thông thường, nhưng shape-margin chỉ ảnh hưởng đến khoảng trống xung quanh giá trị shape-outside. Hàm này sẽ chỉ thêm khoảng cách xung quanh hình dạng nếu có chỗ cho hình dạng đó trong hệ toạ độ. Đó là lý do tại sao trong ví dụ phía trên bán kính vòng tròn được đặt là 40%, chứ không phải 50%. Nếu bán kính được đặt thành 50%, hình tròn sẽ chiếm toàn bộ không gian trong hệ toạ độ và không thể tạo ra hiệu ứng của shape-margin. Hãy nhớ rằng cuối cùng, hình dạng bị ràng buộc với margin-box của phần tử (phần tử cộng với margin xung quanh). Nếu hình dạng lớn hơn và tràn màn hình, phần tử đó sẽ được cắt theo margin-box và bạn sẽ có một hình chữ nhật.

Quan trọng là bạn phải hiểu rằng shape-margin chỉ chấp nhận một giá trị dương duy nhất. Tham số này không có ký hiệu bàn tay. Vậy lề trên cùng của hình tròn là gì?

Tạo ảnh động cho hình dạng

Bạn có thể kết hợp hình dạng CSS với nhiều tính năng CSS khác, chẳng hạn như hiệu ứng chuyển tiếp và ảnh động. Tuy nhiên, tôi phải nhấn mạnh rằng người dùng sẽ thấy rất khó chịu khi bố cục văn bản thay đổi trong khi họ đang đọc. Hãy chú ý đến trải nghiệm này nếu bạn quyết định ưu tiên tạo hình dạng cho ảnh động.

Bạn có thể tạo ảnh động cho bán kính và tâm cho các hình dạng circle()ellipse(), miễn là các hình dạng này được xác định trong các giá trị mà trình duyệt có thể nội suy. Bạn có thể đi từ circle(30%) đến circle(50%). Tuy nhiên, việc tạo ảnh động trong khoảng từ circle(closest-side) đến circle(farthest-side) sẽ bị nghẽn trình duyệt.

.element{
  shape-outside: circle(30%);
  transition: shape-outside 1s;
  float: left;
}

.element:hover{
  shape-outside: circle(50%);
}
Ảnh GIF cho vòng tròn động

Có thể đạt được nhiều hiệu ứng thú vị hơn khi tạo ảnh động cho các hình dạng polygon(), với lưu ý quan trọng là đa giác phải có cùng số đỉnh giữa hai trạng thái ảnh động. Trình duyệt không thể nội suy nếu bạn thêm hoặc xoá đỉnh.

Một mẹo là bạn thêm số đỉnh tối đa cần thiết và định vị các đỉnh này được nhóm lại với nhau trong trạng thái ảnh động, tức là bạn muốn có ít cạnh nhận biết hơn vào hình dạng.

.element{
  /* four vertices (looks like rectangle) */
  shape-outside: polygon(0 0, 100% 0, 100% 100%, 0 100%);
  transition: shape-outside 1s;
}

.element:hover{
  /* four vertices, but second and third overlap (looks like triangle) */
  shape-outside: polygon(0 0, 100% 50%, 100% 50%, 0 100%);
}
Ảnh GIF động hình tam giác

Gói nội dung bên trong hình dạng

Ảnh chụp màn hình bản minh hoạ Alice ở xứ sở thần tiên sử dụng CSS Shapes để bao bọc nội dung

Bản nháp ban đầu của thông số kỹ thuật CSS Shapes bao gồm thuộc tính shape-inside cho phép bạn bao bọc nội dung bên trong một hình dạng. Thậm chí đã có những triển khai trong Chrome và Webkit trong một thời gian. Tuy nhiên, việc gói nội dung được đặt tuỳ ý bên trong một đường dẫn tuỳ chỉnh đòi hỏi nhiều nỗ lực và nghiên cứu hơn để giải quyết mọi tình huống có thể xảy ra và tránh lỗi. Đó là lý do tại sao thuộc tính shape-inside được tạm hoãn sang CSS Shapes Cấp 2 và quá trình triển khai thuộc tính này đã bị rút lại.

Tuy nhiên, chỉ với một chút nỗ lực và đôi chút thoả hiệp, bạn vẫn có thể đạt được hiệu quả của việc gói nội dung bên trong hình dạng tuỳ chỉnh. Cách sử dụng này là sử dụng 2 phần tử nổi với shape-outside, nằm ở các cạnh đối diện của vùng chứa. Giải pháp ở đây là bạn phải sử dụng một hoặc hai phần tử trống không có ý nghĩa ngữ nghĩa, nhưng đóng vai trò là thanh chống để tạo ảo giác về hình dạng bên trong.

<div>
  <div class='left-shape'></div>
  <div class='right-shape'></div>

  Lorem ipsum...
</div>

Vị trí của các phần tử thanh chống .left-shape.right-shape ở phần trên cùng của vùng chứa là rất quan trọng vì chúng sẽ được di chuyển sang trái và sang phải để bên cạnh nội dung.

.left-shape{
  shape-outside: polygon(0 0, ...);
  float: left;
  width: 50%;
  height: 100%;
}

.right-shape{
  shape-outside: polygon(50% 0, ...);
  float: right;
  width: 50%;
  height: 100%;
}
Hình minh hoạ cách giải quyết vấn đề hình dạng bên trong cho bản minh hoạ của Alice

Kiểu này làm cho 2 thanh nổi chiếm toàn bộ không gian trong phần tử, nhưng các thuộc tính shape-outside lại tạo ra không gian cho phần nội dung còn lại.

Nếu hình dạng CSS không được trình duyệt hỗ trợ, điều này sẽ tạo ra hiệu ứng xấu bằng cách đẩy tất cả nội dung xuống. Đó là lý do tại sao bạn cần phải sử dụng tính năng này theo cách được nâng cao dần dần.

Trong các ví dụ về ảnh động có hình dạng trước đây, bạn sẽ nhận thấy việc văn bản dịch chuyển xung quanh có thể gây phiền toái. Không phải trường hợp sử dụng nào cũng đảm bảo hình dạng động. Tuy nhiên, bạn có thể tạo ảnh động cho các thuộc tính khác tương tác với Hình dạng CSS để thêm hiệu ứng vào vị trí thích hợp.

Trong phần minh hoạ Alice in Wonderland về Hình dạng CSS, chúng ta đã sử dụng vị trí cuộn để thay đổi lề trên cùng của nội dung. Văn bản bị nén giữa hai phần tử nổi. Khi di chuyển xuống, nó phải bố cục lại theo shape-outside của 2 phần tử nổi. Việc này mang lại ấn tượng rằng văn bản đang được thu hồi đáng kể, đồng thời tăng thêm trải nghiệm kể chuyện. Đường viền vô cớ? Có thể. Nhưng trông nó thật ngầu.

Vì bố cục văn bản được thực hiện nguyên gốc bởi trình duyệt nên hiệu suất tốt hơn so với sử dụng giải pháp JavaScript. Tuy nhiên, việc thay đổi lề trên cuộn sẽ kích hoạt nhiều sự kiện bố cục lại và vẽ, và điều đó có thể làm giảm đáng kể hiệu suất. Hãy thận trọng khi sử dụng! Tuy nhiên, việc sử dụng Hình dạng CSS mà không tạo ảnh động cho chúng không đi kèm với hiệu suất có thể hiểu được.

Cải tiến tăng dần

Hãy bắt đầu bằng cách giả định rằng trình duyệt không hỗ trợ CSS Shapes và xây dựng dựa trên điều đó khi bạn phát hiện thấy tính năng này. Modernizr là một giải pháp hiệu quả để phát hiện tính năng và có quy trình kiểm thử Hình dạng CSS trong mục "Phát hiện không cốt lõi".

Một số trình duyệt cung cấp chức năng phát hiện tính năng trong CSS thông qua quy tắc @supports mà không cần thư viện bên ngoài. Google Chrome (cũng hỗ trợ CSS Shapes) hiểu quy tắc @supports. Đây là cách bạn sử dụng công cụ này để dần dần cải thiện:

.element{
  /* styles for all browsers */
}

@supports (shape-outside: circle(50%)){
  /* styles only for browsers which support CSS Shapes */
  .element{
    shape-outside: circle(50%);
  }
}

Lea Verou đã viết thêm về cách sử dụng quy tắc @supports của CSS.

Phân biệt với tiêu chí Loại trừ CSS

Những gì chúng tôi biết đến ngày nay là Hình dạng CSS, trước đây được gọi là Hình dạng và Loại trừ CSS, trong những ngày đầu của quy cách. Việc chuyển đổi cách đặt tên có vẻ hơi khác biệt, nhưng thực sự rất quan trọng. Quy tắc loại trừ CSS (hiện là một quy cách riêng) cho phép bao bọc nội dung xung quanh các thành phần được đặt tuỳ ý mà không cần có thuộc tính độ chính xác đơn. Hãy tưởng tượng việc gói nội dung quanh một phần tử có vị trí tuyệt đối; đó là trường hợp sử dụng của các tính năng Loại trừ CSS. Hình dạng CSS chỉ xác định đường dẫn mà nội dung sẽ bao bọc.

Vì vậy, hình dạng và tiêu chí loại trừ không giống nhau, nhưng chúng bổ sung cho nhau. Hình dạng CSS hiện đã có trong trình duyệt, trong khi Loại trừ CSS chưa được triển khai cùng với hoạt động tương tác với hình dạng.

Công cụ để làm việc với CSS Shapes

Bạn có thể tạo đường dẫn bằng các công cụ tạo hình ảnh cổ điển, nhưng không có đường dẫn nào trong số này, tại thời điểm viết bài này, xuất cú pháp bắt buộc cho các giá trị Hình dạng CSS. Ngay cả khi đã có, làm như vậy sẽ không quá thực tế.

Hình dạng CSS được sử dụng trong trình duyệt, nơi chúng phản ứng với các phần tử khác trên trang. Rất hữu ích khi bạn trực quan hoá những tác động của việc chỉnh sửa hình dạng đối với nội dung xung quanh. Có một vài công cụ giúp bạn thực hiện quy trình làm việc này:

Dấu ngoặc: Tiện ích Trình chỉnh sửa hình dạng CSS cho Brackets sử dụng chế độ xem trước trực tiếp của trình soạn thảo mã để phủ một trình chỉnh sửa tương tác nhằm chỉnh sửa các giá trị hình dạng.

Google Chrome: Tiện ích Trình chỉnh sửa hình dạng CSS cho Google Chrome mở rộng Công cụ dành cho nhà phát triển của trình duyệt với các chế độ điều khiển để tạo và chỉnh sửa hình dạng. Thao tác này sẽ đặt một trình chỉnh sửa tương tác lên trên phần tử đã chọn.

Trình kiểm tra trong Google Chrome đã tích hợp sẵn tính năng hỗ trợ làm nổi bật hình dạng. Di chuột qua một phần tử có thuộc tính shape-outside và phần tử đó sẽ sáng lên để minh hoạ hình dạng.

Hình dạng từ hình ảnh: Nếu bạn muốn tạo hình ảnh và nhờ trình duyệt trích xuất các hình dạng từ hình ảnh đó, Rebecca Hauck đã viết một hướng dẫn hữu ích dành cho Photoshop.

Polyfill: Google Chrome là trình duyệt chính đầu tiên cung cấp CSS Shapes. Sắp có hỗ trợ cho tính năng này trên iOS 8 và Safari 8 của Apple. Các nhà cung cấp trình duyệt khác có thể cân nhắc lựa chọn này trong tương lai. Cho đến thời điểm đó, chúng tôi cung cấp dịch vụ polyfill CSS Shapes để cung cấp dịch vụ hỗ trợ cơ bản.

Kết luận

Trong một môi trường web mà nội dung chủ yếu bị mắc kẹt trong những ô đơn giản, Hình dạng CSS cung cấp một cách để tạo bố cục sinh động, thu hẹp khoảng cách về sự chân thực giữa thiết kế web và thiết kế in. Tất nhiên, hình dạng có thể bị lạm dụng và tạo ra các yếu tố gây sao lãng. Tuy nhiên, khi được ứng dụng hợp lý và đánh giá tốt, hình dạng có thể cải thiện cách trình bày nội dung và tập trung sự chú ý của người dùng theo cách độc đáo.

Tôi để lại cho bạn một bộ sưu tập tác phẩm của những người khác, chủ yếu là từ bản in. Bộ sưu tập này thể hiện những cách sử dụng thú vị đối với bố cục không theo hình chữ nhật. Tôi hy vọng bài viết này sẽ truyền cảm hứng cho bạn thử dùng CSS Shapes và thử nghiệm các ý tưởng thiết kế mới.

Cảm ơn Pearl Chen, Alan Stearns và Zoltan Horvath rất nhiều vì đã xem xét bài viết này và cung cấp thông tin chi tiết có giá trị.