พร็อพเพอร์ตี้ที่กำหนดเองที่ชาญฉลาดขึ้นด้วย API ใหม่ของ Houdini

การเปลี่ยนรูปแบบและการคุ้มครองข้อมูลใน CSS

พร็อพเพอร์ตี้ CSS ที่กำหนดเองหรือที่เรียกว่าตัวแปร CSS ช่วยให้คุณกำหนดพร็อพเพอร์ตี้ของคุณเองใน CSS และใช้ค่าของพร็อพเพอร์ตี้นั้นได้ทั่วทั้ง CSS แม้ว่าในปัจจุบันจะมีประโยชน์อย่างเหลือเชื่อ แต่ก็มีข้อบกพร่องที่ทำให้ใช้งานยาก นั่นคือค่าใดก็ได้จึงอาจมีการลบล้างโดยไม่ตั้งใจ สืบทอดค่าจากรายการหลักเสมอ และคุณไม่สามารถเปลี่ยนค่าได้ CSS Properties and Values API ระดับ 1 ของ Houdini พร้อมใช้งานใน Chrome 78 แล้ว ซึ่งจะช่วยขจัดข้อบกพร่องเหล่านี้ ทำให้พร็อพเพอร์ตี้ที่กำหนดเองของ CSS มีประสิทธิภาพอย่างเหลือเชื่อ

Houdini คืออะไร

ก่อนจะพูดถึง API ใหม่ เรามาพูดถึง Houdini กันก่อน CSS-TAG ก่อตั้งทีมปฏิบัติการ Houdini หรือที่รู้จักกันในชื่อ CSS Houdini หรือ Houdini ขึ้นเพื่อ "พัฒนาฟีเจอร์ที่อธิบาย "เวทมนตร์" ของการจัดรูปแบบและเลย์เอาต์บนเว็บ" คอลเล็กชันข้อกำหนดของ Houdini ได้รับการออกแบบมาเพื่อปลดล็อกประสิทธิภาพของเครื่องมือแสดงผลของเบราว์เซอร์ ซึ่งช่วยให้คุณได้รับข้อมูลเชิงลึกที่ละเอียดยิ่งขึ้นเกี่ยวกับสไตล์ของเราและความสามารถในการขยายเครื่องมือแสดงผล ด้วยเหตุนี้ คุณจึงใช้ค่า CSS ที่กําหนดค่าไว้ใน JavaScript และโพลีฟีลหรือสร้าง CSS ใหม่ได้โดยไม่กระทบประสิทธิภาพ Houdini มีศักยภาพที่จะเพิ่มพลังการสร้างสรรค์บนเว็บ

CSS Properties and Values API ระดับ 1

CSS Properties and Values API ระดับ 1 (Houdini Props and Vals) ช่วยให้เรากำหนดโครงสร้างให้กับพร็อพเพอร์ตี้ที่กำหนดเองได้ สถานการณ์ปัจจุบันเมื่อใช้พร็อพเพอร์ตี้ที่กําหนดเองมีดังนี้

.thing {
  --my-color: green;
}

เนื่องจากพร็อพเพอร์ตี้ที่กำหนดเองไม่มีประเภท จึงอาจมีการลบล้างพร็อพเพอร์ตี้ดังกล่าวในลักษณะที่ไม่คาดคิด ตัวอย่างเช่น ลองพิจารณาสิ่งที่จะเกิดขึ้นหากคุณกําหนด --my-color ด้วย URL

.thing {
  --my-color: url('not-a-color');
  color: var(--my-color);
}

เนื่องจากไม่ได้พิมพ์ --my-color ไว้ ระบบจึงไม่รู้ว่า URL ไม่ใช่ค่าสีที่ถูกต้อง เมื่อเราใช้ color จะเปลี่ยนเป็นค่าเริ่มต้น (สีดําสําหรับ color และโปร่งใสสําหรับ background) เมื่อใช้ Houdini Props และ Vals คุณจะลงทะเบียนพร็อพเพอร์ตี้ที่กําหนดเองได้เพื่อให้เบราว์เซอร์ทราบว่าควรเป็นค่าใด

