วันศุกร์ที่ 6 มีนาคม พ.ศ. 2558

How to design content box without table and margin?

>> เรื่องนี้พี่ senior ที่ทำงานเป็นผู้เสนอวิธีการแก้ปัญหาการจัด style sheet แบบไม่มีแบบแผนให้มีแบบแผนเพื่อที่มันจะง่ายต่อการลดเพิ่มเติมแต่งในภายหลัง เรื่องนี้เป็นเรื่องสำคัญมากนะครับ ย้ำเลยสำหรับงาน front-end ควรทำความเข้าใจเป็นอย่างยิ่ง

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

>> แน่นอนเพื่อนๆสามารถเลือกวิธีการจัดการกับปัญหาข้างต้นด้วยตัวเลือกต่อไปนี้ เลือกได้มากกว่าหนึ่งอย่างครับ (ลองคิดและเลือกเลยนะ)
1) margin-left: 10px
2) margin-left: 5px
3) padding-left: 10px
4) padding-left: 5px
5) padding-top: 5px
6) ใช้ table tr และ td เป็น layout

>> เฉลย ไม่ว่าจะเลือกตัวเลือกใดก็ตามในข้อ 1) ถึงข้อ 6) โดยเฉพาะวิธีการจัดการของทั้งสามด้วย margin หรือ table ล้วนทำให้การแก้ไขเลเอาท์ลำบากในภายหลัง (เมื่อของมีมากกว่าสามชิ้น และ requirement จากลูกค้าไม่แน่นอน)

>> ครับก็อย่างที่ผมอยากเสนอ ตัวเอกของเรื่องในคราวนี้ก็คือ CSS เวอร์ชัน 3 ที่มีระบบ box-sizing มาให้ใช้ แล้วมันคืออะไร?

>> มันคือเรื่องที่ว่าด้วยการคำนวณขนาดของ content (ขนาดจริงๆของสิ่งของ) หรือจะให้มันคำนวณขนาดของ border ของ content นั้นแทน (box-sizing: border-box)





>> เอาล่ะ ตัวอย่างต่อจากนี้จะใช้แท็ก div แทนแท็ก table และเลิกใช้ margin ไปตลอดกาล (forever)
- รูปที่ 1 (ตัวเลขสีแดง) คือเป้าหมายที่เราอยากจะ design ให้ใกล้เคียงที่สุด โดยใช้หลักการ box-sizing
- รูปที่ 2 จากรูปแรกจะเห็นว่าเราสามารถแบ่งได้เป็นสิบช่อง
- รูปที่ 3 ใช้สิบช่องดังกล่าวกับเป้าหมาย
- รูปที่ 4 กำหนดแท็ก div ขึ้นมาทั้งสิ้นสิบเอ็ดตัว ตัวนอกสุดคือตัวบรรจุของอีกสิบตัวภายใน พร้อมกับเซตค่าสีพื้นหลังเป็น สีน้ำเงิน (เดี๋ยวจะเปลี่ยนให้เป็นสีใกล้เคียงกับเป้าหมาย) ขนาดความกว้าง 100%
- รูปที่ 5 เปลี่ยนสีพื้นหลังเฉยๆ (อันที่จริงมันซ้ำ แต่ขี้เกียจทำใหม่)
- รูปที่ 6 ใส่รายละเอียดบางตำแหน่งที่เป็นข้อความ
- รูปที่ 7 ใส่รายละเอียดของ content ที่ไม่ใช่ข้อความ เช่น กล่องข้อความและปุ่มกด
- รูปที่ 8 เอาตัวเอกมาช่วย นั่นก็คือ box-sizing: border-box ค่านี้ส่งผลให้การคำนวณความกว้างนั้นไปใช้ขนาดที่รวมกับ border แล้วเป็นหลัก ดังนั้น content จึงไม่มีทางล้นออกจาก container เด็ดขาดครับ

>> มีคำถามว่า แล้วจะจัดระยะทางซ้าย ด้านบน ทางขวาหรือด้านล่างของแต่ละ content อย่างไรล่ะ คำตอบก็คือ ใช้ padding ล้วนๆครับ โดยให้แท็ก div เป็นตัวควบคุม padding ผลักเปลี่ยนตำแหน่ง content ของตัวเองไปตามประสงค์ของ design นั่นเอง ย้ำ! จงลืม margin อันน่าปวดหัวนั่นไปซะ
- รูปที่ 9 เสร็จเรียบร้อย (จบตัวอย่าง)

>> อ้อ อ่านเพิ่มเติม
- http://www.w3schools.com/cssref/css3_pr_box-sizing.asp

ไม่มีความคิดเห็น:

แสดงความคิดเห็น