ความสามารถในการค้นหาขนาดในบรรทัดของระดับบนสุดและค่าหน่วยการค้นหาของคอนเทนเนอร์เพิ่งมีการสนับสนุนที่เสถียรในเครื่องมือเบราว์เซอร์ที่ทันสมัยทั้งหมด
อย่างไรก็ตาม ข้อมูลจำเพาะด้านคงทนมีมากกว่าแค่การค้นหาขนาด และยังทำให้สามารถค้นหาค่ารูปแบบระดับบนสุดได้ด้วย จาก Chromium 111 คุณจะใช้การเก็บรูปแบบสําหรับค่าพร็อพเพอร์ตี้ที่กําหนดเอง และค้นหาองค์ประกอบระดับบนสําหรับค่าของพร็อพเพอร์ตี้ที่กําหนดเองได้
ซึ่งหมายความว่าเราจะมีการควบคุมสไตล์ใน CSS ได้อย่างเป็นเหตุเป็นผลมากขึ้น และแยกชั้นตรรกะและข้อมูลของแอปพลิเคชันออกจากสไตล์ได้ดียิ่งขึ้น
ข้อกำหนดของข้อบังคับระดับ 3 ของข้อบังคับการบรรจุ CSS ซึ่งครอบคลุมการค้นหาขนาดและสไตล์ อนุญาตให้มีการค้นหาสไตล์ใดก็ได้จากองค์ประกอบหลัก ซึ่งรวมถึงคู่พร็อพเพอร์ตี้และค่า เช่น font-weight: 800
อย่างไรก็ตาม ในการเปิดตัวฟีเจอร์นี้ ปัจจุบันการค้นหารูปแบบจะใช้ได้กับค่าพร็อพเพอร์ตี้ที่กำหนดเองของ CSS เท่านั้น ซึ่งมีประโยชน์มากสำหรับการรวมสไตล์และการแยกข้อมูลจากการออกแบบ มาดูวิธีใช้คำค้นหาสไตล์กับพร็อพเพอร์ตี้ที่กำหนดเองของ CSS กัน
เริ่มต้นใช้งานการค้นหาสไตล์
สมมติว่าเรามี HTML ต่อไปนี้
<ul class="card-list">
<li class="card-container">
<div class="card">
...
</div>
</li>
</ul>
หากต้องการใช้การค้นหารูปแบบ คุณต้องตั้งค่าองค์ประกอบคอนเทนเนอร์ก่อน ซึ่งต้องใช้แนวทางที่แตกต่างออกไปเล็กน้อย โดยขึ้นอยู่กับว่าคุณกําลังค้นหารายการหลักโดยตรงหรือโดยอ้อม
การค้นหารายการหลักโดยตรง
คุณไม่จำเป็นต้องใช้การควบคุมด้วยพร็อพเพอร์ตี้ container-type
หรือ container
กับ .card-container
ซึ่งต่างจากการค้นหารูปแบบเพื่อให้ .card
ค้นหาสไตล์ของรายการระดับบนสุดโดยตรงได้ อย่างไรก็ตาม เราจำเป็นต้องนำสไตล์ (ในกรณีนี้คือค่าพร็อพเพอร์ตี้ที่กำหนดเอง) ไปใช้กับคอนเทนเนอร์ (ในกรณีนี้คือ .card-container
) หรือองค์ประกอบใดๆ ที่มีองค์ประกอบที่เรากำลังจัดรูปแบบใน DOM เราไม่สามารถใช้รูปแบบที่ค้นหาในองค์ประกอบโดยตรงที่เราจัดรูปแบบโดยใช้คําค้นหานั้น เนื่องจากอาจทำให้เกิดการวนซ้ำที่ไม่สิ้นสุด
หากต้องการค้นหาผู้ปกครองโดยตรง ให้ใช้วิธีต่อไปนี้
/* styling .card based on the value of --theme on .card-container */
@container style(--theme: warm) {
.card {
background-color: wheat;
border-color: brown;
...
}
}
คุณอาจสังเกตเห็นว่าการค้นหาสไตล์จะตัดคำค้นหาด้วย style()
วิธีนี้ช่วยให้แยกแยะค่าขนาดออกจากรูปแบบได้ เช่น เขียนการค้นหาสำหรับความกว้างของคอนเทนเนอร์เป็น @container (min-width: 200px) { … }
ซึ่งจะใช้รูปแบบหากคอนเทนเนอร์หลักมีความกว้างอย่างน้อย 200 พิกเซล อย่างไรก็ตาม min-width
ยังเป็นพร็อพเพอร์ตี้ CSS ได้ด้วย และคุณค้นหาค่า CSS ของ min-width
ได้โดยใช้การค้นหารูปแบบ คุณจึงควรใช้ style()
wrapper เพื่อทําให้ความแตกต่างชัดเจน @container style(min-width: 200px) { … }
การจัดรูปแบบผู้ปกครองที่ไม่ใช่โดยตรง
หากต้องการค้นหาสไตล์สำหรับองค์ประกอบที่ไม่ใช่องค์ประกอบหลักโดยตรง คุณต้องกำหนด container-name
ให้กับองค์ประกอบนั้น เช่น เราอาจใช้สไตล์กับ .card
โดยอิงตามสไตล์ของ .card-list
โดยการกําหนด container-name
ให้กับ .card-list
และอ้างอิงในคําค้นหาสไตล์
/* styling .card based on the value of --moreGlobalVar on .card-list */
@container cards style(--moreGlobalVar: value) {
.card {
...
}
}
โดยทั่วไปแล้ว แนวทางปฏิบัติแนะนำคือให้ตั้งชื่อคอนเทนเนอร์ให้ชัดเจนถึงสิ่งที่คุณกำลังค้นหา และปลดล็อกความสามารถในการเข้าถึงคอนเทนเนอร์เหล่านั้นได้ง่ายขึ้น ตัวอย่างที่มีประโยชน์ของฟีเจอร์นี้คือในกรณีที่คุณต้องการจัดสไตล์องค์ประกอบภายใน .card
โดยตรง หากไม่มีคอนเทนเนอร์ที่มีชื่อใน .card-container
ผู้ใช้จะค้นหาคอนเทนเนอร์ดังกล่าวโดยตรงไม่ได้
แต่ทั้งหมดนี้ดูสมเหตุสมผลมากขึ้นเมื่อนำไปใช้จริง มาดูตัวอย่างกัน
การทำงานของการค้นหารูปแบบ
การค้นหาสไตล์จะมีประโยชน์อย่างยิ่งเมื่อคุณมีคอมโพเนนต์ที่นำกลับมาใช้ซ้ำได้ซึ่งมีรูปแบบหลายแบบ หรือเมื่อคุณไม่สามารถควบคุมสไตล์ทั้งหมดแต่จำเป็นต้องใช้การเปลี่ยนแปลงในบางกรณี ตัวอย่างนี้แสดงชุดการ์ดผลิตภัณฑ์ที่ใช้คอมโพเนนต์การ์ดเดียวกัน การ์ดผลิตภัณฑ์บางใบมีรายละเอียด/หมายเหตุเพิ่มเติม เช่น "ใหม่" หรือ "สินค้าคงเหลือน้อย" ซึ่งจะแสดงเมื่อพร็อพเพอร์ตี้ที่กำหนดเองชื่อ --detail
ทำงาน นอกจากนี้ หากผลิตภัณฑ์มีสถานะเป็น "สินค้ามีจำนวนน้อย" พื้นหลังของเส้นขอบจะเปลี่ยนเป็นสีแดงเข้ม ข้อมูลประเภทนี้มักจะเป็นข้อมูลที่แสดงผลจากเซิร์ฟเวอร์ และนำไปใช้กับการ์ดผ่านสไตล์แบบแทรกในบรรทัดได้ ดังนี้
<div class="product-list">
<div class="product-card-container" style="--detail: new">
<div class="product-card">
<div class="media">
<img .../>
<div class="comment-block"></div>
</div>
</div>
<div class="meta">
...
</div>
</div>
<div class="product-card-container" style="--detail: low-stock">
...
</div>
<div class="product-card-container">
...
</div>
...
</div>
เมื่อมีข้อมูลที่มีโครงสร้างนี้ คุณจะสามารถส่งผ่านค่าไปยัง --detail
และใช้พร็อพเพอร์ตี้ที่กำหนดเองของ CSS นี้เพื่อใช้รูปแบบ ดังนี้
@container style(--detail: new) {
.comment-block {
display: block;
}
.comment-block::after {
content: 'New';
border: 1px solid currentColor;
background: white;
...
}
}
@container style(--detail: low-stock) {
.comment-block {
display: block;
}
.comment-block::after {
content: 'Low Stock';
border: 1px solid currentColor;
background: white;
...
}
.media-img {
border: 2px solid brickred;
}
}
โค้ดด้านบนช่วยให้เราใช้ชิปสำหรับ --detail: low-stock
และ --detail: new
ได้ แต่คุณอาจสังเกตเห็นความซ้ำซ้อนบางอย่างในบล็อกโค้ด ขณะนี้ยังไม่มีวิธีค้นหาเฉพาะการแสดง --detail
ด้วย @container style(--detail)
ซึ่งจะช่วยให้แชร์สไตล์ได้ดีขึ้นและการซ้ำกันน้อยลง ขณะนี้ความสามารถนี้อยู่ระหว่างการหารือในกลุ่มทำงาน
การ์ดสภาพอากาศ
ตัวอย่างก่อนหน้านี้ใช้พร็อพเพอร์ตี้ที่กำหนดเองรายการเดียวซึ่งมีค่าที่เป็นไปได้หลายแบบเพื่อนำสไตล์มาใช้ แต่คุณสามารถการผสมผสานโดยใช้การค้นหาพร็อพเพอร์ตี้ที่กำหนดเองหลายรายการได้เช่นกัน มาดูตัวอย่างการ์ดสภาพอากาศนี้
หากต้องการจัดรูปแบบการไล่ระดับสีพื้นหลังและไอคอนสำหรับการ์ดเหล่านี้ ให้มองหาลักษณะสภาพอากาศ เช่น "เมฆมาก" "ฝนตก" หรือ "แดดจัด":
@container style(--sunny: true) {
.weather-card {
background: linear-gradient(-30deg, yellow, orange);
}
.weather-card:after {
content: url(<data-uri-for-demo-brevity>);
background: gold;
}
}
ด้วยวิธีนี้ คุณสามารถจัดรูปแบบการ์ดแต่ละใบตามลักษณะเฉพาะของการ์ดนั้นๆ แต่คุณยังสามารถจัดรูปแบบสำหรับชุดค่าผสมลักษณะเฉพาะ (พร็อพเพอร์ตี้ที่กำหนดเอง) โดยใช้ชุดค่าผสม and
ในลักษณะเดียวกันกับคำค้นหาสื่อ เช่น วันที่มีทั้งเมฆมากและแดดจัดจะมีลักษณะดังนี้
@container style(--sunny: true) and style(--cloudy: true) {
.weather-card {
background: linear-gradient(24deg, pink, violet);
}
.weather-card:after {
content: url(<data-uri-for-demo-brevity>);
background: violet;
}
}
การแยกข้อมูลออกจากการออกแบบ
ในทั้ง 2 เดโมนี้ โครงสร้างการแยกชั้นข้อมูล (DOM ที่จะแสดงผลในหน้าเว็บ) ออกจากสไตล์ที่ใช้จะมีประโยชน์ รูปแบบต่างๆ จะเขียนออกมาเป็นรูปแบบต่างๆ ที่เป็นไปได้ซึ่งมีอยู่ในรูปแบบของคอมโพเนนต์ ขณะที่ปลายทางสามารถส่งข้อมูลที่จะใช้ในการจัดรูปแบบคอมโพเนนต์ได้ คุณสามารถใช้ค่าเดี่ยว เช่น ในกรณีแรก การอัปเดตค่า --detail
หรือตัวแปรหลายรายการ เช่น ในกรณีที่สอง (การตั้งค่า --rainy
หรือ --cloudy
หรือ --sunny
และที่ดีที่สุดก็คือคุณสามารถรวมค่าเหล่านี้ได้ด้วย การตรวจหาทั้ง --sunny
และ --cloudy
อาจแสดงรูปแบบที่เมฆมากบางส่วน
คุณสามารถอัปเดตค่าพร็อพเพอร์ตี้ที่กำหนดเองผ่าน JavaScript ได้อย่างราบรื่น ทั้งในขณะที่ตั้งค่าโมเดล DOM (เช่น ขณะสร้างคอมโพเนนต์ในเฟรมเวิร์ก) หรืออัปเดตได้ทุกเมื่อโดยใช้ <parentElem>.style.setProperty('--myProperty’, <value>)
I
ต่อไปนี้เป็นตัวอย่างโค้ด 2-3 บรรทัดที่จะอัปเดต --theme
ของปุ่ม และใช้สไตล์โดยใช้การค้นหาสไตล์และพร็อพเพอร์ตี้ที่กำหนดเอง (--theme
)
จัดรูปแบบการ์ดโดยใช้การค้นหาสไตล์ โดย JavaScript ที่ใช้อัปเดตค่าพร็อพเพอร์ตี้ที่กำหนดเองคือ
const themePicker = document.querySelector('#theme-picker')
const btnParent = document.querySelector('.btn-section');
themePicker.addEventListener('input', (e) => {
btnParent.style.setProperty('--theme', e.target.value);
})
ฟีเจอร์ที่อธิบายในบทความนี้เป็นเพียงจุดเริ่มต้นเท่านั้น คุณจะได้รับสิ่งต่างๆ เพิ่มเติมจากการค้นหาคอนเทนเนอร์เพื่อช่วยในการสร้างอินเทอร์เฟซแบบไดนามิกที่ปรับเปลี่ยนตามอุปกรณ์ สำหรับคำค้นหาสไตล์โดยเฉพาะ ยังมีปัญหาที่รอแก้ไขอยู่ 2-3 ข้อ ประการแรกคือการใช้การค้นหารูปแบบสำหรับสไตล์ CSS นอกเหนือจากคุณสมบัติที่กำหนดเอง ข้อมูลนี้เป็นส่วนหนึ่งของระดับข้อมูลจำเพาะปัจจุบันอยู่แล้ว แต่ยังไม่มีการใช้งานในเบราว์เซอร์ใดๆ เราคาดว่าจะเพิ่มการประเมินบริบทบูลีนลงในระดับข้อกำหนดปัจจุบันเมื่อปัญหาที่ยังมีอยู่ได้รับการแก้ไข ส่วนการค้นหาช่วงมีกำหนดการสำหรับระดับถัดไปของข้อกำหนด