คู่มือปฏิบัติสำหรับการจัดตำแหน่งศูนย์กลางใน CSS

เผยแพร่แล้ว: 2022-04-18
สรุป » กำลังมองหาวิธีแก้ปัญหาด่วนเพื่อจัดกึ่งกลางข้อความหรือองค์ประกอบ div ใน CSS หรือไม่ บทความนี้เหมาะสำหรับคุณ เราจะเน้นที่กรณีการใช้งานเฉพาะ เช่น การจัดกึ่งกลางแนวตั้งและแนวนอน ตลอดจนวิธีการจัดวางสิ่งต่างๆ ให้อยู่ตรงกลางเมื่อคุณไม่ได้ใช้ Flexbox หรือ Grid อย่าลังเลที่จะคั่นหน้านี้เพื่อใช้อ้างอิงในอนาคต!

สารบัญ
  • องค์ประกอบแบบอินไลน์และบล็อก: text-align
    • องค์ประกอบบล็อกตรงกลางที่มีความกว้างคงที่
    • การจัดองค์ประกอบอินไลน์ที่มีความกว้างคงที่
  • Grid & Flexbox: วิถีสมัยใหม่
    • แนวตั้ง & แนวนอน: โซลูชันสากล
  • การจัดกึ่งกลางแบบสัมบูรณ์: แปลง

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

ฉันแน่ใจว่าปัญหาของการจัดกึ่งกลางของสิ่งต่างๆ โดยใช้ CSS ไม่ได้เกี่ยวกับการจดจำ justify-content: center; คุณสมบัติ. โครงสร้างเลย์เอาต์ที่แตกต่างกันมีกฎเกณฑ์ของตัวเองมากกว่า และอาจไม่ เคารพ แนวทางบางอย่าง

แต่ก่อนอื่น คู่มือนี้สร้างขึ้นเพื่อใคร:

  • นักพัฒนา Front-end ที่รู้สึกว่าถูกครอบงำด้วย "กฎและข้อบังคับ" ของ CSS
  • ใครก็ตามที่พบว่ามันยากที่จะทำให้ div เป็นศูนย์กลางในครั้งเดียวและสำหรับทั้งหมด อ๊าาาา!!
  • เจ้าของเว็บไซต์ที่ติดอยู่กับเทมเพลต/ธีมที่มีโครงสร้างไม่ดี

ใน CSS การจัดกึ่งกลางมักเรียกว่าแนวตั้ง แนวนอน หรือแนวตั้งและแนวนอน

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

องค์ประกอบแบบอินไลน์และบล็อก: text-align

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

