Dynamically Changing Favicon Based on User's Color Scheme Preference

The favicon, that tiny but essential image displayed in a browser's tab or bookmark list, is often overlooked when considering a website's customization and personalization.

However, it's a subtle yet effective way to enhance the user experience. One way to achieve this enhancement is by dynamically changing the favicon based on a user's color scheme preference.

In this article, we'll explore how to implement this feature using HTML, CSS, and JavaScript.

Why Change the Favicon Dynamically?

Adapting the favicon based on a user's color scheme preference offers several benefits:

  1. Personalization: It provides a more personalized experience to users, making your website feel more in tune with their preferences.

  2. Visual Continuity: It aligns with the overall color scheme of the website, ensuring visual continuity, especially in dark mode.

  3. User Engagement: This subtle customization can improve user engagement and help your website stand out from the competition.

Creating Different Favicon Images

The first step is to create multiple favicon images that match the light and dark color schemes of your website.

These images should be easily distinguishable from each other. Save them with distinct filenames, such as "favicon-light.png" and "favicon-dark.png."

Linking the Default Favicon in Your HTML

In your HTML document's <head> section, link the default favicon using the following code:

<link rel="icon" type="image/png" href="favicon.png" id="favicon" />

This code links the favicon with the "favicon" ID, which we'll use for dynamic updates.

Detecting the User's Color Scheme Preference

JavaScript can be used to detect the user's color scheme preference. The following code checks whether the user has a light or dark color scheme:

const prefersDarkMode = window.matchMedia(
    '(prefers-color-scheme: dark)'

This code checks whether the user's system preferences include a dark mode. If it does, prefersDarkMode will be set to true.

Dynamically Changing the Favicon

Now, let's add the JavaScript code to dynamically change the favicon based on the user's color scheme preference.

Add the following code just before the closing </body> tag in your HTML document:

    const favicon = document.getElementById('favicon');
    const prefersDarkMode = window.matchMedia(
        '(prefers-color-scheme: dark)'

    function setFavicon() {
        const faviconPath = prefersDarkMode
            ? 'favicon-dark.png'
            : 'favicon-light.png';
        favicon.href = faviconPath;

    setFavicon(); // Initial favicon setup

    // Listen for changes in the user's color scheme preference
        .matchMedia('(prefers-color-scheme: dark)')
        .addEventListener('change', (e) => {
            prefersDarkMode = e.matches;

This JavaScript code does the following:

Testing and Deployment

After implementing the dynamic favicon change, thoroughly test your website to ensure that the favicon updates correctly based on the user's color scheme preference. Once everything works as expected, deploy your updated HTML file to your web server.

With this feature in place, users visiting your website will experience a more personalized and visually coherent browsing experience.

The dynamic favicon change based on their color scheme preference is a subtle but effective way to make your website more engaging and user-friendly.