SVG Symbol
بديل لخطوط الأيقونات — استخدام صور SVG المتراكبة الرمزية لتضمين أيقونات قابلة للتوسع ومتعددة الألوان مباشرةً في HTML.
ما هي صور SVG المتراكبة الرمزية؟
تجمع صور SVG المتراكبة الرمزية أيقونات SVG متعددة في ملف واحد. تُعرَّف كل أيقونة داخل عنصر <symbol> بمعرّف id فريد. لاستخدام أيقونة، تُشير إليها بـ<use href="#icon-id">. تُحمَّل الصورة المتراكبة مرة واحدة — إما مضمّنة أو كملف خارجي — وتُصيَّر الأيقونات الفردية في أي مكان في الصفحة.
هذا أسلوب مختلف جذرياً عن خطوط الأيقونات. بدلاً من تعيين نقاط كود Unicode إلى حروف رسومية في الخط، تستخدم عناصر SVG الأصلية. تحتفظ كل أيقونة بقدراتها الكاملة في SVG: ألوان متعددة وتدرجات ومرشحات وخصائص إمكانية وصول دقيقة. المقايضة هي ترميز أكثر تعقيداً قليلاً واصطلاحات تنسيق مقارنةً بالأسلوب CSS الصرف لخطوط الأيقونات.
كيف يعمل
ملف الصورة المتراكبة هو مستند SVG عادي يحتوي على عنصر <symbol> واحد أو أكثر. يُعرّف كل رمز أيقونة مستقلة بـviewBox خاص بها:
<svg xmlns="http://www.w3.org/2000/svg" style="display:none">
<symbol id="icon-home" viewBox="0 0 24 24">
<path d="M3 12l9-9 9 9M5 10v10a1 1 0 001 1h3a1 1 0 001-1v-4..."/>
</symbol>
<symbol id="icon-search" viewBox="0 0 24 24">
<path d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
</symbol>
</svg>
يُخفى العنصر الخارجي <svg> بـstyle="display:none" كي لا يشغل مساحة في الصفحة. الرموز داخله غير مرئية حتى يُشار إليها. لتصيير أيقونة، استخدم عنصر <use>:
<svg class="icon"><use href="#icon-home"></use></svg>
<svg class="icon"><use href="#icon-search"></use></svg>
نسّق الأيقونات بـ CSS مستخدماً fill وstroke بدلاً من خاصية color المعتمدة على الخطوط:
.icon {
width: 24px;
height: 24px;
fill: currentColor;
stroke: none;
}
يُتيح استخدام fill: currentColor للأيقونة أن ترث لون نص العنصر الأب، مشابهاً لطريقة عمل خطوط الأيقونات مع خاصية color.
الرموز مقابل خطوط الأيقونات
- دعم متعدد الألوان — كل مسار يمكن أن يمتلك تعبئته وحده الخاص
- كل أيقونة عنصر SVG حقيقي بإمكانية وصول أفضل
- لا حاجة لتعيين Unicode — يُشار إلى الأيقونات بأسماء مقروءة
- تصيير أحد — لا مشكلات hinting ولا بُقع تحت البكسل
- يمكن تحريك الأجزاء الفردية للأيقونة باستقلالية
- يعمل مع أي ميزة SVG: تدرجات ومرشحات ومسارات قطع وأقنعة
- ترميز أكثر تفصيلاً (
<svg><use>مقابل<i class="icon">) - لا يمكن تنسيقه بسهولة بـ CSS
color— يتطلبfill/stroke - للصور المتراكبة الخارجية تبعات CORS عند التحميل عبر مصادر مختلفة
- إجمالي حجم الملف أكبر من تنسيقات الخطوط المضغوطة
- وزن HTML أكبر عند كل استخدام للأيقونة
- لا دعم لعناصر زائفة
::before/::after
استراتيجيات التحميل
هناك ثلاثة طرق رئيسية لتحميل صورة SVG المتراكبة الرمزية في صفحة، لكل منها مقايضات مختلفة:
الصورة المتراكبة المضمّنة
الصق SVG الكامل للصورة المتراكبة مباشرةً في عنصر HTML <body>. إنه أبسط أسلوب — لا مشكلات CORS ولا طلب HTTP إضافي. الرموز متاحة فوراً لأي مرجع <use> في الصفحة. الأنسب للتطبيقات ذات الصفحة الواحدة أو مجموعات الأيقونات الصغيرة (أقل من ~50 أيقونة).
الصورة المتراكبة الخارجية
حمّل الصورة المتراكبة كملف خارجي عبر <use href="icons.svg#home">. يُبقي هذا HTML نظيفاً ويتيح للمتصفح تخزين الصورة المتراكبة مؤقتاً بصورة منفصلة عن الصفحة. إلا أنه له تبعات CORS: يجب تقديم الصورة المتراكبة من المصدر ذاته، أو يجب أن يضبط الخادم رؤوس Access-Control-Allow-Origin المناسبة. لاحظ أن Internet Explorer لا يدعم مراجع <use> الخارجية — استخدم polyfill svg4everybody إذا احتجت دعم IE.
الحقن عبر JS
حمّل ملف الصورة المتراكبة عبر fetch() وأدرجه في DOM وقت التشغيل. يجمع هذا قابلية التخزين المؤقت للصور المتراكبة الخارجية مع موثوقية الصور المتراكبة المضمّنة — يصبح SVG المُدرَج جزءاً من المستند، لذا تعمل مراجع <use> بلا قيود CORS. يُولّد Bobcorn هذا الأسلوب: ملف JS يجلب جميع الرموز ويسجّلها عند تحميله.
<!-- تحميل صورة JS المتراكبة المُولَّدة -->
<script src="icons-symbol.js"></script>
<!-- ثم الاستخدام بصورة طبيعية: -->
<svg class="icon"><use href="#icon-home"></use></svg>
<svg class="icon"><use href="#icon-search"></use></svg>
يُنشئ ملف JS عنصر <svg> مخفياً يحتوي على جميع تعريفات <symbol> ويُلحقه بجسم المستند. بعد التحميل، يُشار إلى الأيقونات بالطريقة ذاتها كأسلوب المضمّن.
متى تستخدم رموز SVG
صور SVG المتراكبة الرمزية هي الخيار الصحيح حين يحتاج مشروعك إلى قدرات لا تستطيع خطوط الأيقونات توفيرها:
- الأيقونات متعددة الألوان — حين تستخدم الأيقونات أكثر من لون واحد أو تدرجات أو تعبئات معقدة لا يستطيع خط بحرف رسومي واحد تمثيلها
- إمكانية الوصول أولوية قصوى — يمكن أن تتضمن كل أيقونة عنصر
<title>وخاصيةaria-label، مما يمنح قارئات الشاشة أوصافاً ذات معنى - أجزاء الأيقونة المتحركة — تحتاج إلى تحريك مسارات أو مجموعات فردية داخل أيقونة (مثل ترس دوّار داخل أيقونة الإعدادات)
- المشاريع الكثيفة في SVG — تطبيقك يستخدم بالفعل SVG المضمّن على نطاق واسع، لذا تتلاءم الرموز بشكل طبيعي مع البنية الموجودة
- أقصى حدة تصيير — يمكن أن يُسبّب hinting الخط مشكلات محاذاة في الأحجام الصغيرة؛ تُصيَّر رموز SVG بدقة بكسل كاملة في أي بُعد
متى تلتزم بخطوط الأيقونات
تبقى خطوط الأيقونات الخيار الأفضل في عدة سيناريوهات شائعة:
- مجموعات الأيقونات الكبيرة (200+) — ملف خط WOFF2 مضغوط أصغر بكثير من صورة SVG متراكبة بالعدد ذاته من الأيقونات
- جميع الأيقونات أحادية اللون — إذا كانت كل أيقونة بلون واحد، توفر خطوط الأيقونات أبسط تكامل بلا مقايضات
- التكامل بـ CSS فقط — تتطلب خطوط الأيقونات رابط ورقة أنماط وفئات CSS فحسب، دون JavaScript أو ترميز إضافي
- الأنظمة القديمة — المشاريع التي تستخدم خطوط الأيقونات بالفعل لا تستفيد بما يكفي من التبديل لتبرير جهد الترحيل
- دعم العناصر الزائفة — تحتاج إلى أيقونات في العناصر الزائفة
::beforeأو::afterالتي تعمل فقط مع حروف الخطوط الرسومية