UIDex

قصّ النصّ

Truncation (Ellipsis and Line Clamp)

text-overflow: ellipsis

اسمه كماناقتطاع النصّ، تقصير النصّ، النقاط الثلاث، حصر الأسطر، لاين كلامب، إليبسس، ellipsis، line clamp، text overflow، clamped text، shortened label، cut off text

قصّ النصّ هو عرض جزء من نصّ أطول ممّا تتّسع له مساحته، مع علامة تقول إنّ هناك بقيّة: محرف الحذف «…». والنصّ الكامل يبقى في الـ DOM كما هو، لأن القطع يحدث في طبقة العرض وحدها، ولهذا يجده البحث بـ Ctrl+F ويأخذه النسخ كاملاً ويقرأه قارئ الشاشة كاملاً. وله ثلاثة أشكال لكلٍّ منها تقنية مختلفة: قطع من النهاية على سطر واحد بـ text-overflow، وحصر على عدد أسطر بـ line-clamp، وقطع من الوسط يُبقي أوّل الاسم وامتداده معاً، وليس له في CSS خاصّية أصلاً. وهو ليس القطع الصامت (overflow: hidden وحده)، فذاك يشطر الحرف في منتصفه ولا يترك أي علامة، فلا يعرف المستخدم أن شيئاً نقص. وليس مقتطفاً (excerpt) مبنيّاً في الخادم بـ substring، لأن المقتطف يحذف البقيّة من الاستجابة نفسها فلا سبيل إلى استرجاعها في المتصفّح. وليس كتلة «اقرأ المزيد» القابلة للطيّ، فتلك عنصر بحالتين وزرّ يبدّل بينهما، أمّا القصّ فحالة عرض واحدة يجوز أن يُلحق بها زرّ توسيع. والقاعدة التي تحسم استعماله: النصّ المقصوص يجب أن يبقى قابلاً للقراءة كاملاً في مكان ما، وإلّا فأنت تخفي معلومة لا تختصرها.

لو قلت عليه…

«العنوان بيتقطع وبيحطّ نقط في آخره»«عايز الكلام يقف بعد سطرين ويكمّل بنقط»«اسم الملفّ مش بيبان كامل في الجدول»«النصّ طالع بره المربّع بتاعه»«إزاي أخبّي باقي الوصف وأسيب زرار يفتحه»

العيّنة الحيّة

تفاعل مع الديمو. كل الأجزاء حقيقية ومرقّمة.

المرفقات

كشف-حساب-ال…-٢٠٢٦.xlsx

يسري هذا العرض حتى ١٢ سبتمبر ٢٠٢٦، ويشمل تصميم الصفحات وتنفيذها واختبارها على المتصفّحات المذكورة في الملحق. وأي طلب خارج النطاق المتّفق عليه يُسعَّر على حدة بعد موافقة كتابية منك.

RTLالنقاط تقع عند نهاية السطر المنطقية، أي عند الحافّة اليسرى في العربية

تشريح العنصر: كل جزء واسمه

مرّر على أي سطر ليتحدّد مكانه في الديمو فوق.

برومبت البناء

نفّذ قصّ النصّ في هذه الواجهة بأشكاله الثلاثة. للسطر الواحد: اجمع text-overflow: ellipsis و overflow: hidden و white-space: nowrap على العنصر نفسه، وأضف min-inline-size: 0 على الابن داخل أي flex أو grid وإلّا لن ينكمش ولن تظهر النقاط، وضع table-layout: fixed على أي جدول تقصّ خلاياه. لعدّة أسطر: استخدم ‎-webkit-line-clamp مع display: -webkit-box و -webkit-box-orient: vertical و overflow: hidden، واضبط line-height على 1.7 على الأقلّ في الفقرات العربية حتى لا تُقصّ ذيول الحروف في السطر الأخير. للقطع من الوسط: لا شيء في CSS يفعله، فاكتبه في JavaScript بـ Intl.Segmenter بدقّة grapheme، واحتفظ ببداية الاسم وبامتداده، واشتقّ عدد المحارف من عرض العنصر المقيس بـ ResizeObserver لا من رقم ثابت. اضمن وصولاً كاملاً إلى النصّ في كل حالة: تلميح يفتح عند hover و focus معاً على عنصر قابل للتركيز ومربوط به بـ aria-describedby، أو <button> توسيع يحمل aria-expanded و aria-controls ويبقى ظاهراً بصيغة «عرض أقلّ»، ولا تكتفِ بسمة title لأنها لا تُفتح بلوحة المفاتيح ولا تظهر على اللمس. ولا تقصّ سعراً ولا موعداً ولا سبب رفض ما لم يكن مكتوباً كاملاً في مكان آخر من الشاشة. واستعمل الخصائص المنطقية في كل مسافة وموضع: padding-inline-end و margin-inline و inset-inline-start، ولا تكتب padding-right ولا left. وإذا استبدلت النقاط بتلاشٍ، أضف قاعدة صريحة داخل [dir="rtl"] تقلب اتجاه linear-gradient، ولُفّ أسماء الملفّات اللاتينية في <bdi> حتى تتوقّف إعادة الترتيب عند حدودها، وضع dir="auto" على كل صندوق لا تعرف اتجاه نصّه سلفاً.

سلوكه في الاتجاه من اليمين لليسار

الجزء ده حصري عندنا.

جهة القطع

ينعكس