ตอนนี้พร็อพเพอร์ตี้ที่กำหนดเอง --my-color ได้รับการจดทะเบียนเป็นสีแล้ว ซึ่งจะบอกเบราว์เซอร์ว่าอนุญาตให้ใช้ค่าประเภทใดได้บ้าง รวมถึงวิธีพิมพ์และจัดการพร็อพเพอร์ตี้นั้น

โครงสร้างของพร็อพเพอร์ตี้ที่ลงทะเบียน

การลงทะเบียนพร็อพเพอร์ตี้มีลักษณะดังนี้

window.CSS.registerProperty({
  name: '--my-color',
  syntax: '<color>',
  inherits: false,
  initialValue: 'black',
});

ซึ่งรองรับตัวเลือกต่อไปนี้

name: string

ชื่อของพร็อพเพอร์ตี้ที่กำหนดเอง

syntax: string

วิธีแยกวิเคราะห์พร็อพเพอร์ตี้ที่กำหนดเอง ดูรายการค่าที่เป็นไปได้ทั้งหมดได้ในข้อกำหนดค่าและหน่วย CSS ค่าเริ่มต้นคือ *

inherits: boolean

ระบุว่ารับค่าของรายการหลักหรือไม่ ค่าเริ่มต้นคือ true

initialValue: string

ค่าเริ่มต้นของพร็อพเพอร์ตี้ที่กำหนดเอง

การตรวจสอบ syntax อย่างละเอียด มีตัวเลือกที่ใช้ได้จำนวนมาก ตั้งแต่ตัวเลข สี ไปจนถึงประเภท <custom-ident> ไวยากรณ์เหล่านี้ยังสามารถแก้ไขได้โดยใช้ค่าต่อไปนี้

  • การต่อท้ายด้วย + หมายความว่าจะยอมรับรายการค่าของไวยากรณ์นั้นที่คั่นด้วยเว้นวรรค เช่น <length>+ จะเป็นรายการความยาวที่คั่นด้วยเว้นวรรค
  • การต่อท้ายด้วย # หมายความว่าจะยอมรับรายการค่าของไวยากรณ์นั้นที่คั่นด้วยคอมมา เช่น <color># จะเป็นรายการสีที่คั่นด้วยคอมมา
  • การเพิ่ม | ระหว่างไวยากรณ์หรือตัวระบุหมายความว่าตัวเลือกใดก็ตามที่ให้ไว้ถูกต้อง เช่น <color># | <url> | magic จะอนุญาตรายการสีที่คั่นด้วยคอมมา, URL หรือคําว่า magic

รับทราบ

โปรดทราบข้อควรระวัง 2 ข้อเกี่ยวกับพร็อพและค่าของ Houdini ข้อแรกคือ เมื่อกําหนดแล้ว คุณจะอัปเดตพร็อพเพอร์ตี้ที่ลงทะเบียนไว้ที่มีอยู่ไม่ได้ และพยายามลงทะเบียนพร็อพเพอร์ตี้อีกครั้งจะทำให้เกิดข้อผิดพลาดที่ระบุว่ามีการกําหนดพร็อพเพอร์ตี้นั้นแล้ว

อย่างที่ 2 พร็อพเพอร์ตี้ที่ลงทะเบียนจะไม่ได้รับการตรวจสอบเมื่อแยกวิเคราะห์ ซึ่งต่างจากพร็อพเพอร์ตี้มาตรฐาน แต่จะได้รับการตรวจสอบเมื่อมีการคำนวณ ซึ่งหมายความว่าค่าที่ไม่ถูกต้องจะไม่ปรากฏว่าไม่ถูกต้องเมื่อตรวจสอบพร็อพเพอร์ตี้ขององค์ประกอบ และการใส่พร็อพเพอร์ตี้ที่ไม่ถูกต้องหลังจากพร็อพเพอร์ตี้ที่ถูกต้องจะไม่เปลี่ยนกลับไปใช้พร็อพเพอร์ตี้ที่ถูกต้อง แต่พร็อพเพอร์ตี้ที่ไม่ถูกต้องจะเปลี่ยนกลับไปใช้ค่าเริ่มต้นของพร็อพเพอร์ตี้ที่ลงทะเบียนไว้

