كيفية إنشاء أيقونات مفضلة تكيفية للوضع الفاتح والداكن: دليل المطور الشامل

Favicon.im

تحتاج المواقع الحديثة للتكيف مع تفضيلات المستخدمين، وتخصيص سمة الأيقونة المفضلة هو تفصيل غالباً ما يُغفل ويمكنه تحسين تجربة المستخدم بشكل ملحوظ. عندما يتبدل المستخدمون بين الوضعين الفاتح والداكن، يجب أن تتكيف أيقونتك المفضلة وفقاً لذلك للحفاظ على الاتساق البصري.

يغطي هذا الدليل الشامل كل شيء من حلول HTML البسيطة إلى تنفيذات JavaScript المتقدمة عبر الأُطر الشائعة. سواء كنت تبني موقعاً ثابتاً أو تطبيق ويب معقد، ستجد النهج المناسب لمشروعك.

الطريقة 1: حل HTML فقط (موصى بها لمعظم المواقع)

حل HTML فقط هو الأكثر موثوقية ولا يتطلب أي JavaScript. يستخدم استعلامات وسائط CSS ضمن خاصية media لوسوم ربط الأيقونة للتبديل التلقائي بناءً على تفضيل نظام المستخدم.

لماذا تعمل هذه الطريقة بشكل أفضل:

  • لا تتطلب JavaScript على الإطلاق
  • تعمل فوراً عند تحميل الصفحة
  • مدعومة من جميع المتصفحات الحديثة
  • بدون عبء أداء

التنفيذ الأساسي

<head>
  <!-- Default favicon (fallback for unsupported browsers) -->
  <link rel="icon" href="/favicon-light.ico" type="image/x-icon">

  <!-- Light mode favicon -->
  <link rel="icon" href="/favicon-light.ico" type="image/x-icon" media="(prefers-color-scheme: light)">

  <!-- Dark mode favicon -->
  <link rel="icon" href="/favicon-dark.ico" type="image/x-icon" media="(prefers-color-scheme: dark)">
</head>

التنفيذ الكامل متعدد الأحجام

لدعم شامل للأجهزة، نفّذ أحجاماً متعددة مع متغيرات السمة:

<head>
  <!-- Default favicons (fallback) -->
  <link rel="icon" type="image/x-icon" href="/favicon-light.ico">
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-light-32x32.png">

  <!-- Light mode favicons -->
  <link rel="icon" type="image/x-icon" href="/favicon-light.ico" media="(prefers-color-scheme: light)">
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon-light-16x16.png" media="(prefers-color-scheme: light)">
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-light-32x32.png" media="(prefers-color-scheme: light)">
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-light.png" media="(prefers-color-scheme: light)">

  <!-- Dark mode favicons -->
  <link rel="icon" type="image/x-icon" href="/favicon-dark.ico" media="(prefers-color-scheme: dark)">
  <link rel="icon" type="image/png" sizes="16x16" href="/favicon-dark-16x16.png" media="(prefers-color-scheme: dark)">
  <link rel="icon" type="image/png" sizes="32x32" href="/favicon-dark-32x32.png" media="(prefers-color-scheme: dark)">
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-dark.png" media="(prefers-color-scheme: dark)">

  <!-- SVG favicons with embedded CSS -->
  <link rel="icon" type="image/svg+xml" href="/favicon-adaptive.svg">
</head>

أيقونة SVG تكيفية

أنشئ أيقونة SVG واحدة تتكيف مع نظام الألوان تلقائياً:

