Light mode Dark mode

Jir4yu.me

ความรู้สึก.. ที่ตอนไหนๆก็(ไม่)เหมือนกัน

3 เทคนิคเขียน responsive website ร่วมกับ CSS framework

ผมมักจะใช้ CSS framework อย่างพวก Bootstrap, Semantic UI ในการสร้างเว็บไซต์ให้ลูกค้าเป็นประจำ เพราะมันช่วยให้คนอื่น(ที่ไม่ใช่เรา) สามารถนำโค้ดมาแก้ไขได้ง่าย ไม่ต้องเสียเวลาไปนั่งแกะ CSS ของแต่ละคนอย่างเช่นพวก form, modal หรือ component อื่นๆ จะให้พูดกันง่ายๆ ก็คือสมมติว่าเวลาบำรุงรักษา(maintain) ในแต่ละงานหมดลง ลูกค้าสามารถไปหา vendor เจ้าอื่นเพื่อมาแก้ไขดูแลได้ง่าย หรืออาจจะดีสำหรับเราเองด้วยที่จะยกหน้าที่ให้น้องในทีมเป็นคนรับช่วงต่อ แค่รู้ tag พวก Bootstrap ก็สามารถคลำทางต่อไปได้ไม่ยาก

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

1. เขียนโครงสร้าง HTML ให้ดี

สิ่งแรกที่ผมเจอเลยคือบางคนเขียน tag แบบประหยัดจนเกินไป หรือบางคนก็ใช้มันมากจนเกินไปทำให้เวลาอ่าน หรือเขียน CSS ใส่ลงไปเพิ่มเกิดความซ้ำซาก อาจจะเป็นปัญหาในภายหลังได้ อีกอันที่พบบ่อยคือการใส่ class ลงไปใน level เดียวกับกับที่ framework นั้นใช้ ยกตัวอย่างเช่นเราต้องการสร้าง grid layout ที่มี 2 คอลัมน์ โดยกล่องแต่ละกล่องมีพื้นหลังสีเทา และเว้นระยะห่างจากขอบถึงวัตถุสักเล็กน้อย ดู wireframe ด้านล่างนี้ประกอบ

bootstrap-item

สมมติว่าเราตั้งชื่อ class ที่เราสร้างขึ้นเองชื่อ box-item แล้วกันครับ ซึ่งผมมักจะเห็นบ่อยมากสำหรับการตั้งชื่อ class ใน level เดียวกันกับที่ Bootstrap ใช้ ตัวอย่างโค้ดก็จะประมาณนี้

จะเห็นว่าเรียก box-item ลงไปใน level เดียวกับ col-sm-6 ซึ่งเป็นคอลัมน์ของ Bootstrap ซึ่งแน่นอนว่า col-sm-6 นั้นถูกเขียนให้มี padding-left และ padding-right อีกทั้งเป็น float ไว้อยู่แล้ว จึงทำให้การแก้ไข หรือการจัดรูปแบบนั้นเป็นไปได้ยากพอสมควรหากเราเอา box-item ไว้ใน level นี้

ตัวอย่างการเขียน CSS ของ box-level พื้นหลังเทา ขอบมน แล้วก็ต้องการเว้นระยะจากขอบเล็กน้อย

แต่ถ้าคุณย้อนกลับไปดูผลลัพธ์ที่อยู่บนหน้าเว็บไซต์ก็จะเห็นว่ากล่องแต่ละอันอยู่ติดกันจนไม่เห็นระยะห่างของแต่ละคอลัมน์ที่ Bootstrap สร้างขึ้นเลย นั่นเป็นเพราะเรากำลังใช้ class ที่สร้างขึ้น ทับกับอีกอันที่ถูกเขียน CSS ไว้อยู่แล้วของ framework (col-sm-6 มี padding-left, padding-right อยู่แล้ว 15px จาก Bootstrap และพื้นหลังเทาก็ถูกใส่ลงไปใน level เดียวกับ class ที่ใช้แสดงผล จึงทำให้กล่องดูติดกันเพราะสีของพื้นหลัง)

bootstrap class override

