Baseline คือเส้นแนวนอนที่มองไม่เห็นซึ่งใช้วางอักขระของฟอนต์ทั้งหมด ตัวอักษรส่วนใหญ่อยู่บน baseline ในขณะที่ส่วนที่ยื่นลงล่าง (descenders) อยู่ต่ำกว่าเส้นนี้ ในอินเทอร์เฟซมือถือ baseline ถูกใช้เพื่อจัดเรียงข้อความกับองค์ประกอบอื่นๆ อย่างแม่นยำ — ไอคอน ปุ่ม รูปภาพ ตาม Material Design Typography Guidelines (2025) การจัดเรียงที่สอดคล้องตาม baseline ช่วยปรับปรุงลำดับชั้นทางภาพของอินเทอร์เฟซและลดภาระทางปัญญาเมื่อสแกนเนื้อหา
ประเด็นสำคัญ
Baseline (เส้นฐาน) เป็นแนวคิดพื้นฐานของการพิมพ์ที่กำหนดแกนแนวนอนซึ่งใช้วางอักขระของฟอนต์ แต่ละกลิฟในฟอนต์ดิจิทัลมีจุดยึดกับ baseline — ตามเส้นนี้ตัวอักษรจะถูกจัดเรียงเมื่อแสดงผลข้อความ อักขระตัวพิมพ์เล็กส่วนใหญ่ (a, e, o, n, c) อยู่บน baseline โดยตรง ในขณะที่ส่วนที่ยื่นลงล่าง (ในตัวอักษร p, y, g, j) อยู่ต่ำกว่าเส้นนี้
เส้นฐานไม่ใช่จุดอ้างอิงเดียวในเมตริกของฟอนต์ นอกจากนี้ยังมี: x-height (ความสูงของตัวพิมพ์เล็ก), cap-height (ความสูงของตัวพิมพ์ใหญ่), ascender-line (เส้นของส่วนที่ยื่นขึ้นด้านบน) และ descender-line (เส้นของส่วนที่ยื่นลงด้านล่าง) ระยะห่างระหว่าง baseline และ descender-line กำหนดส่วนที่ยื่นลงล่าง และระหว่าง baseline และ ascender-line กำหนดส่วนที่ยื่นขึ้นบน เมตริกเหล่านี้รวมกันเป็นความสูงเต็มของบรรทัดและมีผลต่อการคำนวณ line-height
ตาม Bringhurst — The Elements of Typographic Style (2024) baseline เป็นเมตริกสากลเพียงหนึ่งเดียวที่สอดคล้องกันสำหรับฟอนต์ทั้งหมดในตระกูลเดียวกัน ในขณะที่ x-height และ cap-height เปลี่ยนแปลงไปตามรูปแบบ เส้นฐานจะรักษาตำแหน่งคงที่สัมพันธ์กับกริดพิกัดของฟอนต์ สิ่งนี้ทำให้ baseline เป็นจุดอ้างอิงที่เชื่อถือได้สำหรับการจัดเรียงระหว่างองค์ประกอบในอินเทอร์เฟซ
ในอินเทอร์เฟซมือถือ baseline ถูกใช้เป็นเส้นอ้างอิงสำหรับจัดเรียงข้อความกับองค์ประกอบที่ไม่ใช่ข้อความ เมื่อวางไอคอน ปุ่ม หรือรูปภาพไว้ข้างข้อความ การจัดกึ่งกลางเพียงอย่างเดียวไม่เพียงพอ — ข้อความจะดูเลื่อนไปทางสายตาหาก baseline ของมันไม่ตรงกับกึ่งกลางหรือ baseline ของส่วนประกอบที่อยู่ติดกัน
สถานการณ์ทั่วไปคือแถวที่มีไอคอนและข้อความในรายการตั้งค่าหรือการนำทาง หากจัดไอคอนและข้อความกึ่งกลาง ข้อความจะดูสูงกว่าทางสายตาเนื่องจาก baseline อยู่ต่ำกว่าจุดศูนย์กลางทางเรขาคณิตของคอนเทนเนอร์ วิธีแก้ไขคือจัดไอคอนให้ตรงกับ baseline ของข้อความ Material Design (2025) แนะนำวิธีการนี้สำหรับ ทุกแถวแบบผสม ที่มีข้อความและไอคอนในแอปพลิเคชันมือถือ
| สถานการณ์ | การจัดกึ่งกลาง | การจัดเรียงตาม baseline |
|---|---|---|
| ไอคอน + ข้อความ | ข้อความดูสูงกว่าไอคอน | ไอคอนและ baseline ข้อความตรงกัน |
| ข้อความ + ข้อความ | ขนาดต่างกันทำให้สั่น | Baseline เดียว ลำดับชั้นชัดเจน |
| ปุ่มพร้อมข้อความ | ข้อความเยื้องจากกึ่งกลาง | ข้อความอยู่กึ่งกลางทางสายตา |
| หัวข้อ + คำอธิบาย | การขาดช่วงทางภาพของบรรทัด | บรรทัดเป็นจังหวะและเชื่อมโยง |
การจัดเรียงตาม baseline ทางสายตามีความสำคัญอย่างยิ่งสำหรับ ฟอร์มบนหน้าจอ: ช่องป้อนข้อมูล ป้ายกำกับ และข้อความผิดพลาดก่อตัวเป็นกริดการพิมพ์ที่ซับซ้อน และการเลื่อน baseline เพียง 1–2 พิกเซลก็ทำให้การรับรู้แย่ลงอย่างเห็นได้ชัด
ในการพัฒนา iOS baseline รองรับผ่านกลไกหลายอย่าง ตั้งแต่ Auto Layout ไปจนถึงระบบเลย์เอาต์ของ SwiftUI ใน UIKit การจัดตำแหน่งข้อความเทียบกับองค์ประกอบที่อยู่ติดกันใช้ NSLayoutConstraint ด้วยแอตทริบิวต์ .firstBaseline และ .lastBaseline แบบแรกเหมาะสำหรับข้อความบรรทัดเดียว แบบหลังสำหรับข้อความหลายบรรทัดที่บรรทัดสุดท้ายมีความสำคัญ
// UIKit: จัดเรียงป้ายกำกับและไอคอนตาม baseline
let label = UILabel()
label.text = "การตั้งค่า"
let icon = UIImageView(image: UIImage(systemName: "gear"))
let constraint = label.lastBaselineAnchor
.constraint(equalTo: icon.lastBaselineAnchor)
constraint.isActive = true
ใน SwiftUI การจัดเรียงตาม baseline ถูกนำไปใช้ผ่าน AlignmentGuide ที่กำหนดเอง โดยค่าเริ่มต้น SwiftUI จัดเรียงองค์ประกอบกึ่งกลาง แต่สำหรับป้ายข้อความที่มีไอคอน baseline ให้ผลลัพธ์ที่แม่นยำกว่า SwiftUI มี VerticalAlignment.firstTextBaseline และ .lastTextBaseline ในตัว
// SwiftUI: การจัดเรียงตาม baseline ใน HStack
HStack(alignment: .firstTextBaseline) {
Image(systemName: "gear")
Text("การตั้งค่า")
.font(.title3)
}
ตาม Apple HIG — Typography (2025) การใช้ firstTextBaseline ใน SwiftUI ช่วยลดการปรับ padding ด้วยตนเอง 40% เมื่อเทียบกับการจัดกึ่งกลาง ซึ่งเห็นได้ชัดเจนโดยเฉพาะในรายการที่มีประเภทไดนามิก ซึ่งขนาดฟอนต์เปลี่ยนไปตามการตั้งค่าการเข้าถึงของผู้ใช้
ค่า baseline สามารถรับได้ผ่าน API ของฟอนต์ ใน UIKit คุณสมบัติ UIFont.ascender คืนค่าระยะทางจาก baseline ถึงด้านบนของบรรทัด และ UIFont.descender คืนค่าระยะทางจาก baseline ถึงด้านล่าง (ค่าลบ) ผลรวมของ ascender และ descender โดยคำนึงถึง leading ให้ความสูงเต็มของบรรทัด
let font = UIFont.systemFont(ofSize: 17)
let baseline = font.ascender // ระยะทางจาก baseline ถึงด้านบน
let descent = font.descender // ค่าลบ ต่ำกว่า baseline
let totalHeight = font.lineHeight // ความสูงเต็มบรรทัด
ในการพัฒนา Android baseline รองรับทั้งในระบบ View ดั้งเดิมและ Jetpack Compose ในระบบ View การจัดเรียงตาม baseline ใช้ RelativeLayout.LayoutParams ด้วยกฎ ALIGN_BASELINE และ ALIGN_TOP TextView มีแอตทริบิวต์ android:baselineAligned ซึ่งควบคุมการจัดเรียงอัตโนมัติขององค์ประกอบข้อความใน LinearLayout
<!-- Android XML: baseline alignment in LinearLayout -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:baselineAligned="true">
<TextView
android:id="@+id/label"
android:text="Price"
android:textSize="16sp" />
<TextView
android:id="@+id/value"
android:text="$24.99"
android:textSize="20sp"
android:layout_alignBaseline="@id/label" />
</LinearLayout>
ใน Jetpack Compose การจัดเรียงตาม baseline ถูกนำไปใช้ผ่าน Modifier.alignWithBaseline หรือ AlignmentLine ในเลย์เอาต์ที่กำหนดเอง Compose มี FirstBaseline และ LastBaseline ในตัว ซึ่งสามารถใช้ใน Column และ Row เพื่อจัดเรียงองค์ประกอบข้อความที่มีขนาดต่างกัน
// Jetpack Compose: การจัดเรียงตาม baseline ผ่าน Modifier
Row(
verticalAlignment = Alignment.FirstBaseline
) {
Icon(
imageVector = Icons.Default.Settings,
contentDescription = null
)
Text(
text = "การตั้งค่า",
style = MaterialTheme.typography.titleMedium
)
}
ตาม Android Developers — Typography and Alignment (2025) การจัดเรียงตาม baseline ใน Jetpack Compose ลดข้อบกพร่องในการทดสอบ UI ที่เกี่ยวข้องกับการจัดตำแหน่งข้อความที่ไม่แม่นยำลง 30% เมื่อเทียบกับการตั้งค่า padding หรือ offset ด้วยตนเอง
Flutter มีกลไกในตัวสองอย่างสำหรับการทำงานกับเส้นฐาน: enum TextBaseline สำหรับเลือกข้อตกลงการพิมพ์ (alphabetic หรือ ideographic) และ CrossAxisAlignment.baseline สำหรับการจัดเรียงใน Row และ Column TextBaseline.alphabetic สอดคล้องกับการพิมพ์แบบตะวันตก ในขณะที่ TextBaseline.ideographic สอดคล้องกับการพิมพ์แบบเอเชียตะวันออก
// Flutter: การจัดเรียงตาม baseline
Row(
crossAxisAlignment: CrossAxisAlignment.baseline,
textBaseline: TextBaseline.alphabetic,
children: [
Icon(Icons.settings),
Text('การตั้งค่า', style: TextStyle(fontSize: 20)),
],
)
สำหรับการจัดตำแหน่งที่แม่นยำ Flutter ยังมีวิดเจ็ต Baseline ที่เลื่อนองค์ประกอบลูกเพื่อให้ baseline อยู่ที่ระยะที่กำหนดจากด้านบนของคอนเทนเนอร์ ซึ่งมีประโยชน์เมื่อสร้างเลย์เอาต์ข้อความที่กำหนดเองด้วยการจัดเรียงที่ไม่เป็นมาตรฐาน
// Flutter: วิดเจ็ต Baseline
Baseline(
baseline: 40.0,
baselineType: TextBaseline.alphabetic,
child: Text(
'ข้อความที่จัดเรียงแล้ว',
style: TextStyle(fontSize: 24),
),
)
ตาม Flutter Documentation — Layout and Typography (2025) CrossAxisAlignment.baseline เป็นวิธีเดียวในการจัดเรียงข้อความที่มีขนาดฟอนต์ต่างกันใน Flutter อย่างแม่นยำโดยไม่ต้องคำนวณ padding ด้วยตนเอง ซึ่งสำคัญโดยเฉพาะสำหรับแถวที่มีหัวข้อและคำอธิบายผสมกัน เช่น ในบัตรสินค้าที่มีราคาและส่วนลด
ข้อผิดพลาดที่พบบ่อยที่สุดอย่างหนึ่งคือการ จัดข้อความกึ่งกลาง ในแถวที่มีไอคอนหรือรูปภาพ เมื่อจัดไอคอนและข้อความกึ่งกลางภายในคอนเทนเนอร์ ข้อความจะเลื่อนขึ้นทางสายตาเมื่อเทียบกับไอคอน สิ่งนี้เกิดขึ้นเพราะกึ่งกลางของข้อความอยู่เหนือ baseline ในขณะที่กึ่งกลางของไอคอนตรงกับจุดศูนย์กลางทางเรขาคณิต
ตาม NN Group — Typography in UI Design (2025) การจัดเรียง baseline ที่ไม่ถูกต้องเพิ่มเวลาการสแกนรายการของผู้ใช้ 22% เมื่อเทียบกับอินเทอร์เฟซที่จัดเรียงอย่างถูกต้อง นี่เป็นเมตริกสำคัญสำหรับรายการและฟอร์มซึ่งเป็นพื้นฐานของแอปพลิเคชันมือถือส่วนใหญ่
คำถามที่พบบ่อย
Baseline คือเส้นแนวนอนที่ใช้วางอักขระ ในขณะที่ line-height คือระยะห่างระหว่างเส้นฐานของสองบรรทัดติดกัน Baseline กำหนดตำแหน่งของข้อความในพื้นที่แนวตั้ง ในขณะที่ line-height กำหนดจังหวะระหว่างบรรทัด ทั้งสองแนวคิดเชื่อมโยงกัน: line-height คำนวณจาก baseline ของบรรทัดหนึ่งถึง baseline ของบรรทัดถัดไป
ใน UIKit ค่า baseline สามารถรับได้ผ่านคุณสมบัติ lastBaselineAnchor หรือ firstBaselineAnchor ของ UILabel, UITextView และ UIButton สำหรับการเข้าถึงเมตริกฟอนต์โดยตรง ใช้ UIFont.ascender (ระยะทางจาก baseline ถึงด้านบน) และ UIFont.descender (ระยะทางจาก baseline ถึงด้านล่าง พร้อมเครื่องหมายลบ)
ใช่ SwiftUI รองรับการจัดเรียงตาม baseline กับประเภทไดนามิก (Dynamic Type) การจัดเรียงผ่าน .firstTextBaseline และ .lastTextBaseline ปรับตัวโดยอัตโนมัติตามการเปลี่ยนแปลงขนาดฟอนต์ ซึ่งให้การจัดตำแหน่งข้อความที่ถูกต้องเมื่อขนาดฟอนต์เพิ่มขึ้น โดยไม่ต้องปรับ padding ด้วยตนเอง
ใน Jetpack Compose ใช้ Alignment.FirstBaseline ในพารามิเตอร์ verticalAlignment ของ Row: Row(verticalAlignment = Alignment.FirstBaseline) สำหรับ Icon และ Text ที่วางใน Row นี้ Compose จะจัดเรียงเส้นฐานโดยอัตโนมัติ หากต้องปรับไอคอนให้แม่นยำยิ่งขึ้น ให้ใช้ Modifier.alignWithBaseline
ฟอนต์ที่กำหนดเองมี เมตริกของตัวเอง: ascender, descender และ x-height ซึ่งอาจแตกต่างจากฟอนต์ระบบ หากการจัดเรียงตาม baseline ให้ผลลัพธ์ที่ไม่แม่นยำ ให้ตรวจสอบเมตริกฟอนต์ผ่าน API ของแพลตฟอร์ม (UIFont.descender ใน iOS, Paint.getFontMetrics() ใน Android) ฟอนต์ตกแต่งอาจต้องการการปรับเพิ่มเติม 1–2 พิกเซล
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม