Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> CSS

วิธีจัดองค์ประกอบให้อยู่ตรงกลางด้วย CSS

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

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

การจัดกึ่งกลางข้อความในแนวนอนจะตรงไปตรงมา เราใช้ text-align ให้มีค่า center .

h1 {
  text-align: center;
}

ข้อมูลข้างต้นใช้ได้กับ ข้อความ . ใดๆ ธาตุ

องค์ประกอบบล็อกตรงกลาง (ไม่ใช่ข้อความ) ในแนวนอน

หากต้องการจัดองค์ประกอบที่ไม่ใช่ข้อความในแนวนอน เราสามารถใช้ margin คุณสมบัติและให้ค่า auto . ด้านซ้ายและขวา . เรายังต้องระบุค่าความกว้างขององค์ประกอบ:

.center-horizontal {
  margin-left: auto;
  margin-right: auto;
  width: 100px; /* or max-content;*/
}

หมายเหตุ:หากคุณไม่ต้องการระบุค่าความกว้างคงที่เฉพาะให้กับองค์ประกอบที่อยู่ตรงกลาง คุณสามารถใช้ width: max-content — จากนั้นองค์ประกอบของคุณจะขยายไปถึงความกว้างของเนื้อหา

บล็อกเทียบกับองค์ประกอบบล็อกแบบอินไลน์

.center-horizontal คลาสด้านบนจะจัดองค์ประกอบบล็อกให้อยู่ตรงกลาง แต่ไม่ใช่ อินไลน์ องค์ประกอบ ใน HTML องค์ประกอบบางอย่างเป็นองค์ประกอบแบบอินไลน์โดยค่าเริ่มต้น <button> องค์ประกอบเช่นมี display: inline-block . เริ่มต้น สไตล์. แต่คุณสามารถสร้างองค์ประกอบบล็อกได้ง่ายๆ เพียงเพิ่ม display: block ไปยังคลาส CSS ของคุณ:

.center-horizontal {
  display: block;
  margin-left: auto;
  margin-right: auto;
  width: 100px; /* or max-content;*/
}

ตอนนี้มันจะใช้ได้กับทุกองค์ประกอบ

จัดกึ่งกลางในแนวนอนด้วย Flexbox

ด้วยคุณสมบัติ flexbox ที่ทันสมัยซึ่งจัดกึ่งกลางในแนวนอนจึงเป็นเรื่องง่าย แทนที่ .center-horizontal ปัจจุบันของคุณ คลาสนี้:

.center-horizontal {
  display: flex;
  justify-content: center;
}

อย่างที่คุณเห็น <div> . ของคุณ องค์ประกอบอยู่ตรงกลาง

แต่ด้วยเหตุผลบางอย่าง องค์ประกอบปุ่มของคุณไม่ทำ ให้อะไร

ก็ <button> องค์ประกอบเป็นองค์ประกอบพิเศษที่แตกต่างจาก <div> องค์ประกอบไม่สามารถเป็นสิ่งที่เรียกว่า flex-container

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

<div class="center-horizontal">
  <button>Center me</button>
</div>

ตอนนี้ใช้งานได้แล้ว! ฉันเพิ่งลบคลาสกลางออกจากองค์ประกอบปุ่มและใช้มันในพาเรนต์ตัด <div> ภาชนะ

เคล็ดลับ:<img> องค์ประกอบไม่สามารถเป็นคอนเทนเนอร์แบบยืดหยุ่นได้ แต่สามารถเป็นรายการแบบยืดหยุ่นได้เช่นเดียวกับปุ่ม

-

จัดองค์ประกอบในแนวตั้ง

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

คุณอาจคิดว่าคุณสามารถใช้บางอย่างเช่น margin-top และ margin-bottom auto — แต่ไม่นะ

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

<section class="section">
  <div class="center-vertical">Center me vertically</div>
</section>

