วิธีการจัดตำแหน่งสิ่งต่าง ๆ ใน CSS

เผยแพร่แล้ว: 2022-03-10
สรุปด่วน ↬ มีสองสามวิธีในการจัดแนวองค์ประกอบใน CSS ในบทความนี้ Rachel Andrew อธิบายสิ่งที่พวกเขามีพร้อมเคล็ดลับบางประการที่จะช่วยให้คุณจำได้ว่าควรใช้อะไรและเพราะเหตุใด

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

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

การจัดแนวข้อความและองค์ประกอบแบบอินไลน์

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

เพิ่มเติมหลังกระโดด! อ่านต่อด้านล่าง↓

ในตัวอย่างด้านล่าง ฉันมีข้อความบางส่วนที่มีรูปภาพอินไลน์ที่ใหญ่ขึ้น ฉันกำลังใช้ vertical-align: middle บนรูปภาพเพื่อจัดแนวข้อความให้อยู่ตรงกลางของรูปภาพ

ดูตัวอย่าง Pen Vertical Alignment โดย Rachel Andrew

ดูตัวอย่าง Pen Vertical Alignment โดย Rachel Andrew

คุณสมบัติของ line-height และการจัดตำแหน่ง

โปรดจำไว้ว่า คุณสมบัติ line-height จะเปลี่ยนขนาดของ line-box และสามารถเปลี่ยนการจัดตำแหน่งของคุณได้ ตัวอย่างต่อไปนี้ใช้ค่าความสูงบรรทัดขนาดใหญ่ 150px และฉันได้จัดแนวรูปภาพให้อยู่ top รูปภาพถูกจัดแนวให้อยู่ด้านบนของกล่องบรรทัด ไม่ใช่ด้านบนของข้อความ ให้เอาความสูงของบรรทัดนั้นออกหรือทำให้เล็กกว่าขนาดของรูปภาพ จากนั้นรูปภาพและข้อความจะเรียงกันที่ด้านบนของข้อความ

ดูการจัดแนวปากกาแนวตั้งและความสูงเส้นโดยราเชล แอนดรูว์

ดูการจัดแนวปากกาแนวตั้งและความสูงเส้นโดยราเชล แอนดรูว์

ปรากฎว่าความ line-height และขนาดของข้อความนั้นค่อนข้างซับซ้อน และฉันจะไม่มุ่งไปที่รูกระต่ายนั้นในบทความนี้ หากคุณกำลังพยายามจัดแนวองค์ประกอบแบบอินไลน์ได้อย่างแม่นยำและต้องการทำความเข้าใจกับสิ่งที่เกิดขึ้นจริงๆ ผมขอแนะนำให้อ่าน “Deep Dive CSS: Font Metrics, line-height And vertical-align

ฉันจะใช้คุณสมบัติการ vertical-align เมื่อใด

คุณสมบัติการ vertical-align มีประโยชน์หากคุณกำลังจัดแนวองค์ประกอบแบบอินไลน์ใดๆ ซึ่งรวมถึงองค์ประกอบที่มี display: inline-block เนื้อหาของเซลล์ตารางยังสามารถจัดแนวด้วยคุณสมบัติการ vertical-align ได้อีกด้วย

คุณสมบัติการ vertical-align ไม่มีผลกับรายการยืดหยุ่นหรือรายการกริด ดังนั้น หากใช้เป็นส่วนหนึ่งของกลยุทธ์ทางเลือก จะหยุดใช้นาทีที่องค์ประกอบหลักเปลี่ยนเป็นกริดหรือคอนเทนเนอร์แบบยืดหยุ่น ตัวอย่างเช่น ในปากกาถัดไป ฉันมีชุดของรายการที่วางด้วย display: inline-block และนี่หมายความว่าฉันสามารถจัดแนวรายการแม้ว่าเบราว์เซอร์จะไม่มี Flexbox:

ดูปากกาอินไลน์บล็อกและแนวตั้งโดย Rachel Andrew

ดูปากกาอินไลน์บล็อกและแนวตั้งโดย Rachel Andrew

