ข้อมูลล่าสุดของ CSS และ UI บนเว็บ: สรุป I/O 2024

แพลตฟอร์มเว็บเต็มไปด้วยนวัตกรรม โดยมี CSS และฟีเจอร์ UI ของเว็บเป็นหัวหอกในการพัฒนาที่น่าตื่นเต้นนี้ เรากำลังเข้าสู่ยุคทองของ UI เว็บ ด้วยฟีเจอร์ CSS ใหม่ซึ่งนำเข้าสู่ทุกเบราว์เซอร์ได้อย่างรวดเร็วอย่างที่เราไม่เคยเห็นมาก่อน ซึ่งเป็นการเปิดโลกแห่งความเป็นไปได้ในการสร้างประสบการณ์เว็บที่สวยงามและน่าสนใจ บล็อกโพสต์นี้จะเจาะลึกสถานะปัจจุบันของ CSS โดยสำรวจฟีเจอร์ใหม่ที่พลิกโฉมวงการและกำลังกำหนดวิธีที่เราสร้างเว็บแอปพลิเคชัน ซึ่งจะแสดงสดในงาน Google I/O 2024

ประสบการณ์แบบอินเทอร์แอกทีฟแปลกใหม่

ประสบการณ์การใช้งานเว็บเป็นการสื่อสารแบบเรียกและตอบระหว่างคุณกับผู้ใช้ ดังนั้นการลงทุนในการโต้ตอบกับผู้ใช้ที่มีคุณภาพจึงสำคัญอย่างยิ่ง เราทํางานเพื่อปรับปรุงครั้งใหญ่ที่ปลดล็อกความสามารถที่เราไม่เคยมีมาก่อนบนเว็บสําหรับการไปยังส่วนต่างๆ ภายในหน้าเว็บและการไปยังหน้าเว็บต่างๆ

ภาพเคลื่อนไหวที่ทำงานตามการเลื่อน

การรองรับเบราว์เซอร์

  • Chrome: 115
  • Edge: 115
  • Firefox: อยู่หลังธง
  • Safari: ไม่รองรับ

แหล่งที่มา

ตามชื่อที่บอกไว้ API ภาพเคลื่อนไหวที่ทำงานตามการเลื่อนช่วยให้คุณสร้างภาพเคลื่อนไหวแบบไดนามิกตามการเลื่อนได้โดยไม่ต้องอาศัยเครื่องมือตรวจสอบการเลื่อนหรือสคริปต์อื่นๆ ที่หนักหน่วง

สร้างภาพเคลื่อนไหวที่ทำงานตามการเลื่อน

ตอนนี้คุณสามารถใช้ความคืบหน้าในการเลื่อนของตัวเลื่อนเพื่อเริ่ม หยุดชั่วคราว และย้อนกลับภาพเคลื่อนไหวได้เช่นเดียวกับภาพเคลื่อนไหวที่อิงตามเวลาบนแพลตฟอร์ม ดังนั้น ขณะเลื่อนไปข้างหน้า คุณจะเห็นความคืบหน้าของภาพเคลื่อนไหว และเมื่อเลื่อนไปข้างหลัง จะเป็นการเปลี่ยนทิศทางกลับ วิธีนี้จะช่วยให้คุณสร้างภาพบางส่วนหรือแบบเต็มหน้าโดยมีองค์ประกอบที่เคลื่อนไหวเข้าไปภายในและในวิวพอร์ต หรือที่เรียกว่า scrollytelling เพื่อสร้างผลกระทบของภาพแบบไดนามิก

ภาพเคลื่อนไหวที่ขับเคลื่อนด้วยการเลื่อนสามารถใช้เพื่อไฮไลต์เนื้อหาสำคัญ แนะนำเรื่องราวแก่ผู้ใช้ หรือเพียงแค่เพิ่มลูกเล่นแบบไดนามิกลงในหน้าเว็บของคุณก็ได้

ภาพภาพเคลื่อนไหวแบบเลื่อน

การสาธิตการใช้งานแบบสด

@keyframes appear {
  from {
    opacity: 0;
    scale: 0.8;
  }
  to {
    opacity: 1;
    scale: 1;
  }
}

img {
  animation: appear linear;
  animation-timeline: view();
  animation-range: entry 25% cover 50%;
}

โค้ดก่อนหน้าจะกำหนดภาพเคลื่อนไหวแบบง่ายที่ปรากฏในวิวพอร์ตโดยเปลี่ยนความทึบแสงและขนาดของรูปภาพ ภาพเคลื่อนไหวจะทำงานตามตำแหน่งการเลื่อน หากต้องการสร้างเอฟเฟกต์นี้ ให้ตั้งค่าภาพเคลื่อนไหว CSS ก่อน แล้วจึงตั้งค่า animation-timeline ในกรณีนี้ ฟังก์ชัน view() ที่มีค่าเริ่มต้นจะติดตามรูปภาพโดยสัมพันธ์กับ scrollport (ซึ่งในกรณีนี้ก็คือ viewport ด้วย)

อย่าลืมคำนึงถึงการสนับสนุนของเบราว์เซอร์และค่ากําหนดของผู้ใช้ โดยเฉพาะความต้องการด้านการช่วยเหลือพิเศษ ดังนั้น ให้ใช้กฎ @supports เพื่อตรวจสอบว่าเบราว์เซอร์รองรับภาพเคลื่อนไหวที่ทำงานจากการเลื่อนหรือไม่ และรวมภาพเคลื่อนไหวที่ทำงานจากการเลื่อนในการค้นหาค่ากำหนดของผู้ใช้ เช่น @media (prefers-reduced-motion: no-preference) เพื่อให้เป็นไปตามค่ากำหนดการเคลื่อนไหวของผู้ใช้ เมื่อทำการตรวจสอบเหล่านี้แล้ว คุณจะทราบว่าสไตล์ของคุณใช้งานได้และภาพเคลื่อนไหวจะไม่ก่อให้เกิดปัญหาต่อผู้ใช้

@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    /* Apply scroll-driven animations here */
  }
}

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

ภาพเคลื่อนไหวที่ทำงานตามการเลื่อน

การสาธิตสด

@keyframes shrink-name {
  from {
    font-size: 2em;
  }
  to {
    font-size: 1.5em;
  }
}

@keyframes add-shadow {
  from {
    box-shadow: none;
  }
  to {
    box-shadow: 0 4px 2px -2px gray;
  }
}

header {
  animation: add-shadow linear both;
}

h2 {
  animation: shrink-name linear both;
}

header, h2 {
  animation-timeline: scroll();
  animation-range: 0 150px;
}

การแสดงตัวอย่างนี้ใช้ภาพเคลื่อนไหวคีย์เฟรมที่แตกต่างกัน 2-3 แบบ ได้แก่ ส่วนหัว ข้อความ แถบนําทาง และพื้นหลัง จากนั้นนําภาพเคลื่อนไหวที่ทำงานตามการเลื่อนไปใช้กับแต่ละรายการ แม้ว่าแต่ละรายการจะมีสไตล์ภาพเคลื่อนไหวต่างกัน แต่รายการทั้งหมดมีไทม์ไลน์ภาพเคลื่อนไหว แถบเลื่อนที่อยู่ใกล้ที่สุด และช่วงภาพเคลื่อนไหวเดียวกัน ซึ่งอยู่ในช่วงจากด้านบนของหน้าไปจนถึง 150 พิกเซล

ประโยชน์ด้านประสิทธิภาพของภาพเคลื่อนไหวที่ทำงานตามการเลื่อน

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

เมื่อเร็วๆ นี้ Tokopedia ใช้ภาพเคลื่อนไหวที่ทำงานตามการเลื่อนเพื่อให้แถบนําทางผลิตภัณฑ์ปรากฏขึ้นขณะที่คุณเลื่อน การใช้ API นี้มีประโยชน์อย่างมาก ทั้งในด้านการจัดการโค้ดและประสิทธิภาพ

ภาพเคลื่อนไหวที่ขับเคลื่อนด้วยการเลื่อนจะขับเคลื่อนแถบนำทางของผลิตภัณฑ์นี้ใน Tokopedia เมื่อคุณเลื่อนลง

