Làm thế nào để bạn chọn cha mẹ đầu tiên trong css?

Tôi không nhớ chính xác thời điểm nữa. Nhưng tôi nhớ rằng một ngày nọ, tôi vừa hoài nghi vừa thất vọng khi nhận ra rằng không có cách nào để chọn phần tử gốc của một phần tử trong CSS

Đợi đã, cái gì? . Tại sao?

Rõ ràng, tôi không đơn độc. Ai đã từng học CSS chắc cũng từng rơi vào hoàn cảnh tương tự và tự đặt cho mình câu hỏi tương tự. Tại sao chúng ta không có bộ chọn cha trong CSS? . dưới dạng một luồng, hết phần tử này đến phần tử khác khi chúng xuất hiện. Khi một phần tử được hiển thị cho chế độ xem, phần tử gốc của nó đã ở đó, bao gồm tất cả kiểu dáng đẹp mắt của nó. Vẽ lại cha mẹ - và do đó, tất cả các cha mẹ khác - sau đó thực tế sẽ yêu cầu một đánh giá khác của tất cả các bộ chọn cha mẹ. Điều này, Remy Sharp đã đồng ý trước đó, một lần nữa sẽ rất tốn kém trên công cụ kết xuất nên việc triển khai bộ chọn gốc là vô nghĩa

Vì vậy, tất cả chúng tôi đều chấp nhận điều không thể tránh khỏi và cố gắng hết sức để giải quyết nó. Chúng tôi đã thêm các lớp trợ giúp vào các mẫu của mình thông qua logic phía sau hoặc bằng JavaScript ở giao diện người dùng. Và nó phần nào làm việc. Nhưng trong hầu hết mọi dự án, vẫn có một thời điểm mà bộ chọn gốc sẽ là giải pháp nhanh nhất và “trung thực nhất về mặt vật chất”

đã đến

Tất cả điều này đã thay đổi vào tháng trước khi Apple phát hành Safari 15. 4, với tư cách là trình duyệt đầu tiên, hỗ trợ lớp giả

article:has(h2 + p, h3 + p) { … }
1, là một trong những Bộ chọn cấp 4 của CSS. Jen Simmons và Jon Davis đã viết trong ghi chú phát hành: “Từ lâu, người ta đã nghĩ rằng một bộ chọn như vậy là không thể, nhưng nhóm của chúng tôi đã tìm ra cách để tối ưu hóa hiệu suất cao và đưa ra giải pháp linh hoạt không làm chậm trang.

nó đây rồi. Bộ chọn cha. Nhưng

article:has(h2 + p, h3 + p) { … }
2 không chỉ hữu ích như một bộ chọn cha. Nó cũng mở ra nhiều cơ hội thú vị hơn. Nhưng trước tiên, hãy xem nó hoạt động như thế nào

Lớp giả

article:has(h2 + p, h3 + p) { … }
2 lấy một danh sách bộ chọn tương đối và sau đó sẽ đại diện cho một phần tử nếu ít nhất một phần tử khác khớp với các bộ chọn trong danh sách. Nghe có vẻ quá phức tạp khi bạn viết nó ra, vì vậy đây là một ví dụ cơ bản. Giả sử bạn muốn chọn tất cả các phần tử
article:has(h2 + p, h3 + p) { … }
4 bao gồm phần tử
article:has(h2 + p, h3 + p) { … }
5, chẳng hạn như một biểu tượng. Bây giờ bạn có thể viết

button:has(svg) { … }

Hãy thử bản demo CodePen – và đảm bảo xem nó trong Safari 15. 4. ;)

Hoặc, nếu bạn muốn tạo phong cách khác cho bài viết nếu bài viết có tiêu đề bên trong và theo sau là một đoạn văn

article:has(h2 + p, h3 + p) { … }

Bạn cũng có thể kết hợp

