ปรับปรุงเวลาที่ใช้ในการโหลดเริ่มต้นโดยข้ามการแสดงผลเนื้อหานอกหน้าจอ
พร็อพเพอร์ตี้ content-visibility
ที่เปิดตัวใน Chromium 85 อาจเป็นหนึ่งในพร็อพเพอร์ตี้ CSS ใหม่ที่มีประสิทธิภาพมากที่สุดในการปรับปรุงประสิทธิภาพการโหลดหน้าเว็บ content-visibility
ช่วยให้ User Agent สามารถข้ามการแสดงผลองค์ประกอบ รวมถึงเลย์เอาต์และการลงสีได้จนกว่าจะต้องใช้ เนื่องจากระบบจะข้ามการแสดงผล หากเนื้อหาส่วนใหญ่ออกนอกหน้าจอ การใช้ประโยชน์จากพร็อพเพอร์ตี้ content-visibility
จะช่วยให้ผู้ใช้เริ่มต้นโหลดได้เร็วขึ้นมาก ยังช่วยให้โต้ตอบกับเนื้อหา
บนหน้าจอได้เร็วขึ้น เยี่ยมไปเลย
การสนับสนุนเบราว์เซอร์
content-visibility
อาศัยค่าพื้นฐานในข้อกำหนดการควบคุมของ CSS แม้ว่าตอนนี้ content-visibility
จะรองรับเฉพาะใน Chromium 85 เท่านั้น (และถือว่าเป็น "การสร้างต้นแบบ" ที่คุ้มค่าสำหรับ Firefox) แต่เบราว์เซอร์ที่ทันสมัยส่วนใหญ่ยังรองรับข้อกำหนดการคอนเทนเนอร์
การควบคุม CSS
เป้าหมายสำคัญและเป้าหมายของการควบคุม CSS คือการเปิดใช้การปรับปรุงประสิทธิภาพการแสดงผลของเนื้อหาเว็บโดยให้มีการแยกแผนผังย่อย DOM ที่คาดการณ์จากส่วนที่เหลือของหน้า
โดยพื้นฐานแล้ว นักพัฒนาซอฟต์แวร์สามารถบอกเบราว์เซอร์ว่าส่วนใดของหน้าเว็บรวมอยู่ในชุดเนื้อหา ซึ่งทำให้เบราว์เซอร์สามารถให้เหตุผลเกี่ยวกับเนื้อหาโดยไม่ต้องพิจารณาสถานะที่อยู่นอกโครงสร้างต้นไม้ย่อย การรู้ว่าส่วนใดของเนื้อหา (ส่วนย่อย) ที่มีเนื้อหาแยกต่างหากหมายความว่าเบราว์เซอร์สามารถตัดสินใจเพิ่มประสิทธิภาพสำหรับการแสดงผลหน้าเว็บได้
ประกอบด้วย CSS อยู่ 4 ประเภท ซึ่งแต่ละค่าที่เป็นไปได้สำหรับพร็อพเพอร์ตี้ CSS contain
สามารถรวมกันในรายการค่าที่คั่นด้วยการเว้นวรรคได้ ดังนี้
size
: การควบคุมขนาดในองค์ประกอบช่วยให้มั่นใจได้ว่าช่องขององค์ประกอบจะวางไว้ข้างบนได้โดยไม่ต้องตรวจสอบองค์ประกอบที่สืบทอดมา ซึ่งหมายความว่าเราอาจข้ามเลย์เอาต์ขององค์ประกอบสืบทอดได้ หากสิ่งที่เราต้องการคือขนาดขององค์ประกอบlayout
: การมีเลย์เอาต์ทำให้องค์ประกอบรองลงมาไม่ส่งผลต่อเลย์เอาต์ภายนอกของช่องอื่นๆ ในหน้าเว็บ การทำเช่นนี้จะทำให้เราข้ามการจัดวางองค์ประกอบสืบทอดได้ หากเราต้องการทำก็แค่วางกรอบอื่นๆstyle
: การควบคุมรูปแบบช่วยให้มั่นใจได้ว่าพร็อพเพอร์ตี้ที่อาจมีผลกระทบกับองค์ประกอบอื่นนอกเหนือจากองค์ประกอบสืบทอดนั้นจะไม่หลุดออกจากองค์ประกอบ (เช่น ตัวนับ) ซึ่งทำให้เราอาจข้ามการคำนวณรูปแบบสำหรับองค์ประกอบสืบทอดได้ หากเราต้องการเพียงแค่คำนวณสไตล์ในองค์ประกอบอื่นๆpaint
: การป้องกันสีช่วยให้มั่นใจได้ว่าองค์ประกอบที่สืบทอดจากกล่องที่บรรจุอยู่จะไม่แสดงนอกขอบเขต ไม่มีองค์ประกอบใดที่ล้นองค์ประกอบได้อย่างชัดเจน และหากองค์ประกอบใดหลุดออกไปนอกหน้าจอหรือไม่มองเห็นได้ องค์ประกอบสืบทอดก็จะไม่ปรากฏด้วย วิธีนี้ช่วยให้เราอาจข้ามการทาสีองค์ประกอบสืบทอด หากองค์ประกอบอยู่นอกจอ
ข้ามการแสดงภาพพร้อมกับ content-visibility
การหาค่าการยับยั้งค่าที่จะใช้อาจเป็นเรื่องยาก เนื่องจากการเพิ่มประสิทธิภาพเบราว์เซอร์จะทำงานต่อเมื่อมีการระบุชุดที่เหมาะสมเท่านั้น คุณอาจลองใช้ค่าต่างๆ เพื่อดูว่าแบบใดได้ผลดีที่สุด หรือจะใช้พร็อพเพอร์ตี้ CSS อื่นที่ชื่อ content-visibility
เพื่อนำค่าที่จำเป็นไปใช้โดยอัตโนมัติก็ได้ content-visibility
ช่วยให้คุณได้รับประสิทธิภาพสูงสุดตามที่เบราว์เซอร์สามารถมอบให้คุณในฐานะนักพัฒนาซอฟต์แวร์ใช้ความพยายามน้อยที่สุด
พร็อพเพอร์ตี้ระดับการเข้าถึงเนื้อหายอมรับค่าหลายค่า แต่ auto
เป็นค่าที่ปรับปรุงประสิทธิภาพได้ทันที องค์ประกอบที่มี content-visibility: auto
ได้รับการกำจัด layout
, style
และการยับยั้ง paint
แล้ว หากองค์ประกอบไม่ได้อยู่บนหน้าจอ (และไม่เกี่ยวข้องกับผู้ใช้ องค์ประกอบที่เกี่ยวข้องจะเป็นองค์ประกอบที่มีการโฟกัสหรือการเลือกในแผนผังย่อย) องค์ประกอบดังกล่าวจะมีการกักเก็บ size
ด้วยเช่นกัน (และจะหยุดการลงสีและการทดสอบ Hit เนื้อหา)
หมายความว่าอย่างไร กล่าวโดยสรุปคือ หากองค์ประกอบอยู่นอกหน้าจอ องค์ประกอบสืบทอดจะไม่แสดงผล เบราว์เซอร์จะกำหนดขนาดขององค์ประกอบโดยไม่พิจารณาเนื้อหาใดๆ แล้วจะหยุดการทำงาน ระบบจะข้ามการแสดงผลส่วนใหญ่ เช่น การจัดรูปแบบและเลย์เอาต์ของแผนผังย่อยขององค์ประกอบ
เมื่อองค์ประกอบเข้าใกล้วิวพอร์ต เบราว์เซอร์จะไม่เพิ่มส่วน size
อีกต่อไป และเริ่มระบายสีและทดสอบเนื้อหาขององค์ประกอบ วิธีนี้ช่วยให้ผู้ใช้มองเห็นงานการแสดงผลได้ทันท่วงที
หมายเหตุเกี่ยวกับการช่วยเหลือพิเศษ
ฟีเจอร์หนึ่งของ content-visibility: auto
คือเนื้อหานอกหน้าจอจะยังคงมีอยู่ในโมเดลออบเจ็กต์เอกสาร และด้วยโครงสร้างการช่วยเหลือพิเศษ (ต่างจาก visibility: hidden
) ซึ่งหมายความว่าผู้ใช้ค้นหาเนื้อหาในหน้าเว็บและไปยังเนื้อหาได้โดยไม่ต้องรอให้โหลดหรือลดประสิทธิภาพในการแสดงผล
อย่างไรก็ตาม ในอีกด้านหนึ่งก็คือองค์ประกอบจุดสังเกตที่มีฟีเจอร์ต่างๆ ด้านรูปแบบ เช่น display: none
หรือ visibility: hidden
จะปรากฏในแผนผังการช่วยเหลือพิเศษเมื่ออยู่นอกหน้าจอด้วย เนื่องจากเบราว์เซอร์จะไม่แสดงผลรูปแบบเหล่านี้จนกว่าจะเข้าสู่วิวพอร์ต เพื่อป้องกันไม่ให้รายการเหล่านี้ปรากฏในแผนผังการช่วยเหลือพิเศษ ซึ่งอาจทำให้เกิดความยุ่งเหยิงได้ โปรดเพิ่ม aria-hidden="true"
ด้วย
ตัวอย่าง: บล็อกการเดินทาง
บล็อกท่องเที่ยวมักมีชุดเรื่องราวพร้อมรูปภาพ 2-3 ภาพ และข้อความอธิบายบางส่วน ต่อไปนี้คือสิ่งที่เกิดขึ้นในเบราว์เซอร์ทั่วไปเมื่อไปยังบล็อกการเดินทาง
- ระบบจะดาวน์โหลดส่วนหนึ่งของหน้าเว็บรวมถึงทรัพยากรที่จำเป็นจากเครือข่าย
- เบราว์เซอร์จะจัดรูปแบบและจัดวางเนื้อหาทั้งหมดของหน้าเว็บ โดยไม่พิจารณาว่าผู้ใช้จะมองเห็นเนื้อหานั้นหรือไม่
- เบราว์เซอร์จะกลับไปยังขั้นตอนที่ 1 จนกว่าจะมีการดาวน์โหลดหน้าและทรัพยากรทั้งหมด
ในขั้นตอนที่ 2 เบราว์เซอร์จะประมวลผลเนื้อหาทั้งหมดและค้นหาสิ่งที่อาจมีการเปลี่ยนแปลง อัปเดตรูปแบบและเลย์เอาต์ขององค์ประกอบใหม่ๆ รวมถึงองค์ประกอบที่อาจเปลี่ยนแปลงไปเนื่องจากการอัปเดตใหม่ๆ นี่คือการแสดงภาพ ซึ่งจะใช้เวลาสักพัก
ต่อไปให้พิจารณาว่าจะเกิดอะไรขึ้นหากคุณใส่ content-visibility: auto
ในแต่ละเรื่องราวในบล็อก ลูปทั่วไปจะเหมือนกัน คือ
เบราว์เซอร์จะดาวน์โหลดและแสดงผลเป็นส่วนๆ ของหน้าเว็บ แต่ผลต่างคือปริมาณงานที่ทำในขั้นตอนที่ 2
เมื่อใช้ "การมองเห็นเนื้อหา" ระบบจะจัดรูปแบบและจัดวางเนื้อหาทั้งหมดที่ผู้ใช้มองเห็นได้ (อยู่ในหน้าจอ) อย่างไรก็ตาม ขณะประมวลผลเรื่องราวที่อยู่นอกหน้าจอโดยสมบูรณ์ เบราว์เซอร์จะข้ามการแสดงผลไป และจะใช้เฉพาะรูปแบบและเลย์เอาต์ของกล่ององค์ประกอบเท่านั้น
ประสิทธิภาพในการโหลดหน้านี้จะเหมือนกับว่ามีเรื่องราวทั้งหมดบนหน้าจอและว่างเปล่าสำหรับเรื่องราวนอกจอแต่ละเรื่อง วิธีนี้มีประสิทธิภาพดีกว่ามาก โดยคาดว่าจะลดลงอย่างน้อย 50% จากค่าใช้จ่ายในการโหลดการแสดงผล ในตัวอย่างของเรา เราจะเห็นการเพิ่มขึ้นจากเวลาในการแสดงผล 232 ms เป็นเวลาในการแสดงผล 30 ms เรียกได้ว่ามีประสิทธิภาพเพิ่มขึ้น 7 เท่า
คุณต้องทำอะไรเพื่อให้ได้รับผลประโยชน์เหล่านี้ ก่อนอื่น เราจะแบ่ง เนื้อหาออกเป็นส่วนต่างๆ ดังนี้
จากนั้นเราจะใช้กฎรูปแบบต่อไปนี้กับส่วนต่างๆ
.story {
content-visibility: auto;
contain-intrinsic-size: 1000px; /* Explained in the next section. */
}
การระบุขนาดตามปกติขององค์ประกอบด้วย contain-intrinsic-size
ในการทราบถึงประโยชน์ที่เป็นไปได้ของ content-visibility
เบราว์เซอร์จะต้องใช้การกำหนดขนาดเพื่อให้แน่ใจว่าผลลัพธ์ของเนื้อหาจะไม่ส่งผลต่อขนาดขององค์ประกอบแต่อย่างใด ซึ่งหมายความว่าองค์ประกอบจะ
จัดวางเหมือนกับว่าว่างเปล่า หากองค์ประกอบไม่ได้ระบุความสูง
ในเลย์เอาต์บล็อกปกติ องค์ประกอบจะมีความสูงเป็น 0
ซึ่งอาจไม่ค่อยเหมาะสม เนื่องจากขนาดของแถบเลื่อนจะเปลี่ยนตามแต่ละเรื่องราวที่มีความสูงไม่เท่ากับ 0
โชคดีที่ CSS ให้พร็อพเพอร์ตี้ contain-intrinsic-size
อีกรายการ ซึ่งระบุขนาดตามปกติขององค์ประกอบหากองค์ประกอบได้รับผลกระทบจากการกำหนดขนาด ในตัวอย่าง เราจะตั้งค่าความสูงและความกว้างของส่วนต่างๆ เป็น 1000px
โดยประมาณ
ซึ่งหมายความว่าจะมีการจัดวางภาพราวกับมีลูกเดี่ยวที่มีขนาด "ภายใน" เพื่อให้มั่นใจว่า div ที่ไม่ทราบขนาดยังคงใช้พื้นที่อยู่
contain-intrinsic-size
ทำหน้าที่เป็นขนาดตัวยึดตำแหน่งแทนเนื้อหาที่แสดงผล
ใน Chromium 98 เป็นต้นไป จะมีคีย์เวิร์ด auto
ใหม่สำหรับ contain-intrinsic-size
เมื่อระบุ เบราว์เซอร์จะจดจำขนาดที่แสดงผลล่าสุด (หากมี) และใช้ขนาดดังกล่าวแทนขนาดตัวยึดตำแหน่งที่นักพัฒนาแอปให้ไว้ ตัวอย่างเช่น หากคุณระบุ contain-intrinsic-size: auto 300px
องค์ประกอบจะเริ่มต้นด้วยการปรับขนาดภายใน 300px
ในแต่ละมิติข้อมูล แต่เมื่อแสดงเนื้อหาขององค์ประกอบแล้ว องค์ประกอบจะรักษาขนาดภายในที่แสดงผลไว้
ระบบจะจดจำการเปลี่ยนแปลงขนาดการแสดงผลครั้งต่อๆ ไปด้วยเช่นกัน ในทางปฏิบัติหมายความว่าหากคุณเลื่อนองค์ประกอบโดยใช้ content-visibility: auto
แล้วเลื่อนกลับมานอกหน้าจอ องค์ประกอบจะคงความกว้างและความสูงไว้ตามที่ควรจะเป็นโดยอัตโนมัติและไม่เปลี่ยนกลับไปใช้การปรับขนาดของตัวยึดตำแหน่ง ฟีเจอร์นี้มีประโยชน์อย่างยิ่งสำหรับการเลื่อนได้ไม่รู้จบ ซึ่งตอนนี้จะปรับปรุงการประมาณขนาดได้โดยอัตโนมัติเมื่อเวลาผ่านไปขณะที่ผู้ใช้สํารวจหน้าเว็บ
ซ่อนเนื้อหาที่มี content-visibility: hidden
จะทำอย่างไรหากต้องการให้เนื้อหาไม่มีการแสดงไม่ว่าเนื้อหาจะแสดงบนหน้าจอหรือไม่ก็ตาม ขณะที่ใช้ประโยชน์จากสถานะการแสดงผลที่แคชไว้ ป้อนข้อมูลต่อไปนี้
content-visibility: hidden
พร็อพเพอร์ตี้ content-visibility: hidden
มอบสิทธิประโยชน์ทั้งหมดของเนื้อหาที่ไม่ได้แสดงผลและสถานะการแสดงผลที่แคชไว้ เช่นเดียวกับ content-visibility: auto
ที่แสดงออกนอกหน้าจอ แต่ต่างจาก auto
ตรงที่จะไม่เริ่มแสดงผลบนหน้าจอโดยอัตโนมัติ
วิธีนี้ช่วยให้คุณควบคุมได้มากขึ้นและยังซ่อนเนื้อหาขององค์ประกอบและเลิกซ่อนเนื้อหาในภายหลังได้อย่างรวดเร็ว
เปรียบเทียบกับวิธีอื่นๆ ทั่วไปในการซ่อนเนื้อหาขององค์ประกอบ
display: none
: ซ่อนองค์ประกอบและทำลายสถานะการแสดงผล ซึ่งหมายความว่าการเลิกซ่อนองค์ประกอบจะมีค่าใช้จ่ายเท่ากับการแสดงผลองค์ประกอบใหม่ที่มีเนื้อหาเดียวกันvisibility: hidden
: ซ่อนองค์ประกอบและคงสถานะการแสดงผลไว้ การดำเนินการนี้ไม่ได้นำองค์ประกอบออกจากเอกสารอย่างแท้จริง เนื่องจาก (และแผนผังย่อย) ยังคงใช้พื้นที่เรขาคณิตในหน้าเว็บและยังคงคลิกได้ นอกจากนี้ยังอัปเดตสถานะการแสดงผลได้ทุกเมื่อที่ต้องการ แม้จะซ่อนอยู่
ในทางกลับกัน content-visibility: hidden
จะซ่อนองค์ประกอบขณะที่คงสถานะการแสดงผลไว้ ดังนั้นหากมีการเปลี่ยนแปลงที่จำเป็นเกิดขึ้น การเปลี่ยนแปลงจะเกิดขึ้นเฉพาะเมื่อองค์ประกอบแสดงอีกครั้ง (เช่น นำพร็อพเพอร์ตี้ content-visibility: hidden
ออก)
ตัวอย่างกรณีการใช้งานที่ยอดเยี่ยมสำหรับ content-visibility: hidden
คือการใช้แถบเลื่อนเสมือนขั้นสูงและการวัดเลย์เอาต์ และยังเหมาะสำหรับ
แอปพลิเคชันหน้าเว็บเดียว (SPA) อีกด้วย คุณอาจเก็บมุมมองแอปที่ไม่ได้ใช้งานไว้ใน DOM โดยใช้ content-visibility: hidden
เพื่อป้องกันไม่ให้แสดงผล แต่ยังคงรักษาสถานะแคชไว้ วิธีนี้ช่วยให้มุมมองแสดงผลอย่างรวดเร็วเมื่อกลับมาทำงานอีกครั้ง
ผลกระทบต่อการโต้ตอบกับ Next Paint (INP)
INP คือเมตริกที่ประเมินความสามารถของหน้าเว็บในการตอบสนองต่อข้อมูลจากผู้ใช้ได้อย่างน่าเชื่อถือ การปรับเปลี่ยนตามอุปกรณ์อาจได้รับผลกระทบจากปริมาณงานที่มากเกินไปในเทรดหลัก รวมถึงงานการแสดงผล
เมื่อใดก็ตามที่คุณลดการแสดงผลในหน้าใดก็ตามได้ ก็จะเป็นการเปิดโอกาสให้เทรดหลักตอบสนองต่อข้อมูลจากผู้ใช้ได้เร็วขึ้น ซึ่งรวมถึงการแสดงผลและการใช้พร็อพเพอร์ตี้ CSS content-visiblity
ในกรณีที่เหมาะสมจะช่วยลดงานการแสดงผล โดยเฉพาะในช่วงเริ่มต้นเมื่อการแสดงผลและเลย์เอาต์ส่วนใหญ่เสร็จสิ้นแล้ว
การลดการแสดงผลจะมีผลโดยตรงต่อ INP เมื่อผู้ใช้พยายามโต้ตอบกับหน้าเว็บที่ใช้พร็อพเพอร์ตี้ content-visibility
อย่างเหมาะสมเพื่อเลื่อนเลย์เอาต์และการแสดงผลองค์ประกอบนอกหน้าจอ เทรดหลักจะมีโอกาสตอบสนองต่องานสําคัญที่ผู้ใช้มองเห็น การทำเช่นนี้จะช่วยปรับปรุง INP ของหน้าเว็บได้ในบางสถานการณ์
บทสรุป
content-visibility
และข้อกำหนดการควบคุมของ CSS หมายความว่าไฟล์ CSS ของคุณจะมีประสิทธิภาพการทำงานที่น่าตื่นเต้นมากขึ้น ดูข้อมูลเพิ่มเติมเกี่ยวกับ
คุณสมบัติเหล่านี้ได้ที่