"เราลดจำนวนบรรทัดโค้ดได้สูงสุด 80% เมื่อเทียบกับการใช้เหตุการณ์การเลื่อน JS แบบดั้งเดิม และพบว่าการใช้งาน CPU เฉลี่ยลดลงจาก 50% เป็น 2% ขณะเลื่อน - Andy Wihalim วิศวกรซอฟต์แวร์อาวุโสของ Tokopedia"

อนาคตของเอฟเฟกต์การเลื่อน

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

และยังมีฟีเจอร์การเลื่อนอีกมากมายที่จะเปิดตัวในเบราว์เซอร์ในอนาคต การสาธิตต่อไปนี้แสดงการรวมฟีเจอร์ในอนาคตเหล่านี้ โดยใช้ CSS scroll-start-target เพื่อตั้งค่าวันที่และเวลาเริ่มต้นภายในเครื่องมือเลือก และเหตุการณ์ JavaScript scrollsnapchange เพื่ออัปเดตวันที่ส่วนหัว ซึ่งทำให้การซิงค์ข้อมูลกับเหตุการณ์ที่หยุดชั่วคราวเป็นเรื่องง่าย

ดูการสาธิตการใช้งานจริงใน Codepen

นอกจากนี้ คุณยังใช้เหตุการณ์ scrollsnapchanging ของ JavaScript เพื่ออัปเดตเครื่องมือเลือกแบบเรียลไทม์ได้ด้วย

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

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มต้นใช้งานภาพเคลื่อนไหวที่ทำงานตามการเลื่อน ทีมของเราเพิ่งเปิดตัวซีรีส์วิดีโอใหม่ในช่อง YouTube ของ Chrome สําหรับนักพัฒนาซอฟต์แวร์ ในส่วนนี้ คุณจะได้เรียนรู้พื้นฐานเกี่ยวกับภาพเคลื่อนไหวที่ทำงานตามการเลื่อนจาก Bramus Van Damme ซึ่งรวมถึงวิธีการทำงานของฟีเจอร์ ศัพท์เฉพาะ วิธีต่างๆ ในการสร้างเอฟเฟกต์ และวิธีรวมเอฟเฟกต์เพื่อสร้างประสบการณ์การใช้งานที่สมบูรณ์ ซีรีส์วิดีโอนี้ยอดเยี่ยมมาก

ดูทรานซิชัน

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

การรองรับเบราว์เซอร์

  • Chrome: 111
  • Edge: 111
  • Firefox: ไม่รองรับ
  • Safari: 18.

แหล่งที่มา

Airbnb เป็นหนึ่งในบริษัทที่ทดลองผสานรวมการเปลี่ยนมุมมองเข้ากับ UI เพื่อให้การไปยังส่วนต่างๆ ของเว็บเป็นไปอย่างราบรื่น ซึ่งรวมถึงแถบด้านข้างของเครื่องมือแก้ไขข้อมูล ไปจนถึงการแก้ไขรูปภาพและการเพิ่มสิ่งอำนวยความสะดวก ทั้งหมดนี้อยู่ในขั้นตอนการดำเนินการของผู้ใช้ที่ราบรื่น

การเปลี่ยนมุมมองเอกสารเดียวกันตามที่เห็นใน Airbnb
พอร์ตโฟลิโอของ Maxwell Barvian ซึ่งแสดงการเปลี่ยนมุมมองระหว่างมุมมอง

แม้ว่าเอฟเฟกต์ทั้งหน้าเหล่านี้จะดูสวยงามและราบรื่น แต่คุณก็สร้างการโต้ตอบเล็กๆ น้อยๆ ได้ด้วย เช่น ตัวอย่างนี้ที่มุมมองรายการจะอัปเดตเมื่อผู้ใช้โต้ตอบ คุณสามารถสร้างเอฟเฟกต์นี้ได้ง่ายๆ ด้วยทรานซิชันของมุมมอง

วิธีเปิดใช้การเปลี่ยนมุมมองในแอปพลิเคชันแบบหน้าเดียวอย่างรวดเร็วนั้นง่ายดายเพียงใช้ document.startViewTransition ปิดท้ายการโต้ตอบ และตรวจสอบว่าองค์ประกอบแต่ละรายการที่เปลี่ยนมี view-transition-name ในบรรทัดหรือใช้ JavaScript แบบไดนามิกขณะที่คุณสร้างโหนด DOM

ภาพตัวอย่าง

การสาธิตการใช้งานแบบสด

document.querySelectorAll('.delete-btn').forEach(btn => {
  btn.addEventListener('click', () => {
    document.startViewTransition(() => {
      btn.closest('.card').remove();
    });
  })
});
/* Styles for the transition animation */
::view-transition-old(.card):only-child {
  animation: fade-out ease-out 0.5s;
}

ดูคลาสการเปลี่ยน

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

การรองรับเบราว์เซอร์

  • Chrome: 125
  • ขอบ: 125
  • Firefox: ไม่รองรับ
  • Safari Technology Preview: สนับสนุน

ดูประเภทการเปลี่ยน

การปรับปรุงที่สําคัญอีกอย่างหนึ่งสําหรับทรานซิชันของมุมมองคือการรองรับประเภททรานซิชันของมุมมอง ประเภทการเปลี่ยนภาพมีประโยชน์เมื่อคุณต้องการการเปลี่ยนภาพลักษณะอื่นเมื่อแสดงภาพเคลื่อนไหวไปยังและออกจากการดูหน้าเว็บ

การรองรับเบราว์เซอร์

  • Chrome: 125
  • Edge: 125
  • Firefox: ไม่รองรับ
  • Safari: 18.

เช่น คุณอาจต้องการให้หน้าแรกแสดงภาพเคลื่อนไหวไปยังหน้าบล็อกในลักษณะที่แตกต่างจากที่หน้าบล็อกแสดงภาพเคลื่อนไหวกลับไปยังหน้าแรก หรือคุณอาจต้องการให้หน้าเว็บสลับเข้าและออกด้วยวิธีต่างๆ เช่น ในตัวอย่างนี้ หน้าเว็บจะสลับจากซ้ายไปขวาและในทางกลับกัน ก่อนหน้านี้การดำเนินการนี้ค่อนข้างยุ่งยาก คุณสามารถเพิ่มคลาสลงใน DOM เพื่อใช้สไตล์ แล้วต้องนําคลาสออกในภายหลัง ประเภทการเปลี่ยนแบบมุมมองช่วยให้เบราว์เซอร์ล้างการเปลี่ยนแบบเก่าได้แทนที่จะต้องดำเนินการด้วยตนเองก่อนที่จะเริ่มต้นการเปลี่ยนใหม่ ทำให้คุณสามารถดำเนินการนี้ได้

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

คุณตั้งค่าประเภทภายในฟังก์ชัน document.startViewTransition ซึ่งยอมรับออบเจ็กต์ได้แล้ว update เป็นฟังก์ชัน Callback ที่อัปเดต DOM และ types คืออาร์เรย์ที่มีประเภท

document.startViewTransition({
  update: myUpdate,
  types: ['slide', 'forwards']
})

การเปลี่ยนการดูหน้าเว็บหลายหน้า

สิ่งที่ทำให้เว็บมีประสิทธิภาพคือความครอบคลุม แอปพลิเคชันจำนวนมากไม่ได้เป็นเพียงหน้าเว็บเดียว แต่เป็นผืนผ้าใบที่มีประสิทธิภาพซึ่งมีหลายหน้า และนี่คือเหตุผลที่เราตื่นเต้นมากที่จะประกาศว่าเรารองรับการเปลี่ยนมุมมองข้ามเอกสารสำหรับแอปพลิเคชันที่มีหลายหน้าใน Chromium 126

การรองรับเบราว์เซอร์

  • Chrome: 126
  • Edge: 126
  • Firefox: ไม่รองรับ
  • Safari Technology Preview: สนับสนุน

ชุดฟีเจอร์ข้ามเอกสารชุดใหม่นี้รวมประสบการณ์การใช้งานเว็บที่อยู่ภายในต้นทางเดียวกัน เช่น การนำทางจาก web.dev ไปยัง web.dev/blog แต่ไม่รวมการนำทางข้ามต้นทาง เช่น การนำทางจาก web.dev ไปยัง blog.web.dev หรือไปยังโดเมนอื่น เช่น google.com

