Contents

CSS Grid หรือ Flexbox: ไหนดีกว่าสำหรับการสร้างคอลัมน์?

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

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

พฤติกรรมที่แตกต่างของ CSS Flexbox และ Grid

กระบวนการข้างต้นสามารถถ่ายทอดได้อย่างมีประสิทธิภาพโดยการสร้างไฟล์ index.html ภายในไดเร็กทอรีที่เลือกและรวมข้อมูลโค้ดที่ตามมาไว้ในนั้น:

 <!DOCTYPE html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="style.css">
  </head>

  <body>
    <h1>Flexbox vs Grid</h1>
    <h2>Flexbox:</h2>

    <div class="flex-container">
      <div>Lorem.</div>
      <div>Lorem ipsum dolor sit amet.</div>
      <div>Lorem ipsum dolor sit amet consectetur.</div>
      <div>Lorem ipsum dolor sit.</div>
      <div>Lorem ipsum dolor sit amet consectetur adipisicing elit.</div>
      <div>Lorem ipsum dolor sit amet.</div>
      <div>Lorem ipsum dolor sit amet consectetur.</div>
      <div>Lorem ipsum dolor sit.</div>
    </div>

    <h2>Grid:</h2>

    <div class="grid-container">
      <div>Lorem.</div>
      <div>Lorem ipsum dolor sit amet.</div>
      <div>Lorem ipsum dolor sit amet consectetur.</div>
      <div>Lorem ipsum dolor sit.</div>
      <div>Lorem ipsum dolor sit amet consectetur adipisicing elit.</div>
      <div>Lorem ipsum dolor sit amet.</div>
      <div>Lorem ipsum dolor sit amet consectetur.</div>
      <div>Lorem ipsum dolor sit.</div>
    </div>
  </body>
</html>

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

คุณอาจสังเกตเห็นว่า HTML รวมเอาเอกสารข้อความที่มีสไตล์เรียกว่า"style.css"สร้างไฟล์นี้โดยเฉพาะภายในไดเร็กทอรีเดียวกับ"index.html"และแทรกการออกแบบที่ตามมาภายใน:

 body {
  padding: 30px;
}

h1 {
  color: #A52A2A;
}

h2 {
  font-size: large;
}

div:not([class]) {
  outline: 2px solid black;
  padding: 0.5em;
}

หน้าของคุณควรมีลักษณะดังนี้:

/th/images/screenshot-of-flex-and-grid-items.jpg

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

 .flex-container {
  display: flex;
}

นี่คือผลลัพธ์:

/th/images/screenshot-of-flex-display.jpg

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

หากต้องการบรรเทาปัญหาที่อาจเกิดขึ้นกับคอลัมน์ที่ล้นภายในคอนเทนเนอร์ที่ยืดหยุ่น ขอแนะนำให้ใช้คุณสมบัติ flex-wrap

 .flex-container {
  display: flex;
  flex-wrap: wrap;
}

คุณสมบัติ CSS flexbox ใหม่ช่วยให้สามารถใช้พื้นที่ได้อย่างมีประสิทธิภาพมากขึ้น โดยอนุญาตให้องค์ประกอบลูกไหลไปยังหลายบรรทัดเมื่อจำเป็น แทนที่จะทำให้ล้นหรือตัดทอนเหมือนในเวอร์ชันก่อนหน้า ความสำเร็จนี้เกิดขึ้นได้จากการนำคอนเทนเนอร์แบบยืดหยุ่นมาใช้โดยมีพื้นที่ว่างว่างที่คำนวณตามขนาดของคอนเทนเนอร์ ซึ่งสามารถแจกจ่ายให้กับคอนเทนเนอร์ย่อยตามขนาดและลำดับความสำคัญที่กำหนดโดยใช้’flex-grow’,‘flex-shrink’และคุณสมบัติ’พื้นฐานแบบยืดหยุ่น’ด้วยการอนุญาตให้องค์ประกอบย่อยเหล่านี้ล้อมรอบและดำเนินการต่อในบรรทัดถัดไปเมื่อพื้นที่ว่างไม่เพียงพอสำหรับองค์ประกอบทั้งหมดที่จะปรากฏในแถวเดียว คุณลักษณะนี้จะช่วยปรับเค้าโครงให้เหมาะสมและหลีกเลี่ยงปัญหาการออกแบบที่อาจเกิดขึ้นจากข้อจำกัดด้านความกว้างคงที่

