เผยแพร่เมื่อวันที่ 10 พฤษภาคม 2024
CSS Anchor Positioning API เป็นเทคโนโลยีที่ปฏิวัติวงการการพัฒนาเว็บเนื่องจากช่วยให้คุณวางองค์ประกอบให้สัมพันธ์กับองค์ประกอบอื่นๆ ได้โดยกำเนิด ซึ่งเรียกว่า จุดยึด API นี้ช่วยลดข้อกำหนดที่ซับซ้อนของเลย์เอาต์สำหรับฟีเจอร์อินเทอร์เฟซต่างๆ เช่น เมนูและเมนูย่อย เคล็ดลับเครื่องมือ ตัวเลือก ป้ายกำกับ การ์ด กล่องโต้ตอบการตั้งค่า และอื่นๆ อีกมากมาย การวางตำแหน่งจุดยึดที่ฝังอยู่ในเบราว์เซอร์จะช่วยให้คุณสร้างอินเทอร์เฟซผู้ใช้แบบเลเยอร์ได้โดยไม่ต้องอาศัยไลบรารีของบุคคลที่สาม ซึ่งเปิดโอกาสให้สร้างสรรค์ได้มากมาย
การวางตำแหน่ง Anchor พร้อมให้ใช้งานใน Chrome 125
แนวคิดหลัก: จุดยึดและองค์ประกอบที่จัดวางตำแหน่ง
หัวใจสําคัญของ API นี้คือความสัมพันธ์ระหว่างจุดยึดกับองค์ประกอบที่มีตําแหน่ง แท็ก Anchor คือองค์ประกอบที่ได้รับการกำหนดให้เป็นจุดอ้างอิงโดยใช้คุณสมบัติ anchor-name
องค์ประกอบที่มีตำแหน่งคือองค์ประกอบที่วางไว้โดยสัมพันธ์กับจุดยึดโดยใช้พร็อพเพอร์ตี้ position-anchor
หรือใช้ anchor-name
อย่างชัดเจนในตรรกะการจัดตำแหน่ง
การตั้งค่า Anchor
การสร้างหมุดนั้นง่ายมาก ใช้พร็อพเพอร์ตี้ anchor-name กับองค์ประกอบที่เลือก และกำหนดตัวระบุที่ไม่ซ้ำกัน ตัวระบุที่ไม่ซ้ำกันนี้ต้องเพิ่มขีดกลาง 2 ขีดไว้ด้านหน้า คล้ายกับตัวแปร CSS
.anchor-button {
anchor-name: --anchor-el;
}
เมื่อได้รับชื่อ Anchor แล้ว .anchor-button
จะทำหน้าที่เป็น Anchor ที่พร้อมแนะนำตำแหน่งขององค์ประกอบอื่นๆ คุณเชื่อมต่อจุดยึดนี้กับองค์ประกอบอื่นๆ ได้ 2 วิธีดังนี้
โฆษณา Anchor ที่ไม่เจาะจง
วิธีแรกในการเชื่อมต่อแท็ก Anchor กับองค์ประกอบอื่นคือใช้แท็ก Anchor แบบไม่เจาะจงปลายทางตามตัวอย่างโค้ดต่อไปนี้ ระบบจะเพิ่มพร็อพเพอร์ตี้ position-anchor
ลงในองค์ประกอบที่คุณต้องการเชื่อมต่อกับจุดยึด และมีชื่อของจุดยึด (ในกรณีนี้คือ --anchor-el
) เป็นค่า
.positioned-notice {
position-anchor: --anchor-el;
}
เมื่อใช้ความสัมพันธ์ขององค์ประกอบแอตทริบิวต์ตำแหน่งแบบนัย คุณจะจัดตำแหน่งองค์ประกอบได้โดยใช้ฟังก์ชัน anchor()
โดยไม่ต้องระบุชื่อองค์ประกอบแอตทริบิวต์ตำแหน่งอย่างชัดเจนในอาร์กิวเมนต์แรก
.positioned-notice {
position-anchor: --anchor-el;
top: anchor(bottom);
}
โฆษณา Anchor ที่ระบุอย่างชัดเจน
หรือจะใช้ชื่อ Anchor โดยตรงในฟังก์ชัน Anchor ก็ได้ (เช่น top: anchor(--anchor-el bottom
) วิธีนี้เรียกว่าแท็ก Anchor ที่ชัดแจ้ง และมีประโยชน์ในกรณีที่คุณต้องการยึดกับองค์ประกอบหลายรายการ (อ่านตัวอย่างต่อไป)
.positioned-notice {
top: anchor(--anchor-el bottom);
}
องค์ประกอบตำแหน่งซึ่งสัมพันธ์กับ Anchor
การจัดตำแหน่งของจุดยึดจะอิงตามการจัดตำแหน่งแบบสัมบูรณ์ของ CSS หากต้องการใช้ค่าการจัดตำแหน่ง คุณต้องเพิ่ม position: absolute
ลงในองค์ประกอบที่จัดตำแหน่ง จากนั้นใช้ฟังก์ชัน anchor()
เพื่อใช้ค่าการจัดตําแหน่ง เช่น หากต้องการวางองค์ประกอบที่ยึดตำแหน่งไว้ที่ด้านซ้ายบนขององค์ประกอบที่ยึด ให้ใช้การวางตำแหน่งต่อไปนี้
.positioned-notice {
position-anchor: --anchor-el;
/* absolutely position the positioned element */
position: absolute;
/* position the right of the positioned element at the right edge of the anchor */
right: anchor(right);
/* position the bottom of the positioned element at the top edge of the anchor */
bottom: anchor(top);
}
ตอนนี้คุณก็มีองค์ประกอบหนึ่งที่ตรึงอยู่กับอีกองค์ประกอบหนึ่ง ดังที่แสดงในรูปภาพต่อไปนี้
หากต้องการใช้ตําแหน่งเชิงตรรกะสําหรับค่าเหล่านี้ ค่าที่เทียบเท่าจะแสดงดังนี้
top
=inset-block-start
left
=inset-inline-start
bottom
=inset-block-end
right
=inset-inline-end
จัดองค์ประกอบที่มีตำแหน่งให้อยู่กึ่งกลางด้วย anchor-center
มีค่าใหม่ที่เรียกว่า anchor-center
ซึ่งใช้ได้กับพร็อพเพอร์ตี้ justify-self
, align-self
, justify-items
และ align-items
เพื่อให้คุณจัดองค์ประกอบที่อยู่ในตำแหน่งกึ่งกลางโดยเทียบกับแท็ก Anchor ได้ง่ายขึ้น
ตัวอย่างนี้จะแก้ไขตัวอย่างก่อนหน้าโดยใช้ justify-self: anchor-center
เพื่อจัดองค์ประกอบที่วางไว้ให้อยู่ตรงกลางเหนือจุดยึด
.positioned-notice {
position: absolute;
/* Anchor reference */
position-anchor: --anchor-el;
/* Position bottom of positioned elem at top of anchor */
bottom: anchor(top);
/* Center justification to the anchor */
justify-self: anchor-center;
}
โฆษณา Anchor หลายรายการ
องค์ประกอบจะยึดกับจุดยึดได้มากกว่า 1 จุด ซึ่งหมายความว่าคุณอาจต้องกำหนดค่าตำแหน่งที่สัมพันธ์กับแท็ก Anchor มากกว่าหนึ่งรายการ โดยทําโดยใช้ฟังก์ชัน anchor()
และระบุอย่างชัดเจนว่ากําลังอ้างอิงถึงแอตทริบิวต์ใดในอาร์กิวเมนต์แรก ในตัวอย่างต่อไปนี้ จากด้านบนซ้ายขององค์ประกอบที่มีตำแหน่งจะตรึงอยู่ด้านขวาล่างของ anchor 1 รายการ และด้านล่างขวาขององค์ประกอบที่อยู่ในตำแหน่งจะยึดกับด้านซ้ายบนของ Anchor ที่ 2
.anchored {
position: absolute;
top: anchor(--one bottom);
left: anchor(--one right);
right: anchor(--two left);
bottom: anchor(--two top);
}
ตำแหน่งที่มี inset-area
นอกจากการวางแนวตามทิศทางเริ่มต้นจากการวางตำแหน่งแบบสัมบูรณ์แล้ว ยังมีกลไกการจัดวางใหม่รวมอยู่ใน API การยึดตำแหน่งที่เรียกว่าพื้นที่ส่วนเกิน
พื้นที่แทรกช่วยให้วางองค์ประกอบที่วางตำแหน่งเป็นจุดยึดได้ง่ายโดยสัมพันธ์กับจุดยึดที่เกี่ยวข้อง และทำงานบนตารางกริด 9 เซลล์โดยมีองค์ประกอบการยึดอยู่ตรงกลาง
ตัวเลือกต่างๆ ในการกำหนดตำแหน่งพื้นที่ภายในอาคารที่เป็นไปได้ซึ่งแสดงในตารางกริด 9 เซลล์
หากต้องการใช้พื้นที่ที่ฝังแทนการวางตำแหน่งแบบสัมบูรณ์ ให้ใช้พร็อพเพอร์ตี้ inset-area
ที่มีค่าเชิงกายภาพหรือเชิงตรรกะ เช่น
- ตรงกลางด้านบน:
inset-area: top
หรือinset-area: block-start
- กึ่งกลางด้านซ้าย:
inset-area: left
หรือinset-area: inline-start
- ตรงกลางด้านล่าง:
inset-area: bottom
หรือinset-area: block-end
- กึ่งกลางด้านขวา:
inset-area: right
หรือinset-area: inline-end
องค์ประกอบของขนาดที่มี anchor-size()
คุณสามารถใช้ฟังก์ชัน anchor-size()
ซึ่งเป็นส่วนหนึ่งของ API การกำหนดตำแหน่งแท็ก Anchor เพื่อกำหนดขนาดหรือจัดตำแหน่งองค์ประกอบที่อยู่ในตำแหน่ง Anchor ได้ตามขนาดของ Anchor (ความกว้าง ความสูง หรือขนาดในบรรทัดและขนาดบล็อก)
CSS ต่อไปนี้แสดงตัวอย่างของการใช้ค่านี้สำหรับความสูง โดยใช้ anchor-size(height)
ภายในฟังก์ชัน calc()
เพื่อกำหนดความสูงสูงสุดของเคล็ดลับเครื่องมือให้เป็น 2 เท่าของความสูงของจุดยึด
.positioned-notice {
position-anchor: --question-mark;
/* set max height of the tooltip to 2x height of the anchor */
max-height: calc(anchor-size(height) * 2);
}
ใช้ Anchor กับองค์ประกอบชั้นบนสุด เช่น ป๊อปโอเวอร์และกล่องโต้ตอบ
การวางตำแหน่งแท็ก Anchor ทำงานได้ดีอย่างไม่น่าเชื่อกับองค์ประกอบชั้นบนสุดอย่าง popover
และ <dialog>
แม้ว่าองค์ประกอบเหล่านี้จะวางอยู่ในเลเยอร์ที่แยกจากโครงสร้างย่อย DOM ส่วนที่เหลือ แต่การจัดตำแหน่งแท็ก Anchor จะช่วยให้คุณเชื่อมโยงองค์ประกอบเหล่านั้นกลับไปและเลื่อนไปตามองค์ประกอบที่ไม่ได้อยู่ในเลเยอร์บนสุดได้ นี่เป็นข้อดีอย่างยิ่งสำหรับอินเทอร์เฟซแบบเลเยอร์
ในตัวอย่างต่อไปนี้ ชุดป๊อปอัปเคล็ดลับเครื่องมือจะเปิดขึ้นโดยใช้ปุ่ม ปุ่มคือ Anchor ส่วนเคล็ดลับเครื่องมือคือองค์ประกอบที่อยู่ในตำแหน่ง คุณจัดรูปแบบองค์ประกอบที่อยู่ในตำแหน่งได้เช่นเดียวกับองค์ประกอบที่ตรึงไว้อื่นๆ ในตัวอย่างนี้ anchor-name
และ position-anchor
คือสไตล์ในบรรทัดบนปุ่มและเคล็ดลับเครื่องมือ เนื่องจากแต่ละหมุดต้องมีชื่อหมุดที่ไม่ซ้ำกัน การสร้างเนื้อหาแบบไดนามิกจึงต้องใช้การฝังเป็นวิธีที่ง่ายที่สุด
ปรับตำแหน่งจุดยึดด้วย @position-try
เมื่อคุณได้ตำแหน่งยึดตําแหน่งเริ่มต้นแล้ว คุณอาจต้องปรับตําแหน่งหากยึดกับขอบของบล็อกที่วางอยู่ หากต้องการสร้างตำแหน่งจุดยึดอื่น คุณสามารถใช้คําสั่ง @position-try
ร่วมกับพร็อพเพอร์ตี้ position-try-options
ในตัวอย่างต่อไปนี้ เมนูย่อยจะปรากฏที่ด้านขวาของเมนู เมนูและเมนูย่อยเป็นการใช้ Anchor Positioning API ที่ยอดเยี่ยมร่วมกับแอตทริบิวต์ popover เนื่องจากเมนูเหล่านี้มักจะยึดอยู่กับปุ่มทริกเกอร์
สำหรับเมนูย่อยนี้ หากมีพื้นที่แนวนอนไม่เพียงพอ คุณสามารถย้ายเมนูย่อยไว้ใต้เมนูหลักแทนได้ โดยให้ตั้งค่าตำแหน่งเริ่มต้นก่อนดังนี้
#submenu {
position: absolute;
position-anchor: --submenu;
/* initial position */
margin-left: var(--padding);
inset-area: right span-bottom;
}
จากนั้นตั้งค่าตำแหน่งที่ยึดตำแหน่งสำรองโดยใช้ @position-try
/* alternate position */
@position-try --bottom {
margin: var(--padding) 0 0 var(--padding);
inset-area: bottom;
}
สุดท้าย ให้เชื่อมต่อทั้งคู่กับ position-try-options
เมื่อนำมารวมกันแล้ว จะมีลักษณะดังนี้
#submenu {
position: absolute;
position-anchor: --submenu;
/* initial position */
margin-left: var(--padding);
inset-area: right span-bottom;
*/ connect with position-try options */
position-try-options: --bottom;
}
/* alternate position */
@position-try --bottom {
margin: var(--padding) 0 0 var(--padding);
inset-area: bottom;
}
คีย์เวิร์ดพลิกอัตโนมัติในตำแหน่งโฆษณา Anchor
หากมีการปรับแต่งพื้นฐาน เช่น พลิกจากบนลงล่างหรือซ้ายไปขวา (หรือทั้ง 2 อย่าง) คุณยังข้ามขั้นตอนในการสร้างการประกาศ @position-try
ที่กำหนดเองและใช้คีย์เวิร์ดแบบพลิกที่เบราว์เซอร์รองรับในตัว เช่น flip-block
และ flip-inline
ได้ด้วย รายการต่อไปนี้ใช้แทนการประกาศ @position-try
ที่กำหนดเองได้ และสามารถใช้ร่วมกันได้
position-try-options: flip-block, flip-inline, flip-block flip-inline;
การพลิกคีย์เวิร์ดอาจลดความซับซ้อนของโค้ด Anchor ได้อย่างมาก คุณสามารถสร้างหมุดที่ใช้งานได้อย่างเต็มรูปแบบซึ่งมีตำแหน่งทางเลือกได้โดยใช้เพียงไม่กี่บรรทัด ดังนี้
#my-tooltip {
position-anchor: --question-mark;
inset-area: top;
position-try-options: flip-block;
}
position-visibility
สำหรับจุดยึดในแถบเลื่อนย่อย
ในบางกรณี คุณอาจต้องการยึดองค์ประกอบภายในส่วนย่อยของการเลื่อนของหน้า ในกรณีเหล่านี้ คุณควบคุมการแสดง Anchor โดยใช้ position-visibility
ได้ หมุดจะอยู่ในมุมมองเมื่อใด ข้อมูลดังกล่าวหายไปเมื่อใด คุณควบคุมตัวเลือกเหล่านี้ได้ด้วยฟีเจอร์นี้ คุณใช้ position-visibility: anchors-visible
เมื่อต้องการให้องค์ประกอบที่วางตำแหน่งไว้แสดงจนกว่าจุดยึดจะมองไม่เห็น
#tooltip {
position: fixed;
position-anchor: --anchor-top-anchor;
position-visibility: anchors-visible;
bottom: anchor(top);
}
อีกวิธีหนึ่งคือให้ใช้ position-visibility: no-overflow
เพื่อป้องกันไม่ให้ Anchor ล้นที่เก็บของ
#tooltip {
position: absolute;
position-anchor: --anchor-top-anchor;
position-visibility: no-overflow;
bottom: anchor(top);
}
การตรวจหาฟีเจอร์และ polyfill
เนื่องจากขณะนี้การรองรับเบราว์เซอร์มีจํากัด คุณจึงอาจต้องระมัดระวังในการใช้ API นี้ ก่อนอื่น คุณสามารถตรวจสอบการรองรับใน CSS ได้โดยตรงโดยใช้การค้นหาฟีเจอร์ @supports
วิธีการก็คือการรวมสไตล์ Anchor ไว้ในลักษณะต่อไปนี้
@supports (anchor-name: --myanchor) {
/* Anchor styles here */
}
นอกจากนี้ คุณยังอาจทำ Polyfill ฟีเจอร์การกำหนดตำแหน่งแท็ก Anchor ได้ด้วย polyfill ของตำแหน่งแท็ก Anchor สำหรับ CSS โดย Oddbird ซึ่งใช้งานได้ใน Firefox 54, Chrome 51, Edge 79 และ Safari 10 โพลีฟีลนี้รองรับฟีเจอร์ตำแหน่งจุดยึดพื้นฐานส่วนใหญ่ แม้ว่าการใช้งานในปัจจุบันจะไม่สมบูรณ์และมีส่วนที่เป็นไวยากรณ์ล้าสมัยอยู่บ้าง คุณสามารถใช้ลิงก์ unpkg หรือนำเข้าโดยตรงในตัวจัดการแพ็กเกจ
หมายเหตุเกี่ยวกับการช่วยเหลือพิเศษ
แม้ว่า API การจัดตำแหน่งแท็ก Anchor จะทำให้จัดตำแหน่งองค์ประกอบได้โดยสัมพันธ์กับองค์ประกอบอื่นๆ แต่ API ดังกล่าวไม่ได้สร้างความสัมพันธ์เชิงความหมายที่มีความหมายระหว่างองค์ประกอบเหล่านั้นโดยธรรมชาติ หากมีความสัมพันธ์เชิงความหมายระหว่างองค์ประกอบ Anchor และองค์ประกอบที่ตําแหน่งอยู่ (เช่น องค์ประกอบที่ตําแหน่งเป็นความคิดเห็นในแถบด้านข้างเกี่ยวกับ anchor text) วิธีหนึ่งที่สามารถทำได้คือใช้ aria-details
เพื่อชี้จากองค์ประกอบ Anchor ไปยังองค์ประกอบที่อยู่ในตำแหน่ง ซอฟต์แวร์โปรแกรมอ่านหน้าจอยังอยู่ระหว่างเรียนรู้วิธีจัดการกับ aria-details แต่การรองรับก็ดีขึ้นเรื่อยๆ
<div class="anchor" aria-details="sidebar-comment">Main content</div>
<div class="positioned" id="sidebar-comment">Sidebar content</div>
.anchor {
anchor-name: --anchor;
}
.positioned {
position: fixed;
position-anchor: --anchor;
}
หากคุณใช้การวางตำแหน่งจุดยึดกับแอตทริบิวต์ popover
หรือองค์ประกอบ <dialog>
เบราว์เซอร์จะจัดการการแก้ไขการนำทางโฟกัสเพื่อการเข้าถึงที่เหมาะสม คุณจึงไม่จำเป็นต้องแสดงป๊อปอัปหรือกล่องโต้ตอบตามลำดับ DOM อ่านเพิ่มเติมเกี่ยวกับหมายเหตุเกี่ยวกับการช่วยเหลือพิเศษในข้อมูลจำเพาะ
บทสรุป
นี่เป็นฟีเจอร์ใหม่ล่าสุดและเราตื่นเต้นที่จะได้เห็นสิ่งที่คุณสร้างด้วยฟีเจอร์นี้ ที่ผ่านมาเราได้เห็นกรณีการใช้งานที่มีประโยชน์มากจากชุมชน เช่น ป้ายกํากับแบบไดนามิกในแผนภูมิ เส้นเชื่อมต่อ เชิงอรรถ และการอ้างอิงเปรียบเทียบด้วยภาพ ขณะที่คุณกำลังทดสอบการจัดตำแหน่งโฆษณา Anchor เราอยากจะฟังความคิดเห็นจากคุณ และหากคุณพบข้อบกพร่อง โปรดแจ้งให้เราทราบ