CSS & HTML

 <style> .text-align-container { display: flex; } .text-align-container-style .item { background: #fff2ea; padding: 20px 0; text-align: center; width: 100%; } </style> <div class="text-align-container text-align-container-style"> <div class="item">Hi, I am centered.</div> </div>
สวัสดี ฉันเป็นศูนย์

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

Stack Diary - Helpful Advice for Web Developers

และทำงานได้ดีกับรายการด้วย:

  • ฉันเป็นรายการ #1
  • และนี่คือรายการ #2

    มาดูกันว่าจะเกิดอะไรขึ้นหากเราพยายามจัดองค์ประกอบ <span> ให้อยู่ตรงกลางโดยไม่ต้องใส่ไว้ในบล็อกคอนเทนเนอร์ก่อน

    CSS & HTML

     .span-demo-container { background: #fff2ea; padding: 20px 0; width: 100%; } .span-demo-center { text-align: center; } <div class="span-demo-container"> <span class="span-demo-center">Am I in the center?</span> </div>

    และผลลัพธ์ก็คือ:

    ฉันอยู่ตรงกลางหรือเปล่า

    เหตุผลที่องค์ประกอบ <span> นี้ไม่อยู่ตรงกลางเพราะเป็นองค์ประกอบแบบอินไลน์ สำหรับองค์ประกอบแบบอินไลน์ คุณต้องการตั้งค่า พา เรนต์เสมอ

    ดังนั้น หากเราย้อนกลับไปใช้คลาส span-demo-center และนำไปใช้กับ <div> ผลลัพธ์จะเป็นดังนี้:

    ตอนนี้ฉันอยู่ตรงกลาง

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

    องค์ประกอบบล็อกตรงกลางที่มีความกว้างคงที่

    อีกวิธียอดนิยมสำหรับการจัดองค์ประกอบให้อยู่ตรงกลางคือการใช้ margin: auto; ซึ่งใช้กันมากที่สุดสำหรับองค์ประกอบบล็อกที่มีความกว้างคงที่

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

    ระยะขอบอัตโนมัติจัดกึ่งกลางใน CSS

    มาดูตัวอย่างการใช้งานจริงกัน:

    CSS & HTML

     .margin-auto-container { background: #fff2ea; padding:1rem; } .margin-auto-inner { width: 200px; padding: 1rem; background: #efba93; color: #fff; margin: 0 auto; text-align: center; } <div class="margin-auto-container"> <div class="margin-auto-inner">Div & Text centered.</div> </div>
    Div & Text อยู่ตรงกลาง

    ในตัวอย่างนี้ คลาส margin-auto-container นำคอนเทนเนอร์มาจากโพสต์ในบล็อกนี้ จากนั้นเราจะสร้างคลาสใหม่ที่เรียกว่า margin-auto-inner และใช้ความกว้างคงที่กับคลาสนั้นด้วยการกำหนดสไตล์ที่กำหนดเอง สุดท้าย เราใช้มาร์ margin: 0 auto; เพื่อให้แน่ใจว่าคอนเทนเนอร์ภายในของเราจะยังคงอยู่ตรงกลางเมื่อเทียบกับคอนเทนเนอร์หลัก

     ทำไม 0? เราเพิ่ม 0 เนื่องจากเราต้องการปล่อยให้ระยะขอบแนวตั้ง (บนและล่าง) เหมือนเดิม และใช้ระยะขอบอัตโนมัติกับมุมมองแนวนอน (ขวา & ซ้าย) คุณสามารถเปลี่ยนค่านี้เพื่อระบุระยะขอบแต่ละรายการได้ เช่น "ระยะขอบ: 25px อัตโนมัติ 50px;" ซึ่งจะเหลือระยะขอบ 25px ไว้ด้านบน และระยะขอบ 50px ที่ด้านล่าง
    
    สำคัญ: เหตุผลที่มาร์จิ้นของคุณ: อัตโนมัติ; ไม่ได้อยู่ตรงกลางเป็นเพราะคุณไม่ได้กำหนดความกว้างคงที่ให้กับองค์ประกอบที่คุณกำลังพยายามจัดกึ่งกลาง

    นอกจากนี้เรายังระบุ text-align: center; เนื่องจากจะเป็นการจัดกึ่งกลางข้อความ ภายใน คอนเทนเนอร์ภายใน

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

    ในกรณีขององค์ประกอบแบบอินไลน์ ความกว้างของชุดแบบกำหนดเองจะถูกละเว้น

    ลองดูการสาธิต:

    CSS & HTML

     .margin-auto-container { background: #fff2ea; padding:1rem; } .margin-auto-inner-span { width: 150px; padding: 5px; background: #efba93; color: #fff; margin: 0 auto; text-align: center; } <div class="margin-auto-container"> <span class="margin-auto-inner-span">Inline <span> element with custom width. (Not centered).</span> </div>

    และผลลัพธ์ก็คือ:

    องค์ประกอบแบบอินไลน์ที่มีความกว้างแบบกำหนดเอง (ไม่ตรงกลาง)

    อย่างที่คุณเห็น แม้จะตั้งค่า margin: auto; องค์ประกอบอินไลน์ช่วงไม่ได้อยู่ตรงกลาง

    โชคดีที่มีวิธีแก้ไขที่ง่ายสำหรับสิ่งนี้ โดยการเพิ่ม display: block; คุณสมบัติของคลาส margin-auto-inner-span ของเรา - เราสามารถบอกเบราว์เซอร์ว่าเราต้องการให้องค์ประกอบเฉพาะนั้นถูกมองว่าเป็น บล็อก และตอนนี้ควรอยู่กึ่งกลาง:

    องค์ประกอบแบบอินไลน์ที่มีความกว้างแบบกำหนดเอง (ศูนย์กลาง)

    ณ จุดนี้ คุณอาจสงสัยว่าองค์ประกอบ HTML ใดที่ถือว่าเป็น Blocks และ Inline เข้าใจได้ ฉันแนะนำให้ดูการอ้างอิง MDN:

    • องค์ประกอบระดับบล็อก
    • องค์ประกอบแบบอินไลน์

    หากคุณทราบความแตกต่างระหว่าง Inline และ Block การค้นหาโซลูชันการจัดกึ่งกลางที่เหมาะสมกับปัญหาของคุณนั้นง่ายกว่ามาก

    Grid & Flexbox: วิถีสมัยใหม่

    Grid และ Flexbox เป็นโมดูลเลย์เอาต์สองโมดูลที่ใช้ในการออกแบบเว็บสมัยใหม่ ในขณะที่ Flexbox เป็นระบบเลย์เอาต์แบบหนึ่งมิติ Grid นั้นใช้วิธีการแบบสองมิติ

    และการจัดกึ่งกลาง div สำหรับเลย์เอาต์ทั้งสองสามารถทำได้ด้วยโค้ดเพียงสองบรรทัด

    แนวตั้ง & แนวนอน: โซลูชันสากล

    สำหรับทั้งเค้าโครง Grid & Flexbox คุณสามารถใช้ place-content: center; คุณสมบัติ.

    CSS & HTML

     .center-div-grid-layout { display: grid; /* display: flex; */ place-content: center; } <div class="center-div-grid-layout">It's that easy.</div>
    มันง่ายมาก

    คุณสมบัติ place-content เป็นชวเลขสำหรับ align-content & justify-content

    ด้วย place-content คุณสามารถทำรูปแบบตำแหน่งได้หลากหลาย ขึ้นอยู่กับรูปแบบของเค้าโครงที่คุณใช้งานอยู่:

    ไวยากรณ์เนื้อหาสถานที่

    สำหรับการอ้างอิงทั้งหมด โปรดดูที่หน้า MDN นี้

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

    การจัดกึ่งกลางแบบสัมบูรณ์: แปลง

    คุณสมบัติการ transform จะใช้เมื่อคุณต้องการให้บางสิ่งอยู่กึ่งกลาง "ตายอยู่ตรงกลาง" - แนวนอน & แนวตั้ง (ซ้าย, ขวา, บน, ล่าง)

    CSS & HTML

     .transform-example-container { height: 150px; position: relative; background: #fff2ea; } .transform-example-container .transform-absolute { width: 300px; text-align: center; background: #efba93; color: #fff; top: 50%; left: 50%; transform: translateY(-50%) translateX(-50%); margin: 0; padding: 10px 0; position: absolute; } <div class="transform-example-container"> <p class="transform-absolute">Example: CSS transform</p> </div>

    ตัวอย่าง: CSS transform

    การทำงานนี้โดยการตั้งค่า ตำแหน่ง เป็น สัมบูรณ์ สำหรับองค์ประกอบย่อยที่คุณต้องการจัดกึ่งกลาง

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

    เราใช้ top และ left เพื่อกำหนดตำแหน่งสัมพันธ์กับมุมบนซ้าย หลังจากนั้นสามารถดึงองค์ประกอบเข้ามาตรงกลางโดยใช้ translate()

    ระยะขอบ และ ช่องว่าง ภายในควรตั้งค่าเป็น 0 ไม่เช่นนั้น คุณจะพบกับการเปลี่ยนตำแหน่ง


    และนั่นเป็นการสรุปบทแนะนำ/ข้อมูลอ้างอิงของเรา หากคุณต้องการควบคุมศูนย์กลางด้วย CSS – เปิดโปรแกรมแก้ไขโค้ดที่คุณชื่นชอบ และเริ่มนำตัวอย่างเหล่านี้ไปทดสอบ