สร้างเว็บไซต์ที่ดูดีด้วย CSS เท่าที่จำเป็น (2023)
(thecascade.dev)- นักพัฒนาจำนวนมากต้องเจอกับปัญหาที่ไม่จำเป็นเพราะ การออกแบบ CSS ที่มากเกินไป
- เพียงมี global styles ขั้นต่ำ ก็สามารถสร้างหน้าเว็บที่ดูสะอาดตาและรองรับการแสดงผลแบบ responsive ได้
- การจำกัดขนาดและกำหนดให้แสดงผลแบบ block สำหรับองค์ประกอบ รูปภาพ, SVG, วิดีโอ ก็ช่วยแก้ปัญหาเลย์เอาต์พื้นฐานได้
- ใช้ฟอนต์ system-ui พร้อมกำหนด ระยะห่างบรรทัด และจำกัดความกว้างสูงสุดของย่อหน้าอย่างเหมาะสม จะช่วยให้การอ่านดีขึ้น
- ควรใช้พร็อพเพอร์ตี color-scheme เพื่อรองรับสภาพแวดล้อมที่ผู้ใช้ตั้งค่าไว้ เช่น dark mode ของระบบปฏิบัติการ
สร้างเว็บไซต์ที่ดูดีด้วย CSS เท่าที่จำเป็น
ปัญหาของ CSS ที่ซับซ้อนเกินไปและแนวทางที่ควรใช้
- หลายคนมัก ทำโครงสร้าง CSS ของเว็บไซต์ให้ซับซ้อนเกินความจำเป็น
- ทั้งที่จริงแล้ว CSS เพียงเล็กน้อยก็เพียงพอสำหรับการสร้าง หน้าเว็บ responsive ที่ดูดีและยึดพื้นฐานที่สำคัญ
HTML พื้นฐานและการจัดการรูปภาพ
-
แม้จะเขียนแค่ HTML พื้นฐาน เว็บไซต์ก็ยังมี ความ responsive ขั้นพื้นฐาน อยู่แล้ว
-
แต่อาจเกิดปัญหา overflow ของเลย์เอาต์ จากรูปภาพได้ จึงควรใช้ CSS ด้านล่าง
img { max-width: 100%; display: block; } -
หากเกิดปัญหาในองค์ประกอบ SVG, video ในลักษณะเดียวกัน ก็สามารถขยายการใช้งานได้ดังนี้
img, svg, video { max-width: 100%; display: block; }
การปรับปรุง typography
-
ฟอนต์เริ่มต้นของเบราว์เซอร์มัก ดูธรรมดาเกินไปในเชิงดีไซน์
-
สามารถใช้ system-ui เป็น font family เพื่อเลือกใช้ ฟอนต์ระบบพื้นฐานที่เหมาะกับแต่ละแพลตฟอร์ม
-
ขนาดฟอนต์และระยะห่างบรรทัดเริ่มต้นมัก ค่อนข้างเล็กเล็กน้อย จึงแนะนำให้ปรับดังนี้
body { font-family: system-ui; font-size: 1.25rem; line-height: 1.5; } -
แค่ตั้งค่านี้ก็ช่วยให้ดีขึ้นอย่างชัดเจนเมื่อเทียบกับ ค่าเริ่มต้นของเบราว์เซอร์
การรองรับ dark mode
-
ผู้ใช้จำนวนมากนิยม dark mode ดังนั้นการใช้พร็อพเพอร์ตี color-scheme ที่อิงค่าจากระบบปฏิบัติการจึงมีประโยชน์
html { color-scheme: light dark; } -
พร็อพเพอร์ตีนี้จะทำให้ user agent style สะท้อน ธีมที่ระบบต้องการ โดยอัตโนมัติ
-
สามารถกำหนดผ่านแอตทริบิวต์ของแท็ก HTML ได้เช่นกัน
<html lang="en" color-scheme="light dark"></html> -
นอกจากอิงค่าที่ระบบต้องการแล้ว การเปิดให้ผู้ใช้ เลือก color scheme ได้เอง ก็ถือเป็น best practice ที่ดีเช่นกัน
การจำกัดความกว้างของคอนเทนต์
-
ความยาวของย่อหน้าเนื้อหา เป็นปัจจัยสำคัญที่ส่งผลต่อการอ่านอย่างมาก
-
โดยทั่วไปควรกำหนดให้ เนื้อหาหลักแสดงผลประมาณ 45~90 ตัวอักษรต่อบรรทัด จึงจะเหมาะสมที่สุด
-
สามารถปรับปรุงการอ่านได้ด้วยการจำกัดความกว้างสูงสุดขององค์ประกอบ
mainดังนี้main { max-width: min(70ch, 100% - 4rem); margin-inline: auto; } -
ฟังก์ชัน
min()จะเลือกค่าที่น้อยกว่าระหว่าง70chและ100% - 4rem -
margin-inline: autoจะช่วย จัดกึ่งกลางในแนวนอน -
หากต้องการ ก็สามารถใช้คลาส .container หรือ .wrapper แทน main ได้
ตัวอย่าง CSS ขั้นต่ำฉบับสมบูรณ์
-
เมื่อนำทั้งหมดมารวมกัน ก็จะได้ชุด CSS ขั้นต่ำตามด้านล่าง ซึ่งเพียงพอสำหรับสร้างเว็บไซต์ที่เสถียรได้
html { color-scheme: light dark; } body { font-family: system-ui; font-size: 1.25rem; line-height: 1.5; } img, svg, video { max-width: 100%; display: block; } main { max-width: min(70ch, 100% - 4rem); margin-inline: auto; }
สรุปและการต่อยอด
- ตัวอย่างข้างต้นสามารถนำไปใช้ได้ทันทีในฐานะ จุดเริ่มต้นที่เบา หรือสำหรับหน้าเว็บขนาดเล็ก
- ในกรณีส่วนใหญ่ ควรต่อยอดจากพื้นฐานนี้ด้วย สไตล์เพิ่มเติม ตามความเหมาะสม
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
system ui font familyซึ่งยังใช้ได้อยู่ในบางภูมิภาคhttps://infinnie.github.io/blog/2017/systemui.html
stligature ของฟอนต์นั้นมากจนไม่อยากรับคำแนะนำเรื่องฟอนต์จากเว็บไซต์นั้นmax-widthตัวเดียว? กลุ่มเป้าหมายคือทุกคนที่ทำโฮมเพจส่วนตัวอันนี้ผิด ไวยากรณ์ที่ถูกต้องคือ
ผู้เขียนบทความใช้ถูกในบางตัวอย่าง แต่ตัวอย่างแรกเขียนผิด เลยอาจทำให้สับสนได้
แบบนี้ คือทั้ง
timesและTimes New Romanก็ดูเหมือนจะใช้ได้โดยไม่ต้องใส่เครื่องหมายอัญประกาศ เลยสงสัยว่าเป็นข้อยกเว้นเพราะเป็นฟอนต์เก่าหรือ CSS จับคู่ชื่อแบบยืดหยุ่นอยู่แล้วอันนี้ ผมแทบอยากเรียกมันว่าเงินเก่าเก็บเลย
https://meyerweb.com/eric/books/
html/cssเองก็ไม่สะดวกเรื่องเลย์เอาต์และการปรับแต่ง ธีมของ Astro ก็ไม่ค่อยมีสำหรับบล็อกส่วนตัว ส่วนใหญ่เป็นแนวองค์กรหรือไม่ก็หวือหวา เรื่องพวกนี้ทำให้ย้อนมาคิดอีกทีว่าทำไมการออกแบบเว็บไซต์มันถึงยากขนาดนี้ นักพัฒนาเว็บตามกระแสนี้กันทันได้อย่างไร ทั้งเฟรมเวิร์ก คอมโพเนนต์ และดีเพนเดนซีจำนวนมหาศาลfranklin.jlเหมาะมากในแง่ของงานคณิตศาสตร์ การจัดการโค้ดอินไลน์ และความเรียบร้อยสะอาดตาcontent-width, ฟอนต์ใหญ่ และ line-height มากเกินไป ทุกวันนี้หลายเว็บใช้ฟอนต์ใหญ่กับระยะห่างบรรทัดกว้างเกินจนต้องเลื่อนหน้าจอเยอะเกินไป ขนาดฟอนต์เริ่มต้นของเบราว์เซอร์ก็เหมาะกับระบบอยู่แล้ว ดังนั้นปล่อยขนาดฟอนต์ไว้แบบเดิมแล้วให้การซูมจัดการจะดีกว่า0img { max-width: 100%; }การตั้งค่านี้ต้องใช้คู่กับ
height: autoเสมอ ไม่อย่างนั้นสัดส่วนรูปจะเพี้ยนimg, svg, video { max-width: 100%; }ใน Chrome 141 การคำนวณ
autoจะผิดเพี้ยนเพราะปัญหา width/height ขององค์ประกอบ SVG ที่ซ้อนกัน ชั่วคราวควรใช้svg:where(:not(svg svg))ฟอนต์
system-uiไม่ใช่แค่ตัวแทนของsans-serifแบบง่าย ๆ ถ้าเอาฟอนต์ UI ของระบบมาใช้กับเนื้อหาหลัก ในบางคู่ของระบบปฏิบัติการ/ภาษา มันอาจอ่านยากจนแทบใช้งานไม่ได้ ถ้าต้องการsans-serifก็ควรใช้sans-serifไปเลยขนาดฟอนต์เริ่มต้นค่อนข้างเล็กนิดหน่อย ประมาณ 18~20px (
1.25rem) กำลังดี แต่บนหน้าจอเล็กไม่ควรเกิน1remมากนักโดยทั่วไปแนะนำ
line-height1.5~1.7 แต่ 1.7 กว้างเกินไปสำหรับจอเล็ก 1.4~1.5 จะพอดีกว่า และปรับตามขนาดหน้าจอได้ในช่วง 1.4~1.6font-family: System UI;นี่เป็นข้อผิดพลาดทางไวยากรณ์ชัดเจน แค่ตรวจสไตล์ชีตก็เห็นได้ทันที
การแยกธีมมืด/สว่างของระบบออกจากธีมของเว็บเป็นความคิดที่ดี Firefox ตั้งค่าเริ่มต้นให้เนื้อหาตามธีมของระบบ และก็ปรับแยกได้เช่นกัน
main { max-width: min(70ch, 100% - 4rem); margin-inline: auto; }อันนี้หมายถึงมีระยะขอบอย่างน้อยประมาณ 2rem (ถ้ารวม body margin เริ่มต้นก็จะเป็น 2rem+8px) ซึ่งมากเกินไปและตำแหน่งที่เอาไปใช้ก็ดูไม่ค่อยเหมาะ ถ้าจะใช้กับ
mainการใช้ padding จะสมเหตุสมผลกว่า เช่นแต่ในทางปฏิบัติ
headerหรือfooterก็มักต้องการระยะขอบด้านข้างแบบเดียวกันอยู่ดี ดังนั้นการปรับ margin ของbodyจะเหมาะกว่าวิธีนี้ลดระยะขอบจากราว ~40px ลงมาเหลือระดับ 16px ได้