ในปากกาถัดไปนี้ ฉันถือว่าบ inline-block เป็นทางเลือกสำรองสำหรับเลย์เอาต์แบบยืดหยุ่น คุณสมบัติการจัดตำแหน่งไม่มีผลอีกต่อไป และฉันสามารถเพิ่ม align-items เพื่อจัดแนวรายการใน Flexbox คุณสามารถบอกได้ว่าวิธี Flexbox อยู่ในการเล่นเพราะช่องว่างระหว่างไอเท็มที่คุณจะได้รับเมื่อใช้ display: inline-block หายไป

ดูทางเลือกย้อนกลับแบบยืดหยุ่นของ Pen inline-block โดย Rachel Andrew

ดูทางเลือกย้อนกลับแบบยืดหยุ่นของ Pen inline-block โดย Rachel Andrew

ความจริงที่ว่าการ vertical-align ทำงานบนเซลล์ตารางเป็นเหตุผลที่เคล็ดลับในการจัดตำแหน่งรายการในแนวตั้งโดยใช้ display: table-cell works

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

การจัดตำแหน่งกล่อง

Box Alignment Specifications เกี่ยวข้องกับวิธีที่เราจัดตำแหน่งอื่นๆ ข้อกำหนดระบุรายละเอียดคุณสมบัติการจัดตำแหน่งต่อไปนี้:

  • justify-content
  • align-content
  • justify-self
  • align-self
  • justify-items
  • align-items

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

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

 .container { display: flex; align-items: center; justify-content: center; }

ในอนาคต เราอาจใช้ display: flex ได้ด้วยซ้ำ เมื่อคุณสมบัติ Box Alignment ถูกนำไปใช้กับ Block Layout อย่างไรก็ตาม ในขณะนี้ การสร้างพาเรนต์ของสิ่งที่คุณต้องการจัดกึ่งกลางคอนเทนเนอร์แบบยืดหยุ่นเป็นวิธีการจัดตำแหน่งในแนวนอนและแนวตั้ง

การจัดตำแหน่งสองประเภท

เมื่อจัดแนวรายการ flex และ grid คุณมีสองสิ่งที่เป็นไปได้ในการจัดแนว:

  1. คุณมีพื้นที่ว่างในกริดหรือคอนเทนเนอร์แบบยืดหยุ่น (เมื่อวางรายการหรือแทร็กแล้ว)
  2. คุณยังมีรายการอยู่ภายในพื้นที่กริดที่คุณวางไว้ หรือบนแกนไขว้ภายในคอนเทนเนอร์แบบยืดหยุ่น

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

การจัดการกับพื้นที่ว่าง: align-content และ justify-content

คุณสมบัติที่ลงท้ายด้วย -content นั้นเกี่ยวกับการกระจายพื้นที่ ดังนั้นเมื่อคุณเลือกใช้ align-content หรือ justify-content คุณกำลังกระจายพื้นที่ว่างระหว่างแทร็กกริดหรือรายการ flex โดยจะไม่เปลี่ยนขนาดของรายการดิ้นหรือกริดด้วยตนเอง พวกเขาย้ายพวกเขาไปรอบ ๆ เพราะพวกเขาเปลี่ยนที่ว่างไป

ด้านล่างนี้ ฉันมีตัวอย่างแบบยืดหยุ่นและตัวอย่างกริด ทั้งสองมีคอนเทนเนอร์ที่ใหญ่กว่าที่จำเป็นสำหรับแสดงรายการ flex หรือแทร็กกริด ดังนั้นฉันจึงสามารถใช้ align-content และ justify-content เพื่อกระจายพื้นที่นั้น

ดู Pen justify-content และ align-content โดย Rachel Andrew

ดู Pen justify-content และ align-content โดย Rachel Andrew

ย้ายรายการไปรอบๆ : justify-self , align-self , justify-items And align-items

จากนั้นเรามี align-self และ justify-self ตามที่ใช้กับรายการ flex หรือ grid แต่ละรายการ คุณยังสามารถใช้ align-items และ justify-items บนคอนเทนเนอร์เพื่อตั้งค่าคุณสมบัติทั้งหมดในครั้งเดียว คุณสมบัติเหล่านี้จัดการกับรายการ flex หรือ grid จริง เช่น การย้ายเนื้อหาภายใน Grid Area หรือ flex line

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

ในตัวอย่างด้านล่าง ฉันมีคอนเทนเนอร์แบบยืดหยุ่นและแบบกริด และกำลังใช้ align-items และ align-self ใน Flexbox เพื่อย้ายรายการขึ้นและลงซึ่งกันและกันบนแกนไขว้ หากคุณใช้ Firefox และตรวจสอบองค์ประกอบโดยใช้ Firefox Flexbox Inspector คุณจะเห็นขนาดของคอนเทนเนอร์แบบยืดหยุ่นและวิธีย้ายรายการในแนวตั้งภายในนั้น

จัดเรียงรายการแบบยืดหยุ่นในคอนเทนเนอร์
จัดรายการ flex ให้ตรงกับคอนเทนเนอร์ flex ที่ไฮไลต์ใน Firefox (ตัวอย่างขนาดใหญ่)

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

จัดแนวรายการกริด
จัดแนวรายการกริดโดยเน้นกริดใน Firefox (ตัวอย่างขนาดใหญ่)

ลองใช้ค่าต่างๆ ในการสาธิต CodePen เพื่อดูว่าคุณสามารถเปลี่ยนเนื้อหาได้อย่างไรในวิธีการจัดวางแต่ละวิธี:

ดู Pen justify-self, align-self, justify-items, align-items โดย Rachel Andrew

ดู Pen justify-self, align-self, justify-items, align-items โดย Rachel Andrew

สับสน โดย align และให้ justify

ปัญหาที่ผู้คนพูดถึงในการจำคุณสมบัติการจัดตำแหน่งใน Grid และ Flexbox คือไม่มีใครจำได้ว่าจะจัดแนวหรือปรับแนว ทิศทางไหน?

สำหรับ Grid Layout คุณจำเป็นต้องรู้ว่าคุณกำลังจัดแนวในทิศทางบล็อกหรืออินไลน์ ทิศทางการบล็อกคือการวางบล็อกทิศทางบนหน้าเว็บของคุณ (ในโหมดการเขียนของคุณ) เช่น สำหรับภาษาอังกฤษในแนวตั้ง ทิศทางอินไลน์คือทิศทางที่ประโยคทำงาน (ดังนั้นสำหรับภาษาอังกฤษที่เรียงจากซ้ายไปขวาในแนวนอน)

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

ตัวอย่างด้านล่างมีเค้าโครงกริดสองแบบ หนึ่งมี writing-mode: horizontal-tb (ซึ่งเป็นค่าเริ่มต้นสำหรับภาษาอังกฤษ) และ writing-mode: vertical-rl นี่เป็นข้อแตกต่างระหว่างพวกเขาเท่านั้น คุณจะเห็นว่าคุณสมบัติการจัดตำแหน่งที่ฉันใช้ทำงานเหมือนกันทุกประการบนแกนบล็อกในทั้งสองโหมด

ดูการจัดแนวแกน Pen Grid Block Axis Alignment โดย Rachel Andrew

ดูการจัดแนวแกน Pen Grid Block Axis Alignment โดย Rachel Andrew

ในการจัดเรียงสิ่งต่าง ๆ ในทิศทางอินไลน์ ให้ใช้คุณสมบัติที่ขึ้นต้นด้วย justify- ใช้ justify-content เพื่อกระจายช่องว่างระหว่างแทร็กกริด และ justify-items หรือ justify-self เพื่อจัดแนวรายการภายในพื้นที่กริดของพวกเขาในทิศทางแบบอินไลน์

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

ดูการจัดแนวอินไลน์ของ Pen Grid โดย Rachel Andrew

ดูการจัดแนวอินไลน์ของ Pen Grid โดย Rachel Andrew

Flexbox นั้นซับซ้อนกว่าเล็กน้อยเนื่องจากเรามีแกนหลักซึ่งสามารถเปลี่ยนเป็น row หรือ column ได้ ลองคิดถึงแกนหลักนั้นก่อน มันถูกตั้งค่าด้วยคุณสมบัติ flex-direction ค่าเริ่มต้น (หรือค่าเริ่มต้น) ของคุณสมบัตินี้คือ row ซึ่งจะวางรายการ flex ออกเป็นแถวในโหมดการเขียนที่กำลังใช้งานอยู่ - นี่คือสาเหตุที่เมื่อทำงานเป็นภาษาอังกฤษ เราจะลงเอยด้วยรายการในแนวนอนเมื่อเราสร้าง ภาชนะดิ้น จากนั้นคุณสามารถเปลี่ยนแกนหลักเป็น flex-direction: column และรายการต่างๆ จะถูกจัดวางเป็นคอลัมน์ ซึ่งหมายความว่าจัดวางในทิศทางบล็อกสำหรับโหมดการเขียนนั้น