ความแตกต่างที่สำคัญอย่างหนึ่งของการเปลี่ยนมุมมองในเอกสารเดียวกันคือคุณไม่จำเป็นต้องปิดการเปลี่ยนด้วย document.startViewTransition() แต่ให้เลือกเข้าร่วมทั้ง 2 หน้าที่เกี่ยวข้องกับการเปลี่ยนมุมมองโดยใช้กฎ @view-transition at ของ CSS

@view-transition {
  navigation: auto;
}

หากต้องการเอฟเฟกต์ที่กําหนดเองมากขึ้น คุณสามารถเชื่อมต่อกับ JavaScript โดยใช้โปรแกรมรับฟังเหตุการณ์ pageswap หรือ pagereveal ใหม่ ซึ่งจะช่วยให้คุณเข้าถึงออบเจ็กต์การเปลี่ยนเฟรมของมุมมองได้

pageswap ช่วยให้คุณทำการเปลี่ยนแปลงในนาทีสุดท้ายในหน้าเว็บที่กำลังจะหมดอายุได้ก่อนที่ระบบจะจับภาพหน้าจอเก่า และ pagereveal ช่วยให้คุณปรับแต่งหน้าเว็บใหม่ได้ก่อนที่หน้าเว็บจะเริ่มแสดงผลหลังจากได้รับการเริ่มต้น

window.addEventListener('pageswap', async (e) => {
    // ...
});

window.addEventListener('pagereveal', async (e) => {
    // ...
});
การแสดงการเปลี่ยนมุมมองในแอปหลายหน้า ดูลิงก์สาธิต

ในอนาคตเราวางแผนที่จะขยายการให้บริการการเปลี่ยนมุมมอง ซึ่งรวมถึง

  • การเปลี่ยนผ่านที่มีขอบเขต: ช่วยให้คุณจำกัดการเปลี่ยนผ่านไปยัง DOM ย่อยได้ ซึ่งจะทำให้ส่วนที่เหลือของหน้าเว็บโต้ตอบต่อไปได้ และรองรับการเปลี่ยนมุมมองหลายรายการที่ทำงานพร้อมกัน
  • การเปลี่ยนมุมมองที่ทำงานด้วยท่าทางสัมผัส: ใช้ท่าทางสัมผัสการลากหรือปัดเพื่อทริกเกอร์การเปลี่ยนมุมมองข้ามเอกสารเพื่อให้ได้รับประสบการณ์การใช้งานที่เหมือนแอปบนเว็บมากขึ้น
  • การจับคู่การนำทางใน CSS: ปรับแต่งการเปลี่ยนมุมมองข้ามเอกสารใน CSS โดยตรงเพื่อเป็นทางเลือกในการใช้เหตุการณ์ pageswap และ pagereveal ใน JavaScript หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนมุมมองสำหรับแอปพลิเคชันที่มีหลายหน้า รวมถึงวิธีตั้งค่าอย่างมีประสิทธิภาพสูงสุดด้วยการแสดงผลล่วงหน้า โปรดดูการบรรยายของ Bramus Van Damme ดังต่อไปนี้

คอมโพเนนต์ UI ที่เปิดใช้เครื่องมือ: ลดความซับซ้อนของการโต้ตอบ

การสร้างเว็บแอปพลิเคชันที่ซับซ้อนไม่ใช่เรื่องง่าย แต่ CSS และ HTML พัฒนาไปอย่างต่อเนื่องเพื่อให้กระบวนการนี้จัดการได้ง่ายขึ้น ฟีเจอร์และการปรับปรุงใหม่ช่วยลดความซับซ้อนในการสร้างคอมโพเนนต์ UI เพื่อให้คุณมุ่งเน้นที่การสร้างประสบการณ์ที่ยอดเยี่ยม ซึ่งดำเนินการผ่านความร่วมมือของหน่วยงานมาตรฐานและกลุ่มชุมชนที่สำคัญหลายกลุ่ม ซึ่งรวมถึงกลุ่มทำงาน CSS, กลุ่มชุมชน Open UI และ WHATWG (กลุ่มทำงานด้านเทคโนโลยีแอปพลิเคชันไฮเปอร์เท็กซ์บนเว็บ)

ปัญหาใหญ่อย่างหนึ่งของนักพัฒนาซอฟต์แวร์คือคําขอที่ดูเรียบง่าย นั่นคือความสามารถในการจัดรูปแบบเมนูแบบเลื่อนลง (องค์ประกอบ select) แม้ว่าจะดูเหมือนเป็นเรื่องง่าย แต่ปัญหานี้มีความซับซ้อน เนื่องจากเกี่ยวข้องกับแพลตฟอร์มหลายส่วน ตั้งแต่เลย์เอาต์และการแสดงผล ไปจนถึงการเลื่อนและการโต้ตอบ การจัดสไตล์ User Agent และพร็อพเพอร์ตี้ CSS ตลอดจนการเปลี่ยนแปลง HTML เอง

เลือกด้วยรายการข้อมูลของตัวเลือกที่มีตัวเลือกอยู่ภายใน ปุ่มทริกเกอร์ ลูกศรชี้ และตัวเลือกที่เลือก
การแตกรายละเอียดส่วนต่างๆ ของรายการที่เลือก

เมนูแบบเลื่อนลงประกอบด้วยส่วนต่างๆ และมีหลายรัฐที่ต้องพิจารณา เช่น

  • การเชื่อมโยงแป้นพิมพ์ (เพื่อเข้าสู่/ออกจากการโต้ตอบ)
  • คลิกเพื่อปิด
  • การจัดการป๊อปอัปที่ใช้งานอยู่ (ปิดป๊อปอัปอื่นๆ เมื่อป๊อปอัปหนึ่งเปิดขึ้น)
  • การจัดการโฟกัสของแท็บ
  • การแสดงค่าตัวเลือกที่เลือกเป็นภาพ
  • รูปแบบการโต้ตอบด้วยลูกศร
  • การจัดการสถานะ (เปิด/ปิด)

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

Popover API

ก่อนอื่น เราได้เปิดตัวแอตทริบิวต์ส่วนกลางชื่อ popover ซึ่งเรายินดีที่จะประกาศว่าเพิ่งได้รับสถานะ "พร้อมใช้งานใหม่" ของ Baseline เมื่อไม่กี่สัปดาห์ที่ผ่านมา

การรองรับเบราว์เซอร์

  • Chrome: 114
  • Edge: 114
  • Firefox: 125
  • Safari: 17.

แหล่งที่มา

องค์ประกอบป๊อปอัปจะซ่อนด้วย display: none จนกว่าจะเปิดด้วยตัวเรียกใช้ เช่น ปุ่มหรือ JavaScript หากต้องการสร้างป๊อปอัปพื้นฐาน ให้ตั้งค่าแอตทริบิวต์ป๊อปอัปในองค์ประกอบ แล้วลิงก์รหัสของป๊อปอัปกับปุ่มโดยใช้ popovertarget ตอนนี้ ปุ่มคือผู้เรียกใช้

ภาพตัวอย่าง

การสาธิตการใช้งานแบบสด

<button popovertarget="my-popover">Open Popover</button>

<div id="my-popover" popover>
  <p>I am a popover with more information.</p>
</div>

เมื่อเปิดใช้แอตทริบิวต์ป๊อปอัปแล้ว ตอนนี้เบราว์เซอร์จะจัดการลักษณะการทํางานหลักๆ หลายอย่างได้โดยไม่ต้องใช้สคริปต์เพิ่มเติม ซึ่งรวมถึง

  • การโปรโมตไปยังเลเยอร์บนสุด เลเยอร์แยกต่างหากเหนือส่วนอื่นๆ ของหน้า คุณจึงไม่ต้องปรับแต่ง z-index
  • ฟังก์ชันปิดไฟ: การคลิกนอกพื้นที่ของป๊อปอัปจะปิดป๊อปอัปและโฟกัสกลับ
  • การจัดการโฟกัสแท็บเริ่มต้น การเปิดป๊อปอัปทำให้แท็บถัดไปหยุดอยู่ในหน้าต่างป๊อปโอเวอร์
  • แป้นพิมพ์ลัดในตัว การกดแป้น esc หรือสลับสองครั้งจะเป็นการปิดป๊อปอัปและเปลี่ยนโฟกัสกลับ
  • การเชื่อมโยงคอมโพเนนต์เริ่มต้น : เบราว์เซอร์เชื่อมต่อป๊อปอัปกับทริกเกอร์นั้นอย่างมีความหมาย
หน้าจอหลักของ GitHub
เมนูในหน้าแรกของ GitHub

คุณอาจกำลังใช้ popover API นี้อยู่โดยไม่รู้ตัว GitHub ใช้ป๊อปอัปในเมนู "ใหม่" ของหน้าแรกและในภาพรวมการตรวจสอบคำขอดึงข้อมูล พวกเขาได้ปรับปรุงฟีเจอร์นี้อย่างต่อเนื่องโดยใช้ popover polyfill ที่พัฒนาโดย Oddbird โดยได้รับการสนับสนุนที่สำคัญจาก Keith Cirkel ของ GitHub เพื่อรองรับเบราว์เซอร์รุ่นเก่า

"เราเลิกใช้งานโค้ดหลายพันบรรทัดด้วยการเปลี่ยนไปใช้ป๊อปอัป การใช้ป๊อปอัปช่วยให้เราไม่ต้องปวดหัวกับตัวเลข Z-Index ที่ไม่อาจคาดเดาได้... การมีความสัมพันธ์ของต้นไม้การช่วยเหลือพิเศษที่ถูกต้องซึ่งสร้างขึ้นจากลักษณะการทำงานของปุ่มแบบประกาศ และลักษณะการโฟกัสที่รวมไว้แล้วช่วยให้ระบบการออกแบบของเราใช้งานรูปแบบต่างๆ ในลักษณะที่เหมาะสมได้ง่ายขึ้นอย่างมาก - Keith Cirkel วิศวกรซอฟต์แวร์จาก GitHub”

การทำภาพเคลื่อนไหวสำหรับเอฟเฟกต์การเข้าและออก

เมื่อใช้ป๊อปอัป คุณอาจต้องการเพิ่มการโต้ตอบบางอย่าง เรามีฟีเจอร์การโต้ตอบใหม่ 4 รายการที่เปิดตัวไปเมื่อปีที่แล้วเพื่อรองรับการแสดงภาพเคลื่อนไหวของป๊อปอัป ซึ่งได้แก่

ความสามารถในการทำให้ display และ content-visibility เคลื่อนไหวในไทม์ไลน์คีย์เฟรม

พร็อพเพอร์ตี้ transition-behavior ที่มีคีย์เวิร์ด allow-discrete เพื่อเปิดใช้การเปลี่ยนพร็อพเพอร์ตี้แบบแยกกัน เช่น display

การรองรับเบราว์เซอร์

  • Chrome: 117
  • Edge: 117
  • Firefox: 129
  • Safari: 17.4

แหล่งที่มา

กฎ @starting-style สำหรับสร้างเอฟเฟกต์ของรายการที่เคลื่อนไหวจาก display: none ไปยังเลเยอร์บนสุด

การรองรับเบราว์เซอร์

  • Chrome: 117
  • Edge: 117
  • Firefox: 129
  • Safari: 17.5

แหล่งที่มา

คุณสมบัติการวางซ้อนสำหรับควบคุมการทำงานของเลเยอร์บนระหว่างภาพเคลื่อนไหว

การรองรับเบราว์เซอร์

  • Chrome: 117
  • Edge: 117
  • Firefox: ไม่สนับสนุน
  • Safari: ไม่รองรับ

แหล่งที่มา

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

ภาพการสาธิต

การสาธิตการใช้งานแบบสด

dialog, ::backdrop{
  opacity: 0;
  transition: opacity 1s, display 1s allow-discrete, overlay 1s allow-discrete;
}

[open], [open]::backdrop {
  opacity: 1;
}

@starting-style {
  [open], [open]::backdrop {
    opacity: 0;
  }
}

ก่อนอื่น ให้ตั้งค่า @starting-style เพื่อให้เบราว์เซอร์รู้ว่าจะสร้างการเคลื่อนไหวให้องค์ประกอบนี้ไปยัง DOM รูปแบบใด ซึ่งทำได้ทั้งกับบทสนทนาและฉากหลัง จากนั้นจึงจัดรูปแบบสถานะเปิดสำหรับทั้งกล่องโต้ตอบและฉากหลัง สำหรับกล่องโต้ตอบ ค่านี้จะใช้แอตทริบิวต์ open และสำหรับป๊อปอัปจะเป็นองค์ประกอบเทียม ::popover-open สุดท้าย ให้สร้างภาพเคลื่อนไหวของ opacity, display และ overlay โดยใช้คีย์เวิร์ด allow-discrete เพื่อเปิดใช้โหมดภาพเคลื่อนไหวที่พร็อพเพอร์ตี้แบบไม่ต่อเนื่องจะเปลี่ยนได้

ตำแหน่งของ Anchor

ฟีเจอร์ป๊อปอัปเป็นเพียงจุดเริ่มต้นเท่านั้น อัปเดตที่น่าตื่นเต้นมากคือตอนนี้ Chrome 125 รองรับการวางตำแหน่งจุดยึดแล้ว

การรองรับเบราว์เซอร์

  • Chrome: 125
  • Edge: 125
  • Firefox: ไม่รองรับ
  • Safari: ไม่รองรับ

แหล่งที่มา

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

ภาพการสาธิต

การสาธิตการใช้งานแบบสด

ตั้งค่าความสัมพันธ์ของตำแหน่งที่ยึดใน CSS โดยใช้พร็อพเพอร์ตี้ anchor-name ในองค์ประกอบการยึด (ในกรณีนี้คือปุ่ม) และพร็อพเพอร์ตี้ position-anchor ในองค์ประกอบที่มีตำแหน่ง (ในกรณีนี้คือเคล็ดลับเครื่องมือ) จากนั้นใช้การวางตำแหน่งแบบสัมบูรณ์หรือแบบคงที่ซึ่งสัมพันธ์กับจุดยึดโดยใช้ฟังก์ชัน anchor() โค้ดต่อไปนี้จะวางตำแหน่งด้านบนของเคล็ดลับเครื่องมือไว้ที่ด้านล่างของปุ่ม

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  position-anchor: --my-anchor;
}

หรือจะใช้ชื่อหมุดในฟังก์ชันหมุดโดยตรงและข้ามพร็อพเพอร์ตี้ position-anchor ก็ได้ ซึ่งจะเป็นประโยชน์เมื่อยึดกับองค์ประกอบหลายรายการ

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  top: anchor(--my-anchor bottom);
}

สุดท้าย ให้ใช้คีย์เวิร์ด anchor-center ใหม่สำหรับพร็อพเพอร์ตี้ justify และ align เพื่อจัดองค์ประกอบที่วางไว้ให้อยู่ตรงกลางของจุดยึด

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  top: anchor(--my-anchor bottom);
  justify-self: anchor-center;
}

แม้ว่าการใช้ตำแหน่งของจุดยึดกับป๊อปอัปจะสะดวกมาก แต่การใช้ป๊อปอัปก็ไม่ใช่ข้อกำหนดในการใช้ตำแหน่งของจุดยึด การวางตำแหน่งจุดยึดใช้ได้กับองค์ประกอบ 2 รายการขึ้นไปเพื่อสร้างความสัมพันธ์ทางภาพ อันที่จริงแล้ว การสาธิตต่อไปนี้ซึ่งได้รับแรงบันดาลใจจากบทความจาก Roman Komarov แสดงสไตล์การขีดเส้นใต้ที่ยึดอยู่กับรายการในลิสต์เมื่อคุณวางเมาส์เหนือหรือกด Tab ผ่านรายการ

ภาพตัวอย่าง

การสาธิตการใช้งานแบบสด

ตัวอย่างนี้ใช้ฟังก์ชันหมุดเพื่อตั้งค่าตำแหน่งหมุดโดยใช้พร็อพเพอร์ตี้ทางกายภาพของ left, right และ bottom เมื่อคุณวางเมาส์เหนือลิงก์ใดลิงก์หนึ่ง จุดยึดเป้าหมายจะเปลี่ยนไป และเบราว์เซอร์จะเปลี่ยนเป้าหมายเพื่อใช้การจัดตำแหน่ง รวมถึงทำให้สีเคลื่อนไหวในเวลาเดียวกันเพื่อสร้างเอฟเฟ็กต์ที่เป็นระเบียบ

