گوگل مجموعهای از شاخصها رو برای اندازه گیری کیفیت UX/UI، سرعت بارگذاری، میزان ثبات بصری و ... رو تحت عنوان Core Web Vitals معرفی کرده که یکی از این شاخصهای CLS هست، مخفف cumulative layout shift.
این شاخص میزان پایداری و ثبات صفحه رو نشون میده و میتونید در پنجره performance در developer tools مرورگر chrome اون رو بررسی کنید. یکی از عاملی که روی اون تاثیر جدی میذاره بحث لود شدن فونتها هست که در این مطلب میخوایم با هم اون رو بشناسیم و راهکارهای بهبودش رو درک کنیم.
شاخص CLS حرکتهای غیرمنتظره، مثل ظاهر و جابهجا شدن یهویی المانهای صفحه (شیفت و فلش خوردن) رو اندازه گیری میکنه اونم با توجه به این که این تغییرات چقدر از پنجره در حال نمایش به کاربر رو تحت تاثیر قرار و اگر در پنجره نیستن چقدر از پنجره دور هستن.
شاخص CLS از دو پارامتر تشکیل شده و عدد حاصل از این دو در هم ضرب میشه و مقدار CLS رو میسازه. در پارامتر impact fraction (IF) این بررسی میشه که چقدر از سطح viewport (پنجره در حال نمایش به کاربر) تحت تاثیر این تغییرات غیرمنتظره قرار گرفته و در پارامتر بعدی یعنی distance fraction (DF) هم این اندازه گیری میشه که فاصله اون تغییرات رخ داده تا viewport چقدر هست. طبیعتا هر چه سطحی کمتری از صفحه درگیری این تغییرات بشه و هر چه از محل در حال نمایش به کاربر دورتر باشه تاثیر کمتری بر تجربه کاربر میذاره پس CLS بهتری خواهیم داشت.

CLS = IF * DF
اگر عدد CLS به دست امده از 0.1 کمتر بود ما عالی عمل کردیم و اگر از 0.25 بیشتر بود یعنی با یک افتضاح رو به رو هستیم و طبیعتا عدد بین این دو نیاز به تلاش برای بهبود داره و این مقدار رو در تب performance در developer tools مرورگر chrome برای صفحه جاری میتونید ببنید.
یکی از تلاشهایی که برای بهبود شاخص CLS میشه کرد، optimise کردن حجم و نحوه و سرعت لود اونهاست. در طی لود شدن فونتها بسته به این که ما font-display رو چطور تعریف کرده باشم FOIT (یهو ظاهرا شدن متنها) و FOUT (یهو استایل پیدا کردن متنها) میتونه رخ بده و روی شاخص CLS تاثیر بذاره.

وقتی یک فونت رو در کل یا بخش از صفحه استفاده میکنیم مرورگر در طی پردازش و painting وقتی به اون المنت میرسه ابتدا تلاش میکنه تا به فایل فونت دسترسی پیدا کنه. اگر اون فونت قبلا لود و کش شده باشه یا فونت پیش فرض سیستم استفاده شده باشه در همین مرحله اغلب متنها با فونت مورد نظر render میشن. اما وقتی ما از یک فونت خارجی استفاده کرده باشیم قضیه کمی پیچیدهتر میشه و به طول کلی این پروسه سه بخش block, swap و failure میتونه داشته باشه که البته بسته به این که font-display چی تعریف شده ممکن هست بعضی از اینها رو نداشته باشیم و تغییراتی هم این فازها داشته باشم.
حواستون باشه این ۳ حالتی که پایین توضیح دادم مقدایر font-display نیست بلکه چرخههایی مفهومی هستن و در ظاهر با مقادیر font-display شباهت دارن ولی در تعریف میتونن متفاوت باشن!
هر کدام از مقادیر font-display روی این سه چرخه لود فونت میتونه چنین تغییراتی روی ایجاد کنه:
جمعبندی FOUT، FOIT و CLS
همونطور که دید در برخی حالتها و شرایط ما میتونیم شیف و فلش خوردن صفحه رو به واسطه لود شدن فونتها تجربه کنیم و اگر هدف ما این باشه که CLS رو کاهش بدیم باید تا می تونیم در قدم اول تعداد فونتهایی که استفاده میکنیم رو کاهش بدیم و ترجیحا از یک یا نهایتا دوتا فونت استفاده کنیم، در قدم بعدی subset و weightهای بلااستفاده رو از فونت که مورد استفاده قرار نمیگیرن حذف کنیم تا حجمش کم بشه و در نهایت با راهکارهای سمت سروری مثل کش کردن سرعت دانلود فونت رو افزایش بدیم و در نهایت نه به شکل افراطی بلکه خیلی معقول از انیمیشنهایی مثل fade-in در موارد که فلش خورد در لود داریم استفاده کنیم
استفاده از انیمیشنهایی که منجر به تغییر سایزهایی ممتد المنت میشن و این باعث میشه تا المنتهای جانبیشون رو هم تغییر کنن و به نوعی در کل صفحه حرکت ایجاد کنن مخصوصا در لود اولیه جدا خودداری کنید هم در پردازش بد پرفورمنس هستن و هم در تجربه کاربری و بصری و میتونن عاملی برای بدتر شدن نرخ CLS باشن.
همچنین بهتره از font-displayهایی که سختگیرانهتر عمل میکنن مثل fallback استفاده کنید و فونتهای پیش فرض مناسبی رو تعیین کنید اگر هم که حتما لود فونت خارجی رو حتی با اندکی افزایش CLS ترجیح دادید بهتره از swap به جای block استفاده کنید.
اگر نکتهای جا مونده اون رو در کامنتها اضافه کن.