ในขณะที่เราสามารถเปลี่ยนแกนนี้ได้ ปัจจัยที่สำคัญที่สุดใน Flexbox คือการถามว่า "แกนใดเป็นแกนหลักของฉัน" เมื่อคุณรู้แล้ว สำหรับการจัดตำแหน่ง (เมื่ออยู่บนแกนหลักของคุณ) คุณเพียงแค่ใช้ justify-content ไม่สำคัญว่าแกนหลักของคุณจะเป็นแถวหรือคอลัมน์ คุณควบคุมช่องว่าง ระหว่าง รายการ flex ด้วย justify-content

ดู Pen justfy-content ใน Flexbox โดย Rachel Andrew

ดู Pen justfy-content ใน Flexbox โดย Rachel Andrew

บนแกนตัดขวาง คุณสามารถใช้ align-items ซึ่งจะจัดตำแหน่งรายการภายในคอนเทนเนอร์ flex หรือ flex line ในคอนเทนเนอร์ flex แบบหลายบรรทัด หากคุณมีคอนเทนเนอร์แบบหลายบรรทัดโดยใช้ flex-wrap: wrap และ มีพื้นที่ว่างในคอนเทนเนอร์นั้น คุณสามารถใช้ align-content เพื่อกระจายพื้นที่บนแกนไขว้

ในตัวอย่างด้านล่าง เรากำลังดำเนินการทั้งกับคอนเทนเนอร์แบบยืดหยุ่นที่แสดงเป็นแถวและคอลัมน์:

ดูการจัดตำแหน่งแกน Pen Cross ใน Flexbox โดย Rachel Andrew

ดูการจัดตำแหน่งแกน Pen Cross ใน Flexbox โดย Rachel Andrew

เมื่อ justify-content หรือ align-content ไม่ทำงาน

คุณสมบัติ justify-content และ align-content ใน Grid และ Flexbox นั้นเกี่ยวกับ การกระจายพื้นที่พิเศษ ดังนั้นสิ่งที่ต้องตรวจสอบคือคุณมีพื้นที่เพิ่มเติม

นี่คือตัวอย่าง Flex: ฉันได้ตั้งค่า flex-direction: row และฉันมีสามรายการ พวกมันไม่ใช้พื้นที่ทั้งหมดในคอนเทนเนอร์แบบยืดหยุ่น ดังนั้นฉันจึงมีพื้นที่ว่างบนแกนหลัก ค่าเริ่มต้นสำหรับ justify-content คือ flex-start ดังนั้นรายการของฉันทั้งหมดจึงเข้าแถวที่จุดเริ่มต้นและพื้นที่พิเศษ อยู่ที่ส่วนท้าย ฉันใช้ Firefox Flex Inspector เพื่อเน้นพื้นที่

รายการยืดหยุ่นชิดซ้าย เน้นพื้นที่ว่างทางด้านขวา
พื้นที่ว่างท้ายตู้คอนเทนเนอร์ (Large Preview)

ถ้าฉันเปลี่ยน flex-direction เป็น space-between ตอนนี้ช่องว่างพิเศษนั้นจะถูกกระจายระหว่างรายการ:

การจัดแนวรายการแบบยืดหยุ่นเพื่อให้มีการกระจายพื้นที่ระหว่างรายการ
พื้นที่ว่างอยู่ระหว่างรายการ (ตัวอย่างขนาดใหญ่)

หากตอนนี้ฉันเพิ่มเนื้อหาลงในรายการของฉันเพื่อให้มีขนาดใหญ่ขึ้นและไม่มีพื้นที่เพิ่มเติมอีกต่อไป justify-content ไม่ทำอะไรเลย — เพียงเพราะไม่มีพื้นที่สำหรับแจกจ่าย

ไอเท็มยืดหยุ่นกำลังเติมคอนเทนเนอร์โดยไม่มีที่ว่าง
ตอนนี้ไม่มีพื้นที่ให้แจกจ่ายแล้ว (ตัวอย่างขนาดใหญ่)

