- ตารางที่มีหลายแถว เมื่อเลื่อนลงไปเรื่อย ๆ จะยิ่งลืมได้ง่ายว่าคอลัมน์แต่ละคอลัมน์หมายถึงอะไร ทำให้อ่านข้อมูลไม่สะดวก
- เพียงเพิ่ม
position: sticky; และ top: 0; ให้กับ thead ก็สามารถทำให้ หัวตารางตรึงอยู่กับที่ ได้
sticky มีการรองรับจากเบราว์เซอร์ทั่วโลกประมาณ 96% จึงไม่ถือว่าใกล้เคียงกับฟีเจอร์ทดลอง
- แม้ตอนดูแถวด้านล่าง เช่น รายการที่ 300 ชื่อคอลัมน์ก็ยังคงแสดงอยู่ ทำให้ ประสบการณ์การสำรวจตาราง ดีขึ้น
- การใช้งานมีขนาดเล็กแต่ให้ผลมาก จึงเหมาะที่จะนำไปใช้เป็นการปรับปรุงการใช้งานพื้นฐานสำหรับเว็บเพจที่มีตารางยาว
ปัญหาหัวตารางหายไปในตารางยาว
- ในชุดข้อมูลขนาดใหญ่หรือตารางที่มีหลายร้อยแถว หลังจากเลื่อนหน้า หัวตาราง จะหายออกไปนอกหน้าจอ
- เมื่อลงไปถึงรายการที่ 300 อาจยากที่จะตรวจสอบอีกครั้งว่าข้อมูลในแต่ละคอลัมน์หมายถึงอะไร
- ยิ่งเป็นตารางที่เพิ่งเห็นเป็นครั้งแรก ก็ยิ่งต้องอ่านไปพร้อมกับจดจำความหมายของคอลัมน์ ทำให้ภาระในการสำรวจข้อมูลเพิ่มขึ้น
ใช้ sticky กับ thead
- วิธีแก้คือเพิ่มคุณสมบัติ CSS สองรายการให้กับ
thead
position: sticky;
top: 0;
- เมื่อใช้
position: sticky ร่วมกับ top: 0 จะสามารถ ตรึง หัวตารางไว้ที่ด้านบนของหน้าจอขณะเลื่อนได้
sticky มี อัตราการรองรับทั่วโลกประมาณ 96% จึงใช้ได้ในเบราว์เซอร์จำนวนมาก
- สามารถตรวจสอบการทำงานจริงได้ที่ ตัวอย่าง CodePen
1 ความคิดเห็น
ความเห็นจาก Hacker News
ถ้าเป็น sticky header แกนเดียวก็พอรับได้ แต่ยังคงรอวันที่ CSS รองรับทั้งสองแกนพร้อมกันอยู่: https://github.com/w3c/csswg-drafts/issues/8286
overflow-x: autoได้ด้วย แต่กลับเหมือนโดนบังคับให้เลือกได้แค่อย่างใดอย่างหนึ่งสารภาพเลยว่าต่อให้แทบไม่มีความรู้ CSS ก็ยังทำเว็บแอปที่พอใช้งานได้อยู่ ช่วงนี้เพิ่งพยายามตรึงเฮดเดอร์ของตารางสัตว์ประหลาดขนาดประมาณ 20,000 แถว: https://www.datasciencemeta.com/rpackages ตอนแรกหวังว่าจะมีอะไรอย่าง
class="table table-header-sticky"อยู่ในคลาสตารางของ Bootstrap แต่ไม่มี ลองปรับตาม Stack Overflow, GPT และตัวอย่างจาก CodePen อยู่ราว 20 นาที ก็ยังมีผลข้างเคียงแปลก ๆ แต่ CodePen ในบทความนี้ทำงานได้ใน 2 นาที และตอนนี้กำลัง deploy ขึ้น production อยู่การตรึงหัวตารางดูเหมือนจะง่ายด้วย
position: sticky;แค่บรรทัดเดียว แต่พอเริ่มใส่อะไรเพิ่มเข้าไปในเนื้อหาตารางก็ซับซ้อนขึ้นทันที เคยเพิ่มฟีเจอร์ในตารางที่มี sticky header ให้จำ index ของแถวแรกที่ผู้ใช้มองเห็นตอนเลื่อนดูเนื้อหาแล้วออกจากหน้า จากนั้นค่อย restore กลับมาเมื่อกลับเข้าเพจ แต่ผลลัพธ์มักจะเลื่อนลงไปประมาณหนึ่งแถวเสมอ ที่แท้แถวที่ 5 อยู่บนสุดของตารางจริง แต่theadมาซ้อนทับไว้จนแถวที่ 6 ดูเหมือนเป็นแถวแรกที่มองเห็น เลยแก้ด้วยการชดเชยตำแหน่ง scroll ตามความสูงของtheadแต่บางครั้งก็ยังคลาดไปไม่กี่พิกเซล และเพราะเป็นตารางใหญ่เลยต้องทำ lazy loading ใน scroll event พร้อมใช้ automatic table layout แบบปกติ ทำให้เซลล์ใน header มีการตัดบรรทัดและความสูงรวมของ header เปลี่ยนไป สุดท้ายเลยต้องผูก ResizeObserver กับtheadเพื่อปรับตำแหน่ง scroll แบบไดนามิกเมื่อความสูงเปลี่ยน [1] https://developer.mozilla.org/en-US/docs/Web/API/ResizeObser...ตอนทำสิ่งนี้ ถ้าต้องการให้ เส้นขอบ ของ header ติดค้างไปด้วย ก็สามารถจัดการด้วย
table thead:beforeและtable thead:afterโดยใส่position: absolute,width: 100%,top: 0/bottom: 0, และborder-top/border-bottomอยากให้หัวตารางทำงานแบบนี้โดยอัตโนมัติอยู่แล้ว ถ้านักพัฒนาตั้งใจใช้แท็กที่เกี่ยวข้องและลงแรงเพิ่มขนาดนั้น ส่วนใหญ่ก็น่าจะหมายถึงอยากได้พฤติกรรมแบบนี้อยู่แล้ว
อีกแล้ว แต่ใช้500 อันกับ `` ซ้อนกัน 45 ชั้นในแต่ละอันแทน ดังนั้นคงใช้ไม่ได้กับเว็บพวกนั้นบน command line ก็ส่ง header ไป stderr และส่งเนื้อหาไป stdout ได้ ถ้าไม่ทำแบบนั้น ผลของ
heights | sort -k2 -nrจะออกมาเป็นGeorge 186,Wally 173,NAME HEIGHTแต่ถ้าให้ header เลี่ยง stdout ก็จะกลายเป็นNAME HEIGHT,George 186,Wally 173heights | (sed -u 1q; sort -k2 -nr)ทำงานได้ถูกต้อง ที่มา: https://stackoverflow.com/a/56151840heightsเป็นไฟล์ ก็ทำแบบ% head -1 heights ; sed 1,1d heights | sort -k2 -nrได้ และถ้าheightsเป็น executable ที่รันซ้ำสองครั้งมีต้นทุนสูง ก็ทำแบบ% heights > /tmp/heights ; head -1 /tmp/heights ; sed 1,1d /tmp/heights | sort -k2 -nrได้ จะ pipe เข้าawkก็ได้เหมือนกัน ทางเลือกอื่นอาจสะดวกน้อยกว่าแต่ก็น่าประหลาดใจน้อยกว่า และยังทำงานได้แม้ผู้เขียน executable จะคิดอีกแบบเรื่องนี้เคยใช้ไม่ได้มานาน Chrome เคยปิด
position: stickyบนองค์ประกอบtheadและtr: https://issues.chromium.org/issues/41303743 จำได้ว่าตารางรองรับบนเบราว์เซอร์เกือบทั้งหมดเป็นสีเขียวหมด แต่บนตารางของ Chrome กลับใช้ไม่ได้จริงบางคนอาจอยากพูดว่า “ขอร้องล่ะ อย่าทำเลย” มากกว่า: https://news.ycombinator.com/item?id=32998091
stickyมันแย่ตรงไหน?ใน CodePen จะดูดีกว่าถ้าชดเชย
topตามขนาดเส้นขอบ เช่นใช้-1pxแทน0เพื่อหลีกเลี่ยงไม่ให้เนื้อหาตารางโผล่ผ่านขึ้นมาเหนือ header เปรียบเทียบ: https://codepen.io/bradleytaunt/pen/bGZyJBj เวอร์ชันแก้ไข: https://codepen.io/alokmenghrajani/pen/ExMBQowมีคนเสนอว่าแทนที่จะใช้ sticky header ให้ใช้ ความสูง viewport แบบจำกัด เพื่อให้ header มองเห็นอยู่เสมอ ทำได้แบบ DataGridXL(https://datagridxl.com) อนึ่ง ฉันเป็นคนสร้างมันเอง