Baseline هو خط أفقي غير مرئي توضع عليه جميع رموز الخط. معظم الحروف تقف على baseline، بينما تنزل عناصر descenders أسفل. في الواجهات المحمولة، يستخدم baseline للمحاذاة الدقيقة للنص مع عناصر أخرى — الأيقونات والأزرار والصور. وفقًا لإرشادات Material Design Typography Guidelines (2025)، فإن المحاذاة المتسقة عبر baseline تحسن التسلسل الهرمي البصري للواجهة وتقلل الحمل المعرفي عند مسح المحتوى.
النقاط الرئيسية
Baseline (الخط الأساسي) هو مفهوم أساسي في علم الطباعة يحدد المحور الأفقي الذي توضع عليه رموز الخط. كل حرف في الخط الرقمي له نقطة ارتباط بالخط الأساسي — على هذا الخط تتحاذى الحروف عند عرض النص. معظم الحروف الصغيرة (ا، ل، م، ن، ك) تقف مباشرة على الخط الأساسي، بينما تنزل عناصر descenders (في الحروف المنخفضة) أسفل.
الخط الأساسي ليس المرجع الوحيد في مقاييس الخط. بالإضافة إليه توجد: x-height (ارتفاع الحروف الصغيرة)، cap-height (ارتفاع الحروف الكبيرة)، ascender-line (خط العناصر الصاعدة العلوية) و descender-line (خط العناصر الهابطة السفلية). تشكل هذه المقاييس ارتفاع السطر الكامل وتؤثر على حساب line-height.
وفقًا لـ Bringhurst — The Elements of Typographic Style (2024)، فإن الخط الأساسي هو المقياس الوحيد العالمي الموحد لجميع خطوط نفس العائلة. بينما يتغير x-height و cap-height من نمط لآخر، يحافظ الخط الأساسي على موقع ثابت بالنسبة لشبكة إحداثيات الخط. وهذا يجعل الخط الأساسي مرجعًا موثوقًا للمحاذاة بين العناصر في الواجهات.
في الواجهات المحمولة، يستخدم 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 يقلل التعديلات اليدوية للتباعد بنسبة 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% مقارنة بالتحديد اليدوي للتباعد أو الإزاحة.
Flutter يوفر آليتين مدمجتين للعمل مع الخط الأساسي: تعداد 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 دون حساب التباعد يدويًا. هذا مهم بشكل خاص للصفوف حيث تختلط العناوين والتسميات التوضيحية، مثل بطاقات المنتجات مع السعر والخصم.
من أكثر الأخطاء شيوعًا هو توسيط النص في الصفوف مع أيقونات أو صور. عندما يتم توسيط أيقونة ونص داخل الحاوية، يتحول النص بصريًا للأعلى بالنسبة للأيقونة. يحدث هذا لأن مركز النص أعلى من 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 تتكيف تلقائيًا مع تغيير حجم الخط. وهذا يوفر توضيعًا صحيحًا للنص عند زيادة حجم الخط دون الحاجة لتعديل التباعد يدويًا.
في 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. سوف نقدم لك النصح ونقترح أفضل حل.