ul::before {
  content: "";
  position: absolute;
  left:   anchor(var(--target) left);
  right:  anchor(var(--target) right);
  bottom: anchor(var(--target) bottom);
  ...
}

li:nth-child(1) { --anchor: --item-1 }
ul:has(:nth-child(1) a:is(:hover, :focus-visible)) {
  --target: --item-1;
  --color: red;
}

inset-area การวางตำแหน่ง

นอกจากการวางตำแหน่งแบบสัมบูรณ์ตามทิศทางเริ่มต้นที่คุณอาจเคยใช้แล้ว ยังมีกลไกการจัดวางใหม่รวมอยู่ด้วย ซึ่งเป็นส่วนหนึ่งของ API การวางตำแหน่งจุดยึดที่เรียกว่าพื้นที่ส่วนเกิน พื้นที่แทรกทำให้สามารถวางองค์ประกอบที่อยู่ในตำแหน่งซึ่งสัมพันธ์กับจุดยึดที่เกี่ยวข้องได้โดยง่าย และทำงานกับตารางกริดขนาด 9 เซลล์ที่มีองค์ประกอบยึดอยู่ตรงกลาง เช่น inset-area: top จะวางองค์ประกอบที่มีตำแหน่งไว้ที่ด้านบน และ inset-area: bottom จะวางองค์ประกอบที่มีตำแหน่งไว้ที่ด้านล่าง

ตัวอย่างหมุดแรกเวอร์ชันที่เรียบง่ายจะมีลักษณะดังนี้เมื่อใช้ inset-area

.anchor {
  anchor-name: --my-anchor;
}

.positioned {
  position: absolute;
  position-anchor: --my-anchor;
  inset-area: bottom;
}

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

เนื่องจากองค์ประกอบเหล่านี้มีการยึด องค์ประกอบที่จัดตำแหน่งไว้จะเคลื่อนไหวไปรอบๆ หน้าเว็บแบบไดนามิกเมื่อองค์ประกอบหลักเคลื่อนไหว ในกรณีนี้ เรามีองค์ประกอบการ์ดสไตล์คอนเทนเนอร์คิวรี ซึ่งปรับขนาดตามขนาดโดยประมาณ (คุณทำไม่ได้กับ Media Query) และเมนูที่ยึดตำแหน่งจะเลื่อนไปตามเลย์เอาต์ใหม่เมื่อ UI ของการ์ดเปลี่ยนแปลง

ภาพตัวอย่าง

การสาธิตการใช้งานแบบสด

ตำแหน่งจุดยึดแบบไดนามิกด้วย position-try-options

การสร้างเมนูและการนำทางเมนูย่อยนั้นง่ายขึ้นมากเมื่อใช้ป๊อปอัปและการวางตำแหน่งจุดยึดร่วมกัน และเมื่อองค์ประกอบที่ยึดตำแหน่งถึงขอบของวิวพอร์ต คุณสามารถให้เบราว์เซอร์จัดการการเปลี่ยนแปลงตำแหน่งให้คุณได้ด้วย ซึ่งทำได้หลายวิธี ขั้นแรกคือสร้างกฎการจัดตําแหน่งของคุณเอง ในกรณีนี้ เมนูย่อยจะอยู่ที่ด้านขวาของปุ่ม "หน้าร้าน" ในตอนแรก แต่คุณสร้างบล็อก @position-try ได้ในกรณีที่มีพื้นที่ไม่เพียงพอทางด้านขวาของเมนู โดยให้ตัวระบุที่กำหนดเองเป็น --bottom จากนั้นเชื่อมต่อบล็อก @position-try นี้กับจุดยึดโดยใช้ position-try-options

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

ภาพตัวอย่าง

การสาธิตการใช้งานแบบสด

#submenu {
  position-anchor: --submenu;
  top: anchor(top);
  left: anchor(right);
  margin-left: var(--padding);

  position-try-options: --bottom;

  transition: top 0.25s, left 0.25s;
  width: max-content;
}

@position-try --bottom {
  top: anchor(left);
  left: anchor(bottom);
  margin-left: var(--padding);
}

นอกจากตรรกะการกำหนดตำแหน่งอย่างชัดแจ้งแล้ว ยังมีคีย์เวิร์ดไม่กี่คำที่เบราว์เซอร์ให้ไว้ในกรณีที่คุณต้องการการโต้ตอบพื้นฐานบางอย่าง เช่น การพลิกจุดยึดในแนวบล็อกหรือทิศทางในบรรทัด

position-try-options: flip-block, flip-inline;

หากต้องการใช้ฟีเจอร์พลิกอย่างง่ายดาย ให้ใช้ประโยชน์จากค่าคีย์เวิร์ดพลิกเหล่านี้และข้ามการเขียนคําจํากัดความ position-try ไปเลย ตอนนี้คุณก็มีองค์ประกอบ Anchor ที่ตอบสนองต่อตำแหน่งซึ่งทํางานได้อย่างสมบูรณ์โดยที่มี CSS เพียงไม่กี่บรรทัด

ภาพตัวอย่าง

การสาธิตการใช้งานแบบสด