เพิ่ม CSS นี้สำหรับคลาสส่วนของคุณ (พาเรนต์):

.section {
  height: 200px;
  border: 1px solid black;
}

เส้นขอบเป็นเพียงเพื่อให้มองเห็นได้ง่ายขึ้นว่าเกิดอะไรขึ้น

เพิ่ม CSS นี้สำหรับองค์ประกอบลูกของคุณ:

.center-vertical {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

เสร็จแล้ว!

จัดกึ่งกลางแนวตั้งด้วย flexbox

หากต้องการจัดองค์ประกอบในแนวตั้งด้วย flexbox เราจำเป็นต้องมีคอนเทนเนอร์ flex parent คุณสามารถลบ center-vertical คลาสจากองค์ประกอบลูกของคุณจากตัวอย่างก่อนหน้า เพิ่มคุณสมบัติ flexbox ทั้งสองนี้ใน .section . ของคุณ คลาสเช่นนี้:

.section {
  height: 200px;
  border: 1px solid black;
  display: flex;
  align-items: center;
}

และตอนนี้องค์ประกอบย่อยของคุณมีศูนย์กลางในแนวตั้งด้วย flexbox

องค์ประกอบกึ่งกลางทั้งในแนวตั้งและแนวนอน

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

ขั้นแรกให้เพิ่มมาร์กอัปนี้:

<section class="section">
  <div class="center-vertical-and-horizontal">
    Center me vertically & horizontally
  </div>
</section>

และ CSS

.section {
  height: 200px;
  border: 1px solid black;
}

.center-vertical-and-horizontal {
  position: relative;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: max-content;
}

อย่างที่คุณเห็น มันคล้ายกับตัวอย่าง "องค์ประกอบตรงกลางแนวตั้ง" (ไม่มี flexbox) เมื่อก่อนมาก เราเพิ่งเพิ่ม left: 50% ประกาศ และสำหรับการ transform คุณสมบัติ เราระบุทั้งแกน X และ Y ในการประกาศครั้งเดียว:(-50%, -50%) . ค่าแรกคือ X ค่าที่สองคือ Y

จัดกึ่งกลางแนวตั้งและแนวนอนด้วย flexbox

สุดท้าย ลองทำแบบเดียวกันโดยใช้ flexbox คุณสามารถลบ center-vertical-and-horizontal คลาสจากองค์ประกอบลูกของคุณ ตอนนี้สำหรับ .section . ของคุณ คลาสใช้ CSS ต่อไปนี้:

.section {
  height: 200px;
  border: 1px solid black;
  display: flex;
  align-items: center;
  justify-content: center;
}

ความแตกต่างเพียงอย่างเดียวระหว่างสิ่งนี้กับตัวอย่างแนวตั้งตรงกลางจากก่อนหน้านี้คือ justify-content: center ประกาศ ซึ่งจัดการงานจัดกึ่งกลางแนวนอน

จัดกึ่งกลางในแนวนอน &แนวตั้งด้วย CSS Grid

สำหรับการวัดผลที่ดี เรามาดูกันว่าคุณสมบัติกริด CSS ที่ทันสมัยและทันสมัยจัดการกับการจัดกึ่งกลางแนวตั้งและแนวนอนได้อย่างไร แทนที่ .section . ของคุณ คลาสนี้:

.section {
  height: 200px;
  border: 1px solid black;
  display: grid;
  place-items: center;
}

เพียงสองคุณสมบัติ (display: grid &place-items:center ) ทำงานกับกริด CSS สะดวกมาก!

น่าเสียดายที่ CSS grid นั้นเข้ากันไม่ได้ในเบราว์เซอร์รุ่นใหม่ทั้งหมด และมันยังใช้งานไม่ได้ 100% ใน CMS/framework ยอดนิยมหลายๆ ตัว เช่น WordPress

ดูสถานะความเข้ากันได้ในปัจจุบันของกริด CSS ที่นี่