ควรกำหนด font-size
โดยใช้หน่วยแบบ relative (%, em, rem) ไม่ใช่หน่วยแบบ absolute (px, pt) แต่ถึงกระนั้น การกำหนด font-size
ในการทำเว็บก็ยังคงเป็นปัญหาสำหรับหลายๆ คน อยู่ดี
ลักษณะที่เหมือนกันอย่างหนึ่งของหน่วยแบบ relative ก็คือ ค่าของมันจะขึ้นอยู่กับ element ที่เป็น parent อย่างไรก็ตาม ทั้ง %, em, rem ก็ยังคงมีความแตกต่างกันอยู่ดี
- Percentใช้ได้กับ property ทั่วๆ ไป อย่าง
width
,height
,line-height
รวมไปถึงfont-size
สมมติเรากำหนดwidth:50%;
จะได้ว่า element นี้ จะมีความกว้างเพียงแค่ครึ่งเดียวของ element ที่เป็น parent ของมัน - Emคล้ายกับ % เพียงแต่ค่าของ em จะถูกนำไปเทียบกับค่า font-size ของ element ที่เป็น parent ของมันเสมอ โดย 1em จะมีค่าเท่ากับ 1เท่า หรือ 100% นั่นเอง สมมติว่าเรากำหนด
font-size
ของ element ที่เป็น parent ให้เป็น 15px จะได้ว่าwidth:10em;
มีค่าเท่ากับ 15×10 = 150px อย่างไรก็ตาม เราอาจพบปัญหาหากมี element ซ้อนกันเยอะๆ เพราะ 1em ของ element หนึ่ง อาจมีค่าไม่เท่ากับ 1em ของอีก element หนึ่ง ที่อยู่คนละระดับชั้นกัน - Remคล้ายกับหน่วย em เพียงแต่มันจะไปเทียบขนาดกับ
font-size
ของ<html>
เสมอ ซึ่งต่างจาก em ที่จะเทียบกับ element ที่เป็น parent ของมัน ข้อดีของการใช้ rem ก็คือ เราจะไม่เจอปัญหาเหมือนกับการใช้ em แต่การใช้ rem ก็มีข้อเสียเหมือนกันเวลานำไปใช้กับส่วนย่อยต่างๆ ภายในกล่องเนื้อหาเพราะหากเรามีการเปลี่ยนfont-size
ที่กล่องนั้นๆ แล้วล่ะก็ ส่วนย่อยต่างๆที่กำหนดfont-size
ด้วย rem ก็จะไม่เปลี่ยนขนาดตาม
กำหนด font-size อย่างไรให้เหมาะสม ?
จากคุณสมบัติของทั้ง 3 หน่วย ข้างต้น ทำให้เราสามารถนำมาประยุกต์ใช้ในการทำเว็บได้ดังนี้
- 1. ใช้หน่วย % ที่
html
จริงๆ แล้วเราจะเลือกใช้หน่วย % หรือ em ก็ได้ ที่html
แต่ที่แนะนำให้ใช้เป็น % ก็เพราะว่าจะได้ไม่มีปัญหาขนาดตัวอักษรผิดเพี้ยนใน IE เวอร์ชันเก่าๆ ส่วนสาเหตุที่ต้องมากำหนดfont-size
ที่html
เลยก็เพื่อที่จะรองรับการใช้หน่วย rem นั่นเอง - 2. ใช้หน่วย em ที่
body
ต่อมาให้เรากำหนดfont-size
ที่body
โดยใช้หน่วย em ในส่วนนี้ให้เรากำหนดเป็นขนาดที่เราใช้เยอะที่สุดในหน้าเว็บเพื่อที่จะลดการเขียนโค้ดให้น้อยที่สุด (หากเป็นหน่วย px ก็มักจะเป็น 13px หรือ 14px สำหรับเว็บภาษาไทย) - 3. ใช้หน่วย rem ที่กล่องต่างๆมาถึงจุดนี้ ตัวหนังสือทั่วๆ ไป ก็จะมีขนาดตามที่เรากำหนดไว้ที่
body
สมมติว่าเราจะสร้างกล่องอะไรขึ้นมาสักกล่องหนึ่ง เช่น กล่องข่าวล่าสุด กล่องข่าวยอดนิยม หรือ กล่องค้นหา แล้วเราอยากให้กล่องดังกล่าว มีขนาดตัวหนังสือที่ต่างจากbody
ให้เรากำหนดfont-size
ของกล่องๆ นี้ โดยใช้หน่วย rem ไม่ใช่ em เพราะเราไม่อยากมาพะวงกับปัญหาของ em หากมีการนำกล่องนี้ไปใส่ไว้ในกล่องอื่นๆ อีกที - 4. ใช้หน่วย em ที่ ส่วนย่อยต่างๆ ภายในกล่องสำหรับส่วนต่างๆ ภายในกล่องไม่ว่าจะเป็น
header
,footer
หรือp
ให้เราใช้หน่วย emเสมอ เพราะขนาดของมันจะได้เทียบกับfont-size
ที่เรากำหนดเอาไว้ที่ตัวกล่อง หากเราต้องการให้กล่องไหนมีตัวหนังสือใหญ่ขึ้นหรือเล็กลง เราก็แค่ปรับfont-size
ของตัวกล่องนั้นๆ แล้วขนาดตัวหนังสือขององค์ประกอบต่างๆ ภายในกล่องก็จะปรับเปลี่ยนตามในสัดส่วนเดิมโดยอัตโนมัติ
1. กำหนด font-size ที่ html ให้เป็น %
html { font-size: 62.5%; /* เพื่อให้ 1rem มีค่าประมาณ 10px */ }
การกำหนด font-size ให้เป็น 62.5% จะทำให้การใช้หน่วย rem นั้นง่ายขึ้นมาก เพราะโดยปกติแล้ว ขนาดตัวอักษรแบบ default นั้นจะอยู่ที่ประมาณ 16px
62.5% ของ 16px = 10px นั่นคือ 1rem = 10px
2. กำหนด font-size ที่ body ด้วย em
ต่อมาให้เรากำหนด font-size
ให้เป็นขนาดที่เราใช้บ่อยที่สุดในหน้าเว็บ สมมติเราชอบขนาด 14px ก็ให้เรากำหนดเป็น 1.4em ได้เลย (จริงๆ แล้วในส่วน body
นี้เราจะใช้ em หรือ rem ก็ได้ แต่แนะนำให้ใช้ em เพราะจะเขียนโค้ดสั้นกว่า)
body { font-size: 1.4em; /* มีค่าประมาณ 14px */ }
สาเหตุที่ต้องกำหนด font-size
ที่ body
ให้ตรงตามขนาดที่เราใช้บ่อยที่สุดก็เพื่อที่จะทำให้เราเขียนโค้ดน้อยที่สุด เราจะเขียนโค้ด font-size
เพิ่มอีกก็ต่อเมื่อเราต้องการตัวหนังสือในขนาดที่ต่างจากนี้เท่านั้น
3. กำหนด font-size ที่กล่องเนื้อหาด้วย rem
ในการกำหนดขนาดตัวหนังสือให้กับกล่องเนื้อหา ให้เราใช้หน่วย rem เสมอ โดยขนาดที่จะกำหนดนั้นให้ยึดจากขนาดของตัวหนังสือ “ปกติ” ภายในกล่องนั้นๆ เป็นหลัก เช่น เนื้อหาที่ mark up ด้วย <p>
เป็นต้น สมมติว่ากล่องนี้เป็นกล่องค้นหาธรรมดาๆ ไม่ได้ต้องการให้โดดเด่นอะไร เราอาจกำหนดให้มีค่าขนาดเป็น 1.4rem เท่ากับ body
ไปเลยก็ได้
.search { font-size: 14px; /* กรณียังไม่รองรับ rem */ font-size: 1.4rem; }
rem นั้น จะไช้ได้ตั้งแต่ IE เวอร์ชัน 9 เป็นต้นไป ดังนั้นก่อนที่จะใช้ rem ให้เราใส่ font-size
ในหน่วย px เอาไว้ด้วยเสมอ แต่ถ้าใครใช้ Sass อยู่แล้ว เราก็อาจเขียน mixin ง่ายๆ ขึ้นมาช่วยก็ได้ แบบนี้
@mixin font-size ($size) { font-size: $size + px; font-size: ($size / 10) + rem; } .search { @include font-size(14); }
แต่ถ้ากล่องที่เราจะสร้างนั้น เป็นกล่องไฮไลท์ที่เราอยากให้ตัวหนังสือมีขนาดใหญ่กว่าปกติ ก็ให้เรากำหนดขนาดที่ต้องการไปที่ตัวกล่องเหมือนเดิม
highlight { font-size: 20px; font-size: 2.0rem; }
4. กำหนด font-size ที่ส่วนย่อยภายในกล่องด้วย em
สำหรับองค์ประกอบต่างๆ ภายในกล่องเนื้อหา ให้เราใช้ em เสมอ จากตัวอย่างก่อนหน้านี้ ที่เราจะสร้างกล่องไฮไลท์ ให้เรากำหนด font-size
ในส่วนของ headings, paragraph และ footer ด้วย em แบบนี้
.highlight { font-size: 20px; font-size: 2.0rem; } .highlight > h2 { font-size: 1.5em; /* 20x1.5 = 30px */ } .highlight > p { font-size: 1em; /* 20x1 = 20px */ } .highlight > footer { font-size: 0.8em; /* 20x0.8 = 16px */ }
แต่เพื่อความสะดวกในการเขียนโค้ด เราอาจสร้างสไตล์กลางๆ สำหรับกล่องเนื้อหาขึ้นมารอไว้เลย เราจะได้เขียนสไตล์เพิ่มเฉพาะเวลาที่กล่องนั้นๆ มีอะไรพิเศษจริงๆ เท่านั้น แบบนี้
.block { font-size: 14px; font-size: 1.4rem; /* ขนาดตัวหนังสือโดยรวมของกล่อง */ } .block > h2 { font-size: 1.5em; /* ใหญ่กว่าปกติครึ่งหนึ่ง */ } .block > p { font-size: 1em; /* ขนาดปกติ */ } .block > footer { font-size: 0.8em; /* เล็กกว่าปกติเล็กน้อย */ }
ต่อไปนี้ เวลาเราจะสร้างกล่องอะไรขึ้นมาให้เราใส่ class “block” เอาไว้ด้วยเสมอ
<div class="highlight block"></div>
หากเราอยากให้ขนาดโดยรวมของกล่องนั้นมากกว่า 14px เราก็แค่เขียนสไตล์เพิ่มเข้าไปแบบนี้
.highlight{ font-size: 20px; font-size: 2.0rem; }
จัดการ font-size โดยรวมด้วย Sass
หากงานของเรามีขนาดใหญ่พอสมควรหรือมีคนทำร่วมกันหลายคน เราอาจพบปัญหาเกี่ยวกับการกำหนด font-size
ที่มีความหลากหลายจนควบคุมได้ลำบาก ในกรณีนี้ เราอาจใช้ Sass เข้ามาช่วย ลองดูตัวอย่างโค้ดต่อไปนี้
/* รวบรวม font-size ของทุกๆ กล่องเนื้อหาเอาไว้ที่ส่วนนี้ พร้อมกับตั้งชื่อให้สื่อความหมาย */ $fontSize: ( 'highlight': 20, 'search': 14 ); /* สร้าง function สำหรับใช้ดึงค่า font-size ตามชื่อกล่องที่ระบุ */ @function getFontSize($block) { @return map-get($fontSize, $block); } /* สร้าง mixin สำหรับการกำหนด font-size โดยใช้หน่วย rem */ @mixin font-size ($size) { font-size: $size + px; font-size: ($size / 10) + rem; }
จากนี้ไป เวลาเราจะกำหนด font-size
ให้กับกล่องอะไรก็ตาม ให้เราทำผ่าน function ที่ใช้ดึงค่า font-size
ที่เราได้กำหนดไว้เสมอ แบบนี้
.highlight{ @include font-size(getFontSize('highlight')); } .search{ @include font-size(getFontSize('search')); }
เพียงเท่านี้ เราก็จะรู้หมดว่า font-size
ทั้งหมดของงานมีขนาดไหนบ้าง ยิ่งถ้าเราทำงานร่วมกับคนอื่นๆ เราก็จะรู้ด้วยว่าเค้าได้เพิ่มขนาดไหนเข้ามา จะเห็นว่าการจัดการ font-size
ที่ดี นอกจากจะช่วยทำให้โค้ดสั้นลงแล้ว ยังช่วยให้การพัฒนาเว็บไซต์มีประสิทธิภาพมากขึ้นอีกด้วย
http://www.siamhtml.com/how-to-define-font-size-in-responsive-web-design/