Flexbox คืออะไร? คำอธิบายคุณสมบัติ CSS ทั้งหมด หลักการพื้นฐาน ข้อดีและข้อเสีย Flexbox ตัวอย่างที่เป็นประโยชน์ในการทำงานกับลิงก์ที่มีประโยชน์บน Flex
Flexboxes เหมาะสำหรับการสร้างเค้าโครงเว็บไซต์ที่ใช้กันทั่วไป เช่น เค้าโครงสามคอลัมน์ที่เรียกว่า "จอกศักดิ์สิทธิ์" ซึ่งคอลัมน์ทั้งหมดจะต้องมีความสูงเต็มโดยไม่คำนึงถึงเนื้อหา ในเวลาเดียวกัน ในซอร์สโค้ดเนื้อหาหลักจะอยู่ก่อนการนำทาง และบนหน้านั้นเอง เนื้อหาหลักจะอยู่หลังการนำทาง
แบบนี้.
ก่อน Flexbox เลย์เอาต์นี้ทำได้ค่อนข้างยากโดยไม่ต้องใช้แฮ็ก นักพัฒนามักต้องทำสิ่งต่างๆ เช่น เพิ่มมาร์กอัปพิเศษ ใช้ระยะขอบติดลบ และเทคนิคอื่นๆ เพื่อให้แน่ใจว่าทุกอย่างจะเรียงกันอย่างถูกต้องโดยไม่คำนึงถึงปริมาณเนื้อหาหรือขนาดหน้าจอ แต่ดังตัวอย่างข้างต้น ทุกอย่างจะง่ายขึ้นมากบน Flexbox
นี่คือบทสรุปของรหัส ในตัวอย่างนี้ เราสร้างองค์ประกอบ #main ให้เป็นคอนเทนเนอร์แบบยืดหยุ่น และปล่อยให้ส่วนหัวและส่วนท้ายเป็นองค์ประกอบบล็อก กล่าวอีกนัยหนึ่ง เฉพาะส่วนตรงกลางเท่านั้นที่จะกลายเป็น flexbox นี่คือตัวอย่างที่ทำให้เป็นคอนเทนเนอร์แบบยืดหยุ่น
#main ( จอแสดงผล: ดิ้น; ความสูงขั้นต่ำ: คำนวณ (100vh - 40vh); )
เพียงใช้ display: flex เพื่อสร้างคอนเทนเนอร์แบบยืดหยุ่น โปรดทราบว่าเรายังตั้งค่าความสูงขั้นต่ำโดยใช้ฟังก์ชัน calc() และตั้งค่า #main เป็น 100% ของความสูงของวิวพอร์ต ลบความสูงของส่วนหัวและฐาน (อย่างละ 20vh) เพื่อให้แน่ใจว่าเลย์เอาต์จะเต็มความสูงทั้งหมดของหน้าจอ แม้ว่าจะมีเนื้อหาเพียงเล็กน้อยก็ตาม ด้วยเหตุนี้ ส่วนท้ายจะไม่เพิ่มขึ้นและเหลือพื้นที่ว่างด้านล่างหากเนื้อหาใช้พื้นที่น้อยกว่าความสูงของหน้าจอ
การคำนวณความสูงขั้นต่ำนั้นค่อนข้างง่าย เนื่องจากเราใช้ box-sizing: border-box กับองค์ประกอบทั้งหมด หากเราไม่ทำเช่นนี้เราจะต้องเพิ่ม ค่าช่องว่างภายในถึงจำนวนเงินที่จะหักออก
หลังจากติดตั้งคอนเทนเนอร์ดิ้น เราจะจัดการกับองค์ประกอบดิ้น
#main > บทความ ( flex: 1; ) #main > nav, #main > กัน ( flex: 0 0 20vw; พื้นหลัง: beige; ) #main > nav ( ลำดับ: -1; )
คุณสมบัติดิ้นเป็นการจดชวเลขสำหรับคุณสมบัติดิ้นเติบโต ดิ้นหดตัว และดิ้นพื้นฐาน ในกรณีแรก เราเขียนเพียงค่าเดียว ดังนั้น flex จึงตั้งค่าคุณสมบัติ flex-grow ในกรณีที่สองเราเขียนค่าทั้งสามค่าให้
ในบทความนี้ เราจะแนะนำเทคโนโลยี CSS Flexbox ที่ออกแบบมาเพื่อสร้างเค้าโครงหน้าเว็บที่ยืดหยุ่น
วัตถุประสงค์ของ CSS Flexbox
CSS Flexbox มีไว้สำหรับ การสร้างเลย์เอาต์ที่ยืดหยุ่น. เมื่อใช้เทคโนโลยีนี้ คุณสามารถจัดเรียงองค์ประกอบในคอนเทนเนอร์ได้อย่างง่ายดายและยืดหยุ่น กระจายพื้นที่ว่างระหว่างองค์ประกอบเหล่านั้น และจัดแนวองค์ประกอบไม่ทางใดก็ทางหนึ่ง แม้ว่าองค์ประกอบเหล่านั้นจะไม่มีขนาดเฉพาะก็ตาม
CSS Flexbox ทำให้การสร้างการออกแบบที่ตอบสนองได้ง่ายกว่าการใช้ Float และ Positioning
Flexbox สามารถใช้ทั้งสำหรับมาร์กอัป CSS ของทั้งหน้าและแต่ละบล็อก
รองรับเบราว์เซอร์สำหรับ CSS Flexbox
CSS Flexbox ได้รับการสนับสนุนโดยเบราว์เซอร์สมัยใหม่ทั้งหมดที่ใช้งานอยู่ในปัจจุบัน (ใช้คำนำหน้า: IE10+, Edge12+, Firefox 2+, Chrome 4+, Safari 3.1+, Opera 12.1+, iOS Safari 3.2, Opera mini, Android 2.1+, Blackberry 7+) .
พื้นฐาน CSS Flexbox
การสร้างมาร์กอัป CSS โดยใช้ Flexbox เริ่มต้นด้วยการตั้งค่าคุณสมบัติการแสดง CSS ขององค์ประกอบ HTML ที่ต้องการให้เป็น flex หรือ flex-inline
หลังจากนี้ องค์ประกอบนี้จะกลายเป็นคอนเทนเนอร์แบบยืดหยุ่นและทั้งหมดของมัน โดยตรงองค์ประกอบลูกเป็นองค์ประกอบดิ้น ยิ่งไปกว่านั้น เมื่อเราพูดถึง flexbox เราหมายถึงเฉพาะองค์ประกอบที่มี display:flex หรือ display:flex-inline และองค์ประกอบทั้งหมด โดยตรงตั้งอยู่ในนั้น ดังนั้นใน CSS Flexbox จึงมีองค์ประกอบเพียงสองประเภท: คอนเทนเนอร์ดิ้นและองค์ประกอบดิ้น
เพิ่มคุณสมบัติคำนำหน้าและความกว้างสูงสุดใน CSS เพื่อรองรับเค้าโครงในเบราว์เซอร์ส่วนใหญ่
หากต้องการ “เปลี่ยน” บล็อกให้เป็นคอนเทนเนอร์ดิ้น ให้ใช้คลาสแถว การตั้งค่าความกว้างขององค์ประกอบ .col__article และ .col__aside flex ภายในคอนเทนเนอร์ flex ทำได้โดยใช้คุณสมบัติ flex CSS
ตามตัวอย่าง เรามามาร์กอัปส่วนท้ายอีกอันโดยใช้ flexbox และสร้างบล็อกที่ประกอบด้วยสามองค์ประกอบในองค์ประกอบ .col__article (ความกว้างขั้นต่ำขององค์ประกอบหนึ่งคือ 300px) เราจะวางสี่บล็อกไว้ในส่วนท้าย (ความกว้างขั้นต่ำของหนึ่งบล็อกคือ 200px)
ฉันอยากจะพูดคุยเกี่ยวกับ FlexBox โมดูลโครงร่าง Flexbox (กล่องแบบยืดหยุ่น ปัจจุบันเป็นการแนะนำผู้สมัครของ W3C) มีเป้าหมายเพื่อนำเสนอวิธีการจัดวาง การจัดตำแหน่ง และการกระจายพื้นที่ว่างระหว่างองค์ประกอบในคอนเทนเนอร์ที่มีประสิทธิภาพมากขึ้น แม้ว่าขนาดจะไม่เป็นที่รู้จักและ/หรือไดนามิกก็ตาม (เพราะฉะนั้นคำว่า "ยืดหยุ่นได้").
แนวคิดหลักของเค้าโครงแบบยืดหยุ่นคือการให้คอนเทนเนอร์สามารถเปลี่ยนความกว้าง/ความสูง (และลำดับ) ขององค์ประกอบเพื่อเติมเต็มพื้นที่ได้ดีขึ้น (ในกรณีส่วนใหญ่เพื่อรองรับการแสดงผลและขนาดหน้าจอทุกประเภท)คอนเทนเนอร์แบบยืดหยุ่นจะขยายองค์ประกอบให้เต็มพื้นที่หรือบีบอัดเพื่อป้องกันไม่ให้ล้น
สิ่งสำคัญที่สุดคือ เค้าโครง flexbox ไม่ได้ขึ้นอยู่กับทิศทาง ซึ่งแตกต่างจากเค้าโครงทั่วไป (บล็อกที่จัดเรียงในแนวตั้งและองค์ประกอบอินไลน์ที่จัดเรียงในแนวนอน)แม้ว่าเลย์เอาต์ปกติจะดีสำหรับหน้าเว็บ แต่ก็ขาดความยืดหยุ่นในการรองรับแอปพลิเคชันขนาดใหญ่หรือซับซ้อน (โดยเฉพาะอย่างยิ่งเมื่อต้องเปลี่ยนการวางแนวหน้าจอ การปรับขนาด การยืด การย่อขนาด ฯลฯ).
เพราะ flexbox เป็นโมดูลทั้งหมด ไม่ใช่แค่คุณสมบัติเดียว แต่ยังรวมคุณสมบัติหลายอย่างเข้าด้วยกันบางส่วนจะต้องนำไปใช้กับคอนเทนเนอร์ (องค์ประกอบหลักเรียกว่าคอนเทนเนอร์ดิ้น) ในขณะที่คุณสมบัติอื่นๆ จะถูกนำไปใช้กับองค์ประกอบลูกหรือองค์ประกอบดิ้น
แม้ว่าเค้าโครงปกติจะขึ้นอยู่กับทิศทางการไหลของบล็อกและองค์ประกอบแบบอินไลน์ เค้าโครงแบบยืดหยุ่นจะขึ้นอยู่กับ "ทิศทางการไหลแบบยืดหยุ่น"
เฟล็กซ์บ็อกซ์
โดยพื้นฐานแล้ว องค์ประกอบต่างๆ จะถูกกระจายไปตามแกนหลัก (จากจุดเริ่มต้นหลักไปยังจุดสิ้นสุดหลัก) หรือตามแกนตามขวาง (จากจุดเริ่มขวางไปจนถึงจุดสิ้นสุดหลัก)
แกนหลัก - แกนหลักซึ่งมีองค์ประกอบดิ้นอยู่โปรดทราบว่าจะต้องเป็นแนวนอน ทุกอย่างขึ้นอยู่กับคุณภาพของเนื้อหาที่จัดชิดขอบ
หลักเริ่มต้น | main-end - องค์ประกอบดิ้นจะถูกวางไว้ในคอนเทนเนอร์จากตำแหน่งเริ่มต้นหลักไปยังตำแหน่งหลัก
ขนาดหลัก — ความกว้างหรือความสูงขององค์ประกอบดิ้น ขึ้นอยู่กับขนาดหลักที่เลือกปริมาณฐานอาจเป็นความกว้างหรือความสูงขององค์ประกอบก็ได้
แกนขวาง - แกนขวางตั้งฉากกับแกนหลักทิศทางของมันขึ้นอยู่กับทิศทางของแกนหลัก
ข้ามเริ่มต้น | cross-end - เส้นเฟล็กซ์เต็มไปด้วยองค์ประกอบและวางไว้ในคอนเทนเนอร์จากตำแหน่ง cross-start และตำแหน่ง cross-end
ขนาดข้าม — ความกว้างหรือความสูงขององค์ประกอบดิ้น ขึ้นอยู่กับมิติที่เลือก จะเท่ากับค่านี้คุณสมบัตินี้เหมือนกับความกว้างหรือความสูงขององค์ประกอบโดยขึ้นอยู่กับมิติข้อมูลที่เลือก
คุณสมบัติ
จอแสดงผล: ดิ้น | อินไลน์-ดิ้น;
กำหนดคอนเทนเนอร์ดิ้น (อินไลน์หรือบล็อกขึ้นอยู่กับค่าที่เลือก) เชื่อมต่อบริบทดิ้นสำหรับผู้สืบทอดในทันทีทั้งหมด
จอแสดงผล: ค่าอื่นๆ | ดิ้น | อินไลน์-ดิ้น;
โปรดทราบว่า:
คอลัมน์ CSS ไม่ทำงานกับคอนเทนเนอร์ดิ้นลอย ชัดเจน และจัดแนวตั้ง ใช้ไม่ได้กับรายการดิ้น
ดิ้นทิศทาง
ใช้ก่อนองค์ประกอบหลักของคอนเทนเนอร์ดิ้น
ตั้งค่าแกนหลัก เพื่อกำหนดทิศทางสำหรับรายการดิ้นที่วางอยู่ในคอนเทนเนอร์
ทิศทางแบบยืดหยุ่น: แถว | แถวย้อนกลับ | คอลัมน์ | คอลัมน์ย้อนกลับ
แถว (ค่าเริ่มต้น): ซ้ายไปขวาสำหรับ ltr, ขวาไปซ้ายสำหรับ rtl;
ย้อนกลับแถว: จากขวาไปซ้ายสำหรับ ltr, จากซ้ายไปขวาสำหรับ rtl;
คอลัมน์: คล้ายกับแถวจากบนลงล่าง
คอลัมน์ย้อนกลับ: คล้ายกับการย้อนกลับแถวจากล่างขึ้นบน
ดิ้นห่อ
ใช้ก่อนองค์ประกอบหลักของคอนเทนเนอร์ดิ้น
กำหนดว่าคอนเทนเนอร์เป็นแบบบรรทัดเดียวหรือหลายบรรทัด ตลอดจนทิศทางของแกนกากบาท กำหนดทิศทางที่จะวางบรรทัดใหม่
เฟล็กซ์-ห่อ: nowrap | ห่อ | ห่อกลับ
nowrap (ค่าเริ่มต้น): บรรทัดเดียว / จากซ้ายไปขวาสำหรับ ltr, จากขวาไปซ้ายสำหรับ rtl;
ตัด: multiline / จากซ้ายไปขวาสำหรับ ltr, จากขวาไปซ้ายสำหรับ rtl;
wrap-reverse: multiline / ขวาไปซ้ายสำหรับ ltr, จากซ้ายไปขวาสำหรับ rtl
ดิ้นไหล
ใช้ก่อนองค์ประกอบหลักของคอนเทนเนอร์ดิ้น
นี่เป็นการจดชวเลขสำหรับคุณสมบัติทิศทางการงอและการพันแบบยืดหยุ่น ซึ่งร่วมกันกำหนดแกนหลักและแกนขวางค่าเริ่มต้นคือแถว nowrap
ดิ้นไหล< ‘flex-direction’> || < ‘Flex-wrap’>
ปรับเนื้อหา
ใช้ก่อนองค์ประกอบหลักของคอนเทนเนอร์ดิ้น
กำหนดการจัดตำแหน่งที่สัมพันธ์กับแกนหลักช่วยกระจายพื้นที่ว่างในกรณีที่องค์ประกอบของเส้นไม่ "ยืด" หรือยืดออก แต่ถึงขนาดสูงสุดแล้วยังช่วยให้สามารถควบคุมการจัดตำแหน่งขององค์ประกอบเมื่ออยู่นอกเส้นได้
ปรับเนื้อหา: flex-start | ดิ้นสุด | ศูนย์ | ช่องว่างระหว่าง | พื้นที่รอบ
flex-start (ค่าเริ่มต้น): รายการจะย้ายไปที่จุดเริ่มต้นของบรรทัด;
flex-end: องค์ประกอบจะย้ายไปที่ส่วนท้ายของบรรทัด
ศูนย์กลาง: องค์ประกอบต่างๆ จัดชิดตรงกลางเส้น
ช่องว่างระหว่าง: องค์ประกอบต่างๆ มีการกระจายเท่าๆ กัน (องค์ประกอบแรกที่ต้นบรรทัด สุดท้ายอยู่ที่ส่วนท้าย)
ช่องว่างรอบ: องค์ประกอบต่างๆ จะถูกกระจายเท่าๆ กัน โดยมีระยะห่างระหว่างกันและนอกเส้นเท่ากัน
ปรับเนื้อหา
จัดรายการ
ใช้ก่อนองค์ประกอบหลักของคอนเทนเนอร์ดิ้น
กำหนดลักษณะการทำงานเริ่มต้นสำหรับวิธีจัดตำแหน่งรายการดิ้นโดยสัมพันธ์กับแกนกากบาทบนเส้นปัจจุบันคิดว่ามันเป็นเวอร์ชันของเนื้อหาชิดขอบสำหรับแกนกากบาท (ตั้งฉากกับแกนหลัก)
จัดรายการ: flex-start | ดิ้นสุด | ศูนย์ | พื้นฐาน | ยืด
flex-start: เส้นขอบข้ามเริ่มต้นสำหรับองค์ประกอบที่อยู่ในตำแหน่งเริ่มต้นข้าม
flex-end: เส้นขอบแบบ cross-end สำหรับองค์ประกอบที่อยู่ในตำแหน่ง cross-end;
ศูนย์กลาง: องค์ประกอบต่างๆ ถูกจัดแนวให้อยู่ตรงกลางของแกนกากบาท
เส้นฐาน: องค์ประกอบต่างๆ ถูกจัดแนวให้สอดคล้องกับเส้นฐาน
ยืด (ค่าเริ่มต้น): องค์ประกอบถูกยืดออกเพื่อเติมคอนเทนเนอร์ (โดยคำนึงถึงความกว้างขั้นต่ำ / ความกว้างสูงสุด)
จัดรายการ
จัดตำแหน่งเนื้อหา
ใช้ก่อนองค์ประกอบหลักของคอนเทนเนอร์ดิ้น จัดแนวแถวของคอนเทนเนอร์ดิ้นเมื่อมีพื้นที่ว่างบนแกนไขว้ คล้ายกับที่เนื้อหาจัดชิดขอบบนแกนหลัก หมายเหตุ: คุณสมบัตินี้ใช้ไม่ได้กับ flexbox แบบบรรทัดเดียว
จัดเนื้อหา: flex-start | ดิ้นสุด | ศูนย์ | ช่องว่างระหว่าง | อวกาศรอบ | ยืด
flex-start: เส้นถูกจัดแนวโดยสัมพันธ์กับจุดเริ่มต้นของคอนเทนเนอร์
flex-end: เส้นถูกจัดแนวโดยสัมพันธ์กับส่วนท้ายของคอนเทนเนอร์
กึ่งกลาง: เส้นถูกจัดแนวให้อยู่ตรงกลางของคอนเทนเนอร์
ช่องว่างระหว่าง: เส้นมีการกระจายเท่าๆ กัน (บรรทัดแรกที่จุดเริ่มต้นของบรรทัด สุดท้ายที่ส่วนท้าย)
ช่องว่างรอบ: เส้นมีการกระจายเท่า ๆ กันโดยมีระยะห่างระหว่างกันเท่ากัน
ยืด (ค่าเริ่มต้น): เส้นถูกยืดออกเพื่อเติมเต็มพื้นที่ว่าง
จัดตำแหน่งเนื้อหา
คำสั่ง
ตามค่าเริ่มต้น รายการ Flex จะถูกจัดเรียงตามลำดับเดิมอย่างไรก็ตาม คุณสมบัติคำสั่งซื้อสามารถควบคุมลำดับที่ปรากฏในคอนเทนเนอร์ได้
สั่งซื้อ 1
ดิ้นเติบโต
ใช้กับองค์ประกอบลูก/องค์ประกอบดิ้น กำหนดความสามารถขององค์ประกอบดิ้นที่จะ "เติบโต" หากจำเป็นรับค่าไร้มิติและทำหน้าที่เป็นสัดส่วนจะกำหนดจำนวนพื้นที่ว่างที่องค์ประกอบสามารถใช้ได้ภายในคอนเทนเนอร์ หากองค์ประกอบทั้งหมดมีคุณสมบัติ flex-grow ตั้งค่าเป็น 1 ลูกแต่ละคนจะได้รับขนาดเท่ากันภายในคอนเทนเนอร์หากคุณตั้งค่าลูกคนใดคนหนึ่งเป็น 2 มันจะใช้พื้นที่เป็นสองเท่าของคนอื่นๆ
ดิ้นเติบโต
ดิ้นหดตัว
ใช้กับองค์ประกอบลูก/องค์ประกอบดิ้น
กำหนดความสามารถของรายการดิ้นที่จะย่อขนาดเมื่อจำเป็น
ดิ้นหดตัว
ไม่ยอมรับจำนวนลบ
ดิ้นพื้นฐาน
ใช้กับองค์ประกอบลูก/องค์ประกอบดิ้น กำหนดขนาดเริ่มต้นสำหรับองค์ประกอบก่อนที่จะจัดสรรพื้นที่ในคอนเทนเนอร์
ดิ้นพื้นฐาน
ดิ้น
ใช้กับองค์ประกอบลูก/องค์ประกอบดิ้น นี่คือชวเลขสำหรับ flex-grow, flex-shrink และ flex-basisพารามิเตอร์ที่สองและสาม (flex-shrink, flex-basis) เป็นทางเลือกค่าเริ่มต้นคือ 0 1 อัตโนมัติ
ดิ้น: ไม่มี | [< ‘Flex-grow «> <» flex-shrink’>? || < ‘Flex-basis’>]
จัดตัวเอง
ใช้กับองค์ประกอบลูก/องค์ประกอบดิ้น ช่วยให้คุณสามารถแทนที่ค่าเริ่มต้นหรือจัดแนวรายการสำหรับรายการ Flex แต่ละรายการ โปรดดูคำอธิบายของคุณสมบัติ align-items เพื่อความเข้าใจที่ดีขึ้นเกี่ยวกับค่าที่มีอยู่
จัดตำแหน่งตนเอง: อัตโนมัติ | ดิ้นเริ่มต้น | ดิ้นสุด | ศูนย์ | พื้นฐาน | ยืด
ตัวอย่าง
เรามาเริ่มด้วยตัวอย่างง่ายๆ ที่เกิดขึ้นเกือบทุกวัน: จัดตำแหน่งให้ตรงตรงกลางไม่มีอะไรจะง่ายไปกว่านี้ถ้าคุณใช้ flexbox
ผู้ปกครอง ( จอแสดงผล: flex; ความสูง: 300px; ) .child ( ความกว้าง: 100px; / * อะไรก็ตาม * / ความสูง: 100px; / * อะไรก็ตาม * / ระยะขอบ: auto; / * Magic! * / )
ตัวอย่างนี้ขึ้นอยู่กับข้อเท็จจริงที่ว่าระยะขอบใต้คอนเทนเนอร์ Flex ซึ่งตั้งค่าเป็นอัตโนมัติกินพื้นที่เพิ่มขึ้น ดังนั้น งานเยื้องด้วยวิธีนี้จะจัดองค์ประกอบให้อยู่กึ่งกลางทั้งสองแกนพอดี ตอนนี้ ลองใช้คุณสมบัติบางอย่างกันลองนึกภาพชุดองค์ประกอบ 6 ชิ้นที่มีขนาดคงที่ (เพื่อความสวยงาม) แต่มีความสามารถในการปรับขนาดภาชนะได้เราต้องการกระจายพวกมันเท่าๆ กันในแนวนอน เพื่อว่าเมื่อเราปรับขนาดหน้าต่างเบราว์เซอร์ ทุกอย่างจะดูดี (ไม่มีการสืบค้น @media!)
คอนเทนเนอร์แบบยืดหยุ่น (
/ * ก่อนอื่น เรามาสร้างบริบทแบบยืดหยุ่นกันก่อน * /
จอแสดงผล: ดิ้น;
/* ตอนนี้เรามากำหนดทิศทางของการไหลและดูว่าเราต้องการองค์ประกอบหรือไม่
ย้ายไปบรรทัดใหม่
*โปรดจำไว้ว่านี่เหมือนกับ:
* ทิศทางแบบยืดหยุ่น: แถว;
* Flex-wrap: ห่อ;
* /
ดิ้นไหล: ตัดแถว;
/ * ทีนี้มาดูกันว่าจะกระจายพื้นที่อย่างไร * /
}
พร้อม. อย่างอื่นเป็นเรื่องของการลงทะเบียน เรามาลองอย่างอื่นกันดีกว่าลองจินตนาการว่าเราต้องการการนำทางที่จัดชิดขวาที่ด้านบนสุดของไซต์ของเรา แต่เราต้องการให้จัดวางตรงกลางบนหน้าจอขนาดกลางและกลายเป็นคอลัมน์เดี่ยวในหน้าจอขนาดเล็กทุกอย่างค่อนข้างง่าย
/*จอใหญ่*/
.การนำทาง(
จอแสดงผล: ดิ้น;
ดิ้นไหล: ตัดแถว;
/* เลื่อนองค์ประกอบไปที่ท้ายบรรทัดตามแกนหลัก * /
ปรับเนื้อหา: ดิ้นปลาย;
}
สื่อทั้งหมดและ (ความกว้างสูงสุด: 800px) (
.การนำทาง(
/* สำหรับหน้าจอขนาดกลาง เราจะจัดการนำทางให้อยู่ตรงกลาง
กระจายพื้นที่ว่างระหว่างองค์ประกอบอย่างสม่ำเสมอ * /
ปรับเนื้อหา: ช่องว่างรอบ;
}
}
/*หน้าจอขนาดเล็ก*/
สื่อทั้งหมดและ (ความกว้างสูงสุด: 500px) (
.การนำทาง(
/ * บนหน้าจอขนาดเล็ก แทนที่จะเรียงเป็นแถว เราจัดเรียงองค์ประกอบเป็นคอลัมน์ * /
ทิศทางแบบยืดหยุ่น: คอลัมน์;
}
}
มาเล่นความยืดหยุ่นของไอเทมดิ้นกันเถอะ!แล้วเลย์เอาต์สามคอลัมน์ที่เหมาะกับอุปกรณ์เคลื่อนที่พร้อมส่วนหัวและส่วนท้ายแบบเต็มความกว้างล่ะและในการจัดลำดับที่แตกต่างกัน
กระดาษห่อ (
จอแสดงผล: ดิ้น;
ดิ้นไหล: ตัดแถว;
}
/ * ตั้งค่าองค์ประกอบทั้งหมดให้มีความกว้าง 100% * /
.header, .main, .nav, .aside, .footer (
ดิ้น 1100%;
}
/* ในกรณีนี้เราอาศัยคำสั่งดั้งเดิมเพื่อนำทางเรา
* อุปกรณ์มือถือ:
* 1 ส่วนหัว
* 2 นำทาง
* 3 หลัก
* 4 กัน
* 5 ส่วนท้าย
* /
/*หน้าจอขนาดกลาง*/
สื่อทั้งหมดและ (ความกว้างขั้นต่ำ: 600px) (
/ * แถบด้านข้างทั้งสองอยู่บนบรรทัดเดียวกัน * /
.aside (ดิ้น: 1 อัตโนมัติ; )
}
/*จอใหญ่*/
Flexbox สามารถเรียกได้ว่าเป็นความพยายามที่ประสบความสำเร็จในการแก้ปัญหามากมายเมื่อสร้างเลย์เอาต์ใน CSS แต่ก่อนที่เราจะพูดถึงคำอธิบายของมัน เรามาดูกันว่ามีอะไรผิดปกติกับวิธีการจัดวางที่เราใช้อยู่ตอนนี้ก่อน
นักออกแบบเลย์เอาต์คนใดก็ตามรู้หลายวิธีในการจัดวางบางอย่างในแนวตั้งหรือสร้างเลย์เอาต์ 3 คอลัมน์โดยมีคอลัมน์กลางที่เป็นยาง แต่ขอยอมรับว่าวิธีการทั้งหมดนี้ค่อนข้างแปลก ดูเหมือนแฮ็ก ไม่เหมาะในทุกกรณี เข้าใจยาก และใช้งานไม่ได้หากไม่ปฏิบัติตามเงื่อนไขเวทย์มนตร์บางอย่างที่พัฒนาขึ้นในอดีต
สิ่งนี้เกิดขึ้นเพราะ html และ css พัฒนาแบบวิวัฒนาการ ในตอนแรกหน้าเว็บดูเหมือนเอกสารข้อความแบบเธรดเดียวหลังจากนั้นไม่นานก็แบ่งหน้าออกเป็นบล็อกด้วยตารางจากนั้นมันก็กลายเป็นแฟชั่นในการจัดวางแบบลอยตัวและหลังจากการตายอย่างเป็นทางการของ ie6 เทคนิคอินไลน์บล็อกก็เกิดขึ้น เพิ่มด้วย ด้วยเหตุนี้ เราจึงสืบทอดเทคนิคเหล่านี้มาผสมผสานกันอย่างลงตัว ซึ่งใช้ในการสร้างเลย์เอาต์สำหรับ 99.9% ของหน้าเว็บที่มีอยู่ทั้งหมด
การจัดเรียงบล็อกแบบหลายบรรทัดภายในคอนเทนเนอร์แบบยืดหยุ่น
ดิ้นห่อ
ตัวอย่างทั้งหมดที่เราให้ไว้ข้างต้นถูกสร้างขึ้นโดยคำนึงถึงการจัดเรียงบล็อกบรรทัดเดียว (คอลัมน์เดียว) ต้องบอกว่าโดยค่าเริ่มต้น คอนเทนเนอร์แบบยืดหยุ่นจะจัดเรียงบล็อกภายในตัวมันเองเป็นบรรทัดเดียวเสมอ อย่างไรก็ตาม ข้อมูลจำเพาะยังรองรับโหมดหลายบรรทัดด้วย คุณสมบัติ CSS flex-wrap รับผิดชอบเนื้อหาหลายบรรทัดภายในคอนเทนเนอร์ดิ้น
ค่าที่มีอยู่ ดิ้นห่อ:
- ตอนนี้แรป (ค่าเริ่มต้น): บล็อกจะจัดเรียงเป็นหนึ่งบรรทัดจากซ้ายไปขวา (ใน rtl จากขวาไปซ้าย)
- ห่อ: บล็อกจะจัดเรียงเป็นแถวแนวนอนหลายแถว (หากไม่พอดีในแถวเดียว) พวกเขาติดตามกันจากซ้ายไปขวา (ใน rtl จากขวาไปซ้าย)
- wrap-reverse: เช่นเดียวกับ ห่อแต่บล็อกจะจัดเรียงในลำดับย้อนกลับ
flex-flow เป็นการชวเลขที่สะดวกสำหรับ flex-direction + flex-wrap
โดยพื้นฐานแล้ว การไหลแบบยืดหยุ่นทำให้สามารถอธิบายทิศทางของแกนตามขวางหลักและหลายเส้นได้ในคุณสมบัติเดียว ค่าเริ่มต้นของ flex-flow: row nowrap
ดิ้นไหล:<‘flex-direction’> || <‘flex-wrap’>
ซีเอสเอส
/* เช่น. ... */ .my-flex-block( flex-direcrion:column; flex-wrap: wrap; ) /* นี่เหมือนกับ... */ .my-flex-block( flex-flow: การตัดคอลัมน์ ; )จัดตำแหน่งเนื้อหา
นอกจากนี้ยังมีคุณสมบัติ align-content ซึ่งกำหนดว่าแถวผลลัพธ์ของบล็อกจะจัดแนวในแนวตั้งอย่างไร และจะแบ่งพื้นที่ทั้งหมดของคอนเทนเนอร์ดิ้นอย่างไร
สำคัญ: align-content ใช้งานได้ในโหมดหลายบรรทัดเท่านั้น (เช่น ในกรณีของ flex-wrap:wrap; หรือ flex-wrap:wrap-reverse;)
ค่าที่มีอยู่ จัดตำแหน่งเนื้อหา:
- flex-start: แถวของบล็อกถูกกดไปที่จุดเริ่มต้นของคอนเทนเนอร์ดิ้น
- flex-end: แถวของบล็อกถูกกดไปที่ส่วนท้ายของคอนเทนเนอร์ดิ้น
- ศูนย์กลาง: แถวของบล็อกอยู่ตรงกลางของคอนเทนเนอร์ดิ้น
- ช่องว่างระหว่าง: แถวแรกของบล็อกอยู่ที่จุดเริ่มต้นของคอนเทนเนอร์ดิ้น แถวสุดท้ายของบล็อกอยู่ที่ส่วนท้าย แถวอื่นๆ ทั้งหมดจะกระจายเท่าๆ กันในพื้นที่ที่เหลือ
- ช่องว่างรอบ: แถวของบล็อกมีการกระจายเท่าๆ กันตั้งแต่ต้นจนจบคอนเทนเนอร์ดิ้น โดยแบ่งพื้นที่ว่างทั้งหมดเท่าๆ กัน
- ยืด (ค่าเริ่มต้น): แถวของบล็อกถูกยืดออกเพื่อใช้พื้นที่ว่างทั้งหมด
คุณสมบัติ CSS flex-wrap และ align-content ควรนำไปใช้กับคอนเทนเนอร์ flex โดยตรง ไม่ใช่กับลูก
การสาธิตคุณสมบัติหลายบรรทัดในเฟล็กซ์
กฎ CSS สำหรับองค์ประกอบลูกของคอนเทนเนอร์ดิ้น (บล็อกดิ้น)
flex-basis - ขนาดพื้นฐานของบล็อกดิ้นเดียว
ตั้งค่าขนาดแกนหลักเริ่มต้นสำหรับบล็อกเฟล็กซ์ ก่อนที่จะใช้การแปลงตามปัจจัยเฟล็กซ์อื่นๆ สามารถระบุเป็นหน่วยความยาวใดก็ได้ (px, em, %, ...) หรืออัตโนมัติ (ค่าเริ่มต้น) หากตั้งค่าเป็นอัตโนมัติ ขนาดบล็อก (ความกว้าง ความสูง) จะถูกใช้เป็นพื้นฐาน ซึ่งในทางกลับกันอาจขึ้นอยู่กับขนาดของเนื้อหา หากไม่ได้ระบุไว้อย่างชัดเจน
flex-grow – “ความโลภ” ของบล็อกดิ้นเดียว
กำหนดว่าบล็อกดิ้นแต่ละบล็อกจะมีขนาดใหญ่กว่าองค์ประกอบที่อยู่ติดกันได้มากเพียงใด หากจำเป็น flex-grow ยอมรับค่าไร้มิติ (ค่าเริ่มต้น 0)
ตัวอย่างที่ 1:
- หากกล่องดิ้นทั้งหมดภายในคอนเทนเนอร์ดิ้นมี flex-grow:1 กล่องเหล่านั้นจะมีขนาดเท่ากัน
- หากหนึ่งในนั้นมี flex-grow:2 มันจะใหญ่กว่าอันอื่นทั้งหมด 2 เท่า
ตัวอย่างที่ 2:
- หากกล่องดิ้นทั้งหมดภายในคอนเทนเนอร์ดิ้นมี flex-grow:3 กล่องเหล่านั้นจะมีขนาดเท่ากัน
- ถ้าหนึ่งในนั้นมี flex-grow:12 มันจะใหญ่กว่าอันอื่นๆ ทั้งหมด 4 เท่า
นั่นคือค่าสัมบูรณ์ของ flex-grow ไม่ได้กำหนดความกว้างที่แน่นอน โดยจะกำหนดระดับของ "ความโลภ" โดยสัมพันธ์กับบล็อกดิ้นอื่นๆ ในระดับเดียวกัน
flex-shrink - ปัจจัย "การบีบอัด" ของบล็อกดิ้นเดียว
กำหนดว่าบล็อก Flex จะหดตัวมากน้อยเพียงใดเมื่อเทียบกับองค์ประกอบที่อยู่ติดกันภายในคอนเทนเนอร์ Flex หากมีพื้นที่ว่างไม่เพียงพอ ค่าเริ่มต้นเป็น 1
flex - ชวเลขสำหรับคุณสมบัติ flex-grow, flex-shrink และ flex-basis
ดิ้น: ไม่มี | [<"flex-grow"> <"flex-shrink">? || <"flex-basis"> ]
ซีเอสเอส
/* เช่น. ... */ .my-flex-block( flex-grow:12; flex-shrink:3; flex พื้นฐาน: 30em; ) /* นี่เหมือนกับ... */ .my-flex-block( flex : 12 3 30นาที; )การสาธิตสำหรับ flex-grow, flex-shrink และ flex-basis
align-self – การจัดตำแหน่งบล็อกดิ้นเดียวตามแนวแกนขวาง
ทำให้สามารถแทนที่คุณสมบัติ align-items ของคอนเทนเนอร์ Flex สำหรับบล็อก Flex แต่ละรายการได้
ค่า align-self ที่มีอยู่ (5 ตัวเลือกเดียวกับ align-items)
- flex-start: บล็อกดิ้นถูกกดไปที่จุดเริ่มต้นของแกนตามขวาง
- ส่วนโค้งงอ: บล็อกส่วนโค้งถูกกดเข้ากับส่วนปลายของแกนขวาง
- ศูนย์กลาง: บล็อกดิ้นตั้งอยู่ที่กึ่งกลางของแกนกากบาท
- เส้นฐาน: บล็อกดิ้นอยู่ในแนวเดียวกับเส้นฐาน
- ยืด (ค่าเริ่มต้น): บล็อกเฟล็กซ์ถูกยืดออกเพื่อใช้พื้นที่ว่างทั้งหมดตามแนวแกนขวาง โดยคำนึงถึงความกว้างต่ำสุด / ความกว้างสูงสุด หากตั้งค่าไว้
order – ลำดับของบล็อกดิ้นเดียวภายในคอนเทนเนอร์ดิ้น
ตามค่าเริ่มต้น บล็อกทั้งหมดจะเรียงต่อกันตามลำดับที่ระบุใน html อย่างไรก็ตาม คำสั่งซื้อนี้สามารถเปลี่ยนแปลงได้โดยใช้คุณสมบัติคำสั่งซื้อ มันถูกระบุเป็นจำนวนเต็มและมีค่าเริ่มต้นเป็น 0
มูลค่าการสั่งซื้อไม่ได้ระบุตำแหน่งที่แน่นอนขององค์ประกอบในลำดับ จะกำหนดน้ำหนักของตำแหน่งขององค์ประกอบ
HTML
ในกรณีนี้ บล็อกจะไล่ตามกันไปตามแกนหลักตามลำดับต่อไปนี้: item5, item1, item3, item4, item2
สาธิตการจัดตำแหน่งตนเองและการจัดลำดับ
ระยะขอบ: อัตโนมัติ แนวตั้ง. ฝันเป็นจริง!
คุณคงชอบ Flexbox อย่างน้อยก็เพราะว่าการจัดตำแหน่งแนวนอนที่คุ้นเคยผ่านระยะขอบ:อัตโนมัติก็ใช้งานได้ที่นี่สำหรับแนวตั้งเช่นกัน
My-flex-container ( display: flex; height: 300px; /* Or Anything */ ) .my-flex-block ( width: 100px; /* หรืออะไรก็ตาม */ height: 100px; /* หรืออะไรก็ตาม * / Margin: auto; /* Magic! บล็อกอยู่ตรงกลางในแนวตั้งและแนวนอน! */ )
สิ่งที่ต้องจำ
- คุณไม่ควรใช้ flexbox ในกรณีที่ไม่จำเป็น
- การกำหนดภูมิภาคและการเปลี่ยนแปลงลำดับของเนื้อหาในหลายกรณียังคงมีประโยชน์ในการทำให้ขึ้นอยู่กับโครงสร้างเพจ ลองคิดดูสิ
- ทำความเข้าใจ flexbox และรู้พื้นฐาน ทำให้บรรลุผลตามที่คาดหวังได้ง่ายขึ้นมาก
- อย่าลืมเกี่ยวกับระยะขอบ สิ่งเหล่านี้จะถูกนำมาพิจารณาเมื่อตั้งค่าการจัดแนวแกน สิ่งสำคัญคือต้องจำไว้ว่าระยะขอบใน flexbox จะไม่ "ยุบ" เหมือนที่เกิดขึ้นในโฟลว์ปกติ
- ค่าทศนิยมของบล็อกดิ้นจะไม่ถูกนำมาพิจารณาและไม่มีความหมาย สิ่งนี้อาจนำไปใช้เพื่อการเสื่อมถอยอย่างสง่างามได้เมื่อเปลี่ยนมาใช้ flexbox
- Flexbox เหมาะอย่างยิ่งสำหรับเค้าโครงของส่วนประกอบของเว็บและแต่ละส่วนของหน้าเว็บ แต่ไม่ได้แสดงด้านที่ดีที่สุดเมื่อวางเค้าโครงพื้นฐาน (ตำแหน่งของบทความ ส่วนหัว ส่วนท้าย แถบนำทาง ฯลฯ) นี่ยังคงเป็นประเด็นที่ถกเถียงกันอยู่ แต่บทความนี้แสดงให้เห็นถึงข้อบกพร่องที่ค่อนข้างน่าเชื่อ xanthir.com/blog/b4580
ในที่สุด
ฉันคิดว่าแน่นอนว่า flexbox จะไม่แทนที่วิธีการจัดวางอื่น ๆ ทั้งหมด แต่แน่นอนว่าในอนาคตอันใกล้นี้มันจะครอบครองช่องที่คุ้มค่าในการแก้ปัญหาจำนวนมาก และแน่นอน คุณต้องลองร่วมงานกับเขาตอนนี้ บทความใดบทความหนึ่งต่อไปนี้จะกล่าวถึงตัวอย่างเฉพาะของการทำงานกับเค้าโครงดิ้น สมัครรับข่าวสาร;)
คุณสมบัติ align-content ระบุประเภทของการจัดตำแหน่งของเส้นภายในคอนเทนเนอร์ดิ้นตามแกนขวางหากมีพื้นที่ว่าง
มันใช้กับ: คอนเทนเนอร์แบบยืดหยุ่น
ค่าเริ่มต้น: ยืด.
Flex-start เส้นจะอยู่ที่จุดเริ่มต้นของแกนตามขวาง แต่ละบรรทัดถัดไปจะล้างด้วยบรรทัดก่อนหน้า แถวแบบยืดหยุ่นจะถูกวางโดยเริ่มต้นที่ส่วนท้ายของแกนกากบาท แต่ละบรรทัดก่อนหน้าจะถูกล้างด้วยบรรทัดถัดไป center เส้นจะถูกวางไว้ตรงกลางคอนเทนเนอร์ ช่องว่างระหว่าง เส้นมีการกระจายเท่าๆ กันในคอนเทนเนอร์และระยะห่างระหว่างเส้นทั้งสองเท่ากัน space-around เส้นจะมีระยะห่างเท่ากันเพื่อให้ช่องว่างระหว่างสองบรรทัดที่อยู่ติดกันเท่ากัน พื้นที่ว่างก่อนบรรทัดแรกและหลังบรรทัดสุดท้ายเท่ากับครึ่งหนึ่งของช่องว่างระหว่างสองบรรทัดที่อยู่ติดกัน space-evenly แถวมีการกระจายเท่าๆ กัน ช่องว่างก่อนบรรทัดแรกและหลังบรรทัดสุดท้ายจะมีความกว้างเท่ากับบรรทัดอื่นๆ ยืด เส้นจะยืดออกเท่า ๆ กันเพื่อเติมเต็มพื้นที่ว่าง
คุณสมบัติ align-content จะจัดแนวเส้นของคอนเทนเนอร์ Flex ภายในคอนเทนเนอร์ Flex เมื่อมีพื้นที่เพิ่มเติมในแกนไขว้ คล้ายกับวิธีที่เนื้อหา justify จัดแนวแต่ละรายการภายในแกนหลัก โปรดทราบว่าคุณสมบัตินี้ไม่มีผลกับคอนเทนเนอร์ดิ้นบรรทัดเดียว ค่าต่างๆ มีความหมายดังต่อไปนี้:
หมายเหตุ: เฉพาะคอนเทนเนอร์ดิ้นแบบหลายบรรทัดเท่านั้นที่เคยมีพื้นที่ว่างในแกนกากบาทสำหรับเส้นที่จะจัดแนว เนื่องจากในคอนเทนเนอร์ดิ้นแบบบรรทัดเดียว เส้นเดียวจะยืดออกโดยอัตโนมัติเพื่อเติมช่องว่าง
นำไปใช้กับ:ดิ้นคอนเทนเนอร์
อักษรย่อ: ยืด.
เส้นเริ่มต้นแบบยืดหยุ่นจะถูกบรรจุไว้ที่จุดเริ่มต้นของคอนเทนเนอร์แบบยืดหยุ่น ขอบกากบาทเริ่มต้นของบรรทัดแรกในคอนเทนเนอร์ Flex จะถูกวางไว้ชิดกับขอบกากบาทเริ่มต้นของคอนเทนเนอร์ Flex และแต่ละบรรทัดต่อมาจะถูกวางชิดกับบรรทัดก่อนหน้า เส้นแบบยืดหยุ่นจะถูกบรรจุไว้ที่ส่วนท้ายของคอนเทนเนอร์แบบยืดหยุ่น ขอบกากบาทของบรรทัดสุดท้ายถูกวางไว้ชิดกับขอบกากบาทของคอนเทนเนอร์ดิ้น และแต่ละบรรทัดที่อยู่ข้างหน้าจะถูกวางให้ชิดกับบรรทัดถัดไป เส้นกึ่งกลางจะเรียงกันเข้าหากึ่งกลางของคอนเทนเนอร์ดิ้น เส้นในคอนเทนเนอร์ Flex จะถูกวางให้ชิดกันและจัดชิดตรงกลางของคอนเทนเนอร์ Flex โดยมีระยะห่างเท่ากันระหว่างขอบเนื้อหาแบบเริ่มต้นแบบกากบาทของคอนเทนเนอร์ Flex และบรรทัดแรกในคอนเทนเนอร์ Flex และระหว่าง cross-end content edge ของคอนเทนเนอร์ดิ้นและบรรทัดสุดท้ายในคอนเทนเนอร์ดิ้น (หากพื้นที่ว่างที่เหลือเป็นลบ เส้นจะล้นเท่ากันในทั้งสองทิศทาง) ช่องว่างระหว่างเส้นมีการกระจายเท่าๆ กันในคอนเทนเนอร์ดิ้น หากพื้นที่ว่างที่เหลือเป็นลบ ค่านี้จะเหมือนกับ flex-start มิฉะนั้น ขอบ cross-start ของบรรทัดแรกในคอนเทนเนอร์ flex จะถูกวางไว้เสมอกับขอบเนื้อหา cross-start ของคอนเทนเนอร์ flex ขอบ cross-end ของบรรทัดสุดท้ายในคอนเทนเนอร์ flex จะถูกวางให้เสมอกับ cross- ขอบเนื้อหาด้านท้ายของคอนเทนเนอร์ Flex และเส้นที่เหลือในคอนเทนเนอร์ Flex จะถูกกระจายเพื่อให้ระยะห่างระหว่างสองบรรทัดที่อยู่ติดกันเท่ากัน space-around Lines มีการกระจายเท่าๆ กันในคอนเทนเนอร์ดิ้น โดยมีช่องว่างครึ่งขนาดที่ปลายทั้งสองข้าง หากพื้นที่ว่างที่เหลือเป็นลบ ค่านี้จะเหมือนกับค่าตรงกลาง มิฉะนั้น เส้นในคอนเทนเนอร์ Flex จะมีการกระจายเพื่อให้ระยะห่างระหว่างสองบรรทัดที่อยู่ติดกันเท่ากัน และระยะห่างระหว่างบรรทัดแรก/สุดท้ายและขอบคอนเทนเนอร์ Flex จะมีขนาดเป็นครึ่งหนึ่งของระยะห่างระหว่างเส้น Flex space-evenly เส้นมีการกระจายเท่าๆ กันในคอนเทนเนอร์ดิ้น หากพื้นที่ว่างที่เหลือเป็นลบ ค่านี้จะเหมือนกับค่าตรงกลาง มิฉะนั้น เส้นในคอนเทนเนอร์ดิ้นจะถูกกระจายเพื่อให้ระยะห่างระหว่างเส้นดิ้นทุกเส้นเท่ากัน ยืดเส้นยืดเพื่อกินพื้นที่ที่เหลืออยู่ หากพื้นที่ว่างที่เหลือเป็นลบ ค่านี้จะเหมือนกับ flex-start มิฉะนั้น พื้นที่ว่างจะถูกแบ่งเท่าๆ กันระหว่างบรรทัดทั้งหมด เพื่อเพิ่มขนาดการข้าม