تغییر favicon با تغییر به light mode و dark mode در react js
اگر در حال نوشتن یک برنامه با react js هستید و به دنبال این هستید که در صورتی که کاربر دستگاه خود را در حالت light mode یا dark mode قرار داد favicon صفحه را تغییر دهید از این نوشته برای آن استفاده کنید.
تغییر favicon با تغییر به light mode و dark mode در react js
برای اینکار ابتدا یک فایل js در پوشهی public خود بسازید میتوانید نام آن را favicon.js بگذارید. محتوای این فایل را با کدهای زیر پر کنید:
addEventListener("load", (event) => {
function set_favicon() {
const usesDarkMode =
window.matchMedia("(prefers-color-scheme: dark)").matches || false;
const favicon = document.getElementById("favicon");
function switchIcon(usesDarkMode) {
if (usesDarkMode) {
favicon.href = "/favicon-light.png";
} else {
favicon.href = "/favicon-dark.png";
}
}
window
.matchMedia("(prefers-color-scheme: dark)")
.addEventListener("change", (e) => switchIcon(e.matches));
switchIcon(usesDarkMode);
}
set_favicon();
});
onload = (event) => {};
سپس فایل index.html که درون فولدر public موجود است قبل از بسته شدن تگ body کد زیر را قرار دهید:
<script src="favicon.js"></script>
سپس خطی که در آن کد مربوط به favicon.ico قرار گرفته است را با کد زیر جایگزین کنید:
<link rel="shortcut icon" id="favicon" href="%PUBLIC_URL%/favicon.ico" />
حالا باید فایلهای favicon مربوط به حالت روشن و تیره است را با نامهای favicon-dark.png و favicon-light.png در پوشهی public ذخیره کنید.
در صورتی که سوالی در ارتباط با کد بالا دارید در بخش نظرات همین نوشته برای ما بنویسید.


















میشه این کد رو توی index.js react گذاشت یا حتما باید توی public باشه؟
سلام. برای اینکه این قابلیت به درستی کار کند، بهتر است کد را در پوشه public قرار دهید تا به صورت مستقل از فرآیند بیلد ریاکت اجرا شود.
اگه چندتا favicon با سایزهای مختلف داشته باشیم، باید همه رو تغییر بدیم؟
خیر، کافیست فقط favicon اصلی را که در کد استفاده شده تغییر دهید. مرورگرها معمولاً به طور خودکار اندازه مناسب را انتخاب میکنند.
این onchange listener روی مرورگرهای قدیمی کار میکنه؟
متاسفانه matchMedia و event listener مربوط به آن در مرورگرهای بسیار قدیمی پشتیبانی نمیشوند. برای اطمینان از سازگاری، میتوانید از polyfill استفاده کنید یا راهکارهای جایگزین دیگری را در نظر بگیرید.
آیا لازم هست فایل favicon.js قبل از تمام اسکریپتهای react لود بشه؟
سلام، خیر، لزومی ندارد که فایل favicon.js قبل از تمام اسکریپتهای ریاکت لود شود. مهم این است که قبل از اولین رندر یا تعامل با DOM که نیاز به تغییر favicon دارد، اجرا شود.
این روش روی همه مرورگرها کار میکنه یا فقط کروم و فایرفاکس؟
سلام، این روش بر اساس ویژگی prefers-color-scheme است که توسط اکثر مرورگرهای مدرن پشتیبانی میشود.