<!-- favicon-adaptive.svg -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
  <style>
    .light-mode { fill: #000000; }
    .dark-mode { fill: #ffffff; }

    @media (prefers-color-scheme: dark) {
      .light-mode { display: none; }
    }

    @media (prefers-color-scheme: light) {
      .dark-mode { display: none; }
    }
  </style>

  <!-- Light mode design -->
  <circle class="light-mode" cx="16" cy="16" r="12"/>
  <text class="light-mode" x="16" y="20" text-anchor="middle" fill="#fff" font-size="14">L</text>

  <!-- Dark mode design -->
  <circle class="dark-mode" cx="16" cy="16" r="12"/>
  <text class="dark-mode" x="16" y="20" text-anchor="middle" fill="#000" font-size="14">D</text>
</svg>

الطريقة 2: تنفيذ JavaScript

عندما تحتاج تبديل أيقونة ديناميكي يتجاوز تفضيلات النظام — مثل أزرار سمة مخصصة أو تحديثات فورية — يوفر JavaScript المرونة التي تحتاجها.

استخدم JavaScript عندما:

  • لديك أزرار تحكم سمة مخصصة
  • تحتاج مزامنة مع حالة سمة تطبيقك
  • تريد تحديث الأيقونات بدون تحديث الصفحة
  • تبني تطبيق صفحة واحدة

نهج JavaScript الأساسي

// Function to update favicon based on theme
function updateFavicon(theme) {
  const favicon = document.querySelector('link[rel="icon"]') ||
                 document.createElement('link');

  favicon.rel = 'icon';
  favicon.type = 'image/png';
  favicon.href = theme === 'dark' ? '/favicon-dark.png' : '/favicon-light.png';

  if (!document.querySelector('link[rel="icon"]')) {
    document.head.appendChild(favicon);
  }
}

// Listen for system theme changes
if (window.matchMedia) {
  const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');

  // Set initial favicon
  updateFavicon(mediaQuery.matches ? 'dark' : 'light');

  // Listen for changes
  mediaQuery.addEventListener('change', (e) => {
    updateFavicon(e.matches ? 'dark' : 'light');
  });
}

JavaScript متقدم مع أحجام متعددة

class FaviconManager {
  constructor() {
    this.sizes = [
      { size: '16x16', selector: 'link[rel="icon"][sizes="16x16"]' },
      { size: '32x32', selector: 'link[rel="icon"][sizes="32x32"]' },
      { size: '180x180', selector: 'link[rel="apple-touch-icon"]' }
    ];

    this.init();
  }

  init() {
    // Set initial theme
    this.updateTheme(this.getSystemTheme());

    // Listen for system changes
    if (window.matchMedia) {
      const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
      mediaQuery.addEventListener('change', (e) => {
        this.updateTheme(e.matches ? 'dark' : 'light');
      });
    }
  }

  getSystemTheme() {
    return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
      ? 'dark' : 'light';
  }

  updateTheme(theme) {
    this.sizes.forEach(({ size, selector }) => {
      let link = document.querySelector(selector);

      if (!link) {
        link = document.createElement('link');
        link.rel = size === '180x180' ? 'apple-touch-icon' : 'icon';
        link.type = 'image/png';
        if (size !== '180x180') link.sizes = size;
        document.head.appendChild(link);
      }

      link.href = `/favicon-${theme}-${size}.png`;
    });

    // Update default ico file
    let icoLink = document.querySelector('link[rel="icon"][type="image/x-icon"]');
    if (!icoLink) {
      icoLink = document.createElement('link');
      icoLink.rel = 'icon';
      icoLink.type = 'image/x-icon';
      document.head.appendChild(icoLink);
    }
    icoLink.href = `/favicon-${theme}.ico`;
  }

  // Method to manually set theme (for custom theme toggles)
  setTheme(theme) {
    this.updateTheme(theme);
  }
}

// Initialize
const faviconManager = new FaviconManager();

// Export for manual theme switching
window.faviconManager = faviconManager;

الطريقة 3: تكامل الأُطر

توفر الأُطر الحديثة طرقاً أنيقة للتعامل مع تخصيص سمة الأيقونة. إليك كيفية تنفيذ أيقونات تكيفية في أكثر أُطر JavaScript شيوعاً.

تنفيذ React

import { useEffect, useState } from 'react';
import { Helmet } from 'react-helmet';

function AdaptiveFavicon() {
  const [theme, setTheme] = useState('light');

  useEffect(() => {
    // Check system preference
    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
    setTheme(mediaQuery.matches ? 'dark' : 'light');

    // Listen for changes
    const handleChange = (e) => {
      setTheme(e.matches ? 'dark' : 'light');
    };

    mediaQuery.addEventListener('change', handleChange);
    return () => mediaQuery.removeEventListener('change', handleChange);
  }, []);

  return (
    <Helmet>
      <link rel="icon" type="image/x-icon" href={`/favicon-${theme}.ico`} />
      <link rel="icon" type="image/png" sizes="32x32" href={`/favicon-${theme}-32x32.png`} />
      <link rel="apple-touch-icon" sizes="180x180" href={`/apple-touch-icon-${theme}.png`} />
    </Helmet>
  );
}

تنفيذ Vue 3

<template>
  <div>
    <!-- Your app content -->
  </div>
</template>

<script setup>
import { ref, onMounted, watch } from 'vue'
import { useHead } from '@unhead/vue'

const isDark = ref(false)

const updateFavicon = () => {
  const theme = isDark.value ? 'dark' : 'light'

  useHead({
    link: [
      { rel: 'icon', type: 'image/x-icon', href: `/favicon-${theme}.ico` },
      { rel: 'icon', type: 'image/png', sizes: '32x32', href: `/favicon-${theme}-32x32.png` },
      { rel: 'apple-touch-icon', sizes: '180x180', href: `/apple-touch-icon-${theme}.png` }
    ]
  })
}

onMounted(() => {
  // Check system preference
  if (window.matchMedia) {
    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
    isDark.value = mediaQuery.matches

    // Listen for changes
    mediaQuery.addEventListener('change', (e) => {
      isDark.value = e.matches
    })
  }

  updateFavicon()
})

watch(isDark, updateFavicon)
</script>

تنفيذ Nuxt 3

// nuxt.config.ts
export default defineNuxtConfig({
  app: {
    head: {
      script: [
        {
          innerHTML: `
            (function() {
              const updateFavicon = (isDark) => {
                const theme = isDark ? 'dark' : 'light';
                const links = [
                  { rel: 'icon', type: 'image/x-icon', href: \`/favicon-\${theme}.ico\` },
                  { rel: 'icon', type: 'image/png', sizes: '32x32', href: \`/favicon-\${theme}-32x32.png\` }
                ];

                links.forEach(linkData => {
                  let link = document.querySelector(\`link[rel="\${linkData.rel}"][sizes="\${linkData.sizes || 'any'}"]\`);
                  if (!link) {
                    link = document.createElement('link');
                    Object.assign(link, linkData);
                    document.head.appendChild(link);
                  } else {
                    link.href = linkData.href;
                  }
                });
              };

              if (window.matchMedia) {
                const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
                updateFavicon(mediaQuery.matches);
                mediaQuery.addEventListener('change', e => updateFavicon(e.matches));
              }
            })();
          `
        }
      ]
    }
  }
})

الطريقة 4: أيقونة CSS-in-JS (متقدمة)

ولّد أيقونات ديناميكياً باستخدام Canvas وألوان CSS:

class DynamicFaviconGenerator {
  constructor() {
    this.canvas = document.createElement('canvas');
    this.ctx = this.canvas.getContext('2d');
    this.canvas.width = 32;
    this.canvas.height = 32;
  }

  generateFavicon(theme) {
    const colors = {
      light: { bg: '#ffffff', text: '#000000' },
      dark: { bg: '#000000', text: '#ffffff' }
    };

    const { bg, text } = colors[theme];

    // Clear canvas
    this.ctx.clearRect(0, 0, 32, 32);

    // Draw background
    this.ctx.fillStyle = bg;
    this.ctx.fillRect(0, 0, 32, 32);

    // Draw border
    this.ctx.strokeStyle = text;
    this.ctx.lineWidth = 2;
    this.ctx.strokeRect(2, 2, 28, 28);

    // Draw icon (example: letter or symbol)
    this.ctx.fillStyle = text;
    this.ctx.font = 'bold 20px Arial';
    this.ctx.textAlign = 'center';
    this.ctx.textBaseline = 'middle';
    this.ctx.fillText('🌙', 16, 16);

    return this.canvas.toDataURL('image/png');
  }

  updateFavicon(theme) {
    const dataUrl = this.generateFavicon(theme);

    let link = document.querySelector('link[rel="icon"]');
    if (!link) {
      link = document.createElement('link');
      link.rel = 'icon';
      link.type = 'image/png';
      document.head.appendChild(link);
    }

    link.href = dataUrl;
  }
}

// Usage
const generator = new DynamicFaviconGenerator();
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');

generator.updateFavicon(mediaQuery.matches ? 'dark' : 'light');
mediaQuery.addEventListener('change', e => {
  generator.updateFavicon(e.matches ? 'dark' : 'light');
});

أفضل ممارسات التصميم

إنشاء أيقونات تكيفية فعالة يتطلب اهتماماً دقيقاً بمبادئ التصميم وتجربة المستخدم.

التباين والرؤية

تصميم أيقونة الوضع الفاتح:

  • استخدم عناصر داكنة (نص، أيقونات) على خلفيات شفافة أو فاتحة
  • استهدف نسب تباين WCAG AA (4.5:1 كحد أدنى)
  • اختبر المظهر على تبويبات متصفح بيضاء وأشرطة إشارات مرجعية
  • اضمن الوضوح عند 16×16 بكسل (أصغر حجم شائع)

تصميم أيقونة الوضع الداكن:

  • استخدم عناصر فاتحة على خلفيات شفافة أو داكنة
  • اختبر الرؤية مقابل سمات المتصفح الداكنة
  • تجنب الأبيض النقي (#ffffff) — استخدم أبيض مخفف (#f0f0f0) لتوازن أفضل
  • فكر في ظلال أو خطوط خفيفة للتحديد

نصائح اتساق التصميم

  1. حافظ على التعرف على العلامة التجارية — أبقِ عناصر تصميمك الأساسية متسقة
  2. اختبر بأحجام متعددة — 16×16 و32×32 و180×180 بكسل
  3. استخدم أشكالاً بسيطة — التفاصيل المعقدة تختفي بالأحجام الصغيرة
  4. ضع في اعتبارك مستخدمي عمى الألوان — لا تعتمد على اللون وحده للتمييز

اصطلاح تسمية الملفات

نظّم ملفات أيقونتك بتسمية واضحة:

/public/
├── favicon-light.ico
├── favicon-dark.ico
├── favicon-light-16x16.png
├── favicon-dark-16x16.png
├── favicon-light-32x32.png
├── favicon-dark-32x32.png
├── apple-touch-icon-light.png
├── apple-touch-icon-dark.png
└── favicon-adaptive.svg

توافق المتصفحات

دعم المتصفحات الحديثة للأيقونات التكيفية

المتصفح دعم استعلام الوسائط ملاحظات
Chrome 76+ دعم كامل يعمل بشكل مثالي
Firefox 67+ دعم كامل تنفيذ ممتاز
Safari 12.1+ دعم كامل يشمل iOS Safari
Edge 79+ دعم كامل Edge القائم على Chromium
Internet Explorer بدون دعم استخدم JavaScript كاحتياط

تغطية السوق: هذه الإصدارات تغطي ~95% من استخدام المتصفحات العالمي حتى 2025.

استراتيجية الاحتياط

<!-- Always provide fallbacks -->
<link rel="icon" href="/favicon-light.ico" type="image/x-icon">

<!-- Enhanced support for modern browsers -->
<link rel="icon" href="/favicon-light.ico" type="image/x-icon" media="(prefers-color-scheme: light)">
<link rel="icon" href="/favicon-dark.ico" type="image/x-icon" media="(prefers-color-scheme: dark)">

<!-- JavaScript fallback for older browsers -->
<script>
  if (!window.matchMedia || !CSS.supports('(prefers-color-scheme: dark)')) {
    // Load favicon based on time of day or other heuristics
    const hour = new Date().getHours();
    const isDark = hour < 6 || hour > 18;
    document.querySelector('link[rel="icon"]').href =
      isDark ? '/favicon-dark.ico' : '/favicon-light.ico';
  }
</script>

الاختبار والتحقق

قائمة فحص الاختبار اليدوي

  • [ ] اختبار في الوضع الفاتح (تفضيل النظام)
  • [ ] اختبار في الوضع الداكن (تفضيل النظام)
  • [ ] التحقق من تغير الأيقونة فوراً عند تبديل سمة النظام
  • [ ] الفحص في متصفحات مختلفة (Chrome، Firefox، Safari، Edge)
  • [ ] اختبار على الأجهزة المحمولة
  • [ ] التحقق من سلوك الاحتياط في المتصفحات القديمة

الاختبار الآلي

// Test script for favicon theme switching
function testFaviconThemes() {
  const tests = [
    { theme: 'light', expected: '/favicon-light.ico' },
    { theme: 'dark', expected: '/favicon-dark.ico' }
  ];

  tests.forEach(({ theme, expected }) => {
    // Mock media query
    Object.defineProperty(window, 'matchMedia', {
      writable: true,
      value: jest.fn().mockImplementation(query => ({
        matches: query.includes('dark') ? theme === 'dark' : theme === 'light',
        addEventListener: jest.fn(),
        removeEventListener: jest.fn(),
      })),
    });

    // Trigger update
    updateFavicon(theme);

    // Assert
    const favicon = document.querySelector('link[rel="icon"]');
    expect(favicon.href).toContain(expected);
  });
}

تحسين الأداء

تحميل أيقونات السمة مسبقاً

<!-- Preload both theme favicons for instant switching -->
<link rel="preload" as="image" href="/favicon-light.ico">
<link rel="preload" as="image" href="/favicon-dark.ico">

تقليل أحجام الملفات

  • أبقِ ملفات ICO أقل من 1 كيلوبايت
  • حسّن ملفات PNG بأدوات مثل TinyPNG
  • استخدم SVG للتصاميم الهندسية البسيطة
  • فكر في صيغة WebP للمتصفحات الحديثة

استراتيجية التخزين المؤقت

# Nginx configuration for favicon caching
location ~* \.(ico|png|svg)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
    add_header Vary "Accept-Encoding";
}

استكشاف المشاكل الشائعة

الأيقونة لا تتبدل بين السمات

الأعراض: الأيقونة تبقى نفسها بغض النظر عن تغييرات سمة النظام

الأسباب والحلول الشائعة:

  1. مشاكل ذاكرة المتصفح المؤقتة

    <!-- Add cache-busting parameters -->
    <link rel="icon" href="/favicon-light.ico?v=2025" media="(prefers-color-scheme: light)">
    <link rel="icon" href="/favicon-dark.ico?v=2025" media="(prefers-color-scheme: dark)">
    
  2. صياغة استعلام وسائط غير صحيحة

    <!-- ❌ Wrong -->
    <link rel="icon" href="/favicon-dark.ico" media="dark">
    
    <!-- ✅ Correct -->
    <link rel="icon" href="/favicon-dark.ico" media="(prefers-color-scheme: dark)">
    

أيقونات متعددة تُحمَّل في وقت واحد

الأعراض: تبويب الشبكة يُظهر طلبات أيقونة متعددة

الحل: استخدم JavaScript للاستبدال بدلاً من الإضافة:

function replaceFavicon(href) {
  // Remove all existing favicon links
  document.querySelectorAll('link[rel*="icon"]').forEach(link => link.remove());

  // Add new favicon
  const link = document.createElement('link');
  link.rel = 'icon';
  link.type = 'image/x-icon';
  link.href = href;
  document.head.appendChild(link);
}

أيقونات SVG لا تُعرض

الأعراض: أيقونة SVG تعمل في بعض المتصفحات لكن ليس غيرها

السبب الجذري: دعم محدود لأيقونات SVG في المتصفحات القديمة

الحل: وفّر دائماً احتياطي PNG:

<!-- Modern browsers: SVG with media queries -->
<link rel="icon" type="image/svg+xml" href="/favicon-adaptive.svg">

<!-- Fallback: PNG for older browsers -->
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-light-32x32.png" media="(prefers-color-scheme: light)">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-dark-32x32.png" media="(prefers-color-scheme: dark)">

تقنيات متقدمة

شارات الإشعارات الواعية بالسمة

class NotificationFavicon {
  constructor() {
    this.canvas = document.createElement('canvas');
    this.ctx = this.canvas.getContext('2d');
    this.canvas.width = 32;
    this.canvas.height = 32;
    this.baseIcons = {
      light: '/favicon-light-32x32.png',
      dark: '/favicon-dark-32x32.png'
    };
  }

  async drawWithBadge(theme, count) {
    const baseIcon = new Image();
    baseIcon.src = this.baseIcons[theme];

    return new Promise(resolve => {
      baseIcon.onload = () => {
        this.ctx.clearRect(0, 0, 32, 32);
        this.ctx.drawImage(baseIcon, 0, 0, 32, 32);

        if (count > 0) {
          // Draw notification badge
          const badgeSize = 12;
          const x = 32 - badgeSize;
          const y = 0;

          // Badge background
          this.ctx.fillStyle = '#ff4444';
          this.ctx.beginPath();
          this.ctx.arc(x + badgeSize/2, y + badgeSize/2, badgeSize/2, 0, 2 * Math.PI);
          this.ctx.fill();

          // Badge text
          this.ctx.fillStyle = 'white';
          this.ctx.font = '8px Arial';
          this.ctx.textAlign = 'center';
          this.ctx.textBaseline = 'middle';
          this.ctx.fillText(
            count > 9 ? '9+' : count.toString(),
            x + badgeSize/2,
            y + badgeSize/2
          );
        }

        resolve(this.canvas.toDataURL());
      };
    });
  }

  async updateWithNotification(count = 0) {
    const theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
    const dataUrl = await this.drawWithBadge(theme, count);

    let link = document.querySelector('link[rel="icon"]');
    if (!link) {
      link = document.createElement('link');
      link.rel = 'icon';
      document.head.appendChild(link);
    }
    link.href = dataUrl;
  }
}

// Usage
const notificationFavicon = new NotificationFavicon();
notificationFavicon.updateWithNotification(3); // Show badge with count 3

الملخص والخطوات التالية

الأيقونات التكيفية تمثل طريقة صغيرة لكن مؤثرة لتحسين تجربة المستخدم. تُظهر الاهتمام بالتفاصيل واحترام تفضيلات المستخدم، مما يساهم في موقع أكثر صقلاً واحترافية.

اختر الطريقة المناسبة لمشروعك

الطريقة الأفضل لـ التعقيد الأداء
HTML فقط المواقع الثابتة، المدونات، صفحات التسويق منخفض ممتاز
JavaScript تطبيقات الصفحة الواحدة، السمات المخصصة، التحديثات الديناميكية متوسط جيد
تكامل الأُطر تطبيقات React/Vue/Nuxt متوسط جيد
التقنيات المتقدمة أنظمة الإشعارات، التحديثات الفورية عالي متغير

قائمة فحص التنفيذ

قبل نشر نظام أيقونتك التكيفية:

  • [ ] إنشاء نسختين من الأيقونة للوضع الفاتح والداكن
  • [ ] اختبار في عدة متصفحات (Chrome، Firefox، Safari، Edge)
  • [ ] التحقق من عمل التبديل مع تغييرات سمة النظام
  • [ ] اختبار على الأجهزة المحمولة (iOS Safari، Android Chrome)
  • [ ] تحسين أحجام الملفات (أبقِ ICO أقل من 1 كيلوبايت)
  • [ ] إضافة احتياطيات مناسبة للمتصفحات القديمة
  • [ ] التحقق من التنفيذ بأدوات مثل Favicon.im

تأثير الأداء

عند التنفيذ بشكل صحيح، الأيقونات التكيفية لها تأثير أداء ضئيل:

  • طريقة HTML فقط: صفر عبء JavaScript
  • تأثير حجم الملف: ~2-4 كيلوبايت إجمالي (نسختا الفاتح + الداكن)
  • وقت التحميل: لا يُذكر مع التخزين المؤقت المناسب

المزيد

فكر في هذه التحسينات المتقدمة:

  • حمّل أصول الأيقونة الحرجة مسبقاً للتبديل الفوري
  • استخدم صيغة WebP للمتصفحات الحديثة (مع احتياطيات PNG)
  • نفّذ شارات أيقونة ديناميكية للإشعارات
  • أضف رسوم أيقونة متحركة للمناسبات أو الحالات الخاصة

بتنفيذ الأيقونات التكيفية بعناية، تنشئ تجربة ويب أكثر تماسكاً وسهولة في الاستخدام تتكيف مع تفضيلات المستخدمين الحديثة.

Check Your Favicon

Use favicon.im to quickly check if your favicon is configured correctly. Our free tool ensures your website's favicon displays properly across all browsers and devices.

Free Public Service

Favicon.im is a completely free public service trusted by developers worldwide.

15M+
Monthly Favicon Requests
100%
Free Forever