.tooltip {
  inset-area: top;
  position-try-options: flip-block;
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้การจัดตำแหน่งโฆษณา Anchor

อนาคตของ UI แบบเลเยอร์

เราเห็นประสบการณ์การยึดเกาะอยู่ทุกที่ และชุดฟีเจอร์ที่แสดงในโพสต์นี้ถือเป็นจุดเริ่มต้นที่ยอดเยี่ยมในการปลดปล่อยความคิดสร้างสรรค์และควบคุมองค์ประกอบตำแหน่งยึดและอินเทอร์เฟซแบบเลเยอร์ได้ดียิ่งขึ้น แต่นี่เป็นเพียงจุดเริ่มต้นเท่านั้น ตัวอย่างเช่น ปัจจุบัน popover ใช้ได้กับปุ่มที่เป็นองค์ประกอบเรียกใช้หรือกับ JavaScript เท่านั้น สำหรับตัวอย่างแบบวิกิพีเดีย ซึ่งเป็นรูปแบบที่พบได้ทั่วทั้งแพลตฟอร์มเว็บ ผู้ใช้ต้องโต้ตอบกับตัวอย่างได้ และเรียกให้ป๊อปอัปแสดงจากลิงก์และจากผู้ใช้ที่แสดงความสนใจโดยไม่ต้องคลิกผ่าน เช่น การโฮเวอร์หรือโฟกัสแท็บ

ขั้นตอนถัดไปสำหรับ popover API คือเรากําลังพัฒนา interesttarget เพื่อตอบสนองความต้องการเหล่านี้และทําให้สร้างประสบการณ์เหล่านี้อีกครั้งได้ง่ายขึ้นด้วยฮุกการช่วยเหลือพิเศษที่เหมาะสมซึ่งติดตั้งมาในตัว นี่เป็นปัญหาการช่วยเหลือพิเศษที่แก้ได้ยากและมีคำถามที่ยังไม่ได้รับการตอบมากมายเกี่ยวกับลักษณะการทำงานที่เหมาะสม แต่การแก้ปัญหาและทำให้ฟังก์ชันการทำงานนี้เป็นไปตามมาตรฐานที่ระดับแพลตฟอร์มควรจะช่วยปรับปรุงประสบการณ์การใช้งานเหล่านี้สำหรับทุกคน

<a interesttarget="my-tooltip">Hover/Focus to show the tooltip</a>

<span popover=hint id="my-toolip">This is the tooltip</span>

นอกจากนี้ ยังมีตัวเรียกทั่วไป (invoketarget) อีกตัวหนึ่งสำหรับอนาคตที่พร้อมให้ทดสอบใน Canary ซึ่งมาจากการทำงานของนักพัฒนาซอฟต์แวร์บุคคลที่สาม 2 คน ได้แก่ Keith Cirkel และ Luke Warlow invoketarget รองรับประสบการณ์การใช้งานแบบประกาศสำหรับนักพัฒนาซอฟต์แวร์ ซึ่ง popovertarget มีป๊อปอัปที่ปรับให้เป็นมาตรฐานสำหรับองค์ประกอบแบบอินเทอร์แอกทีฟทั้งหมด ซึ่งรวมถึง <dialog>, <details>, <video>, <input type="file"> และอื่นๆ

<button invoketarget="my-dialog">
  Open Dialog
</button>

<dialog id="my-dialog">
  Hello world!
</dialog>

เราทราบดีว่ายังมี Use Case อีกหลายอย่างที่ API นี้ยังไม่ครอบคลุม เช่น การจัดสไตล์ลูกศรที่เชื่อมต่อองค์ประกอบที่ยึดกับจุดยึด โดยเฉพาะเมื่อตำแหน่งขององค์ประกอบที่ยึดมีการเปลี่ยนแปลง และการเปิดใช้องค์ประกอบให้ "เลื่อน" และอยู่ในวิวพอร์ตแทนที่จะยึดตามตำแหน่งอื่นที่ตั้งไว้เมื่อถึงขอบเขต ดังนั้น แม้ว่าเราจะตื่นเต้นที่ได้เปิดตัว API ที่มีประสิทธิภาพนี้ แต่เราก็หวังว่าจะได้ขยายความสามารถของ API นี้ให้มากยิ่งขึ้นในอนาคต

ตัวเลือกที่มีสไตล์

การใช้ popover และ anchor ร่วมกันช่วยให้ทีมของเรามีความคืบหน้าในการเปิดใช้เมนูแบบเลื่อนลงแบบกำหนดเองได้ในที่สุด ข่าวดีคือเรามีความคืบหน้าอย่างมาก ข่าวร้ายคือ API นี้ยังอยู่ในขั้นทดลองอย่างมากในขณะนี้ อย่างไรก็ตาม เรายินดีที่จะแชร์การสาธิตเวอร์ชันที่ใช้จริงและการอัปเดตความคืบหน้า และหวังว่าจะได้รับความคิดเห็นจากคุณ ประการแรก เราได้ดำเนินการเกี่ยวกับวิธีเลือกให้ผู้ใช้ได้รับประสบการณ์การเลือกแบบใหม่ที่กำหนดค่าได้ วิธีปัจจุบันที่อยู่ระหว่างดำเนินการคือการใช้พร็อพเพอร์ตี้ลักษณะที่ปรากฏใน CSS ซึ่งตั้งค่าเป็น appearance: base-select เมื่อตั้งค่าลักษณะที่ปรากฏแล้ว คุณจะเลือกใช้ประสบการณ์การเลือกแบบใหม่ที่กำหนดเองได้

select {
  appearance: base-select;
}

นอกจาก appearance: base-select แล้ว ยังมีอัปเดต HTML ใหม่อีก 2-3 รายการ ซึ่งรวมถึงความสามารถในการตัดตัวเลือกใน datalist เพื่อปรับแต่ง และความสามารถในการเพิ่มเนื้อหาแบบไม่อินเทอร์แอกทีฟตามต้องการ เช่น รูปภาพในตัวเลือก นอกจากนี้ คุณยังมีสิทธิ์เข้าถึงองค์ประกอบใหม่อย่าง <selectedoption> ซึ่งจะแสดงเนื้อหาของตัวเลือกในองค์ประกอบนั้นเอง จากนั้นคุณจะปรับแต่งตามความต้องการของคุณได้ องค์ประกอบนี้ใช้งานง่ายมาก

ภาพการสาธิต

สาธิตการแจ้งว่าไม่เหมาะสม

การสาธิตการใช้งานแบบสด

<select>
  <button type=popover>
    <selectedoption></selectedoption>
  </button>
  <datalist>
    <option value="" hidden>
      <p>Select a country</p>
    </option>
    <option value="andorra">
      <img src="Flag_of_Andorra.svg" />
      <p>Andorra</p>
    </option>
    <option value="bolivia">
      <img src="Flag_of_Bolivia.svg" />
      <p>Bolivia</p>
    </option>
...
  </datalist>
</select>

โค้ดต่อไปนี้แสดงการปรับแต่ง <selectedoption> ใน UI ของ Gmail โดยที่ไอคอนภาพแสดงประเภทการตอบกลับที่เลือกเพื่อประหยัดพื้นที่ คุณใช้สไตล์การแสดงผลพื้นฐานภายใน selectedoption เพื่อแยกความแตกต่างระหว่างการจัดรูปแบบตัวเลือกกับการจัดรูปแบบตัวอย่างได้ ในกรณีนี้ ข้อความที่แสดงในตัวเลือกจะซ่อนอยู่จากสายตาใน selectedoption

ภาพการสาธิต

gmail demo

การสาธิตสด

selectedoption .text {
  display: none;
}

ข้อดีอย่างหนึ่งที่สำคัญที่สุดของการใช้องค์ประกอบ <select> ซ้ำสำหรับ API นี้คือการรองรับการทำงานแบบย้อนหลัง ในประเทศนี้ คุณจะเห็น UI ที่กำหนดเองพร้อมรูปธงในตัวเลือกเพื่อให้ผู้ใช้แยกวิเคราะห์เนื้อหาได้ง่ายขึ้น เนื่องจากเบราว์เซอร์ที่ไม่รองรับจะไม่สนใจบรรทัดที่ไม่เข้าใจ เช่น ปุ่มที่กําหนดเอง, datalist, selectedoption และรูปภาพภายในตัวเลือก ตัวเลือกสำรองจึงจะคล้ายกับ UI การเลือกเริ่มต้นปัจจุบัน

เบราว์เซอร์ที่ไม่รองรับจะได้รับประสบการณ์การใช้งานปัจจุบันที่เลือก
ภาพเบราว์เซอร์ที่รองรับทางด้านซ้ายเทียบกับภาพเบราว์เซอร์ที่ไม่รองรับทางด้านขวา

การเลือกแบบปรับแต่งได้ช่วยให้ใช้งานได้อย่างไม่มีที่สิ้นสุด ฉันชอบตัวเลือกประเทศสไตล์ Airbnb นี้เป็นพิเศษ เพราะมีรูปแบบที่ชาญฉลาดสำหรับการออกแบบที่ปรับเปลี่ยนตามอุปกรณ์ คุณสามารถทำสิ่งนี้ได้และอีกมากมายด้วยการเลือกสไตไลซ์ที่กำลังจะเปิดตัว ทำให้เป็นส่วนเสริมที่จำเป็นเพิ่มเติมสำหรับแพลตฟอร์มเว็บ

ภาพตัวอย่าง

การสาธิตการใช้งานแบบสด

แอคคอร์เดียนสุดพิเศษ

การแก้ปัญหาการจัดรูปแบบที่เลือก (และองค์ประกอบทั้งหมดที่แสดงควบคู่กันไป) ไม่ใช่องค์ประกอบ UI เดียวที่ทีม Chrome ได้มุ่งเน้น การอัปเดตคอมโพเนนต์เพิ่มเติมรายการแรกคือความสามารถในการสร้าง Accordion แบบพิเศษ ซึ่งจะเปิดได้ทีละรายการเท่านั้น

การรองรับเบราว์เซอร์

  • Chrome: 120
  • ขอบ: 120
  • Firefox: 130
  • Safari: 17.2.

วิธีเปิดใช้พารามิเตอร์นี้คือการใช้ค่าชื่อเดียวกันสําหรับองค์ประกอบรายละเอียดหลายรายการ ซึ่งจะสร้างกลุ่มรายละเอียดที่เชื่อมต่อกัน ซึ่งคล้ายกับกลุ่มปุ่มตัวเลือก

เดโม Accordion สุดพิเศษ
<details name="learn-css" open>
  <summary>Welcome to Learn CSS!</summary>
</details>

<details name="learn-css">
  <summary>Box Model</summary>
  <p>...</p>
</details>

<details name="learn-css">
  <summary>Selectors</summary>
  <p>...</p>
</details>

:user-valid และ :user-invalid

การปรับปรุงคอมโพเนนต์ UI อีกอย่างหนึ่งคือคลาสจำลอง :user-valid และ :user-invalid เมื่อเร็วๆ นี้ คลาสจำลอง :user-valid และ :user-invalid เสถียรในทุกเบราว์เซอร์ ลักษณะการทำงานคล้ายกับคลาสเทียม :valid และ :invalid แต่จะจับคู่การควบคุมแบบฟอร์มหลังจากที่ผู้ใช้โต้ตอบกับอินพุตอย่างมีนัยสำคัญเท่านั้น ซึ่งหมายความว่าต้องใช้โค้ดน้อยลงอย่างมากในการระบุว่ามีการใช้ค่าแบบฟอร์มหรือค่า "เปลี่ยนแปลง" ซึ่งมีประโยชน์มากในการให้ความคิดเห็นของผู้ใช้ และลดการเขียนสคริปต์จำนวนมากที่จําเป็นต้องใช้ก่อนหน้านี้

การรองรับเบราว์เซอร์

  • Chrome: 119
  • Edge: 119
  • Firefox: 88
  • Safari: 16.5

แหล่งที่มา

หน้าจอสาธิต

การสาธิตการใช้งานแบบสด

input:user-valid,
select:user-valid,
textarea:user-valid {
    --state-color: green;
    --bg: linear-gradient(...);
}

input:user-invalid,
select:user-invalid,
textarea:user-invalid {
    --state-color: red;
    --bg: linear-gradient(...);
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้องค์ประกอบจำลองที่ใช้ตรวจสอบแบบฟอร์ม user-*

field-sizing: content

การอัปเดตคอมโพเนนต์ที่เป็นประโยชน์อีกรายการหนึ่งซึ่งเพิ่งเปิดตัวเมื่อไม่นานมานี้คือ field-sizing: content ซึ่งนำไปใช้กับการควบคุมแบบฟอร์ม เช่น อินพุตและพื้นที่ข้อความได้ ซึ่งจะช่วยให้ขนาดของอินพุตขยาย (หรือหด) ตามเนื้อหา field-sizing: content มีประโยชน์อย่างยิ่งสำหรับ textarea เนื่องจากคุณไม่ต้องแก้ไขขนาดที่ตายตัวอีกต่อไป ซึ่งอาจทำให้ต้องเลื่อนขึ้นเพื่อดูสิ่งที่เขียนไว้ในส่วนก่อนหน้าของพรอมต์ในกล่องอินพุตที่เล็กเกินไป

การรองรับเบราว์เซอร์

  • Chrome: 123
  • Edge: 123
  • Firefox: ไม่รองรับ
  • Safari: ไม่รองรับ

แหล่งที่มา

หน้าจอสาธิต

การสาธิตการใช้งานแบบสด

textarea, select, input {
  field-sizing: content;
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับการปรับขนาดช่อง

<hr> ใน <select>

ความสามารถในการเปิดใช้ <hr> หรือองค์ประกอบเส้นแนวนอนในรายการตัวเลือกเป็นอีกฟีเจอร์เล็กๆ แต่มีประโยชน์ของคอมโพเนนต์ แม้ว่าจะไม่ได้ใช้ความหมายมากนัก แต่จะช่วยให้คุณแยกเนื้อหาภายในรายการตัวเลือกได้อย่างลงตัว โดยเฉพาะเนื้อหาที่คุณอาจไม่ต้องการจัดกลุ่มกับ optgroup เช่น ค่าตัวยึดตำแหน่ง

เลือกภาพหน้าจอ

ภาพหน้าจอของชั่วโมงที่เลือกด้วยธีมสว่างและมืดใน Chrome

เลือก "การสาธิตการใช้งานแบบสด"

<select name="majors" id="major-select">
  <option value="">Select a major</option>
  <hr>
  <optgroup label="School of Fine Arts">
    <option value="arthist">
Art History
  </option>
  <option value="finearts">
    Fine Arts
  </option>
...
</select>

ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ hr ใน select

การปรับปรุงคุณภาพชีวิต

เราปรับปรุงอย่างต่อเนื่อง ไม่ใช่แค่การโต้ตอบและคอมโพเนนต์ นอกจากนี้ เรายังมีการอัปเดตอื่นๆ อีกมากมายที่ปรับปรุงคุณภาพการใช้งานซึ่งเปิดตัวไปเมื่อปีที่แล้ว

การฝังด้วยฟีเจอร์มองไปข้างหน้า

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

การรองรับเบราว์เซอร์

  • Chrome: 120
  • Edge: 120
  • Firefox: 117
  • Safari: 17.2

แหล่งที่มา

สิ่งที่ฉันชอบอย่างหนึ่งเกี่ยวกับการฝัง CSS คือช่วยให้คุณบล็อกคอมโพเนนต์ได้ และภายในคอมโพเนนต์เหล่านั้นจะมีสถานะและตัวแก้ไข เช่น การค้นหาคอนเทนเนอร์และการค้นหาสื่อ ก่อนหน้านี้ เราเคยจัดกลุ่มข้อความค้นหาทั้งหมดนี้ไว้ที่ด้านล่างของไฟล์เพื่อวัตถุประสงค์ในการระบุเจาะจง ตอนนี้คุณสามารถเขียนโค้ดในลักษณะที่สมเหตุสมผลข้างโค้ดที่เหลือได้

.card {
  /* card base styles */

  h2 {
    /* child element style */
  }

  &.highlight {
    /* modifier style */
  }

  &:hover, &:focus {
    /* state styles */
  }

  @container (width >= 300px) {
    /* container query styles */
  }
}

การจัดแนวเนื้อหาสำหรับเลย์เอาต์บล็อก

อีกการเปลี่ยนแปลงที่ยอดเยี่ยมคือความสามารถในการใช้กลไกการจัดกึ่งกลาง เช่น align-content ในเลย์เอาต์บล็อก ซึ่งหมายความว่าตอนนี้คุณทําสิ่งต่างๆ เช่น จัดกึ่งกลางแนวตั้งภายใน div ได้โดยไม่ต้องใช้เลย์เอาต์ Flex หรือตารางกริด และไม่มีผลข้างเคียง เช่น การป้องกันไม่ให้ระยะขอบยุบ ซึ่งคุณอาจไม่ต้องการจากอัลกอริทึมการจัดวางเหล่านั้น

การรองรับเบราว์เซอร์

  • Chrome: 123
  • Edge: 123
  • Firefox: 125
  • Safari: 17.4

ภาพหน้าจอ

การสาธิตการใช้งานแบบสด

div {
  align-content: center;
}

การแบ่งบรรทัดข้อความ: สมดุลและสวยงาม

พูดถึงเลย์เอาต์ เลย์เอาต์ข้อความได้รับการปรับปรุงให้ดียิ่งขึ้นด้วยการเพิ่ม text-wrap: balance และ pretty text-wrap: balance ใช้สำหรับบล็อกข้อความที่สม่ำเสมอมากขึ้น ส่วน text-wrap: pretty จะมุ่งเน้นที่การลดคำเดี่ยวในบรรทัดสุดท้ายของข้อความ

หน้าจอสาธิต

การสาธิตการใช้งานแบบสด

ในการแสดงตัวอย่างต่อไปนี้ คุณสามารถเปรียบเทียบได้โดยลากแถบเลื่อนเพื่อดูผลของ balance และ pretty กับส่วนหัวและย่อหน้า ลองแปลการสาธิตเป็นภาษาอื่น
h1 {
  text-wrap: balance;
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับการตัดข้อความ: ยอดคงเหลือ

การอัปเดตแบบอักษรสากล

การอัปเดตเลย์เอาต์แบบอักษรสำหรับฟีเจอร์ข้อความ CJK ได้รับการอัปเดตดีๆ มากมายในช่วงปีที่ผ่านมา เช่น ฟีเจอร์ word-break: auto-phrase ที่ตัดบรรทัดตรงขอบของวลีอย่างเป็นธรรมชาติ

การรองรับเบราว์เซอร์

  • Chrome: 119
  • ขอบ: 119
  • Firefox: ไม่รองรับ
  • Safari: ไม่รองรับ

word-break: auto-phrase ตัดบรรทัดตรงขอบของวลีตามปกติ
การเปรียบเทียบ word-break: normal กับ word-break: auto-phrase

และ text-spacing-trim ซึ่งจะใช้การแยกระยะห่างระหว่างอักขระเครื่องหมายวรรคตอนเพื่อปรับปรุงความอ่านง่ายของแบบอักษรจีน ญี่ปุ่น และเกาหลีเพื่อให้ได้ผลลัพธ์ที่อ่านง่ายยิ่งขึ้น

การรองรับเบราว์เซอร์

  • Chrome: 123
  • ขอบ: 123
  • Firefox: ไม่สนับสนุน
  • Safari: ไม่รองรับ

แหล่งที่มา

ระบบนำครึ่งขวาของจุด CJK ออกด้วย text-spacing-trim
เมื่ออักขระเครื่องหมายวรรคตอนปรากฏเป็นแถวเดียว คุณควรนำครึ่งขวาของเครื่องหมายวรรคตอน CJK ออก

ไวยากรณ์สีสัมพัทธ์

ในโลกของธีมสี เราได้เห็นการอัปเดตครั้งใหญ่ด้วยไวยากรณ์สีแบบสัมพัทธ์

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

หน้าจอสาธิต

การสาธิตการใช้งานแบบสด

ในการแสดงตัวอย่างต่อไปนี้ คุณสามารถเปรียบเทียบได้โดยลากแถบเลื่อนเพื่อดูผลของ balance และ pretty กับส่วนหัวและย่อหน้า ลองแปลข้อมูลเดโมเป็นภาษาอื่น
:root {
  --hue: 230;
  --primary: oklch(70% .2 var(--hue));
}

li {
  --_bg: oklch(from var(--primary)
    calc(l - (var(--i) * .05))
    calc(c - (var(--i) * .01))
    calc(h - (var(--i) + 5)));
}

ฟังก์ชัน light-dark()

การใช้ธีมมีความยืดหยุ่นและง่ายขึ้นมากเมื่อใช้ร่วมกับฟังก์ชัน light-dark()

การรองรับเบราว์เซอร์

  • Chrome: 123
  • Edge: 123
  • Firefox: 120
  • Safari: 17.5

แหล่งที่มา

ฟังก์ชัน light-dark() เป็นการปรับปรุงที่เหมาะกับการใช้งานจริงซึ่งลดความซับซ้อนของตัวเลือกธีมสีเพื่อให้คุณเขียนสไตล์ธีมได้กระชับยิ่งขึ้น ดังที่ Adam Argyle แสดงไว้อย่างยอดเยี่ยมในแผนภาพนี้ ก่อนหน้านี้ คุณต้องใช้โค้ด 2 บล็อกที่แตกต่างกัน (ธีมเริ่มต้นและการค้นหาค่ากําหนดของผู้ใช้) เพื่อตั้งค่าตัวเลือกธีม ตอนนี้คุณสามารถเขียนตัวเลือกสไตล์เหล่านี้สำหรับทั้งธีมสว่างและธีมดาร์กในบรรทัด CSS เดียวกันได้โดยใช้ฟังก์ชัน light-dark()

การแสดงภาพ light-dark() ดูข้อมูลเพิ่มเติมในเดโม
html {
  color-scheme: light dark;
}

button {
    background-color: light-dark(lightblue, darkblue);
}

หากผู้ใช้เลือกธีมสว่าง ปุ่มจะมีพื้นหลังสีฟ้าอ่อน หากผู้ใช้เลือกธีมมืด ปุ่มจะมีพื้นหลังสีน้ำเงินเข้ม

ตัวเลือก :has()

และคงจะพลาดมากหากพูดถึง UI สมัยใหม่โดยไม่พูดถึงไฮไลต์การทํางานร่วมกันที่ส่งผลมากที่สุดอย่างหนึ่งจากปีที่ผ่านมา ซึ่งก็คือตัวเลือก :has() ที่เปิดตัวในเบราว์เซอร์ต่างๆ ในเดือนธันวาคมปีที่แล้ว API นี้เป็นตัวเปลี่ยนเกมสำหรับการเขียนสไตล์เชิงตรรกะ

การรองรับเบราว์เซอร์

  • Chrome: 105
  • Edge: 105
  • Firefox: 121
  • Safari: 15.4

แหล่งที่มา

ตัวเลือก :has() ช่วยให้คุณตรวจสอบได้ว่าองค์ประกอบย่อยมีองค์ประกอบย่อยที่เฉพาะเจาะจงหรือไม่ หรือองค์ประกอบย่อยเหล่านั้นอยู่ในสถานะที่เฉพาะเจาะจงหรือไม่ ซึ่งโดยทั่วไปก็ทำหน้าที่เป็นตัวเลือกหลักได้ด้วย

การสาธิตการใช้ has() เพื่อจัดสไตล์บล็อกการเปรียบเทียบใน Tokopedia

:has() ได้แสดงให้เห็นว่ามีประโยชน์อย่างยิ่งสำหรับบริษัทหลายแห่ง รวมถึง PolicyBazaar ที่ใช้ :has() เพื่อจัดรูปแบบบล็อกตามเนื้อหาภายใน เช่น ในส่วนเปรียบเทียบ ซึ่งรูปแบบจะเปลี่ยนไปหากมีแผนที่จะเปรียบเทียบในบล็อก หรือหากไม่มีแผน

"การใช้ตัวเลือก :has() ช่วยให้เรากำจัดการตรวจสอบการเลือกของผู้ใช้ที่อิงตาม JavaScript และแทนที่ด้วยโซลูชัน CSS ที่ทำงานได้อย่างราบรื่นและมอบประสบการณ์การใช้งานแบบเดิม – Aman Soni หัวหน้าทีมเทคโนโลยีของ PolicyBazaar"

การค้นหาคอนเทนเนอร์

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

การรองรับเบราว์เซอร์

  • Chrome: 105
  • Edge: 105
  • Firefox: 110
  • Safari: 16

แหล่งที่มา

เมื่อเร็วๆ นี้ Angular ได้เปิดตัวเว็บไซต์เอกสารประกอบของ Angular ที่สวยงามบน angular.dev โดยใช้การค้นหาคอนเทนเนอร์เพื่อจัดรูปแบบบล็อกส่วนหัวตามพื้นที่ว่างที่มีบนหน้าเว็บ ดังนั้นแม้ว่าเลย์เอาต์จะเปลี่ยนไปจากเลย์เอาต์แถบด้านข้างแบบหลายคอลัมน์เป็นเลย์เอาต์แบบคอลัมน์เดียว บล็อกส่วนหัวก็จะปรับตัวเองได้

เว็บไซต์ Angular.dev ที่แสดงการค้นหาคอนเทนเนอร์ในการ์ดส่วนหัว

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

หน้าจอสาธิต

การสาธิตการใช้งานแบบสด

กำลังสร้างการค้นหาคอนเทนเนอร์ของการ์ดส่วนหัว Angular อีกครั้ง

@property

และสุดท้าย เรายินดีที่จะได้เห็น @property ปรากฏใน Baseline ในเร็วๆ นี้ นี่เป็นฟีเจอร์สําคัญในการระบุความหมายเชิงอรรถศาสตร์ให้กับพร็อพเพอร์ตี้ที่กําหนดเองของ CSS (หรือที่เรียกว่าตัวแปร CSS) และเปิดใช้ฟีเจอร์การโต้ตอบใหม่ๆ มากมาย @property ยังเปิดใช้ความหมายตามบริบท การตรวจสอบประเภท ค่าเริ่มต้น และค่าสำรองใน CSS ด้วย ซึ่งเปิดโอกาสให้ใช้ฟีเจอร์ที่มีประสิทธิภาพมากขึ้น เช่น การค้นหาแบบช่วง นี่เป็นฟีเจอร์ที่ไม่เคยมีมาก่อน และตอนนี้ภาษา CSS มีความลึกซึ้งมากขึ้น

การรองรับเบราว์เซอร์

  • Chrome: 85.
  • Edge: 85
  • Firefox: 128
  • Safari: 16.4

แหล่งที่มา

การสาธิต Screencast

การสาธิตการใช้งานแบบสด

@property --card-bg {
  syntax: "<color>";
  inherits: false;
  initial-value: #c0bae8;
}

บทสรุป

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

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

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

ติดตามการเปิดตัวฟีเจอร์ใหม่เหล่านี้ได้ที่ developer.chrome.com และ web.dev ซึ่งทีมของเราได้แชร์ข่าวสารล่าสุดเกี่ยวกับเทคโนโลยีเว็บ ลองใช้ภาพเคลื่อนไหวที่ทำงานตามการเลื่อน การเปลี่ยนมุมมอง การวางตำแหน่งจุดยึด หรือแม้แต่การเลือกที่มีสไตล์ แล้วบอกให้เราทราบว่าคุณคิดเห็นอย่างไร เราพร้อมรับฟังและพร้อมให้ความช่วยเหลือ