การทำภาพเคลื่อนไหวของพร็อพเพอร์ตี้ที่กำหนดเอง

พร็อพเพอร์ตี้ที่กำหนดเองที่จดทะเบียนมีโบนัสสนุกๆ นอกเหนือจากการตรวจสอบประเภท ซึ่งก็คือความสามารถในการทำให้พร็อพเพอร์ตี้เคลื่อนไหว ตัวอย่างภาพเคลื่อนไหวพื้นฐานมีลักษณะดังนี้

<script>
CSS.registerProperty({
  name: '--stop-color',
  syntax: '<color>',
  inherits: false,
  initialValue: 'blue',
});
</script>

<style>
button {
  --stop-color: red;
  transition: --stop-color 1s;
}

button:hover {
  --stop-color: green;
}
</style>

เมื่อวางเมาส์เหนือปุ่ม ปุ่มจะเปลี่ยนจากสีแดงเป็นสีเขียว หากไม่ได้ลงทะเบียนพร็อพเพอร์ตี้ ระบบจะข้ามจากสีหนึ่งไปยังอีกสีหนึ่ง เนื่องจากหากไม่ได้ลงทะเบียนไว้ เบราว์เซอร์จะไม่ทราบว่าจะเกิดอะไรขึ้นระหว่างค่าหนึ่งกับอีกค่าหนึ่ง จึงไม่สามารถรับประกันความสามารถในการเปลี่ยนสี แต่ตัวอย่างนี้ยังนำไปต่อยอดได้ด้วยการทำให้ไล่ระดับสี CSS เคลื่อนไหว CSS ต่อไปนี้เขียนได้ด้วยพร็อพเพอร์ตี้ที่จดทะเบียนเดียวกันได้

button {
  --stop-color: red;
  background: linear-gradient(var(--stop-color), black);
  transition: --stop-color 1s;
}

button:hover {
  --stop-color: green;
}

ซึ่งจะสร้างภาพเคลื่อนไหวของพร็อพเพอร์ตี้ที่กำหนดเองซึ่งเป็นส่วนหนึ่งของ linear-gradient จึงทำให้สีไล่ระดับเชิงเส้นมีภาพเคลื่อนไหว ไปที่ Glitch ด้านล่างเพื่อดูโค้ดแบบเต็มและลองใช้ด้วยตนเอง

บทสรุป

Houdini กําลังจะเปิดตัวในเบราว์เซอร์ ซึ่งจะมาพร้อมกับวิธีใหม่ทั้งหมดในการทํางานกับและขยาย CSS เรามี Paint API อยู่แล้ว และตอนนี้เรามีพร็อพและค่าที่กำหนดเองด้วย กล่องเครื่องมือครีเอทีฟของเราจึงขยายการให้บริการมากขึ้น ซึ่งช่วยให้เรากําหนดพร็อพเพอร์ตี้ CSS ประเภทต่างๆ และใช้ในการสร้างและเคลื่อนไหวการออกแบบใหม่ๆ ที่น่าตื่นเต้นได้ นอกจากนี้ เรายังมีฟีเจอร์อื่นๆ อีกมากมายที่กำลังพัฒนาในคิวปัญหาของ Houdini ซึ่งคุณสามารถแสดงความคิดเห็นและดูฟีเจอร์ใหม่ๆ ของ Houdini ได้ Houdini ก่อตั้งขึ้นเพื่อสร้างฟีเจอร์ที่อธิบาย "ความมหัศจรรย์" ของการจัดรูปแบบและเลย์เอาต์บนเว็บ ดังนั้นลองออกไปข้างนอกแล้วนำฟีเจอร์ที่มีเวทมนตร์เหล่านั้นมาใช้ให้เป็นประโยชน์

รูปภาพโดย Maik Jonietz ใน Unsplash