article:has(h2 + p, h3 + p) { … }
2 với lớp giả
article:has(h2 + p, h3 + p) { … }
7 để chọn một phần tử nếu nó không chứa một số phần tử khác, trong trường hợp này là tiêu đề

section:not(:has(h1, h2, h3, h4, h5, h6)) { … }

Cũng có thể sử dụng các lớp giả như

article:has(h2 + p, h3 + p) { … }
8,
article:has(h2 + p, h3 + p) { … }
9 hoặc
section:not(:has(h1, h2, h3, h4, h5, h6)) { … }
0. Ví dụ: bạn có thể tạo kiểu cho phần tử biểu mẫu khi hộp kiểm bên trong đã được chọn

article:has(h2 + p, h3 + p) { … }
3

Sau đó, bạn cũng có thể sử dụng bộ kết hợp anh chị em chung

section:not(:has(h1, h2, h3, h4, h5, h6)) { … }
1 để thay đổi kiểu dáng của biểu mẫu tùy thuộc vào số lượng hộp kiểm đã được chọn

article:has(h2 + p, h3 + p) { … }
5

Hãy thử bản demo CodePen

Mặc dù bản demo này có thể không phải là ví dụ thực tế nhất, nhưng tất cả điều này vẫn bắt đầu trở nên thú vị, phải không?

sử dụng. phải điều chỉnh Lưới

Lưới CSS thường hoạt động từ vùng chứa trong và trước

article:has(h2 + p, h3 + p) { … }
2, thực sự không có cách nào để điều chỉnh Lưới dựa trên nội dung bên trong. Điều gì sẽ xảy ra nếu chúng ta có thể sử dụng
article:has(h2 + p, h3 + p) { … }
2 để điều chỉnh bố cục Lưới CSS của vùng chứa dựa trên số lượng phần tử bên trong vùng chứa đó? . Heydon Pickering đã viết bài báo cuối cùng về họ. Bằng cách kết hợp các lớp giả
section:not(:has(h1, h2, h3, h4, h5, h6)) { … }
4 và
section:not(:has(h1, h2, h3, h4, h5, h6)) { … }
5 bên trong danh sách bộ chọn
article:has(h2 + p, h3 + p) { … }
2 của chúng tôi, chúng tôi có thể điều chỉnh bố cục bằng cách “đếm” các phần tử bên trong. Ví dụ, đây là cách chúng ta có thể nhắm mục tiêu một lưới có hai phần tử bên trong

article:has(h2 + p, h3 + p) { … }
1

Vì vậy, nếu vùng chứa Grid của chúng ta có một phần tử bên trong vừa là phần tử con thứ hai vừa là phần tử con cuối cùng của vùng chứa, thì lưới phải có hai cột. Điều tương tự cũng hoạt động với ba cột

article:has(h2 + p, h3 + p) { … }
2

Cuối cùng, chúng ta cũng có thể tạo bố cục lưới có bốn cột nếu vùng chứa có bốn thành phần trở lên bên trong. Để đạt được điều này, chúng tôi chọn ít nhất một phần tử là phần tử thứ tư hoặc một trong tất cả các phần tử sau

article:has(h2 + p, h3 + p) { … }
3

Đây là bản demo CodePen một lần nữa

Như bạn có thể thấy, có rất nhiều trường hợp sử dụng tuyệt vời cho

article:has(h2 + p, h3 + p) { … }
2 với tư cách là bộ chọn chính và có vẻ như đây chỉ là phần nổi của những gì mọi người sẽ nghĩ ra.
article:has(h2 + p, h3 + p) { … }
2 cho phép chúng tôi tạo kiểu cho các phần tử dựa trên việc phần tử con của phần tử được chọn, có tiêu điểm hay liệu nó có hiện diện hay không. Và chúng ta thậm chí có thể nhắm mục tiêu một phần tử dựa trên số phần tử con mà nó có. Tất cả điều này sẽ cho phép các thành phần linh hoạt hơn nhiều. Chỉ cần nghĩ đến tất cả các biến thể của nội dung và bối cảnh có thể tồn tại bên trong một hệ thống thiết kế và bạn sẽ biết điều này sẽ có giá trị như thế nào.

