Descender एक लोअरकेस अक्षर का वह भाग है जो फ़ॉन्ट की आधार रेखा (baseline) से नीचे तक फैला होता है। लैटिन लिपि में descender वाले विशिष्ट अक्षर “g”, “j”, “p”, “q”, “y” हैं। Descender की लंबाई फ़ॉन्ट के निचले विस्तारित भाग को निर्धारित करती है और लाइन स्पेसिंग की गणना के लिए अत्यंत महत्वपूर्ण है: baseline के नीचे पर्याप्त स्थान के बिना, descender वाले अक्षर अगली पंक्ति से टकराएँगे। Material Design Type Scale Guidelines (2025) के अनुसार, descender का अपर्याप्त ध्यान मोबाइल उपकरणों पर बहु-पंक्ति टेक्स्ट में पंक्ति टकराव (collision) के मुख्य कारणों में से एक है।
मुख्य बिंदु
Descender ग्लिफ़ का वह भाग है जो आधार रेखा के नीचे स्थित होता है। जबकि अक्षर का मुख्य भाग baseline पर टिका होता है, descender इसके पार फैलकर फ़ॉन्ट की विशिष्ट आकृति बनाता है। लैटिन लिपि में, descender वाले अक्षरों में “g”, “j”, “p”, “q”, “y” शामिल हैं — इनके निचले तत्व पंक्ति से नीचे उतरते हैं।
Descender की गहराई baseline से ग्लिफ़ के निचले किनारे (descender-line) तक की दूरी बताती है। गुणवत्ता वाले फ़ॉन्ट में यह दूरी संतुलित होती है: बहुत छोटा descender descender वाले अक्षरों को पहचानना कठिन बना देता है, जबकि बहुत लंबा descender पंक्तियों के बीच अत्यधिक खाली स्थान बनाता है और टेक्स्ट घनत्व कम करता है। विभिन्न टाइपफ़ेस descender लंबाई में महत्वपूर्ण अंतर दिखाते हैं।
| टाइपफ़ेस | Descender / em-size | descender वाले अक्षरों के उदाहरण |
|---|---|---|
| SF Pro | ~0.22 | g, j, p, q, y — संतुलित विस्तार |
| Roboto | ~0.24 | g, j, p — मध्यम descender |
| Playfair Display | ~0.30 | g, j, p, q — लंबे सजावटी तत्व |
| Inter | ~0.26 | g, j, p — baseline से काफ़ी नीचे |
| Noto Sans | ~0.20 | g, j — छोटा descender, संक्षिप्त |
Google Fonts Metrics Guide (2025) के अनुसार, descender को इष्टतम माना जाता है जब इसकी गहराई पूर्ण em आकार (1000 FUnits) का 20–25% हो। 15% से कम मान descender वाले अक्षरों को अलग करना कठिन बनाते हैं, जबकि 30% से अधिक मान पंक्ति टकराव को रोकने के लिए line-height में अनिवार्य वृद्धि की आवश्यकता होती है।
डिजिटल फ़ॉन्ट में, descender मीट्रिक तालिकाओं में ऋणात्मक मान के रूप में संग्रहीत होता है। OpenType प्रारूप में, यह hhea.descent फ़ील्ड (hhea तालिका) और sTypoDescender (OS/2 तालिका) है। दोनों मान ऋणात्मक हैं क्योंकि वे baseline से नीचे की ओर मापे जाते हैं। TrueType के लिए, OS/2 तालिका का उपयोग usWinDescent फ़ील्ड के साथ किया जाता है — इसका मान धनात्मक है लेकिन उसी मीट्रिक को दर्शाता है।
# fontTools के माध्यम से फ़ॉन्ट से descender पढ़ना
from fontTools.ttLib import TTFont
font = TTFont('Roboto-Regular.ttf')
hhea = font['hhea']
os2 = font['OS/2']
descent_hhea = hhea.descent # -500 FUnits (Roboto)
typo_descender = os2.sTypoDescender # -500 FUnits
win_descent = os2.usWinDescent # 500 (positive value)
# 16pt फ़ॉन्ट आकार के लिए पिक्सेल में बदलें
px_per_em = 16
descent_px = abs(descent_hhea) * px_per_em / 1000 # 8 px
प्लेटफ़ॉर्म के बीच महत्वपूर्ण अंतर: iOS रेंडरिंग के लिए hhea.descent का उपयोग करता है, जबकि Android OS/2 से sTypoDescender का उपयोग करता है। यदि ये मान भिन्न हैं (जो खराब कॉन्फ़िगर किए गए फ़ॉन्ट में होता है), तो समान टेक्स्ट iOS और Android पर अलग-अलग लाइन स्पेसिंग के साथ प्रदर्शित होगा। 100 FUnits का अंतर (लगभग 16 pt फ़ॉन्ट आकार पर 1.6 px) पहले से ही दृश्य रूप से ध्यान देने योग्य है।
Microsoft OpenType Specification v1.9 (2025) के अनुसार, सही क्रॉस-प्लेटफ़ॉर्म रेंडरिंग के लिए, hhea.descent और sTypoDescender मान 50 FUnits की सटीकता के भीतर बराबर होने चाहिए। मोबाइल एप्लिकेशन के लिए फ़ॉन्ट चुनते समय, fontTools या समान उपयोगिता के माध्यम से इसकी जाँच की जानी चाहिए।
iOS में, descender मान UIFont.descender प्रॉपर्टी के माध्यम से उपलब्ध है। यह प्रॉपर्टी एक ऋणात्मक संख्या लौटाती है जो baseline से फ़ॉन्ट के निचले किनारे (descender सहित) तक की दूरी दर्शाती है। उदाहरण के लिए, 17 pt पर SF Pro के लिए descender मान लगभग -4.2 pt है। निरपेक्ष मान जितना बड़ा होगा, फ़ॉन्ट के निचले विस्तार उतने ही लंबे होंगे।
// iOS पर UIFont के माध्यम से descender प्राप्त करना
let font = UIFont.systemFont(ofSize: 17)
let descender = font.descender // ~ -4.2 pt SF Pro 17pt के लिए
let ascender = font.ascender // ~ 16.2 pt
let lineHeight = font.lineHeight // ~ 20.4 pt
// descender ऑफ़सेट के साथ कस्टम रेंडरिंग
let attrString = NSAttributedString(
string: "Sample text with letter p and y",
attributes: [.font: font]
)
// Core Text: descender के साथ बाउंडिंग बॉक्स प्राप्त करना
let ctFont = CTFontCreateWithName(
"SF Pro Text" as CFString, 17, nil
)
let descent = CTFontGetDescent(ctFont) // ~4.2 pt
TextKit (NSTextStorage, NSLayoutManager) का उपयोग करते समय, descender स्वचालित रूप से lineFragmentPadding और lineFragmentRect में शामिल होता है। हालाँकि, Core Graphics (draw(in:)) के माध्यम से कस्टम रेंडरिंग करते समय, आपको कंटेनर के निचले मार्जिन में descender का निरपेक्ष मान जोड़कर मैन्युअल रूप से निर्देशांक समायोजित करने होंगे। यदि ऐसा नहीं किया जाता है, तो descender वाले अक्षर रेंडरिंग सीमा से बाहर चले जाएँगे और काट दिए जाएँगे।
Android में, descender मीट्रिक Paint.FontMetrics.descent के माध्यम से उपलब्ध हैं। iOS के विपरीत, descent मान धनात्मक है — यह baseline से टेक्स्ट के निचले किनारे तक की दूरी दर्शाता है। FontMetrics.bottom प्रॉपर्टी में न केवल descender बल्कि फ़ॉन्ट डिज़ाइनर द्वारा अनुशंसित अतिरिक्त स्थान (leading) भी शामिल है। केवल descender के सटीक लेखांकन के लिए, bottom के बजाय descent का उपयोग करें।
// Android पर Paint के माध्यम से descender प्राप्त करना
val paint = Paint().apply {
textSize = 17 * density
}
val metrics = paint.fontMetrics
val descent = metrics.descent // ~4.5 px 17sp के लिए
val bottom = metrics.bottom // ~5.0 px leading के साथ
// descender ऑफ़सेट के साथ कस्टम रेंडरिंग
val baseline = y
canvas.drawText("नमूना: gpq", x, baseline, paint)
// descender के साथ निचली सीमा
val bottomBound = baseline + descent // सही निचली सीमा
Jetpack Compose में, descender को TextLayoutResult के माध्यम से प्राप्त किया जा सकता है। getLineBottom विधि पंक्ति के निचले किनारे का Y-निर्देशांक लौटाती है, जिसमें पहले से ही descender शामिल है। विभिन्न फ़ॉन्ट आकारों वाली स्ट्रिंग्स का कस्टम लेआउट करते समय (उदाहरण के लिए, छूट मूल्य और पूर्ण मूल्य), descender को ध्यान में रखते हुए baseline संरेखण निचले किनारे के संरेखण की तुलना में अधिक सटीक परिणाम देता है।
// Compose: टेक्स्ट की निचली सीमा की जाँच करना
val text = "Text with descenders: gpq"
var layoutResult by remember { mutableStateOf<TextLayoutResult?>(null) }
Text(
text = text,
onTextLayout = { layoutResult = it },
modifier = Modifier.drawBehind {
layoutResult?.let { result ->
val lastLine = result.lineCount - 1
val bottom = result.getLineBottom(lastLine)
val top = result.getLineTop(lastLine)
// जाँचें कि descender कंटेनर सीमा से अधिक न हो
}
}
)
Google Material Design — Typography Implementation (2025) के अनुसार, निश्चित ऊँचाई वाले कंटेनरों में descender कटने से रोकने के लिए, आपको फ़ॉन्ट के descent के बराबर ऊर्ध्वाधर पैडिंग जोड़ना होगा, भले ही वर्तमान टेक्स्ट में descender वाले अक्षर हों या नहीं। यह सुनिश्चित करता है कि टेक्स्ट को गतिशील रूप से बदलने पर इंटरफ़ेस टूटेगा नहीं।
पंक्ति टकराव एक ऐसी स्थिति है जहाँ ऊपरी पंक्ति के एक अक्षर का descender भौतिक रूप से निचली पंक्ति के एक अक्षर के ascender से टकराता है। मोबाइल इंटरफ़ेस में, यह विशेष रूप से बहु-पंक्ति शीर्षकों, उत्पाद कार्डों और छोटे लाइन स्पेसिंग वाले टेक्स्ट ब्लॉकों में ध्यान देने योग्य है। लंबे descender और छोटे line-height वाले फ़ॉन्ट का उपयोग करने पर समस्या बढ़ जाती है।
टकराव को रोकने वाला न्यूनतम line-height सूत्र का उपयोग करके गणना की जा सकती है: line-height = ascender + descender + 2 px मार्जिन। 17 pt पर SF Pro के लिए, यह लगभग 16.2 + 4.2 + 2 = 22.4 pt (गुणांक ~1.32) का line-height देता है। 16 sp पर Roboto के लिए, लगभग 1.35। यदि line-height इस मान से कम है, तो descender वाले अक्षरों वाले टेक्स्ट में टकराव निश्चित है।
// iOS: टकराव रोकने के लिए न्यूनतम line-height की गणना करें
let font = UIFont.systemFont(ofSize: 17)
let minLineHeight = abs(font.ascender) + abs(font.descender) + 2.0
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.minimumLineHeight = minLineHeight
paragraphStyle.maximumLineHeight = minLineHeight
let attributedText = NSAttributedString(
string: "Text with p on first line\nand y on second line",
attributes: [
.font: font,
.paragraphStyle: paragraphStyle
]
)
सजावटी और हस्तलिखित फ़ॉन्ट के साथ काम करते समय विशेष सावधानी बरतनी चाहिए — उनका descender em आकार के 35–40% तक पहुँच सकता है। ऐसे फ़ॉन्ट शायद ही कभी मुख्य टेक्स्ट के लिए उपयोग किए जाते हैं लेकिन शीर्षकों में लागू किए जा सकते हैं। शीर्षक में लंबे descender वाले अक्षर की एक भी उपस्थिति पड़ोसी इंटरफ़ेस तत्व के साथ टकराव का कारण बन सकती है।
सबसे आम गलती बटन और टेक्स्ट फ़ील्ड में descender का कट जाना है। जब हम descender पर ध्यान दिए बिना बटन या टेक्स्ट फ़ील्ड की ऊँचाई line-height के बराबर सेट करते हैं, तो descender वाले अक्षर निचले किनारे से काट दिए जाते हैं। यह विशेष रूप से गोल कोनों वाले सिस्टम बटनों में ध्यान देने योग्य है, जहाँ descender कोने की त्रिज्या सीमा से बाहर जा सकता है।
Nielsen Norman Group — Mobile Typography Research (2025) के अनुसार, 41% मोबाइल एप्लिकेशन में कम से कम एक स्क्रीन होती है जहाँ descender वाला टेक्स्ट घटक सीमा से बाहर चला जाता है। इससे पठनीयता में 15% की कमी आती है और उपयोगकर्ता द्वारा कार्य पूरा करने का समय बढ़ जाता है। descender वाले अक्षरों वाले टेक्स्ट के साथ नियमित परीक्षण विकास के प्रारंभिक चरणों में ऐसी समस्याओं की पहचान करने में मदद करता है।
अक्सर पूछे जाने वाले प्रश्न
Baseline वह क्षैतिज रेखा है जिस पर अक्षर टिकते हैं, जबकि descender इस रेखा के नीचे स्थित अक्षर का भाग है। Baseline पंक्ति के लिए स्थिर है, descender एक विशिष्ट अक्षर का गुण है। इन अवधारणाओं को भ्रमित न करें: baseline संरेखण के लिए उपयोग किया जाता है, जबकि descender लाइन स्पेसिंग को प्रभावित करता है और कंटेनर की ऊँचाई निर्धारित करते समय ध्यान देने की आवश्यकता होती है।
View सिस्टम के लिए Paint.getFontMetrics().descent या Jetpack Compose में TextLayoutResult का उपयोग करें। iOS के विपरीत, Android पर descent मान धनात्मक है और baseline से ग्लिफ़ के निचले किनारे तक की दूरी दर्शाता है। पंक्ति की पूर्ण निचली सीमा की गणना करने के लिए, baseline के Y-निर्देशांक में descent जोड़ें।
प्लेटफ़ॉर्म फ़ॉन्ट फ़ाइल से अलग-अलग मीट्रिक तालिकाओं का उपयोग करते हैं: iOS hhea.descent का उपयोग करता है, Android os/2.sTypoDescender का। यदि फ़ॉन्ट में ये मान भिन्न हैं, तो रेंडरिंग अलग होगी। fontTools के माध्यम से हमेशा दोनों मानों की जाँच करें। गुणवत्ता वाले सिस्टम फ़ॉन्ट (SF Pro, Roboto, Noto) में दोनों प्लेटफ़ॉर्म के लिए सुसंगत मीट्रिक होते हैं।
न्यूनतम line-height = ascender + descender + 2 px मार्जिन। iOS पर 17 pt सिस्टम फ़ॉन्ट के लिए यह लगभग 22.4 pt है। Android पर 16 sp Roboto के लिए — लगभग 22 sp। निकटतम पूर्णांक में गोल करने और descender अक्षरों की परीक्षण स्ट्रिंग के साथ जाँच करने की अनुशंसा की जाती है — यदि कोई टकराव नहीं है, तो line-height पर्याप्त है।
हाँ, लेकिन कुछ शर्तों के साथ। लंबे descender वाले फ़ॉन्ट (Playfair Display, सजावटी टाइपफ़ेस) शीर्षकों और एक्सेंट टेक्स्ट के लिए स्वीकार्य हैं जहाँ डिज़ाइन से समझौता किए बिना line-height बढ़ाया जा सकता है। मुख्य टेक्स्ट के लिए, ऊर्ध्वाधर स्थान बर्बाद करने से बचने के लिए em आकार के 20–25% descender वाले फ़ॉन्ट (SF Pro, Roboto, Inter) पसंद किए जाते हैं।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें