วิธีใหม่ในการวาดเส้นคั่นใน CSS: `CSS Gap Decorations`
(blogs.windows.com)- การเพิ่ม เส้นคั่น ระหว่างเซกชันบนหน้าเว็บเป็นเทคนิคการออกแบบที่ใช้กันทั่วไปเพื่อ จัดระเบียบเนื้อหาให้ชัดเจน และเพิ่ม ความอ่านง่าย
- แม้จะสามารถใช้เทคนิค CSS แบบเดิมอย่าง
borderเพื่อเพิ่มเส้นคั่นได้ แต่ก็มีข้อจำกัด เช่น การเปลี่ยนขนาดและความจำเป็นต้องเขียนโค้ดเพิ่มเติม - CSS Gap Decorations แก้ปัญหาเหล่านี้ด้วยการเพิ่มพร็อพเพอร์ตีอย่าง
column-ruleและrow-rule
เทคนิคเส้นคั่นใน CSS แบบเดิมและข้อจำกัด
- พร็อพเพอร์ตี
borderเป็นวิธีทั่วไปในการเพิ่มเส้นคั่น แต่ก็อาจเกิดปัญหาดังต่อไปนี้- เมื่อเพิ่ม
borderขนาดขององค์ประกอบอาจเปลี่ยนไป - ต้องเขียนโค้ดเพิ่มเติมสำหรับองค์ประกอบแรกและองค์ประกอบสุดท้าย
- หากมีการตัดบรรทัดในเลย์เอาต์ Flexbox เส้นคั่นอาจครอบคลุมพื้นที่ได้ไม่เต็มทั้งหมด
- เมื่อเพิ่ม
- สามารถใช้ pseudo-element อย่าง
::beforeและ::afterเพื่อเพิ่มเส้นคั่นได้ แต่มีข้อจำกัดดังนี้- ต้องเขียนโค้ดเพิ่มเติมสำหรับองค์ประกอบแรกและองค์ประกอบสุดท้าย
- ต้องใช้โค้ดกำหนดตำแหน่งแบบ absolute ที่ซับซ้อน
- สามารถทำให้ดูเหมือนมีเส้นคั่นได้โดยกำหนดสีพื้นหลังให้กับกริดคอนเทนเนอร์ และกำหนดสีพื้นหลังให้กับไอเท็ม
- ปรับความยาวของเส้นคั่นไม่ได้
- หากมีเซลล์ว่าง สีพื้นหลังจะมองเห็นได้
- หากไอเท็มเติมเต็มเซลล์ไม่ครบ สีพื้นหลังจะมองเห็นได้
- ใช้งานไม่ได้หากพื้นหลังของหน้าไม่ใช่สีเดียวล้วน
- ในเลย์เอาต์หลายคอลัมน์ สามารถใช้พร็อพเพอร์ตี
column-ruleเพื่อเพิ่มเส้นคั่นได้ แต่มีข้อจำกัดดังนี้- ใช้งานได้เฉพาะกับเลย์เอาต์หลายคอลัมน์เท่านั้น
- ไม่สามารถควบคุมทิศทางอินไลน์ของเนื้อหาได้
ข้อเสนอ CSS Gap Decorations
- CSS Gap Decorations เป็นข้อเสนอใหม่เพื่อแก้ปัญหาข้างต้น
- ประเด็นสำคัญของข้อเสนอ
- ขยายการรองรับพร็อพเพอร์ตี
column-ruleให้ใช้ได้กับเลย์เอาต์กริดและฟเล็กซ์บ็อกซ์ - เพิ่มพร็อพเพอร์ตีใหม่
row-rule - สามารถกำหนดเส้นคั่นต่างกันในแต่ละส่วนของคอนเทนเนอร์ได้
- ขยายการรองรับพร็อพเพอร์ตี
- สามารถเปลี่ยนสีของเส้นคั่นได้ด้วยพร็อพเพอร์ตี
row-rule-color.alternate-red-blue { display: grid; grid-template: repeat(auto-fill, 30px) / repeat(6, 100px); gap: 10px; row-rule: 1px solid; row-rule-color: red blue; } - สามารถกำหนดเส้นคั่นที่มีความหนาและสีแตกต่างกันได้
.varying-widths { display: grid; grid-template: repeat(auto-fill, 30px) / repeat(6, 100px); row-gap: 10px; row-rule: 5px solid black / repeat(auto, 1px solid #666) / 3px solid black; } - สามารถควบคุมพฤติกรรมของเส้นคั่นที่จุดตัดได้
- ใช้พร็อพเพอร์ตี
*-rule-breakและ*-rule-outsetได้ - ควบคุมตำแหน่งเริ่มต้นและสิ้นสุดของเส้นคั่นที่จุดตัดได้
- ปรับความยาวและออฟเซ็ตของเส้นคั่นได้อย่างละเอียด
- ใช้พร็อพเพอร์ตี
การขอฟีดแบ็กต่อข้อเสนอ
- ข้อเสนอ CSS Gap Decorations จะได้รับการปรับปรุงต่อไปโดยอิงจากฟีดแบ็กของนักพัฒนา
- ดูรายละเอียดเพิ่มเติมได้ใน explainer อย่างเป็นทางการ
- สามารถส่งฟีดแบ็กผ่าน GitHub issue ได้
- โดยเฉพาะอย่างยิ่ง ยินดีรับฟีดแบ็กเกี่ยวกับพฤติกรรมของเส้นคั่นที่จุดตัด
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
อยากมี pseudo-element แบบใหม่:
.container:gap { background-color: red; }{ padding: 2px }เพื่อตั้งระยะว่างที่ปลายของตัวคั่นได้:gap-horzและ:gap-vertเพื่อตั้งค่าระยะห่างแนวตั้งและแนวนอนแยกกันได้.container:gap:nth-gap(2n) { color: blue; }เพื่อให้ได้สีสลับกันการออกแบบโดยคณะกรรมการไม่ใช่สิ่งที่ดีที่สุด แต่ในฐานะคนที่ไม่ได้เป็นเจ้าของภาษา ชื่อพร็อพเพอร์ตีที่เสนอมาดูเหมือนจะสื่อความหมายได้ไม่ดีนัก
อยากให้พิจารณากรณีใช้งานของพาเนลที่ปรับขนาดได้ด้วย
การเพิ่มเส้นขอบทำให้ขนาดของรายการเปลี่ยนไป ซึ่งอาจไม่เป็นที่ต้องการ
* { box-sizing: border-box; }น่าสนใจ ช่วงนี้ทำงาน UI ใน QML เป็นหลัก และมันจัดการปัญหาแบบนี้ได้แทบทั้งหมด
เป็นไอเดียที่ใช้ได้ แต่คิดว่าน่าจะมีประโยชน์กว่านี้ถ้ามีมาตั้งแต่ราว 10 ปีก่อน
.things .thing:not(:last-child) { border-bottom: 1px solid gray; }เป็นปัญหาที่น่าปวดหัวมานาน ดีที่ได้เห็นใครสักคนลงมือทำอะไรบางอย่าง
display: gridเท่านั้น และไม่ครอบคลุมองค์ประกอบที่ความกว้างไม่ตายตัว|ระหว่างลิงก์อาจไปโผล่ท้ายบรรทัดแรกหรือต้นบรรทัดที่สองได้ทำให้นึกถึงคำกล่าวของดีไซเนอร์ชาวเยอรมัน: "เมื่อดีไซเนอร์ไม่มีไอเดียเหลือแล้ว ก็จะเพิ่มเส้นเข้าไปอีกสองสามเส้น"
เจอปัญหานี้บ่อย และอยากได้วิธีที่ดีกว่า
<hr/>หวังว่าสิ่งนี้จะผ่าน... การใช้ AI มาอุดช่องว่างความรู้เรื่อง flexbox เป็นพรจริง ๆ แต่สิ่งนี้ให้ความรู้สึกเหมือนเป็นวิธีแก้ที่แท้จริง