แล้วก็ยังส่งผลต่อหน้าจอขนาดเล็กอื่นๆ ด้วยเช่นกัน

responsive mobile problem

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

โดยจะแยก box-item ออกมาเป็นอีกชั้นนึงให้อยู่ใต้ col-sm-6 เวลา CSS เรียกใช้งานก็จะไม่ทับกับของเดิมที่ framework เขีัยนมาแล้ว ซึ่งวิธีการแบบนี้จะช่วยให้ class ประเภทรูปแบบสามารถแสดงผลได้อย่างถูกต้องในหน้าจอขนาดอื่นๆ ด้วยเช่นกัน

เขียน class คนละ level

responsive mobile
สังเกตุเห็นว่ามีเว้นระยะจากขอบหน้าจอมาให้ ซึ่งไม่กระทบ class เดิมของ Bootstrap

สรุปง่ายๆ คือควรแยก class ที่เรากำลังจะสร้างขึ้นออกมาเป็น level ใหม่ อาจจะครอบไปเลย หรืออาจจะอยู่ใต้ class รูปแบบ เพื่อช่วยในเรื่องการแสดงผลในทุกขนาดหน้าจอ และการบำรุงรักษาในอนาคต

2. การ Override หรือเปลี่ยนค่าเดิมของ framework

หากมีความจำเป็นต้องเขียนทับ class เดิมของ Bootstrap จริงๆ ก็สามารถทำได้เหมือนกัน แต่ควรจะศึกษา rules ของ class นั้นให้ดีก่อนว่าในหน้าจอขนาดเล็ก กลาง ใหญ่ มันมีผลกระทบมากน้อยแค่ไหน ถ้าไม่เปลี่ยนแปลงอะไรมากก็สามารถเขียนทับ หรือ override ลงไปตรงๆ ได้เลย ยกตัวอย่างหากเราต้องการใช้ jumbotron ซึ่งเป็น class นึงของ Bootstrap ในการสร้างเนื้อหาภายในเว็บไซต์ เราก็อาจจะเขียนได้ดังนี้

bootstrap jumbotron

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

override jumbotron

แต่ต้องอย่าลืมนะครับว่า web browser ทั้งหลายนั้นอ่าน CSS แบบบนลงล่าง นั่นหมายความว่าที่เราเขียนทับไปทั้งหมดต้องเรียกหลังจากที่เรียกไฟล์ CSS ของ Bootstrap แล้ว สรุปของหัวข้อนี้คือทำการเขียนทับ class เดิมที่ Bootstrap มีอยู่ ซึ่งเราอาจจะต้องศึกษาก่อนว่า class ที่ต้องการแก้ไขนั้นเขียนอะไรยังไงบ้าง การเขียนทับนั้นไม่ยากครับ แต่ไม่ควรเขียนทับพวก class ที่ใช้แสดงผลอย่าง row, col-xs-, col-sm-, col-md- หรือ col-lg- ทั้งหลายเพราะต้องใช้เวลามานั่งปรับสำหรับการแสดงผลในขนาดหน้าจออื่นๆ ด้วย

3. ใช้ Preprocessor อย่าง SASS, LESS

การใช้ SASS และ LESS จะทำให้ชีวิตในการเขียน CSS ของคุณง่ายขึ้น และเร็วขึ้นมาก คุณผู้อ่านอาจจะไม่ต้องเรียนรู้ทุกอย่างก็ได้ แค่เรียกใช้เฉพาะบางฟังก์ชั่นอย่างเช่น variable, color function และ mixins ก็จะทำให้เราสามารถเขียน responsive website พร้อมกับใช้ framework ได้อย่างไม่ยากเย็นอีกต่อไป ยกตัวอย่างการเขียนโค้ดในหัวข้อที่ 2 ครับ หากเราเขียนทับ class jumbotron ด้วย SASS ก็จะสามารถกำหนดตัวแปร พร้อมเขียนในรูปย่อได้ดังนี้

