วิธีจัด `div` ให้อยู่กึ่งกลางใน CSS
(joshwcomeau.com)- การจัดกึ่งกลางใน CSS ไม่ใช่แค่ทริกเดียวอีกต่อไป แต่เป็นเรื่องของการเลือกใช้ระหว่าง Flow, Flexbox, Positioned layout, CSS Grid, text-align ตามว่าองค์ประกอบอยู่ใน flow ของเอกสาร ลอยอยู่ หรือมีหลายชิ้น
- ถ้าต้องการวางองค์ประกอบเดี่ยวให้อยู่กึ่งกลางแนวนอน วิธีแบบ Flow layout โดยจำกัดความกว้างด้วย
max-width: fit-contentแล้วใช้margin-inline: autoจะกระทบกับองค์ประกอบพี่น้องน้อยกว่า - Flexbox สามารถจัดลูกหนึ่งชิ้นหรือหลายชิ้นให้อยู่กึ่งกลางแนวนอน/แนวตั้งได้ด้วยแค่
justify-content: centerและalign-items: centerและแม้ลูกจะล้นออกมาก็ยัง overflow แบบสมมาตร - UI ที่ลอยอยู่ เช่น modal หรือ banner เหมาะกับการใช้
position: fixed,inset: 0, การจำกัดขนาด และmargin: autoร่วมกัน ส่วน CSS Grid เด่นเรื่องไวยากรณ์สั้นและการ ซ้อนทับกัน - ตัวข้อความเองไม่ใช่การจัดเลย์เอาต์ จึงต้องใช้
text-align: centerและเมื่อการรองรับalign-contentใน Flow layout กว้างขึ้น ก็อาจลดความจำเป็นในการเปลี่ยนไปใช้ Flexbox หรือ Grid แค่เพื่อจัดกึ่งกลางแนวตั้งแบบง่าย ๆ
จัดกึ่งกลางแนวนอนใน Flow layout ด้วย auto margin
- หนึ่งในวิธีเก่าแก่คือจำกัดความกว้างขององค์ประกอบก่อน แล้วตั้ง margin ทั้งสองด้านเป็น
auto
.element {
max-width: fit-content;
margin-left: auto;
margin-right: auto;
}
- องค์ประกอบใน Flow layout จะกินพื้นที่แนวนอนเต็มโดยปริยาย ดังนั้นถ้าจะวางไว้ตรงกลาง ต้อง จำกัดความกว้าง ก่อน
fit-contentทำให้องค์ประกอบโอบตามเนื้อหา จนwidthถูกกำหนดด้วยขนาดของเนื้อหาเหมือนheight- ถ้าใช้
max-widthแทนwidthจะเป็นการจำกัดแค่ขนาดสูงสุด ทำให้องค์ประกอบย่อเล็กลงตามคอนเทนเนอร์ได้เมื่อพื้นที่แคบลง - ถ้ามีแค่
margin-left: autoพื้นที่ว่างจะถูกใส่ไว้ที่ margin ซ้าย แต่ถ้าตั้ง margin ทั้งสองด้านเป็นautoพื้นที่ว่างจะถูกแบ่งเท่ากัน ทำให้องค์ประกอบอยู่ตรงกลาง
.element {
max-width: fit-content;
margin-inline: auto;
}
margin-inlineเป็นวิธีสมัยใหม่ในการตั้งmargin-leftและmargin-rightให้มีค่าเท่ากัน และมีการรองรับของเบราว์เซอร์ที่ดีmargin-inlineเป็นส่วนหนึ่งของ logical properties จึงอิงกับแกน inline ตามทิศทางการเขียน ไม่ได้อิงซ้ายขวาแบบตายตัว- จึงสามารถใส่ margin ด้านที่ถูกต้องได้ทั้งในภาษาที่เขียนจากซ้ายไปขวาและจากขวาไปซ้าย
- วิธีนี้มีประโยชน์เมื่ออยาก จัดกึ่งกลางเฉพาะลูกเดี่ยว เช่น รูปภาพในบทความบล็อก โดยไม่อยากให้กระทบกับองค์ประกอบพี่น้อง
จัดกึ่งกลางลูกเดี่ยวหรือหลายลูกด้วย Flexbox
- Flexbox เป็นโหมดเลย์เอาต์ที่เก่งเรื่องการจัดวางหลายรายการตามแกนหลัก และถูกใช้บ่อยมากสำหรับการจัดกึ่งกลาง
.container {
display: flex;
justify-content: center;
align-items: center;
}
- เมื่อใช้
justify-content: centerคู่กับalign-items: centerก็สามารถวางลูกให้อยู่กึ่งกลางทั้งแนวนอนและแนวตั้งได้ - แม้ลูกจะมีขนาดไม่พอดีกับคอนเทนเนอร์ การจัดตำแหน่งก็ยังคงอยู่ และหากล้นออกมาก็จะ overflow แบบสมมาตร
- สามารถจัดกึ่งกลางลูกหลายชิ้นได้เช่นกัน และควบคุมทิศทางการเรียงซ้อนด้วย
flex-direction
.container {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
gap: 4px;
}
- เหมาะจะใช้เป็น ตัวเลือกพื้นฐาน ที่ครอบคลุมทั้งกรณีลูกเดี่ยวและหลายลูก
จัดกึ่งกลาง UI แบบลอยด้วย Positioned layout
- องค์ประกอบที่ต้องลอยอยู่เหนือ flow ปกติของเอกสาร เช่น modal, prompt, banner สามารถจัดการได้ด้วย Positioned layout
.element {
position: fixed;
inset: 0px;
width: 12rem;
height: 5rem;
max-width: 100vw;
max-height: 100dvh;
margin: auto;
}
position: fixedจะตรึงองค์ประกอบไว้กับ viewport และinset: 0pxคือการตั้งtop,left,right,bottomให้เป็น0pxทั้งหมด- ถ้ามีแค่
inset: 0pxองค์ประกอบจะพยายามขยายเต็ม viewport ดังนั้นจึงต้องจำกัดขนาดด้วยwidth,height,max-width,max-height - การจับคู่นี้คือการสร้างเงื่อนไขที่เป็นไปไม่ได้ขึ้นมาโดยตั้งใจ
- องค์ประกอบไม่สามารถห่างจากทั้งซ้ายและขวา
0pxพร้อมกับมีความกว้าง12remได้ในเวลาเดียวกัน - CSS rendering engine จะให้ความสำคัญกับข้อจำกัดของ
widthก่อน แล้วคลายความขัดแย้งด้วยการไปชิดด้านหนึ่งตามทิศทางภาษา
- องค์ประกอบไม่สามารถห่างจากทั้งซ้ายและขวา
- เมื่อใส่
margin: autoเข้าไป วิธีที่เบราว์เซอร์ใช้คลายความขัดแย้งจะเปลี่ยนไป ทำให้องค์ประกอบไปอยู่ กึ่งกลางทั้งแนวนอนและแนวตั้ง - เงื่อนไข 4 อย่างที่ต้องมีคือ
position: fixed,inset: 0px, ความกว้างและความสูงที่ถูกจำกัด, และmargin: auto -
จัดกึ่งกลางแค่แกนเดียว เช่น banner ด้านล่าง
.element { position: fixed; left: 0px; right: 0px; bottom: 8px; width: 12rem; max-width: calc( 100vw - 8px * 2 ); margin-inline: auto; }- เมื่อไม่ใส่
top: 0pxเงื่อนไขที่เป็นไปไม่ได้ในแนวตั้งก็หายไป และองค์ประกอบจะถูกตรึงไว้ด้านล่าง calc(100vw - 8px * 2)ใช้จำกัดความกว้างสูงสุดโดยเว้น buffer ไว้ทั้งสองด้านของ viewportmargin-inline: autoยังสื่อเจตนาเรื่องการจัดกึ่งกลางแนวนอนได้ชัดเจนกว่า
- เมื่อไม่ใส่
-
องค์ประกอบที่ไม่รู้ขนาดล่วงหน้า
.element { position: fixed; inset: 0; width: fit-content; height: fit-content; margin: auto; }- ถ้ายังไม่รู้ขนาดขององค์ประกอบล่วงหน้า สามารถใช้
width: fit-contentและheight: fit-contentเพื่อให้โอบตามเนื้อหาได้ - อาจเพิ่มข้อจำกัดอย่าง
max-width: 60vwได้ แต่ไม่จำเป็น และองค์ประกอบจะยังอยู่ภายใน viewport
- ถ้ายังไม่รู้ขนาดขององค์ประกอบล่วงหน้า สามารถใช้
-
กึ่งกลางแบบเยื้องออกไปเล็กน้อยโดยตั้งใจ
- ถ้าปรับค่า inset ด้านหนึ่ง เช่น
bottom: 48pxองค์ประกอบจะขยับไปครึ่งหนึ่งของค่าที่กำหนด - ถ้า
bottom: 48pxองค์ประกอบจะเลื่อนขึ้น24px - นั่นเป็นเพราะองค์ประกอบถูกแขวนไว้ตรงกลางภายใน กล่องเสมือน ระหว่างขอบบนและล่าง
- ถ้าใช้
transform: translateY(-48px)จะสามารถย้ายองค์ประกอบขึ้นไป48pxได้อย่างแม่นยำ - วิธี offset ด้วย
bottomมีข้อดีคือยังเก็บพร็อพเพอร์ตีtransformไว้ใช้กับแอนิเมชันหรือเอฟเฟกต์ตอนแสดงผลภายหลังได้
- ถ้าปรับค่า inset ด้านหนึ่ง เช่น
จัดกึ่งกลางแบบสั้น ๆ และซ้อนทับกันด้วย CSS Grid
- โค้ดจัดกึ่งกลางที่สั้นที่สุดใน CSS Grid คือการใช้
display: gridคู่กับplace-content: center
.container {
display: grid;
place-content: center;
}
-
place-contentเป็นรูปย่อของjustify-contentและalign-contentโดยกำหนดค่าเดียวกันให้ทั้งแถวและคอลัมน์ -
การตั้งค่านี้จะสร้างเซลล์ Grid 1×1 ไว้ตรงกลางของคอนเทนเนอร์แม่
-
ความต่างจาก Flexbox
- แม้จะดูคล้าย Flexbox แต่ CSS Grid ใช้อัลกอริทึมเลย์เอาต์ที่ต่างกันโดยสิ้นเชิง
- หากกำหนด
width: 50%และheight: 50%ให้ลูก ความต่างจะเห็นชัด - ใน Flexbox ค่าเปอร์เซ็นต์จะคำนวณจาก
.containerแม่ - ใน CSS Grid ค่าเปอร์เซ็นต์จะคำนวณจาก เซลล์ Grid
- ถ้าไม่ได้กำหนด
grid-template-columnsหรือgrid-template-rowsขนาดของ Grid track จะคำนวณจากเนื้อหา จึงอาจทำให้องค์ประกอบเล็กกว่าที่คาดไว้ - ในกรณีแบบนี้อาจต้องเพิ่ม CSS เพื่อแก้ Grid แต่ถ้าต้องการแค่จัดกึ่งกลางธรรมดา Flexbox อาจง่ายกว่า
-
ซ้อนหลายองค์ประกอบไว้ตำแหน่งเดียวกัน
.container { display: grid; place-content: center; } .element { grid-row: 1; grid-column: 1; }- CSS Grid สามารถวางลูกหลายตัวไว้ในเซลล์เดียวกันได้
- ถ้ากำหนด
grid-row: 1และgrid-column: 1ให้.elementทุกตัว องค์ประกอบจะใช้พื้นที่ Grid เดียวกันและซ้อนกันหน้า-หลัง - ใช้งานได้แม้ลูกแต่ละตัวจะมีขนาดต่างกัน
.container { display: grid; place-content: center; place-items: center; } .element { grid-row: 1; grid-column: 1; }- ถ้าต้องการซ้อนลูกที่มีขนาดต่างกันให้อยู่กึ่งกลาง ต้องเพิ่ม
place-items: centerด้วย place-itemsเป็นรูปย่อของjustify-itemsและalign-itemsและใช้ควบคุมการจัดวางของรูปภาพภายในเซลล์ Grid- ถ้าไม่มีพร็อพเพอร์ตีนี้ แม้ตัวเซลล์ Grid จะอยู่ตรงกลาง แต่รูปภาพภายในเซลล์จะกองอยู่มุมซ้ายบน
- หากอยากศึกษา CSS Grid เพิ่มเติม ดูได้ที่ An Interactive Guide to CSS Grid
ข้อความต้องจัดด้วย text-align แยกต่างหาก
- ข้อความใน CSS ต้องจัดการแยกต่างหาก เพราะเทคนิคเลย์เอาต์อย่าง Flexbox ไม่ได้จัดแนวตัวอักษรทีละตัว
- ถ้าใช้ Flexbox จัดย่อหน้าให้อยู่กึ่งกลาง บล็อกของย่อหน้า จะมาอยู่กลาง แต่ตัวอักษรในย่อหน้ายังชิดซ้ายอยู่
- ถ้าต้องการจัดข้อความให้อยู่กึ่งกลางจริง ๆ ต้องใช้
text-align: center
.container {
display: flex;
justify-content: center;
align-items: center;
text-align: center;
}
อนาคตของ Flow layout: align-content
- แม้ Flow layout จะจัดกึ่งกลางแนวนอนได้ด้วย auto margin แต่การจัดกึ่งกลางแนวตั้งที่ผ่านมาต้องพึ่งโหมดเลย์เอาต์อื่นอย่าง Flexbox หรือ Grid
- ณ ต้นปี 2024 ผู้พัฒนาเบราว์เซอร์กำลังทยอยทำ
align-contentสำหรับ Flow layout - พฤติกรรมใหม่นี้ใช้ควบคุม การจัดวางตามแกน block ของเนื้อหา และในเวลานั้นใช้งานได้เฉพาะหลังแฟลกใน Chrome Canary และใน Safari Technical Preview
- เดโมตัวอย่างไม่ได้เป็นพฤติกรรม Flow layout จริง แต่เป็นการจำลองด้วย Flexbox หลังจากตรวจสอบพฤติกรรมใน Chrome Canary และ Safari TP แล้ว
- ฟีเจอร์นี้ไม่ได้สร้าง UI แบบใหม่ แต่ช่วยลดความจำเป็นในการสลับไปใช้โหมดเลย์เอาต์อื่นเพียงเพื่อจัดกึ่งกลางแบบง่าย ๆ
เกณฑ์การเลือกใช้ตามสถานการณ์
- หากต้องการจัดองค์ประกอบเดี่ยวให้อยู่กึ่งกลางแนวนอนโดยไม่กระทบกับองค์ประกอบพี่น้อง ให้ใช้กลยุทธ์ Flow layout auto margin
- UI แบบลอยอย่าง modal หรือ banner ควรจัดกึ่งกลางด้วย Positioned layout และ auto margin
- ถ้าต้องการซ้อนหลายองค์ประกอบไว้ตำแหน่งเดียวกันและให้อยู่กึ่งกลาง CSS Grid เหมาะที่สุด
- หากต้องการจัดข้อความให้อยู่กึ่งกลาง ให้ใช้
text-alignและสามารถใช้ร่วมกับวิธีจัดกึ่งกลางอื่นได้ - ในสถานการณ์ส่วนใหญ่ที่เหลือ Flexbox คือทางเลือกที่อเนกประสงค์ที่สุด
- ใช้ได้ทั้งกับลูกเดี่ยวและหลายลูก
- จัดกึ่งกลางได้ทั้งแนวนอนและแนวตั้ง
- ใช้ได้ไม่ว่าลูกจะอยู่ภายในคอนเทนเนอร์พอดีหรือล้นออกมา
3 ความคิดเห็น
พอนึกดูแล้ว อยู่ ๆ ก็รู้สึกขัดตาเหมือนกันว่า GeekNews เองก็ยังไม่ได้จัดบทความให้อยู่กึ่งกลาง ฮือ 555
ผมใช้
place-items: center;บ่อยอยู่แล้ว แต่ก็มีอีกหลายวิธีเหมือนกันนะความคิดเห็นจาก Hacker News
ในเมื่อคอมเมนต์อื่น ๆ กำลังวิจารณ์ตัวคอมเมนต์กันอยู่ ขอร่วมวงด้วยแล้วกัน: ผมมองว่า มีมการจัดกึ่งกลางใน CSS ส่วนใหญ่หมายถึง “วิธีวางองค์ประกอบหนึ่งให้อยู่ตรงกลางพอดีของอีกองค์ประกอบหนึ่ง”
ในแง่การ implement จะบอกว่าการจัดกึ่งกลางยากและอาจมีได้หลายความหมายก็ถูก แต่สำหรับคนรุ่น GeoCities หรือ AngelFire มันยากจะยอมรับ เพราะแม้แต่ HTML ในยุค 90 ก็ยังใส่
helloไว้ตรงกลางพอดีของกล่องสีเหลือง 600x600 ได้โดยไม่มีปัญหาเครื่องมือใหม่ที่บอกว่าดีกว่ากลับทำงานมาตรฐานที่เคยทำได้อยู่แล้วไม่ได้ จึงน่าหงุดหงิด และนั่นทำให้หลายคนยังใช้ table layout ต่อไปจนถึงปลายยุค 2000 ผมชอบ CSS นะ แต่นี่อาจเป็นอาการ Stockholm syndrome รูปแบบหนึ่งก็ได้
แปลกใจที่
valignยังทำงานได้แม้ไม่มีใน Chromium และไม่แน่ใจว่านี่เป็นการเปลี่ยนแปลงล่าสุดหรือเปล่าhelloไว้ตรงกลางพอดีของกล่องสีเหลือง 600x600 นั้นทำได้ตั้งแต่ CSS เวอร์ชันแรกแล้ว ตัวอย่างเช่น attributevalignของ HTML สอดคล้องกับ CSS propertyvertical-alignของกล่องinline,inline-block,table-cellแต่จากประสบการณ์ คนจำนวนไม่น้อยที่พูดแบบโรแมนติกว่าใช้ table อย่างเดียวก็พอ หรือบ่นว่า CSS มีข้อจำกัดและสับสน จริง ๆ แล้วไม่ได้พยายามเรียนรู้มากนักว่า CSS ทำงานอย่างไร อย่างน้อยผู้เขียนก็ตระหนักถึงจุดนั้น
"valign"เช่นกัน แต่เวลาใช้ table โดยไม่มี fixed layout ผมเห็นความต่างเล็ก ๆ น้อย ๆ ระหว่างเบราว์เซอร์หลัก 3 ตัวมาโดยตลอด ดังนั้นโดยทั่วไปผมคงไม่พึ่งพา พฤติกรรม auto layoutเป็นบทความที่ดี และปฏิกิริยาที่นี่ค่อนข้างน่าประหลาดใจเมื่อเทียบกับกลุ่มผู้อ่านที่ในนามเป็นสายเทคนิค การจัดวางหน้าและการกำหนดรูปแบบแบบอัตโนมัติ นั้นยากจริง ๆ และถึงขั้นเป็นหัวข้อวิทยานิพนธ์ปริญญาเอกได้เลย[1]
การคาดหวังว่าจะ abstraction ความซับซ้อนนั้นให้เหลือคำง่าย ๆ อย่าง “ทำให้เป็นไปตามที่ฉันตั้งใจ” ไม่ใช่เรื่องสมจริง
ถ้าดูเว็บไซต์ของ Gwern Branwen[2] จะเห็นว่าแทบจะเป็นงานศิลปะ แต่แก่นสำคัญคือกำหนดรูปลักษณ์ที่ต้องการก่อน แล้วจำกัดงานเขียนให้สามารถแสดงออกภายในสไตล์นั้นได้
ผมติดตามเรื่องเลย์เอาต์เว็บเพจมาตั้งแต่เข้าร่วมสตาร์ตอัป “นิตยสารกอล์ฟแห่งแรกบนเว็บ”[3] ในปี 1995 และได้เข้าใจว่า web content ที่ดูดีในสภาพแวดล้อมเอาต์พุตหลากหลายนั้นยากแค่ไหนจาก Zen Garden และ mailing list/เว็บไซต์
A List Apart[4]การย้าย semantic content ไปยังหน้าจอ กระดาษ หรือระนาบจำกัด เป็น mapping หรือ projection จากพื้นที่ต้นทางไปยังชุดกฎของพื้นที่ปลายทาง และกฎเหล่านั้นรวมทั้งข้อจำกัดทางกายภาพ ข้อจำกัดของซอฟต์แวร์เบราว์เซอร์ และพฤติกรรมเฉพาะตัวของแต่ละเบราว์เซอร์
ดังนั้น CSS จึงดูเหมือนเละเทะสำหรับคนที่ “อยากสร้างเว็บเพจตั้งแต่ต้น” แต่จริง ๆ แล้วมันใกล้เคียงกับการมีทางเลือกมากเกินไป มากกว่าจะเป็นข้อจำกัดที่ขัดขวางสิ่งที่ทำได้
[1] https://scholar.google.com/scholar?hl=en&as_sdt=0%2C5&q=thes...
[2] https://gwern.net/
[3] ชื่อ Golfweb และสุดท้ายดูเหมือนจะกลายเป็นส่วนหนึ่งของ CBS Sports
[4] https://www.alistapart.com
[1] https://every-layout.dev/rudiments/boxes/
โดยเฉพาะอย่างยิ่ง มันมุ่งไปสู่โมเดลใหญ่หนึ่งเดียวที่ใช้ได้กับทุกหน้า และมีเป้าหมายแบบซิซีฟัสที่จะคำนวณ auto layout ใหม่ทุกครั้งในแต่ละหน้า พอรวมกับเป้าหมายที่จะรองรับทุกขนาดหน้าต่างด้วยแล้ว ก็ไม่เข้าใจว่าทำไมถึงคิดว่าสิ่งนี้เป็นไปได้
https://css-art.com/the-girl-with-a-p-e-a-r-l-css-earring/
ไม่รู้เหมือนกันว่ามี
divที่ถูกจัดกึ่งกลางอยู่กี่ตัวโดยเฉพาะในตารางที่มีข้อความและวัตถุขนาดต่างกันในแต่ละคอลัมน์ การตัดสินใจว่าจะย้ายองค์ประกอบไปหน้าถัดไปเมื่อไรและอย่างไร เป็นงานยากในการเลือก heuristic ที่ดี
ใน custom appkit, คอนโทรล GTK และ toolkit ที่ใช้ Lua ภายในซึ่งไม่ได้เผยแพร่ การจัดกึ่งกลาง content หรือการขึ้นบรรทัด/จัดแนวองค์ประกอบก็ไม่ใช่เรื่องใหญ่อะไร เลยสงสัยว่าในเว็บเราพลาดอะไรไปกันแน่
คำว่า “แค่มีตัวเลือกเยอะเท่านั้น” ฟังดูคล้ายกับ TMTOWTDI ที่ถูกฝังไปนานแล้วด้วย
เป็นบทความยอดเยี่ยม และองค์ประกอบแบบ interactive ก็ดีเป็นพิเศษ สิ่งที่ช่วยให้ผมเข้าใจการกำหนดตำแหน่งและการจัดกึ่งกลางใน CSS เมื่อไม่กี่ปีก่อนอย่างมาก คือการอ่านเรื่อง box model
เมื่อเข้าใจ box model แล้ว จะช่วยให้ตัดสิน flow ภายใน DOM ได้ และ CSS properties
displayกับpositionก็เป็นพื้นฐานในการเรียนรู้การกำหนดตำแหน่งเช่นกัน เอกสารของ MDN ทำไว้ดีhttps://developer.mozilla.org/en-US/docs/Learn/CSS/Building_...
https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layou...
“วิธีจัดให้อยู่กึ่งกลาง” เป็นคำถามคลาสสิกของ CSS และข้อเท็จจริงที่ว่ามันไม่ได้ชัดเจนจนเห็นได้ทันที ก็สะท้อนอะไรได้หลายอย่าง CSS แทบจะเป็น ส่วนผสมปนเปมัว ๆ และเป็นชุดรวมแบบอ่างล้างจานที่หลายคณะกรรมการออกแบบพร้อมกัน ไม่ใช่คณะกรรมการเดียว
แนวคิดเรื่องรีลีสจริง ๆ ถูกละทิ้งไปนานแล้ว และสถานะของ CSS ในปัจจุบันใกล้เคียงกับการรวบรวมสถานะของโมดูลแยก ๆ ที่เปลี่ยนแปลงอยู่ตลอดเวลา นี่ไม่ใช่วิธีพัฒนาซอฟต์แวร์ และจริง ๆ แล้วก็ไม่ใช่วิธีที่ดีในการสร้างอะไรทั้งนั้น
เว็บและเทคโนโลยีของมันโดยรวมก็ไม่ได้ชัดเจนว่าจะมุ่งหน้าไปทางไหน จึงเลี่ยงไม่ได้ที่จะเกิดการทดลองที่ล้มเหลวและความไม่สอดคล้องกันมากมาย ขอบเขตมันกว้างกว่าโครงการวิศวกรรมที่วางแผนมาอย่างดี มีเป้าหมายและเส้นทางชัดเจนมาก
สิ่งที่คนที่อยากทำหน้าเว็บให้ได้หน้าตาตามต้องการมักเรียนก่อน คือขนาดตัวอักษร สี สีพื้นหลัง และการจัดแนว และถ้าตัดเรื่องการจัดแนวออกไป อย่างอื่นก็แทบจะตรงกันแบบ 1:1 กับวิธีก่อนยุค CSS
ก่อนมี CSS ถ้าอยากวางคอนเทนต์ไว้ตรงกลาง ก็แค่ใส่ไว้ในแท็ก ไม่ว่าจะเป็นข้อความ,
div, ตาราง, ปุ่ม หรือวัตถุ HTML แบบไหนก็ไม่สำคัญ หลายคนคาดหวังว่า CSS จะทำงานเหมือนอดีต โดยไม่ต้องแยกระหว่างอ็อบเจ็กต์อินไลน์กับบล็อก แต่เมื่อ CSS ไม่ตรงกับอคติตั้งต้นนั้น คำถามแบบนี้จึงเกิดขึ้นบทความนี้ดีมากจริง ๆ โดยเฉพาะวิธีโต้ตอบที่ยอดเยี่ยมมาก ยังมีเครื่องมือหนึ่งที่ให้ผลลัพธ์ตามต้องการแทบทุกครั้งมาตั้งนานแล้วด้วย
http://howtocenterincss.com
CSS ใช้เวลาหลายสิบปีกว่าจะเสนอวิธีแก้ที่ใช้งานได้พอ ๆ กับตารางที่วางคอนเทนต์ไว้ตรงกลาง แต่ระหว่างนั้น การใช้ตารางทำเลย์เอาต์ กลับถูกตำหนิ
ตาราง HTML จำเป็นต้องมีการจัดการอย่างน้อยเช่น `` เพื่อการเข้าถึง
https://developer.mozilla.org/en-US/docs/Learn/HTML/Tables/A...
เอกสาร CSS Grid Layout ก็ควรค่าแก่การดู
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_la...
Firefox DevTools > INTRODUCTION TO CSS GRID LAYOUT: https://mozilladevelopers.github.io/playground/css-grid/
CSS Grid Garden: https://cssgridgarden.com/
MDN > "Relationship of grid layout to other layout methods": https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_la...
MDN: "Box alignment in grid layout": https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_la...
การพัฒนาเว็บมีองค์ประกอบมากกว่าตำแหน่งที่คอนเทนต์ถูกวางไว้บนหน้า และนั่นคือเหตุผลที่การพัฒนาเว็บที่ดีเป็นเรื่องยาก
divกับ CSS คือภาพลักษณ์แบบฮิปสเตอร์ ส่วนข้อเสียคือ ซุป DIVตอนนั้น CSS ไม่เหมาะกับสิ่งที่ผู้คนพยายามทำอย่างเหลือเชื่อ ผมคิดว่าเพราะมันถูกออกแบบมาสำหรับการจัดรูปแบบเอกสาร ไม่ใช่สำหรับเว็บแอปหรือเลย์เอาต์หน้าจอ
ในทางกลับกัน ข้อดีของ
tableคือมันใช้งานได้จริงเหมือนหลายคนที่นี่ ผมมองว่า CSS เป็นหายนะโดยสมบูรณ์ ปัญหาหลักคือคำสั่งสไตล์คอย เขียนทับ กันไม่หยุด หรือไม่ก็ล้มเหลวเงียบ ๆ โดยไม่มีผลอะไรเลย
ชอบที่ข้อความแจ้งคุกกี้ในตัวอย่างหนึ่งซื่อตรงอย่างโหดร้าย
“เราให้ความสำคัญกับข้อมูลส่วนบุคคลของคุณ เราใช้คุกกี้ที่ขายข้อมูลนี้ให้ผู้ลงโฆษณาเพื่อยกระดับประสบการณ์การท่องเว็บของคุณ สิ่งนี้มีคุณค่ามาก”
สิ่งที่เรียนรู้จากประวัติศาสตร์การใช้ตารางทำเลย์เอาต์นั้นน่าสนใจ ตารางมีเส้นขอบ แพดดิ้ง และเลย์เอาต์แบบอิงเซลล์ที่จัดเรียงเป็นคอลัมน์ และเมื่อขยายออกไป รอบ ๆ ตารางกับเซลล์ก็ยังต้องมีช่องว่าง นั่นคือมาร์จินด้วย
ตารางเป็นองค์ประกอบที่ตั้งหลักในงานเลย์เอาต์มานาน และจริง ๆ แล้วมันมีภูมิปัญญาว่าองค์ประกอบทุกอย่างควร ทำงานคล้ายเซลล์ตาราง ในระดับหนึ่ง
องค์ประกอบควรทำตาม box model ซึ่งสำหรับคนทำงานด้านตัวพิมพ์ถือว่าค่อนข้างชัดเจน แต่ขณะเดียวกัน ประเด็นที่ว่ามันควรถูกจัดเรียงเป็นคอลัมน์นั้นชัดเจนน้อยกว่า และกลายเป็นพื้นฐานของ Grid layout กับ Bootstrap
เมื่อเจอปัญหาเลย์เอาต์แล้วแก้ด้วยตาราง จากนั้นตระหนักว่าต้องมีฟีเจอร์ใหม่ที่มีคุณสมบัติบางส่วนของตารางแต่ไม่ใช่ทั้งหมด นั่นเป็นวิวัฒนาการที่เป็นธรรมชาติ
CSS ค้นพบเรื่องนี้แล้ว แต่ก็น่าแปลกที่บางระบบอย่างโปรแกรมประมวลผลคำกลับไม่สามารถรวมองค์ประกอบต่าง ๆ ไว้ใต้ box model ได้
ข้อบ่นว่า “ทำไมถึงยังยากขนาดนี้อยู่” ดูจะค่อนข้างคลาดเคลื่อน อย่างที่บทความบอกไว้ Flexbox แก้กรณีการจัดกึ่งกลางแบบง่าย ๆ ทุกแบบได้อย่างเป็นธรรมชาติ
ถ้า Flexbox แก้ไม่ได้ นั่นก็ไม่ใช่แค่การจัดกึ่งกลางธรรมดา แต่เป็นการทำสิ่งที่ซับซ้อนกว่า และการคาดหวังให้การทำงานนั้นเรียบง่ายมาก ๆ ก็ไม่เหมาะสม
ตอนนี้กลับมีวิธีมากเกินไปจนความซับซ้อนท่วมท้น หลายครั้งต้องแก้โค้ดเก่ามากกว่าสร้างใหม่ ต้องพิจารณาว่าทำไม CSS ถึงถูกเขียนด้วยวิธีนั้น edge case ไหนจะพัง แก้ได้หรือไม่ และเมื่อไม่ใช่เรื่องง่ายควรเลือกทางออกใดจากหลายวิธี
แค่กวาดตาดูบทความก็ยังไม่ค่อยเป็นธรรมชาติ แม้ใน Flexbox การตั้งค่าแนวนอนคือ
justify-contentส่วนแนวตั้งคือalign-itemsแต่ชื่อพร็อพเพอร์ตีของ CSS มีมากเกินไปและดูตั้งขึ้นเองจนจำไม่ค่อยได้แล้วสุดท้ายความต่างคือ เราสร้างทางออกที่ซับซ้อนจาก building block ที่เรียบง่าย เป็นธรรมชาติ และเชื่อถือได้ หรือสร้างทางออกที่ซับซ้อนจาก building block ที่ซับซ้อน ซึ่งทับซ้อนกันบางส่วนและต้องค้นหาอยู่เรื่อย ๆ
Go หรือ Python ใกล้เคียงแบบแรก ส่วน CSS ใกล้เคียงแบบหลัง
มีเหตุผลที่ผู้คนชอบระบบกริดของ Bootstrap และ Flexbox ก็ทำทั้งหมดนั้นและมากกว่านั้นได้ทันทีในเบราว์เซอร์ แทบจะพูดเกินจริงได้ยากว่าผมชอบมันแค่ไหน
divให้อยู่กึ่งกลางใน CSS เป็นอะไรที่อยู่กึ่งกลางระหว่างเล่นแร่แปรธาตุกับวิทยาศาสตร์จรวดมันเผยให้เห็นว่าพวกเขาไม่ได้ตามความเปลี่ยนแปลงของ CSS เท่ากับส่วนอื่น ๆ ของการพัฒนาเว็บ แต่ก็ยังพูดฟันธงแบบนั้นได้อย่างสบายใจ
ไล่จากด้านนอกเข้าไปด้านใน จากองค์ประกอบแม่ไปสู่องค์ประกอบลูก จะทำให้ง่ายขึ้นมาก ถึงจะต้องใช้ทักษะอยู่บ้าง แต่โดยพื้นฐานแล้วมันใกล้เคียงกับ พีชคณิตแบบยืดหยุ่น