القطع يقع عند النهاية المنطقية للسطر، وهي الحافّة اليسرى في العربية، و text-overflow يتكفّل بذلك وحده دون قاعدة إضافية منك. والذي يُفسده هو direction: ltr التي يضعها كثيرون على الحاوية لضبط شكل الأرقام أو أسماء الملفّات: نهاية السطر تنتقل إلى اليمين، فتأكل النقاط أوّل الجملة العربية وتُبقي آخرها. وإذا كانت القيمة قد تأتي بأي اتجاه، ضع dir="auto" أو unicode-bidi: plaintext على العنصر المقصوص نفسه؛ ولا يكفي لفّ القيمة بـ <bdi> هنا لأنه يعزل ترتيبها ولا ينقل النقاط، فالحافّة التي تُقصّ تتبع اتجاه الكتلة.

قناع التلاشي

ينعكس

بعض التصاميم تستبدل النقاط بتلاشٍ تدريجي عند الحافّة، وهذا الشكل لا ينعكس من تلقاء نفسه لأن التدرّجات لا تقبل الكلمات المنطقية: في linear-gradient لا يوجد إلّا to right و to left، ولا وجود لـ to inline-end. فالقناع المكتوب to right يبقى على اليمين في العربية بينما القطع يقع على اليسار، فترى تلاشياً فوق نصّ سليم وحرفاً مبتوراً بلا تمويه. اكتب قاعدة صريحة داخل [dir="rtl"] تقلبه إلى to left، وينطبق الأمر نفسه على mask-image. والمساحة المحجوزة للقناع تُكتب padding-inline-end، فـ padding-right ثابتة تترك الفجوة عند الحافّة الخطأ.

القطع من الوسط بالترتيب المنطقي

لا ينعكس

سلسلة JavaScript مخزّنة بالترتيب المنطقي دائماً: أوّل عنصر فيها هو أوّل محرف يُقرأ، في العربية كما في الإنجليزية. فابنِ القطع من الوسط على هذا الترتيب مباشرةً، ولا تحاول «تصحيحه» بعكس السلسلة أو بالاعتماد على ما تراه على الشاشة، لأن الترتيب البصري ناتج خوارزمية bidi لحظة الرسم وليس طريقة تخزين النصّ. والفخّ الحقيقي أن موضع الفصل قد يقع داخل عنقود رسومي واحد، فتنفصل الشدّة أو الفتحة عن حرفها وتظهر معلّقة على النقاط؛ قسّم بـ Intl.Segmenter بدقّة grapheme قبل أن تقصّ.

اسم لاتيني داخل سطر عربي

لا ينعكس

text-overflow يحذف ما وقع عند الطرف البصري للسطر بعد أن ترتّبه خوارزمية bidi، والطرف البصري ليس بالضرورة آخر السلسلة منطقياً. ضع اسم ملفّ لاتينياً مثل Q4-report-final.pdf في آخر جملة عربية ودع السطر يفيض: القطع يبدأ من أوّل حروف الاسم، لأن المقطع اللاتيني يُرسم من اليسار إلى اليمين بينما ينتهي السطر عند اليسار، فيبقى الامتداد ظاهراً ويضيع الجزء الذي كان يفرّق بين ملفّ وآخر. لُفّ الاسم في <bdi> فهو يعزله ويحمل dir="auto" معاً، فيُحسب ترتيبه داخل حدوده وتتوقّف علامات الترقيم المجاورة عن الانتقال عبره؛ وإذا كان أوّل الاسم هو المهمّ فاقطع من الوسط في JavaScript ولا تترك الأمر لـ text-overflow.

ارتفاع السطر في فقرة محصورة

لا ينعكس

الحصر بـ line-clamp يقصّ كل ما زاد عن ارتفاع مشتقّ من line-height، والحروف العربية تنزل تحت خطّ الأساس أكثر من اللاتينية: ذيول ج و ح و ي والنقاط تحتها. ومع line-height: 1.2 المألوف في الفقرات الإنجليزية يحلق overflow: hidden أسفل السطر الأخير فيبدو النصّ مبتوراً من تحت. ابدأ من line-height: 1.7 أو 1.8 في الفقرة العربية، وتذكّر أن الارتفاع الكلّي يكبر بنفس النسبة، فقد تحتاج سطرين حيث كانت الإنجليزية ثلاثة لتبقى البطاقة بنفس الطول.

أسماؤه في الكود

كل سطر هو كلمة مكتبة واحدة عن نفس الشيء. خد السطر اللي بيكلّم مشروعك.

CSStext-overflow: ellipsisسطر واحد فقط، ولا يعمل إلّا مع overflow: hidden و white-space: nowrap على نفس العنصر.
CSS-webkit-line-clamp: 2الحصر على أسطر؛ الاسم غير المسبوق line-clamp موجود في مواصفة CSS Overflow 4 وبدأ يصل، فتحقّق من الدعم قبل حذف السطور المسبوقة.
CSSmin-inline-size: 0ما يسمح لابن flex بالانكماش تحت عرض محتواه؛ بدونه لا تظهر النقاط أبداً.
HTML<bdi>يعزل الاسم اللاتيني داخل السطر العربي، ويحمل dir="auto"، فتتوقّف إعادة ترتيب bidi عند حدوده.
ARIAaria-expanded + aria-controlsالزوج الذي يجعل زرّ «عرض المزيد» مفهوماً لقارئ الشاشة ويربطه بالفقرة التي يفتحها.
Ant Design<Typography.Paragraph ellipsis={{ rows: 2, expandable: true }} />يعطيك الحصر وزرّ التوسيع والتلميح في إعداد واحد، ويقبل suffix للإبقاء على الامتداد.
SwiftUI.truncationMode(.middle)القطع من الوسط جاهز عند أبل مع .lineLimit، وهو بالضبط ما لا تملكه CSS.

شوف كمان

آخر تحديث · 2026-08-19