ซึ่งเวลา compile ออกมาแล้วก็จะได้เหมือนกับในหัวข้อที่ 2 แต่จะเห็นว่า syntax ในการเรียกใช้นั้นดูสวยงามเป็นระเบียบแล้วก็สามารถนำกลับมาใช้ใหม่ หรือแบ่งออกเป็นแต่ละไฟล์ได้สะดวกกว่ามาก และถ้าใครที่ชอบเขียน responsive website จากจอใหญ่ก่อนแล้วค่อยมานั่งปรับจากจอเล็กขึ้นมาอีกครั้งแบบผม ก็อาจจะใช้เทคนิคแบบเดียวกันได้ครับ คือกำหนดตัวแปรที่เก็บค่า media-query เอาไว้แล้วค่อยเรียกใช้จากเล็กไปใหญ่ ตัวอย่างข้างล่างอาจจะแสดงให้เห็นถึงวิธีการทำแบบคร่าวๆ แต่ถ้าเอาไปใช้ในงาน production grade จริงๆ ควรแยกเป็นไฟล์ให้ชัดเจนดีกว่าครับ

darken($purple, 10%) เป็น color function ที่ช่วยหาค่าสีที่มืดกว่าสีที่ระบุกี่ % ก็ว่ากันไป

ดังตัวอย่างจะเห็นว่าผมเพิ่มตัวแปรชื่อ $sm, $md และ $lg เข้ามาโดยกำหนดให้ค่าเป็นข้อความเหมือนเวลาที่เราเขียน media-query ด้วย CSS ปรกติจากนั้นก็ใส่ค่า min-width(ผมถนัดเริ่มแก้จากเล็กขึ้นมาใหญ่) โดยมีค่าตาม grid system ของ Bootstrap ถ้าใครใช้ framework ตัวอื่นก็อย่าลืมเปลี่ยนให้ตรงด้วยก็ดีครับ แล้วก็ทดสอบโดยการลองใช้กับ class ของปุ่ม btn-primary แทนที่จะเขียนเต็มๆ ยาวๆ หลายต่อหลายครั้งก็เปลี่ยนมาเรียกตัวแปรตามที่กำหนดไว้แล้วใส่ค่าการแสดงผลตามขนาดหน้าจอได้เลย คุณผู้อ่านที่มีโค้ดเยอะๆ อาจจะเห็นถึงความแตกต่างแล้วก็สะดวกมากกว่าการเขียนแบบ pure CSS ธรรมดาทั่วไป

สรุปแล้วการเขียน responsive website นั้นก็ขึ้นอยู่กับประสบการณ์แล้วก็วิธีการเขียนของแต่ละคน ซึ่งอาจจะมีเทคนิคการเรียกใช้ที่แตกต่างกันไป บางคนเขียนละเอียดกว่านี้เพราะต้องการเก็บแต่ละจุดให้เรียบร้อย ให้แสดงผลได้ชัดเจน บางคนที่ถืองานเยอะแบบผมก็เลือกที่จะใช้ CSS framework เข้ามาช่วยบางส่วน แล้วถ้าจุดไหนไม่เวิร์คหรือแสดงผลไม่ตรงตามที่ต้องการก็มาเขียนทับเพิ่มเข้าไปเล็กน้อย คุณผู้อ่านใครที่กำลังสนใจศึกษา SASS หรือวิธีการเขียน responsive website ในรูปแบบง่ายๆ ไม่ต้องซับซ้อนมาก สามารถเข้าไปที่ github ของ WhiteTail ซึ่งเป็นธีม WordPress ที่เขียนด้วย SASS (เป็นธีมที่ใช้งานอยู่ที่ท่านเห็นหน้าบล็อกนี้) เพื่อนั่งแงะนั่งแกะได้ตามสบายครับ

Jirayu Limjinda

ถ้าไม่รู้จักกัน บางทีคุณอาจจะไม่เข้าใจกับสิ่งที่ผมทำ.. กลับกัน ถ้าคุณรู้จักผมดี คุณจะไม่ต้องเอ่ยปากถามเลยว่าทำไม

ความคิดเห็นจากบุคคลอื่นๆ

แสดงความคิดเห็นของคุณที่นี่

loading, please wait..

loading, please wait..