Nhưng chờ đợi, có nhiều hơn nữa

có như một bộ chọn anh chị em trước đó

Bởi vì

article:has(h2 + p, h3 + p) { … }
2 chấp nhận một danh sách bộ chọn tương đối, bạn cũng có thể chọn một phần tử nếu nó có một phần tử khác theo sau nó. Hay nói cách khác, chúng ta có thể sử dụng
article:has(h2 + p, h3 + p) { … }
2 để chọn phần tử anh chị em trước đó của một phần tử

article:has(h2 + p, h3 + p) { … }
8

Dùng thử trên CodePen

Một lần nữa, có rất nhiều trường hợp sử dụng thực tế cho việc này. Ví dụ: bạn có thể tạo kiểu khác cho hình ảnh khi có chú thích bên dưới hình ảnh đó

article:has(h2 + p, h3 + p) { … }
9

Khả năng sử dụng

article:has(h2 + p, h3 + p) { … }
2 theo những cách hữu ích và sáng tạo để viết CSS linh hoạt và mạnh mẽ hơn dường như là vô tận. Và như trường hợp của rất nhiều tính năng mới hiện đang được thêm vào CSS, tôi nóng lòng muốn xem những cách sử dụng quảng cáo nào khác cho
article:has(h2 + p, h3 + p) { … }
2 mà tất cả các bạn nghĩ ra. Một ví dụ gần đây là bản demo tuyệt vời này của Michelle Barker, nơi cô ấy kết hợp các rãnh lưới động với bộ chọn
article:has(h2 + p, h3 + p) { … }
2

Kiểm tra hỗ trợ

Hiện tại, Safari là trình duyệt duy nhất hỗ trợ

article:has(h2 + p, h3 + p) { … }
2. Tuy nhiên, trong phiên bản 101 sắp tới của Chrome, bạn sẽ có thể kích hoạt nó thông qua cờ các tính năng của Nền tảng web thử nghiệm. Mặc dù điều này đầy hứa hẹn, nhưng chắc chắn sẽ mất một thời gian ngắn cho đến khi
article:has(h2 + p, h3 + p) { … }
2 được đa số trình duyệt hỗ trợ. Trong thời gian chờ đợi, một lần nữa chúng tôi có thể sử dụng tính năng nâng cao lũy tiến để sử dụng
article:has(h2 + p, h3 + p) { … }
2 trong các trình duyệt hỗ trợ tính năng này. Như Michelle Barker lưu ý, bạn có thể kiểm tra hỗ trợ cho
article:has(h2 + p, h3 + p) { … }
2 bằng truy vấn tính năng
article:has(h2 + p, h3 + p) { … }
38 bằng cách sử dụng hàm
article:has(h2 + p, h3 + p) { … }
39

article:has(h2 + p, h3 + p) { … }
0

Do đó, bạn có thể nhắm mục tiêu hỗ trợ các trình duyệt theo cách thân thiện trong tương lai. Bởi vì một khi

article:has(h2 + p, h3 + p) { … }
2 được hỗ trợ bởi một trình duyệt khác, mã của bạn cũng sẽ tự động hoạt động trong trình duyệt này

Bạn có thêm ý tưởng nào về cách sử dụng

article:has(h2 + p, h3 + p) { … }
2 không?

Làm cách nào để chọn con đầu lòng bằng CSS?

Các. bộ chọn con đầu tiên được sử dụng để chọn bộ chọn đã chỉ định, chỉ khi đó là bộ chọn con đầu tiên của bộ chọn cha.

CSS có bộ chọn gốc không?

Các phiên bản đầu tiên của bộ chọn cấp độ gốc đã được soạn thảo cho CSS3, chỉ được hoãn lại. Cuối cùng, các. has() lớp giả đã được xác định chính thức trong Bộ chọn CSS cấp 4 .