คำถามทั่วไปที่ฉันถามคือเหตุใด justify-content จึงไม่ทำงานเมื่อ flex-direction is column โดยทั่วไปเนื่องจากไม่มีพื้นที่ให้แจกจ่าย หากคุณใช้ตัวอย่างข้างต้นและทำให้เป็น flex-direction: column รายการจะแสดงเป็นคอลัมน์ แต่จะไม่มีการเว้นวรรคเพิ่มเติมด้านล่างรายการตามที่มีเมื่อคุณทำ flex-direction: row นี่เป็นเพราะเมื่อคุณสร้าง Flex Container ด้วย display: flex คุณมี flex container ระดับบล็อก การดำเนินการนี้จะใช้พื้นที่ที่เป็นไปได้ทั้งหมดในทิศทางแบบอินไลน์ ใน CSS สิ่งต่าง ๆ ไม่ยืดออกในทิศทางบล็อก ดังนั้นจึงไม่มีที่ว่างเพิ่มเติม

รายการดิ้นที่จัดเรียงเป็นคอลัมน์
คอลัมน์สูงเท่าที่จำเป็นเพื่อแสดงรายการ (ตัวอย่างขนาดใหญ่)

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

คอลัมน์ของรายการดิ้นที่มีช่องว่างระหว่างกัน
การเพิ่มความสูงให้กับคอนเทนเนอร์หมายความว่าเรามีพื้นที่ว่าง (ตัวอย่างขนาดใหญ่)

เหตุใดจึงไม่มี justify-self ใน Flexbox

Grid Layout ใช้คุณสมบัติทั้งหมดสำหรับทั้งสองแกนเพราะเรามีสองแกนที่จะจัดการกับใน Grid Layout เสมอ เราสร้างแทร็ก (ซึ่งอาจเหลือพื้นที่เพิ่มเติมในคอนเทนเนอร์กริดในมิติใดมิติหนึ่ง) และเพื่อให้เราสามารถกระจายพื้นที่นั้นด้วย align-content หรือ justify-content เรายังมี Grid Areas และองค์ประกอบในพื้นที่นั้นอาจใช้พื้นที่ไม่เต็มพื้นที่ ดังนั้นเราจึงสามารถใช้ align-self หรือ justify-self เพื่อย้ายเนื้อหาไปรอบๆ พื้นที่ (หรือ align-items , justify-items เพื่อเปลี่ยนการจัดตำแหน่งรายการทั้งหมด)

Flexbox ไม่มีแทร็กในแบบที่เลย์เอาต์ Grid มี บนแกนหลัก ทั้งหมดที่เราต้องเล่นด้วยคือการกระจายช่องว่างระหว่างไอเท็ม ไม่มีแนวคิดเกี่ยวกับแทร็กที่มีการวางรายการแบบยืดหยุ่น ดังนั้นจึงไม่มีการสร้างพื้นที่สำหรับเคลื่อนย้ายไอเท็ม ด้วยเหตุนี้จึงไม่มีคุณสมบัติ justify-self บนแกนหลักใน Flexbox

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

ระยะขอบอัตโนมัติจะใช้พื้นที่ทั้งหมดในทิศทางที่ถูกนำไปใช้ ซึ่งเป็นเหตุผลที่เราสามารถจัดบล็อกให้อยู่ตรงกลาง (เช่น เค้าโครงหน้าหลักของเรา) โดยใช้ระยะขอบซ้ายและขวาของอัตโนมัติ ด้วยระยะขอบอัตโนมัติทั้งสองด้าน แต่ละระยะขอบจะพยายามใช้พื้นที่ทั้งหมดจึงดันบล็อกเข้าไปตรงกลาง ด้วยรายการ Flex ของเรา เราสามารถเพิ่ม margin-left: auto ให้กับรายการที่เราต้องการให้มีการแยกส่วน และตราบใดที่มีพื้นที่ว่างในคอนเทนเนอร์แบบยืดหยุ่น คุณก็จะได้ส่วนแยก สิ่งนี้เล่นได้ดีกับ Flexbox เพราะทันทีที่ไม่มีพื้นที่ว่าง ไอเท็มจะทำงานเหมือนไอเท็ม flex ปกติ

ดูการจัดตำแหน่งปากกาด้วยระยะขอบอัตโนมัติโดย Rachel Andrew

ดูการจัดตำแหน่งปากกาด้วยระยะขอบอัตโนมัติโดย Rachel Andrew

