เหตุผลที่เราสร้างเครื่องมือ CSS Grid
ตาราง CSS เป็นระบบเลย์เอาต์ CSS ที่มีประสิทธิภาพมาก ซึ่งช่วยให้นักพัฒนาเว็บสร้างเลย์เอาต์ 2 มิติที่ซับซ้อน รวมถึงกำหนดกฎเกี่ยวกับวิธีกำหนดขนาด จัดแนว และจัดลำดับรายการย่อยแต่ละรายการในตาราง CSS Grid เปิดตัวหลังจากที่ Flexbox ได้รับความนิยม และทั้งสองเทคโนโลยีนี้ช่วยให้นักพัฒนาซอฟต์แวร์ออกแบบเว็บไซต์ที่ปรับเปลี่ยนตามอุปกรณ์ได้ดียิ่งขึ้นโดยไม่ต้องใช้การแฮ็กการจัดแนวที่ซับซ้อนหรือเลย์เอาต์ที่ JavaScript ช่วย
เนื่องจากเป็นระบบเลย์เอาต์ที่ค่อนข้างใหม่ ตารางกริด CSS จึงแก้ไขได้ยากเช่นกัน ไวยากรณ์ของภาษาค่อนข้างอเนกประสงค์ (เพียงค้นหาตารางสรุป) มีวิธีมากมายในการสร้างเลย์เอาต์เดียวกัน และการปรับขนาดที่ยืดหยุ่นและแทร็กโดยนัยทําให้เหตุผลว่าเหตุใดเลย์เอาต์จึงเป็นหรือไม่เป็นอย่างควรจะเป็นได้ยากขึ้น ด้วยเหตุนี้ เราจึงมุ่งมั่นที่จะจัดเตรียมเครื่องมือ CSS Grid โดยเฉพาะใน DevTools เพื่อให้นักพัฒนาซอฟต์แวร์เข้าใจสิ่งที่โค้ด CSS กำลังทำอยู่และวิธีสร้างเลย์เอาต์ที่เหมาะสมมากขึ้น
การออกแบบเครื่องมือ
ความร่วมมือระหว่าง Chrome กับ Edge
เครื่องมือตาราง CSS ดึงดูดความสนใจจากทั้งเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome และเครื่องมือสำหรับนักพัฒนาเว็บใน Edge เราตัดสินใจที่จะทำงานร่วมกันตั้งแต่ต้น เราแชร์ทรัพยากรด้านผลิตภัณฑ์ วิศวกรรม และการออกแบบจากทั้ง 2 ทีม และประสานงานกันทุกสัปดาห์เพื่อทำให้เรื่องนี้เกิดขึ้น
สรุปฟีเจอร์
เครื่องมือ CSS Grid มีฟีเจอร์หลัก 3 อย่าง ได้แก่
- การวางซ้อนแบบถาวรเฉพาะตารางกริดซึ่งช่วยเกี่ยวกับข้อมูลมิติข้อมูลและการจัดเรียง
- ป้ายในแผนผัง DOM ที่ไฮไลต์คอนเทนเนอร์ตารางกริด CSS และเปิด/ปิดการวางซ้อนตารางกริด
- แผงแถบด้านข้างที่ช่วยให้นักพัฒนาซอฟต์แวร์ปรับเปลี่ยนการแสดงการวางซ้อน DOM ในแบบของคุณ (เช่น การเปลี่ยนสีและความกว้างของกฎ)
- เครื่องมือแก้ไขตาราง CSS ในแผงสไตล์
ต่อไปเรามาเจาะลึกเรื่องนี้กัน
การวางซ้อนถาวรของตารางกริด
ในเครื่องมือสำหรับนักพัฒนาเว็บ การวางซ้อนเป็นเครื่องมือที่มีประสิทธิภาพซึ่งให้ข้อมูลเลย์เอาต์และสไตล์ขององค์ประกอบแต่ละรายการ
ข้อมูลเพิ่มเติมนี้จะวางซ้อนบนองค์ประกอบที่น่าสนใจ ก่อนหน้านี้ เมื่อคุณวางเมาส์เหนือตารางกริดโดยที่ DevTools เปิดอยู่ การวางซ้อนจะแสดงข้อมูลโมเดลกล่อง แต่จำกัดการไฮไลต์เนื้อหาไว้ที่รายการตารางกริดโดยไม่อธิบายสาเหตุ เราต้องการเพิ่มส่วนสำคัญ 2 ส่วนสำหรับการวางซ้อนตารางกริด CSS ดังนี้
- เราต้องการแสดงข้อมูลที่เป็นประโยชน์มากขึ้นเกี่ยวกับตารางกริด เช่น มิติข้อมูลและช่องว่างที่เขียน
- เราต้องการทำให้การวางซ้อนติดอยู่เพื่อให้ดูตารางกริดหลายรายการพร้อมกันได้ และเห็นการวางซ้อนที่อัปเดตข้อมูลตารางกริดเมื่อเราเปลี่ยนสไตล์องค์ประกอบ
มาดูกันว่าเราทําทั้ง 2 อย่างได้อย่างไร
ขนาดที่เขียนเทียบกับขนาดที่คำนวณ
ปัญหาที่ยากอย่างหนึ่งเกี่ยวกับการแก้ไขข้อบกพร่อง CSS Grid คือการกำหนดขนาดแทร็กตารางกริดมีหลายวิธี เช่น คุณอาจใช้ค่าพิกเซล ค่าเปอร์เซ็นต์ เศษ ฟังก์ชันซ้ำ และฟังก์ชัน minmax ร่วมกันเพื่อสร้างขนาดแทร็กอเนกประสงค์ ดังนี้
.grid-cards {
display: grid;
width: 200px;
height: 300px;
grid-template-rows: 20% 0.3fr 100px minmax(100px, auto);
grid-template-columns: repeat(3, minmax(200px, 1fr));
}
อย่างไรก็ตาม การแมปขนาดแทร็กที่เขียนเหล่านี้กับขนาดแทร็กที่คำนวณแล้วซึ่งเบราว์เซอร์คำนวณให้เรานั้นทำได้ยาก เราจึงแสดงข้อมูล 2 รายการนี้ควบคู่กันในการวางซ้อนเพื่อลดช่องว่างนี้
สตริงก่อนจุดคือค่าที่เขียน และสตริงหลังจุดแสดงค่าที่คำนวณจริง
ก่อนหน้านี้ เครื่องมือสำหรับนักพัฒนาเว็บไม่สามารถรับค่าที่เขียนไว้ ในทางทฤษฎี เราอาจแยกวิเคราะห์ค่าที่เขียนใน DevTools ด้วยตนเองและคำนวณค่าเหล่านั้นตามข้อกำหนด CSS Grid ได้ แต่วิธีนี้จะต้องอาศัยสถานการณ์ที่ซับซ้อนหลายอย่าง และโดยพื้นฐานแล้วจะเป็นการทำซ้ำความพยายามของ Blink ดังนั้นด้วยความช่วยเหลือจากทีมสไตล์ของ Blink เราจึงได้รับ API ใหม่จากเครื่องมือสไตล์ที่แสดง "ค่าแบบ Cascaded" ค่าแบบ Cascaded คือค่าที่มีประสิทธิภาพสุดท้ายหลังจากการต่อเรียงของ CSS สำหรับพร็อพเพอร์ตี้ CSS ค่านี้คือค่าที่ชนะหลังจากที่เครื่องมือสไตล์คอมไพล์สไตล์ชีตทั้งหมดแล้ว แต่ก่อนที่จะคำนวณค่าใดๆ เช่น เปอร์เซ็นต์ เศษทศนิยม ฯลฯ
ตอนนี้เราใช้ API นี้เพื่อแสดงค่าที่เขียนในตารางวางซ้อน
การวางซ้อนแบบถาวร
ก่อนที่จะมีเครื่องมือ CSS Grid การซ้อนทับใน DevTools นั้นใช้งานง่ายมาก คุณเพียงวางเมาส์เหนือองค์ประกอบในแผง DOM Tree ของ DevTools หรือในหน้าเว็บที่ตรวจสอบโดยตรง แล้วคุณจะเห็นการซ้อนทับที่อธิบายองค์ประกอบนี้ เมื่อคุณเลื่อนเมาส์ออก การวางซ้อนจะหายไป สําหรับการวางซ้อนตารางกริด เราต้องการอะไรที่แตกต่างออกไป นั่นคือสามารถไฮไลต์ตารางกริดหลายรายการพร้อมกัน และการวางซ้อนตารางกริดจะยังคงอยู่ได้ในขณะที่การวางซ้อนแบบปกติเมื่อวางเมาส์เหนือยังคงทํางานอยู่
เช่น
อย่างไรก็ตาม การวางซ้อนในเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ไม่ได้ออกแบบมาโดยคำนึงถึงกลไกแบบหลายองค์ประกอบที่คงอยู่นี้ (สร้างขึ้นเมื่อหลายปีก่อน) เราจึงต้องปรับโครงสร้างการออกแบบการวางซ้อนเพื่อให้ใช้งานได้ เราได้เพิ่ม GridHighlightTool
ใหม่ลงในชุดเครื่องมือไฮไลต์ที่มีอยู่ ซึ่งต่อมาได้พัฒนาเป็น PersistentTool
ระดับทั่วเว็บไซต์สำหรับการไฮไลต์การวางซ้อนถาวรทั้งหมดพร้อมกัน สำหรับการวางซ้อนถาวรแต่ละประเภท (ตารางกริด แบบยืดหยุ่น ฯลฯ) เราจะเก็บฟิลด์การกำหนดค่าที่เกี่ยวข้องไว้ภายในเครื่องมือถาวร ทุกครั้งที่เครื่องมือไฮไลต์การวางซ้อนตรวจสอบว่าจะวาดอะไร ระบบจะรวมการกำหนดค่าเหล่านี้ไว้ด้วย
เราได้สร้างคําสั่ง CDP ใหม่สําหรับการวางซ้อนแบบถาวรของตารางกริดเพื่อให้ DevTools ควบคุมสิ่งที่ต้องไฮไลต์ได้ ดังนี้
# Highlight multiple elements with the CSS Grid overlay.
command setShowGridOverlays
parameters
# An array of node identifiers and descriptors for the highlight appearance.
array of GridNodeHighlightConfig gridNodeHighlightConfigs
โดย GridNodeHighlightConfig
แต่ละรายการจะมีข้อมูลเกี่ยวกับโหนดที่จะวาดและวิธีวาด ซึ่งช่วยให้เราเพิ่มกลไกแบบถาวรที่มีหลายรายการได้โดยไม่ทำให้ลักษณะการทำงานขณะวางเมาส์เหนือรายการปัจจุบันเสีย
ป้ายตารางกริดแบบเรียลไทม์
เราตัดสินใจเพิ่มป้ายเล็กๆ ไว้ข้างคอนเทนเนอร์ตารางกริดในแผนผัง DOM เพื่อช่วยให้นักพัฒนาแอปสามารถสลับเปิดและปิดการวางซ้อนตารางกริดได้อย่างง่ายดาย ป้ายเหล่านี้ยังช่วยให้นักพัฒนาซอฟต์แวร์ระบุคอนเทนเนอร์ตารางกริดในโครงสร้าง DOM ได้ด้วย
การเปลี่ยนแปลงในแผนผัง DOM
เนื่องจากป้าย Grid
ไม่ใช่ป้ายเดียวที่เราต้องการแสดงในแผนผัง DOM เราจึงต้องการทำให้การเพิ่มป้ายนั้นง่ายที่สุด ElementsTreeElement
ซึ่งเป็นคลาสที่รับผิดชอบในการสร้างและจัดการองค์ประกอบ DOM Tree แต่ละรายการในเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ได้รับการอัปเดตด้วยเมธอดสาธารณะใหม่หลายรายการเพื่อกำหนดค่าป้าย หากมีป้ายหลายรายการสำหรับองค์ประกอบเดียว ระบบจะจัดเรียงตามหมวดหมู่ของป้าย แล้วจัดเรียงตามชื่อตามลําดับตัวอักษรหากอยู่ในหมวดหมู่เดียวกัน หมวดหมู่ที่ใช้ได้มี Security
, Layout
ฯลฯ และ Grid
อยู่ในหมวดหมู่ Layout
นอกจากนี้ เรายังมีการรองรับการช่วยเหลือพิเศษสำหรับผู้ทุพพลภาพในตัวตั้งแต่ต้น ป้ายอินเทอร์แอกทีฟทุกรายการต้องระบุ aria-label
เริ่มต้นและ aria-label
ที่ใช้งานอยู่ ส่วนป้ายที่อ่านอย่างเดียวจะใช้ชื่อป้ายเป็น aria-label
เราได้รับการอัปเดตสไตล์แบบเรียลไทม์ได้อย่างไร
การเปลี่ยนแปลง DOM จำนวนมากจะแสดงในแผนผัง DOM ของเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์แบบเรียลไทม์ เช่น โหนดที่เพิ่มใหม่จะปรากฏในต้นไม้ DOM ทันที และชื่อคลาสที่นําออกจะหายไปทันทีเช่นกัน เราต้องการให้สถานะป้าย "ตารางกริด" แสดงข้อมูลเดียวกันด้วย อย่างไรก็ตาม การดำเนินการนี้ทำได้ยาก เนื่องจากเครื่องมือสำหรับนักพัฒนาเว็บไม่สามารถรับการแจ้งเตือนเมื่อองค์ประกอบที่แสดงใน DOM Tree ได้รับการอัปเดตสไตล์ที่คอมไพล์แล้ว วิธีเดียวที่ทราบได้ว่าองค์ประกอบหนึ่งๆ กลายเป็นหรือหยุดเป็นคอนเทนเนอร์ตารางกริดแล้วคือต้องค้นหาข้อมูลสไตล์ล่าสุดขององค์ประกอบแต่ละรายการในเบราว์เซอร์อย่างต่อเนื่อง ซึ่งจะมีราคาสูงเกินกว่าจะจ่ายได้
เราได้เพิ่มเมธอด CDP ใหม่สำหรับการสำรวจการอัปเดตสไตล์เพื่อให้ส่วนหน้าทราบได้ง่ายขึ้นเมื่อองค์ประกอบได้รับการอัปเดตสไตล์ หากต้องการรับการอัปเดตสไตล์ของโหนด DOM เราจะเริ่มต้นด้วยการบอกเบราว์เซอร์ว่าต้องการติดตามการประกาศ CSS ใด ในกรณีของป้ายตารางกริด เราจะขอให้เบราว์เซอร์ติดตามข้อมูลต่อไปนี้
{
"display": "grid",
"display": "inline-grid",
}
จากนั้นเราจะส่งคําขอการโหวต และเมื่อมีการอัปเดตสไตล์ที่ติดตามสําหรับโหนด DOM ในแผงองค์ประกอบ เบราว์เซอร์จะส่งรายการโหนดที่อัปเดตแล้วไปยังเครื่องมือสําหรับนักพัฒนาซอฟต์แวร์และแก้ไขคําขอการโหวตที่มีอยู่ เมื่อใดก็ตามที่เครื่องมือสำหรับนักพัฒนาเว็บต้องการรับการแจ้งเตือนสำหรับการอัปเดตรูปแบบอีกครั้ง เครื่องมือนี้จะส่งคำขอการหยั่งสัญญาณนี้แทนการหยั่งสัญญาณแบ็กเอนด์จากแต่ละโหนดอย่างต่อเนื่อง นอกจากนี้ DevTools ยังเปลี่ยนการประกาศ CSS ที่กำลังติดตามได้โดยการส่งรายการใหม่ไปยังเบราว์เซอร์
แผงเลย์เอาต์
แม้ว่าป้ายกำกับต้นไม้ DOM จะช่วยเพิ่มการค้นพบตาราง CSS แต่บางครั้งเราก็ต้องการดูรายการตาราง CSS ทั้งหมดในหน้าเว็บหนึ่งๆ และเปิด/ปิดการวางซ้อนแบบถาวรเพื่อแก้ไขข้อบกพร่องของเลย์เอาต์ได้อย่างง่ายดาย เราจึงตัดสินใจสร้างแผงแถบด้านข้างสำหรับเครื่องมือการจัดวางโดยเฉพาะ ซึ่งจะมอบพื้นที่เฉพาะสำหรับการรวบรวมคอนเทนเนอร์ของตารางกริดทั้งหมด รวมถึงกำหนดค่าตัวเลือกทั้งหมดสำหรับการวางซ้อนตารางกริด แผงเลย์เอาต์นี้ยังช่วยให้เราใส่เครื่องมือที่เกี่ยวข้องกับเลย์เอาต์จำนวนมากในอนาคต (เช่น Flexbox, การค้นหาคอนเทนเนอร์) ไว้ที่นี่ได้ด้วย
ค้นหาองค์ประกอบตามสไตล์ที่คำนวณแล้ว
หากต้องการแสดงรายการคอนเทนเนอร์ตาราง CSS ในแผงเลย์เอาต์ เราต้องค้นหาโหนด DOM ตามสไตล์ที่คำนวณแล้ว แต่วิธีนี้ก็ไม่ได้ตรงไปตรงมาเช่นกัน เนื่องจากเครื่องมือสำหรับนักพัฒนาเว็บจะไม่ทราบโหนด DOM บางโหนดเมื่อเปิดเครื่องมือดังกล่าว แต่เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์จะรู้จักเฉพาะโหนดย่อยจำนวนน้อยเท่านั้น โดยปกติจะอยู่ในระดับบนสุดของลําดับชั้น DOM เพื่อเริ่มต้นแผนผัง DOM ของเครื่องมือสําหรับนักพัฒนาซอฟต์แวร์ ระบบจะดึงข้อมูลโหนดอื่นๆ เมื่อได้รับคําขอเพิ่มเติมเท่านั้นเพื่อเหตุผลด้านประสิทธิภาพ ซึ่งหมายความว่าเราต้องใช้คําสั่ง CDP ใหม่เพื่อรวบรวมโหนดทั้งหมดในหน้าเว็บและกรองตามสไตล์ที่คอมไพล์แล้ว
# Finds nodes with a given computed style in a subtree.
experimental command getNodesForSubtreeByStyle
parameters
# Node ID pointing to the root of a subtree.
NodeId nodeId
# The style to filter nodes by (includes nodes if any of properties matches).
array of CSSComputedStyleProperty computedStyles
# Whether or not iframes and shadow roots in the same target should be traversed when returning the
# results (default is false).
optional boolean pierce
returns
# Resulting nodes.
array of NodeId nodeIds
การดำเนินการนี้จะทำให้ฟรอนท์เอนด์ของเครื่องมือสำหรับนักพัฒนาเว็บรับรายการคอนเทนเนอร์ตารางกริด CSS ในหน้าเว็บ ซึ่งอาจเจาะผ่าน iframe และรากที่เป็นเงา และแสดงผลในแผงเลย์เอาต์ได้
บทสรุป
เครื่องมือ CSS Grid เป็นหนึ่งในโปรเจ็กต์เครื่องมือออกแบบของ DevTools โปรเจ็กต์แรกๆ ที่รองรับฟีเจอร์แพลตฟอร์มเว็บ เครื่องมือนี้เปิดตัวเครื่องมือพื้นฐานหลายอย่างใน DevTools เช่น การซ้อนทับแบบถาวร ป้ายกำกับ DOM Tree และแผงเลย์เอาต์ รวมถึงปูทางสำหรับเครื่องมือการจัดวางในอนาคตในเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome เช่น การค้นหา Flexbox และคอนเทนเนอร์ นอกจากนี้ยังเป็นรากฐานสําหรับเครื่องมือแก้ไขตารางกริดและ Flexbox ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์เปลี่ยนการจัดแนวตารางกริดและ Flexbox ได้อย่างอินเทอร์แอกทีฟ เราจะอธิบายเรื่องนี้ในอนาคต
ดาวน์โหลดแชแนลตัวอย่าง
ลองใช้ Chrome Canary, Dev หรือเบต้าเป็นเบราว์เซอร์เริ่มต้นสำหรับการพัฒนา ช่องทางเวอร์ชันตัวอย่างเหล่านี้จะช่วยให้คุณเข้าถึงฟีเจอร์ล่าสุดของ DevTools, ทดสอบ API ของแพลตฟอร์มเว็บที่ล้ำสมัย และช่วยคุณค้นหาปัญหาในเว็บไซต์ได้ก่อนที่ผู้ใช้จะพบ
ติดต่อทีมเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome
ใช้ตัวเลือกต่อไปนี้เพื่อพูดคุยเกี่ยวกับฟีเจอร์ใหม่ การอัปเดต หรือสิ่งอื่นๆ ที่เกี่ยวข้องกับเครื่องมือสำหรับนักพัฒนาเว็บ
- ส่งความคิดเห็นและคำขอฟีเจอร์ถึงเราได้ที่ crbug.com
- รายงานปัญหาเกี่ยวกับเครื่องมือสำหรับนักพัฒนาเว็บโดยใช้ ตัวเลือกเพิ่มเติม > ความช่วยเหลือ > รายงานปัญหาเกี่ยวกับเครื่องมือสำหรับนักพัฒนาเว็บในเครื่องมือสำหรับนักพัฒนาเว็บ
- ทวีตที่ @ChromeDevTools
- แสดงความคิดเห็นในวิดีโอ YouTube เกี่ยวกับข่าวสารใน DevTools หรือวิดีโอ YouTube เกี่ยวกับเคล็ดลับใน DevTools