เพื่อให้ได้เค้าโครงตามตารางสำหรับองค์ประกอบ ตัวที่สอง เราสามารถใช้กฎ CSS ต่อไปนี้:css.grid {display: grid;grid-template-columns: Repeat(auto-fill, minmax(200px, 1fr)); grid-gap: 5px;} จอแสดงผล : grid; กฎ ใช้โมเดลโครงร่าง"กริด"กับคลาส .grid ซึ่งช่วยให้เราสามารถกำหนดแถวและคอลัมน์ภายในคลาสนั้นได้ คุณสมบัติ grid-template-columns ระบุว่าเราต้องการสร้างตารางที่เติมอัตโนมัติโดยมีความกว้างขั้นต่ำ 200 พิกเซลและความกว้างสูงสุด 1 ส่วน (หมายความว่าแต่ละคอลัมน์จะใช้พื้นที่มากเท่าที่จำเป็น) ในที่สุดคุณสมบัติ grid-gap

 .grid-container {
  display: grid;
}

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

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

 .grid-container {
  display: grid;
  grid-auto-flow: column;
}

นี่คือผลลัพธ์:

/th/images/screenshot-of-flex-and-grid-display.jpg

หากต้องการกำหนดจำนวนคอลัมน์ต่อแถวที่ต้องการอย่างแม่นยำภายในเค้าโครงตาราง ให้ใช้คุณสมบัติ"grid-template-columns"ใน CSS

 .grid-container {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
}

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

 .grid-container {
  display: grid;
  grid-template-columns: repeat(auto-fit, min-max(300px, 1fr));
}

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

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

/th/images/screenshot-of-nowrap.jpg

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

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

โดยพื้นฐานแล้ว CSS Grid มอบแนวทางในการออกแบบเลย์เอาต์ที่เป็นระเบียบมากกว่าเมื่อเทียบกับ flexbox ซึ่งให้ความสามารถในการปรับตัวและการตอบสนองที่มากกว่าในการสร้างอินเทอร์เฟซผู้ใช้แบบไดนามิก ชื่อเล่นของระบบเค้าโครงที่โดดเด่นทั้งสองนี้ไม่เหมาะสมไปกว่านี้อีกแล้ว

เมื่อใดจึงควรใช้ Flexbox

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

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

 <h1>Flexbox vs. Grid</h1>

<header class="flex">
  <h2>Flexbox</h2>

  <nav>
    <ul class="nav-list">
      <li><a href="">Home</a></li>
      <li><a href="">About Us</a></li>
      <li><a href="">Service Information Goes Here</a></li>
      <li><a href="">Blog Contact</a></li>
      <li><a href=""></a></li>
    </ul>
  </nav>
</header>

<header class="grid">
  <h2>Grid</h2>

  <nav>
    <ul class="nav-list">
      <li><a href="">Home</a></li>
      <li><a href="">About Us</a></li>
      <li><a href="">Service Information Goes Here</a></li>
      <li><a href="">Blog Contact</a></li>
      <li><a href=""></a></li>
    </ul>
  </nav>
</header>

แก้ไขเนื้อหาภายในสไตล์ชีตแบบเรียงซ้อนโดยใช้ข้อมูลโค้ดที่ให้มาแทนมาร์กอัปที่มีอยู่

 .nav-list {
  list-style: none;
  margin: 0;
  padding: 0;
}

header {
  --border-width: 5px;
  border: var(--border-width) solid black;
  margin-bottom: 30px;
}

header > *:first-child {
  border: var(--border-width) solid #FFC0CB;
  margin: 0;
}

li {
  border: var(--border-width) solid #90EE90;
}

นี่คือผลลัพธ์:

/th/images/screenshot-of-flex-and-grid.jpg

หากต้องการสร้างการนำทางที่ยืดหยุ่นโดยรายการเมนูแรกจะซ้อนกันในแนวตั้งบนหน้าจอขนาดเล็กและแสดงเป็นสองคอลัมน์ที่มีความกว้างเท่ากันบนหน้าจอขนาดใหญ่โดยใช้ CSS Grid ให้เพิ่มโค้ดต่อไปนี้ในสไตล์ชีทของคุณ:css/* Small screens/@media (max-width): 768px) {.container {display: flex;justify-content: space-between;}}/หน้าจอที่ใหญ่ขึ้น */@media (ความกว้างขั้นต่ำ: 769px) {.container {display: grid;grid-template-columns: ทำซ้ำ (2, auto);gap: 10px;}}และสำหรับรายการเมนูที่สองในรูปแบบรายการ คุณสามารถใช้แบบเดียวกันได้

 .flex .nav-list {
  display: flex;
  gap: 1em;
  flex-wrap: wrap;
}

.grid .nav-list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}

กำหนดประสิทธิภาพของแต่ละแนวทางโดยการเปรียบเทียบผลลัพธ์:

/th/images/screenshot-of-output.jpg

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

เมื่อใดจึงควรใช้ CSS Grid

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

แทนที่มาร์กอัปภายในแท็ก ด้วยข้อมูลโค้ดที่ให้มา ซึ่งมีชุดคำแนะนำสำหรับการสร้างและจัดรูปแบบหน้าเว็บโดยใช้ HTML และ CSS

 <h1>Flexbox vs. Grids</h1>

<section class="cards">
  <h2>Some cards</h2>

  <div class="columns">
    <article class="card">
      <h3 class="card__title">Fun Stuff</h3>
      <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit.</p>

      <ul>
        <li>Lorem</li>
        <li>Ipsum</li>
        <li>Excavate</li>
      </ul>
    </article>

    <article class="card">
      <h3 class="card__title">Fun Stuff</h3>
      <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>

      <ul>
        <li>Lorem</li>
        <li>Ipsum</li>
        <li>Excavate</li>
      </ul>
    </article>

    <article class="card">
      <h3 class="card__title">A Longer Title Than Others</h3>

      <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Facere
         excepturi sit ea dolores totam veniam qui voluptates commodi,
         perferendis et!</p>

      <ul>
        <li>Lorem</li>
        <li>Ipsum</li>
        <li>Excavate</li>
      </ul>
    </article>
  </div>
</section>

เพิ่ม CSS นี้:

 .columns {
  display: flex;
  gap: 1em;
}

article {
  background-color: #90EE90;
  color: black;
  padding: 15px;
}

ul {
  background-color: white;
  padding: 2px;
  list-style: none;
}

การสาธิตครั้งแรกใช้เค้าโครง Flexbox สำหรับการเปรียบเทียบด้วยภาพกับเค้าโครงตาราง ผลลัพธ์ที่แสดงจะเป็นดังนี้:

/th/images/screenshot-of-flex-not-grid.jpg

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

 .columns > * {
  flex: 1;
}

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

 .columns {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 1em;
}

นี่คือผลลัพธ์:

/th/images/screenshot-of-grid-better-than-flex.jpg

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

ดังนั้นเมื่อใดที่คุณควรใช้ Grid หรือ Flexbox

เวอร์ชันภาษาอังกฤษขั้นสูง: เลย์เอาต์ตารางมีโครงสร้างที่มีการจัดระเบียบอย่างดีสำหรับองค์ประกอบหลัก โดยให้ความกว้างของคอลัมน์สม่ำเสมอและสม่ำเสมอในขนาดเนื้อหาต่างๆ

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