คำแนะนำเกี่ยวกับ CSS `font-family`
(chrismorgan.info)- หากออกแบบเว็บโดยเชื่อชื่อฟอนต์เฉพาะมากเกินไป ดีไซน์อาจพังได้ตามแพลตฟอร์ม เครือข่าย และการตั้งค่าความปลอดภัย ดังนั้นควรเขียน
font-familyโดยตั้งอยู่บนสมมติฐานว่าจะมี generic family fallback - สำหรับโค้ด งานอาร์ตเวิร์ก หรือเลย์เอาต์ที่ต้องการการแสดงผลแบบความกว้างคงที่ ต้องใส่
monospaceไว้เสมอ และถ้าต้องการให้serifกับsans-serifรับประกันตระกูลฟอนต์ที่ต้องการ ก็ควรระบุไว้ด้วยเพื่อความปลอดภัย - การทำสแตกด้วยการไล่รายชื่อฟอนต์ที่น่าจะมีอยู่ในเครื่องยาว ๆ มักได้ประโยชน์ไม่มาก และ ค่าเริ่มต้นของ generic family ในเบราว์เซอร์อาจเลือกตัวที่ดีกว่าได้ด้วยซ้ำ
- เว็บฟอนต์ช้ากว่าการไม่มีเว็บฟอนต์ และยังสร้างปัญหาโหลดไม่สำเร็จรวมถึงทางเลือกแบบประนีประนอมของ
font-displayดังนั้นสำหรับคอนเทนต์ การใช้ ฟอนต์เริ่มต้นของผู้ใช้ ตรง ๆ ก็เป็นตัวเลือกที่ใช้งานได้จริง system-uiและui-*มีลักษณะเหมาะกับข้อความ UI สั้น ๆ มากกว่า จึงอาจไม่เหมาะกับคอนเทนต์ยาวและการรองรับภาษา และเสี่ยงหากใช้เป็นตัวแทนฟอนต์เริ่มต้นสำหรับคอนเทนต์
อย่าเชื่อชื่อฟอนต์มากเกินไป
- ไม่มี web-safe font ที่มีให้เหมือนกันบนทุกแพลตฟอร์มหลัก ดังนั้นไม่ควรสมมติว่าชื่อฟอนต์ใดชื่อหนึ่งจะใช้งานได้เสมอ
- เว็บฟอนต์ก็ไม่ใช่คำตอบที่แน่นอน
- รีซอร์สย่อยที่ไม่ได้ inline อาจโหลดไม่สำเร็จได้จากหลายเหตุผลทางเครือข่าย
- การโหลดฟอนต์เป็นพื้นที่ที่มีข้อกังวลด้านความปลอดภัย จึงอาจถูกบล็อกในบางสภาพแวดล้อม
- uBlock Origin มีปุ่มเฉพาะสำหรับปิดใช้งานฟอนต์จากระยะไกล
- โหมดประหยัดข้อมูลของบางเบราว์เซอร์อาจบล็อกการโหลดฟอนต์ และแม้กรณีที่ยังไม่บล็อก ก็ควรบล็อกด้วยซ้ำตามมุมมองนี้
- หากผู้ใช้ไม่อนุญาตให้เว็บไซต์เลือกฟอนต์เอง จะใช้งานได้เพียง generic family เท่านั้น
- หากใช้
document.fonts.load("1em my-web-font")ใน JavaScript Promise ที่คืนกลับมาอาจrejectได้- ในช่วง 6 ปีระหว่าง 2020–2025 มีเคสที่พังเพราะปัญหานี้ประมาณ 4 ครั้ง และในนั้น 2 ครั้งเกิดขึ้นในปี 2025
ต้องระบุตระกูล fallback เสมอ
- ถ้าต้องการข้อความแบบความกว้างคงที่ ต้องใส่
monospaceลงในfont-familyเสมอ- การขาด
monospaceอาจไม่ปรากฏให้ผู้ใช้ส่วนใหญ่เห็น แต่ในบางสภาพแวดล้อมอาจทำให้เลย์เอาต์หรืองานที่ตั้งใจไว้เสียไป - ตัวอย่างเช่น ASCII might fly? ของ Adel Faure ตอนเขียนบทความนี้ยังไม่มี
monospaceจึงอาจแสดงผลแบบไม่ใช่ความกว้างคงที่ได้
- การขาด
- สำหรับ
serifหรือsans-serifก็ควรใส่ไว้เช่นกันหากต้องการ fallback ของตระกูลฟอนต์ที่ต้องการ- ตัวอย่าง:
font-family: Arial, sans-serif; - ตัวอย่าง:
font-family: Times New Roman, serif; - ถ้าไม่ใส่ ระบบจะใช้ฟอนต์เริ่มต้น ซึ่งอาจเป็น serif หรืออาจเป็นอย่างอื่นไปเลยก็ได้
- ตัวอย่าง:
ลดการไล่รายชื่อฟอนต์ที่น่าจะติดตั้งอยู่
- การไล่ฟอนต์ที่น่าจะมีในระบบยาว ๆ เช่น
Arial,Helvetica,Helvetica Neue,Liberation Sans,Noto Sansโดยทั่วไปไม่ได้ช่วยมากนัก - โดยเฉพาะ Arial ผู้เขียนมองว่าไม่มีกรณีไหนที่เป็นตัวเลือกดีกว่า
sans-serif sans-serifอาจถูกตีความเป็นฟอนต์ที่ไม่แย่ไปกว่าฟอนต์ที่ระบุไว้ และยังมีโอกาสถูกเลือกเป็นฟอนต์ที่ดีกว่าด้วย- ตัวอย่างการประกาศฟอนต์แบบความกว้างคงที่ที่พบจริงมีรายการยาวเกินจำเป็น
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif- การประกาศนี้แย่กว่า
font-family: monospace, monospaceอย่างชัดเจน และmonospaceอาจถูกตีความเป็นฟอนต์ที่ไม่แย่ไปกว่ารายการทั้งหมดนี้
- ไม่จำเป็นต้องห้ามใช้ฟอนต์แบบมีชื่อที่ไม่ใช่เว็บฟอนต์ทั้งหมด แต่เหมาะจะมี ไม่เกินหนึ่งตัว
- Georgia) และ Times New Roman ต่างก็เป็น serif ใน Core fonts for the Web ของ Microsoft แต่มีคาแรกเตอร์ต่างกัน
- Georgia กว้างกว่า Times New Roman มาก ดังนั้นถ้าต้องการคุณลักษณะนี้เชิงสไตล์
font-family: Georgia, serifก็ถือเป็นตัวเลือกที่ยอมรับได้
- modernfontstacks.com และที่เก็บโค้ด มีไอเดียการเลือกฟอนต์ตามแพลตฟอร์ม
- อย่างไรก็ตาม มีการแนะนำฟอนต์แบบมีชื่อมากเกินไป และหลายตัวควรถูกตัดออกจะดีกว่า
- การจัดการกับ Courier New ผิดพลาดอย่างมาก และภาพประกอบดูเหมือนสร้างด้วย macOS Courier
ทางเลือกของการใช้แต่ generic family
- เมื่อคุณลดการไล่รายชื่อฟอนต์ที่ติดตั้งในเครื่องแล้ว ก็อาจกลับมาทบทวนได้ว่าเว็บฟอนต์จำเป็นจริงหรือไม่
- เว็บฟอนต์ช้ากว่าการไม่มีเว็บฟอนต์ และอาจสร้างปัญหาเรื่องการโหลด
- นี่จึงเป็นเหตุผลที่มี
font-display - แต่แทนที่จะต้องจัดการกับการประนีประนอมระหว่างช่วง block·swap การวาดใหม่ และ reflow ก็สามารถเลือกใช้ฟอนต์ที่ผู้ใช้มีอยู่แล้วตรง ๆ ได้
- นี่จึงเป็นเหตุผลที่มี
- แม้แต่
monospaceก็เลือกใช้เฉพาะ generic family ได้- ในอดีตค่าเริ่มต้นของ
monospaceไม่ค่อยดี โดยเฉพาะ Courier New#Courier_New) ของ Microsoft ที่ถูกดิจิไทซ์อย่างผิดพลาดจนดูเหมือนมีน้ำหนัก 200–250 มากกว่า 400 - ต่อมา Apple เปิดตัว Menlo) และในช่วงที่ค่าเริ่มต้น
monospaceของเบราว์เซอร์ยังไม่อัปเดต ผู้คนก็เริ่มใส่ Menlo ลงในฟอนต์สแตก - ปัจจุบันค่าเริ่มต้นของเบราว์เซอร์ดีขึ้นหมดแล้ว แม้จะไม่ได้ยอดเยี่ยมทุกกรณี แต่ก็ไม่ได้แย่อีกต่อไป
- ในอดีตค่าเริ่มต้นของ
- จึงสามารถทิ้งรายการอย่าง
Menlo, Monaco, Consolas, Bitstream Vera Sans Mono, Courier, Courier Newแล้วเหลือแค่monospaceได้ - การใส่
Courier Newลงในฟอนต์สแตกอย่างจงใจถูกประเมินในแง่ลบอย่างมาก
monospace, monospace และพฤติกรรมของเบราว์เซอร์
- หากระบุหรือใช้
font-family: monospace;แบบชัดเจนหรือโดยนัยfont-sizeเริ่มต้นอาจไม่ได้เป็น 100% แต่เป็น 81.25%- ผู้ใช้สามารถเปลี่ยนฟอนต์ generic family ขนาดตัวอักษรเริ่มต้น และขนาดตัวอักษรแบบความกว้างคงที่เริ่มต้นได้
- ถ้ามี family ตัวที่สองอยู่ในรายการ พฤติกรรมนี้จะไม่เกิดขึ้น
font-family: my-web-font, monospace;ใช้ได้font-family: monospace, monospace;ก็ใช้ได้- หรือจะกำหนด
font-sizeเองโดยตรงก็ได้
- Lightning CSS มีปัญหาที่ทำให้
monospace, monospaceพัง- อ้างอิงปัญหา: parcel-bundler/lightningcss#1221
- ตอนนี้จึงใช้
monospace, mชั่วคราว
- ปัญหานี้กระทบเฉพาะ
monospace - ผู้เขียนอยากผลักดันให้เบราว์เซอร์เลิกพฤติกรรมเรื่องขนาดของ
monospaceและน่าจะปรับค่าที่น่าจะเป็น 13px ให้ขึ้นมาเป็น 16px- สถานที่เสนออาจเป็น CSSWG
อย่าใช้ system-ui และ ui-* กับคอนเทนต์
- ฟอนต์ UI มีไว้สำหรับข้อความ UI สั้น ๆ ไม่ใช่สำหรับ คอนเทนต์ยาว
- ฟอนต์ UI อาจรองรับภาษาของคอนเทนต์ได้ไม่ดี
- macOS ดูจะไม่มีปัญหามากในจุดนี้ แต่ Windows ไม่เป็นเช่นนั้นตามมุมมองนี้
- ผลลัพธ์คืออาจเกิด กรณีที่ผู้ใช้ CJK ได้เห็นฟอนต์ความกว้างคงที่ที่ไม่ดี
- ผู้ใช้บางคนตั้งใจเลือกฟอนต์ระบบ UI ที่ดูตลก ๆ ไว้เอง และว่ากันว่าพบได้ค่อนข้างบ่อยในบางคอมมูนิตี้ Android
- ถ้าใช้
system-uiคอนเทนต์ก็อาจหน้าตาเป็นแบบนั้นด้วย
- ถ้าใช้
- w3c/csswg-drafts issue #3658 พูดถึงปัญหาหลายอย่างของ
system-uiและสรุปว่าsystem-uiถูกนำไปใช้ผิดวัตถุประสงค์อย่างกว้างขวาง - mdn/content issue #41244 เพิ่มโน้ตเตือนเรื่องการใช้งานมากเกินไปใน MDN
system-uiและui-*ถูกใช้เหมือนเป็น proxy เพื่อให้ได้ฟอนต์เริ่มต้นที่ดีกว่า แต่การใช้แบบนี้ไม่ดี- ผู้เขียนมองว่า
system-uiเป็นความผิดพลาด- ควรเหลือเพียง
-apple-systemและให้BlinkMacSystemFontเปลี่ยนมาเป็นตัวนั้น - ตอนที่ทำให้เป็นมาตรฐาน แพลตฟอร์มอื่นยังไม่มีแนวคิดที่เทียบเท่ากันและมีประโยชน์ ส่วนตอนนี้บางแพลตฟอร์มจึงค่อยมีขึ้นมา
- ผู้เขียนมองว่าการใช้งานส่วนใหญ่เป็นการใช้ผิดวัตถุประสงค์เพื่อเลี่ยงปัญหาที่เบราว์เซอร์ไม่ยอมอัปเดตค่าเริ่มต้นเก่าของ generic family
- ควรเหลือเพียง
ui-serif,ui-sans-serif,ui-monospaceและโดยเฉพาะui-roundedถูกมองว่าเป็นความผิดพลาดชัดเจนที่ควรถูกถอดออก- นอกสภาพแวดล้อมของ Apple ก็ไม่ควรคาดหวังว่าจะถูกแมปไปยังฟอนต์ใดเลย
- แนวคิดนี้มีอยู่เฉพาะบนแพลตฟอร์ม Apple จึงไม่ควรถูกใส่ไว้ในมาตรฐาน
- หาก Apple จะให้มาก็ควรเป็นรูปแบบมีคำนำหน้า
-appleเหมือน-apple-system
- มีกรณีใช้งาน
system-uiกับเว็บแอปที่สมเหตุสมผลอยู่บ้าง แต่ความรู้สึกคือในทางปฏิบัติแทบทั้งหมดถูกใช้ผิดวัตถุประสงค์ และการแทรกแซงเพื่อนำออกก็อาจไม่ใช่เรื่องเลวร้าย
1 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
ที่ https://lindenii.org เลือกแนวทาง ไม่กำหนด
font-familyไปเลย เพื่อเคารพฟอนต์เริ่มต้นที่ผู้ใช้เลือกไว้ในเบราว์เซอร์โดยส่วนตัวฉันชอบ sans-serif มากกว่า แต่ถ้าผู้ใช้ตั้งค่า serif เป็นค่าปริยายอยู่ ก็ไม่เห็นเหตุผลว่าทำไมต้องไปเขียนทับ
แต่ในกรณีที่ต้องใช้ตัวอักษรที่ฟอนต์ส่วนใหญ่ไม่มี เช่น https://runxiyu.org/soc/ta/ ก็เลี่ยงไม่ได้ที่จะต้องใส่เว็บฟอนต์ และผลก็คือข้อความส่วนที่เหลือทั้งหมดถูกบังคับให้เป็น sans-serif แทนค่าปริยายของผู้ใช้ด้วย
นอกจากจะห่ออักขระแปลก ๆ แต่ละตัวด้วยอะไรอย่าง
<unusual-character>ก็ไม่แน่ใจว่ามีวิธีที่ดีกว่านี้ไหม และคงจะดีถ้ามีวิธีกำหนดอะไรอย่าง “ฟอนต์สำหรับโค้ดที่ผู้ใช้ชอบ” ได้ขอบคุณสำหรับเทคนิค
monospace, monospaceด้วย เรื่องความต่างของขนาดนี่ทำให้งงพอสมควรเว็บไซต์ที่ทำรายการอักขระ Unicode ก็จัดการแบบนั้น
monospaceเคยมีคนชมดีไซน์เว็บนี้เหมือนกัน แต่จริง ๆ คือเอาธีม Zola มาใช้แล้วลด CSS กับองค์ประกอบคัสตอมลงเท่านั้น ดังนั้นโดยเฉพาะกับหน้าเว็บส่วนตัว ฉันค่อนข้างเห็นด้วยกับประเด็นของบทความนี้
font-familyเลย มองว่าคงจะดีกับผู้ใช้มากกว่าถ้าฟอนต์เริ่มต้น ตามค่าปริยายจริง ๆ ของเบราว์เซอร์เปลี่ยนจาก serif เป็น sans-serifผู้ใช้ส่วนใหญ่ไม่ได้เลือกฟอนต์เอง จึงไม่มีทางแยกได้ว่าอะไรคือ “ฟอนต์ที่ผู้ใช้เลือก” กับ “ฟอนต์ค่าปริยายของเบราว์เซอร์”
ถึงฉันจะชอบ serif แต่ทุกวันนี้คนส่วนใหญ่น่าจะชอบ sans-serif มากกว่า
ในสภาพแวดล้อมของฉัน ฉันบล็อกไม่ให้หน้าเว็บกำหนดฟอนต์ และก็ไม่ได้ติดตั้งฟอนต์ CJK ที่ดี ๆ ด้วย
เพราะถึงจะแสดงกล่องเขียนว่า “4E2D” แทนตัวอักษรจีน สำหรับฉันมันก็มีความหมายไม่ต่างจากอักษรภาพนั้นอยู่ดี
ระบบ fallback ฟอนต์แบบนั้นทำได้ดีแล้ว แต่น่าเสียดายที่ไม่มีวิธีระบุชื่อฟอนต์ค่าปริยายโดยตรง
แต่ถ้าใช้ JavaScript ดู
getComputedStyle(document.documentElement).fontFamilyในเอกสารว่าง จะเห็นเป็น"serif"หรือ"sans-serif"ตามการตั้งค่าฟอนต์ขั้นสูงของฉันไม่แน่ใจเหมือนกันว่า “ฟอนต์ที่ชอบสำหรับโค้ด” หมายถึงอะไรกันแน่ ดูเหมือนจะหมายถึงอย่างอื่นที่ไม่ใช่
monospaceบทความนี้ยังเป็น ร่าง อยู่ เลยยังไม่สมบูรณ์มาก และดูเป็นการเอาเศษชิ้นส่วนจากหลายรูปแบบมาปะปนกันอยู่สองสามอย่าง จึงค่อนข้างรก
สุดท้ายแล้วน่าจะยาวเกินหนึ่งหน้า และอาจออกมาในรูปแบบที่ต่างจากตอนนี้มาก บางส่วนอาจเป็นลายมือ ภาพวาดมือ หรือเลย์เอาต์ทำมือด้วย
ช่วงนี้กลับไปโฟกัสกับการทำ lightweight markup language แทน ซึ่งตอนนี้เกือบใช้งานได้แล้ว แบบที่รู้สึกว่า 90% สุดท้ายนั้นไม่เคยเหลือน้อยลงเลย
จากนั้นค่อยกลับมาเขียนบทความและเผยแพร่อีกที
ตรงที่บอกว่าใช้
font-family: monospace;แล้วfont-sizeอาจถูกตั้งค่าปริยายเป็น 81.25% แทน 100% แต่ถ้ามีฟอนต์ตัวที่สองในรายการจะไม่เกิดปัญหานั้น น่าสนใจมากแปลว่า
font-family: my-web-font, monospace;หรือfont-family: monospace, monospace;ใช้ได้ แต่ดูเหมือน MDN ยังไม่ได้บันทึกเรื่องนี้ไว้ในเอกสารตอนนี้เลยสงสัยว่ามีใครอธิบายได้ไหมว่าทำไมถึงเป็นแบบนี้ และทำไมถึงยังไม่ได้ถูกทำเป็นเอกสาร
เลยกลายเป็นสาเหตุหนึ่งของความไม่สอดคล้องกันระหว่างเบราว์เซอร์
ถึงจะเป็นร่าง แต่ก็มี การซ้ำแบบแปลก ๆ ที่เหมือนคัดลอกทั้งเซกชันแล้ววางซ้ำเป็นครั้งที่สอง
โดยเฉพาะเพราะมันให้ความรู้สึกเหมือนบอกว่าฟอนต์ fixed-width ที่ฉันชอบนั้นไม่ค่อยดี เลยยิ่งสะดุดตา
ถ้าอ่านละเอียดจะเห็นว่ากำลังแยกแยะว่าอะไรควรเป็นคำแนะนำที่ชัดเจน และอะไรควรใช้จุดยืนที่ละเอียดอ่อนกว่านั้น จึงมีความขัดแย้งเล็ก ๆ อยู่บ้าง
อยากรู้ว่าฟอนต์ fixed-width ที่คุณชอบคืออะไร
เหตุผลหนึ่งที่ทำให้ไม่อยากใช้แค่
serifกับsans-serifคือฟอนต์ serif ค่าปริยายมักเป็น Times ซึ่งบางครั้งก็รู้สึกว่าไม่ค่อยดีเพราะแบบนั้นฉันจึงกำลังย้ายฟอนต์เนื้อหาจาก serif ไปเป็น sans-serif
เกี่ยวกับคำแนะนำว่า “อย่าไล่รายชื่อฟอนต์ที่น่าจะมีติดตั้งในระบบ” และ “แม้แต่ fixed-width ก็ควรใช้แค่ generic family ถ้าเป็นไปได้” บนเว็บไซต์ของฉันตั้งค่าไว้ประมาณนี้
ใช้
--sans-serif: Adwaita Sans, Adwaita Sans Bundled, Inter, sans-serif;และ--monospace: Iosevka, Iosevka Web, Cascadia Code, monospace;เจตนาคือ ถ้า GNOME มี Adwaita Sans ติดตั้งอยู่แล้ว ก็จะใช้ฟอนต์ระบบและไม่ต้องดาวน์โหลดเว็บฟอนต์ แต่ถ้าไม่มี ก็จะใช้เว็บฟอนต์
Adwaita Sans Bundledและระหว่างโหลดจะ fallback ไปที่ Inter กับsans-serifซึ่งมี metrics ใกล้เคียงกันฝั่ง fixed-width ก็เหมือนกัน คือถ้าระบบมี Iosevka ก็ใช้ไปเลย ถ้าไม่มีค่อยใช้เว็บฟอนต์
Iosevka Webและระหว่างโหลด fallback ไปที่ Cascadia Code กับmonospaceยังคิดเผื่อด้วยว่า
monospaceบน Windows เป็น Consolas ซึ่งไม่ค่อยถูกใจ และ Windows รุ่นใหม่ก็มักติดตั้ง Cascadia Code มาแล้วฉันรู้ว่า Cascadia Code มี metrics ต่างจาก Iosevka มาก ซึ่งน่าจะเป็นข้อเสีย แต่อยากรู้ว่าคนอื่นมองแนวทางนี้อย่างไร
เป็นบทความที่อ่านลื่นดี และฉันไม่เคยรู้เทคนิค
monospace, monospaceมาก่อนเลยมีปัญหาเรื่องฟอร์แมตเล็กน้อยคือ ในเบราว์เซอร์ของฉัน ข้อความในย่อหน้า
.unimportantอยู่บนพื้นหลังสีเหลืองก็จริง แต่กลับไปซ้อนอยู่หลังข้อความของแถบ.statusที่ตรึงไว้ ทำให้ตอนเลื่อนผ่านช่วง.unimportantดูแปลก ๆดูเหมือนจะมีปัญหาคล้ายกันกับ ลายน้ำ DRAFT แบบทแยงด้วย