Media Queries ช่วยให้คุณปรับเลย์เอาต์ตามขนาดของวิวพอร์ตหรือประเภทของอุปกรณ์ที่ใช้ได้ การค้นหาคอนเทนเนอร์ช่วยให้คุณปรับองค์ประกอบได้อย่างเฉพาะเจาะจงมากขึ้นตามขนาดและสถานะขององค์ประกอบระดับบนสุดหรือคอนเทนเนอร์
สมมติว่าคุณมีแบบฟอร์มลงชื่อสมัครรับจดหมายข่าวที่ตั้งใจจะใช้ในหลายบริบทบนเว็บไซต์ คุณอาจต้องการให้ครอบคลุมความกว้างเต็มหน้าในหน้าลงชื่อสมัครใช้ แต่ให้แสดงในคอลัมน์แยกในหน้าที่มีเนื้อหาอื่นๆ
ดังที่แสดงในเดโมนี้ การค้นหาคอนเทนเนอร์ช่วยให้คุณปรับพร็อพเพอร์ตี้ต่างๆ เช่น font-size, padding และเลย์เอาต์ขององค์ประกอบตามแอตทริบิวต์ของคอนเทนเนอร์ที่ใกล้ที่สุดได้ โดยไม่ขึ้นอยู่กับขนาดวิวพอร์ต
การตั้งค่าการค้นหาคอนเทนเนอร์
การค้นหาคอนเทนเนอร์จะสร้างขึ้นใน 2 ส่วน ซึ่งต่างจากการค้นหาสื่อ ดังนี้
- กำหนดคอนเทนเนอร์
- เขียนสไตล์สำหรับองค์ประกอบย่อยที่จะใช้เมื่อคอนเทนเนอร์หลักตรงกับเงื่อนไขของคำค้นหา
การกำหนดคอนเทนเนอร์
คุณกำหนดคอนเทนเนอร์ได้โดยใช้พร็อพเพอร์ตี้ container-type
.my-container-element { container-type: inline-size; }
container-type
ของ inline-size
ช่วยให้คุณค้นหาแกนแบบอินไลน์ของคอนเทนเนอร์ได้
หากต้องการค้นหาทั้งแกน inline
และ block
ให้ใช้ container-type: size
main, .my-component { container-type: size; }
ค่าทั้ง 2 ค่าของ container-type
จะใช้การจำกัดขนาดประเภทต่างๆ Inline-size
ในองค์ประกอบจะป้องกันไม่ให้องค์ประกอบย่อยส่งผลต่อขนาดแบบอินไลน์
องค์ประกอบที่มีการบรรจุ size
จะป้องกันไม่ให้องค์ประกอบย่อยส่งผลต่อขนาดขององค์ประกอบในทั้งแกนบล็อกและแกนอินไลน์
ในตัวอย่างนี้ คุณจะเห็นว่าการจำกัดขนาดอาจส่งผลต่อองค์ประกอบที่ใช้
เนื่องจากจะไม่ปรับขนาดตามขนาดขององค์ประกอบย่อย (องค์ประกอบ <p>
) คอนเทนเนอร์จะยุบลง เว้นแต่จะกำหนดขนาดอย่างชัดเจนโดยการตั้งค่ามิติข้อมูล (เช่น inline-size
, block-size
, aspect-ratio
) หรือวางไว้ในเลย์เอาต์ที่มีการกำหนดขนาดอย่างชัดเจน
เงื่อนไขการค้นหาคอนเทนเนอร์
เมื่อสร้างคอนเทนเนอร์แล้ว คุณจะเพิ่มเงื่อนไขที่อยู่ในวงเล็บได้ ซึ่งต้องเป็นจริงเพื่อให้ใช้สไตล์ภายใน Container Query ได้ สําหรับการค้นหาขนาดคอนเทนเนอร์ซึ่งอิงตามมิติข้อมูลขององค์ประกอบระดับบน เงื่อนไขจะประกอบด้วยข้อมูลต่อไปนี้
- ฟีเจอร์ขนาด:
width
,height
,inline-size
,block-size
,aspect-ratio
หรือorientation
- โอเปอเรเตอร์การเปรียบเทียบ (เช่น
>
,<
,=
,>=
) - และค่าความยาว
.my-container-element { container-type: inline-size; } @container (inline-size > 30em) { .my-child-element { /* styles to apply when .my-container-element is wider than 30em */ } }
คุณยังเขียนเงื่อนไขฟีเจอร์ขนาดด้วยโคลอนและค่าเดียวเพื่อทดสอบได้ด้วย
@container (orientation: landscape) { /*...*/ } @container (min-width: 300px) { /*...*/ }
นอกจากนี้ คุณยังรวมเงื่อนไขหลายรายการได้โดยใช้คีย์เวิร์ด เช่น and
และ or
หรือเชื่อมโยงเงื่อนไขหลายรายการเข้าด้วยกันด้วยโอเปอเรเตอร์
@container (inline-size > 40em) and (orientation: landscape) { /*...*/ } @container (height > 25vh) or (orientation: portrait) { /*...*/ } @container ( 10em <= width <= 500px) { /*...*/ }
การตั้งชื่อคอนเทนเนอร์
หากต้องการกำหนดเป้าหมายคอนเทนเนอร์ที่เฉพาะเจาะจง แม้ว่าคอนเทนเนอร์นั้นจะไม่ใช่คอนเทนเนอร์ระดับบนสุดที่ใกล้ที่สุด คุณก็ตั้งชื่อคอนเทนเนอร์ด้วยพร็อพเพอร์ตี้ container-name
ได้ จากนั้นคุณจะอ้างอิงชื่อคอนเทนเนอร์ที่ต้องการค้นหาก่อนกำหนดเงื่อนไขได้
.sidebar { container-name: main-sidebar; container-type: inline-size; } @container main-sidebar (inline-size > 20em) { .button-group { display: flex; padding-inline: 1.25em; } }
คอนเทนเนอร์ที่มีชื่อยังคงต้องเป็นบรรพบุรุษขององค์ประกอบที่กำลังจัดรูปแบบ
ใช้รูปแบบย่อกับพร็อพเพอร์ตี้ container
พร็อพเพอร์ตี้ container
ช่วยให้คุณใช้ไวยากรณ์แบบย่อเพื่อกำหนดคอนเทนเนอร์และระบุประเภทคอนเทนเนอร์ได้
.sidebar { container: main-sidebar / inline-size; }
ชื่อคอนเทนเนอร์จะอยู่ก่อนเครื่องหมายทับ และประเภทคอนเทนเนอร์จะอยู่หลังเครื่องหมายทับ
หน่วยการค้นหาคอนเทนเนอร์
นอกจากนี้ คุณยังมีสิทธิ์เข้าถึงหน่วยความยาวสัมพัทธ์ของคอนเทนเนอร์ภายในคอนเทนเนอร์ด้วย ซึ่งจะช่วยเพิ่มความยืดหยุ่นให้กับคอมโพเนนต์ที่อาจอยู่ในคอนเทนเนอร์ต่างๆ เนื่องจากความยาวสัมพัทธ์จะปรับตามขนาดของคอนเทนเนอร์
ในที่นี้ ระบบใช้หน่วยความยาวของคอนเทนเนอร์ cqi
(1% ของขนาดอินไลน์ของคอนเทนเนอร์คำค้นหา) สำหรับระยะขอบของปุ่ม
.container { container: button-container / inline-size; } .one { inline-size: 30vw; } .two { inline-size: 50vw; } button { padding: 2cqi 5cqi; }
ปุ่มทั้ง 2 ปุ่มใช้หน่วยสัมพัทธ์เดียวกัน แต่เนื่องจากหน่วยสัมพัทธ์นั้นสัมพันธ์กับขนาดของคอนเทนเนอร์ ปุ่มที่ 2 จึงมีระยะห่างภายในมากกว่าเนื่องจากคอนเทนเนอร์มีขนาดใหญ่กว่า
การซ้อนการค้นหาคอนเทนเนอร์
คุณซ้อนการค้นหาคอนเทนเนอร์ไว้ในตัวเลือกได้
.my-element { display: grid; padding: 1em 2em; @container my-container (min-inline-size: 22em) { /* styles to apply when element's container is wider than 22em */ } } /* equivalent to */ .my-element { display: grid; padding: 1em 2em; } @container my-container (min-inline-size: 22em) { .my-element { /* styles to apply when element's is wider than 22em */ } }
หรือจะซ้อนไว้ภายใน Container Query หรือกฎ @ อื่นๆ ก็ได้
@container my-container (min-inline-size: 22em) { .my-element { /* styles to apply when element's is wider than 22em */ } }
@layer base { @container my-container (min-inline-size: 22em) { .my-element { /* styles to apply */ } } }
ทดสอบความเข้าใจ
คุณใช้ฟีเจอร์ขนาดใดสำหรับเงื่อนไขการค้นหาคอนเทนเนอร์ได้ (เลือกได้มากกว่า 1 ข้อ)
width
block-size
inline-size
viewport-size
viewport-size
ไม่ใช่ฟีเจอร์ขนาดที่ถูกต้องสำหรับการค้นหาคอนเทนเนอร์height
เมื่อใช้ประเภทคอนเทนเนอร์ inline-size
คุณจะค้นหา aspect-ratio
ของคอนเทนเนอร์ได้
inline-size
จะค้นหา aspect-ratio
ขององค์ประกอบไม่ได้เนื่องจาก aspect-ratio
จะพิจารณา block-size
หรือ height
container-type
ของ size
เพื่อค้นหาอัตราส่วนภาพของคอนเทนเนอร์ เนื่องจากจะพิจารณาทั้งมิติข้อมูลแบบอินไลน์และแบบบล็อกของคอนเทนเนอร์หากต้องการใช้หน่วยสัมพัทธ์ของคอนเทนเนอร์ตามความสูงของคอนเทนเนอร์ คุณจะเลือกหน่วยใด
cqi
cqi
อิงตามขนาดแบบอินไลน์เชิงตรรกะของคอนเทนเนอร์cqq
cqw
อิงตามความกว้างของคอนเทนเนอร์cqb
cqb
อิงตามขนาดบล็อกเชิงตรรกะของคอนเทนเนอร์cqvh
cqvh
ไม่ใช่หน่วยการกำหนดขนาด CSS ที่ถูกต้องcqh
cqh
อิงตามความสูงของคอนเทนเนอร์