Flexbox และไมโครส่วนประกอบ

สิ่งหนึ่งที่ฉันคิดว่ามักถูกมองข้ามคือประโยชน์ของ Flexbox สำหรับงานเลย์เอาต์เล็กๆ ซึ่งคุณอาจคิดว่าการใช้ vertical-align เป็นวิธีที่จะไป ฉันมักจะใช้ Flexbox เพื่อจัดตำแหน่งลวดลายเล็กๆ ให้เรียบร้อย ตัวอย่างเช่น การจัดตำแหน่งไอคอนถัดจากข้อความ การจัดแนวพื้นฐานสองสิ่งด้วยขนาดฟอนต์ที่แตกต่างกัน หรือทำให้ฟิลด์และปุ่มของฟอร์มเรียงกันอย่างเหมาะสม หากคุณกำลังดิ้นรนเพื่อให้ได้สิ่งที่เข้ากับ vertical-align อย่างดี อาจลองใช้งานกับ Flexbox โปรดจำไว้ว่า คุณสามารถสร้างคอนเทนเนอร์ flex แบบอินไลน์ได้หากต้องการด้วย display: inline-flex

ดูตัวอย่าง Pen inline-flex โดย Rachel Andrew

ดูตัวอย่าง Pen inline-flex โดย Rachel Andrew

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

ผู้คนมักกระตือรือร้นที่จะรู้ว่าสิ่งที่ถูกหรือผิดในการทำสิ่งต่างๆ คืออะไร ในความเป็นจริง มักไม่มีถูกหรือผิด ความแตกต่างเล็กน้อยในรูปแบบของคุณอาจหมายถึงความแตกต่างระหว่าง Flexbox ทำงานได้ดีที่สุด ไม่เช่นนั้นคุณจะใช้ vertical-align

ห่อ

ในการสรุป ฉันมีสรุปสั้นๆ เกี่ยวกับพื้นฐานของการจัดตำแหน่ง หากคุณจำกฎสองสามข้อเหล่านี้ได้ คุณควรสามารถปรับสิ่งต่างๆ ให้สอดคล้องกับ CSS ได้มากที่สุด:

  1. คุณกำลังจัดแนวข้อความหรือองค์ประกอบแบบอินไลน์หรือไม่? ถ้าใช่ คุณต้องใช้ text-align , vertical-align และ line-height
  2. คุณมีรายการหรือรายการที่คุณต้องการจัดวางตรงกลางหน้าหรือคอนเทนเนอร์หรือไม่? ถ้าใช่ ให้สร้างคอนเทนเนอร์เป็นคอนเทนเนอร์แบบยืดหยุ่น จากนั้นตั้งค่า align-items: center และ justify-content: center
  3. สำหรับ Grid Layouts คุณสมบัติที่เริ่มต้นด้วย align- ทำงานในทิศทาง Block; ที่เริ่มต้นด้วยการ justify- ทำงานในทิศทางอินไลน์
  4. สำหรับ Flex Layouts คุณสมบัติที่เริ่มต้นด้วยการ align- บนแกนไขว้ ที่เริ่มต้นด้วยการ justify- ทำงานบนแกนหลัก
  5. คุณสมบัติ justify-content และ align-content กระจายพื้นที่พิเศษ ถ้าคุณไม่มีพื้นที่เพิ่มเติมในคอนเทนเนอร์แบบยืดหยุ่นหรือแบบกริด สิ่งเหล่านี้จะไม่ทำอะไรเลย
  6. หากคุณคิดว่าคุณต้องการ justify-self ใน Flexbox การใช้ระยะขอบอัตโนมัติอาจจะให้รูปแบบที่คุณต้องการ
  7. คุณสามารถใช้ Grid และ Flexbox ร่วมกับคุณสมบัติการจัดตำแหน่งสำหรับงานเลย์เอาต์ขนาดเล็กรวมถึงส่วนประกอบหลัก — ทดลอง!

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจัดตำแหน่ง ดูแหล่งข้อมูลเหล่านี้:

  • CSS Box Alignment (เอกสารเว็บ MDN)
  • ทุกสิ่งที่คุณต้องการรู้เกี่ยวกับการจัดตำแหน่งใน Flexbox
  • สูตรการจัดตำแหน่งกล่อง