Rem Hack

Трябва ли да използваме font-size: 62.5% в CSS? Истината за популярния REM hack

Преди няколко години, когато за първи път записах курс по HTML/CSS, лекторът препоръча един много як хак, с който да се промени цялостния размер на буквите, а и другите елементи в html документа, така че да се смята по-лесно в rem мерна единица, а именно:
 html {

    font-size: 62.5%;

}

Идеята зад този „трик“ е проста – да се направи така, че 1rem да бъде равен на 10px, вместо стандартните 16px. Това улеснява значително преобразуването на стойности от пиксели към rem.

Аз разбира се, веднага тествах този трик и всичко изглеждаше супер.

Но дали е добра практика? Наскоро се зачудих по този въпрос, след като попаднах на някои „недостатъци“, които front-end разработчици споделят във връзка с този хак. И се оказва, че все повече девелопъри са започнали да избягват този подход.

Преди да разгледаме, защо, обаче, нека обясня:

Как работи rem в CSS

В началото, в ранните версии на CSS (Cascading Style Sheet) – говорим за годините около 1996, когато е разработен, програмистите използвали предимно пиксели, проценти и em – като em е първата относителна единица за текст.

И всичко си е било наред, докато не започнали да се появяват сложни layout-и. Тогава използването на em се усложнило, тъй като em се изчислява спрямо родителският елемент.

Например, ако body font-size = 16px, div font-size, който се намира в body = 1.2em, а p font-size, който се намира в div-a = 1.2em, то се получава, че div = 19.2px, a p = 23.04px.

Тоест, размерите започват да се натрупват „каскадно“ като водопад, който пада от скала на скала в езеро.

Това води до няколко проблема.

  • Трудно се предвижда крайният размер;
  • Сложни layout-и стават трудни за контрол;
  • Компонентите стават зависими един от друг.

С други думи, CSS започва да става много сложен.

И така, с течение на времето и обновяването на CSS и по-точно с появата на CSS3 се създава огромен набор от нови модули, целящи да подобрят езика. Един от тях е така наречения „CSS Values and Units Module Level 3“, където се появява rem. А името на тази единица идва от Root em. Разликата с em, обаче е, че rem = em спрямо root елемента html.

Основната идея е проста. Вместо да става натрупване като при em, размерът се изчислява спрямо коренния елемент на документа – html, който по подразбиране е 16px.

Така дори да имаме html font-size = 16px, div font-size = 2rem и p font-size = 1rem, това ще означава, че div-а = 32px, a p-то на 16px.

И така, да се върнем на темата с промяната на кореновия елемент.

Защо изобщо се появява този 62.5% hack?

Проблемът възниква, когато дизайнерски файлове (например във Figma или Photoshop) използват pixel стойности.

Например:

  • 24px padding;
  • 32px margin;
  • 18px font-size;

Ако използваме стандартният размер на rem трябва да направим преобразуване от сорта:

  • 24px -> 1.5rem;
  • 32px -> 2rem;
  • 18px -> 1.125rem;

За някои девелопъри, това са неудобни изчисления и затова се появява следният трик:

html {

  font-size: 62.5%;

}

И тъй като тези проценти от 62.5% от 16px = 10px, резултатът е, че 1rem = 10px и така изчисленията стават по-лесни:

  • 24px -> 2.4rem;
  • 32px -> 3.2rem;
  • 18px -> 1.8rem;

На пръв поглед това изглежда като удобно решение, но основният проблем е в достъпността.

Как 62.5%-товия хак поражда проблем с достъпността?

Основният проблем се появява заради това, че много хора променят базовия размер на браузъра си поради проблеми със зрението, използване на малки екрани или заради лични предпочитания за по-голям текст.

Така че, когато намалим базовия размер на HTML до 62.5%, на практика променяме начина, по който браузърът очаква да работи страницата.

Това може да доведе до по-малък текст от очакваното, неправилно мащабиране на интерфейса или пък нарушена достъпност на сайта.

А както знаем достъпността (accessibility) е сред най-важните принципи на съвременната уеб разработка.

Други проблеми могат да се появат при използване на външни библиотеки също, защото се предполага, че използват rem в стандартния размер от 16px, което може да доведе до неправилна визуализация.

Някои девелопъри пък изобщо не са чували за този хак, така че това може да породи неяснота в екипа.

Така, че се оказва, че този хак не е толкова добро решение.

Решението

Вместо това, повечето специалисти съветват да се използват други методи като css calc() например.

При използването на тази фунция, не е нужно rem-овете да се смятат „на ръка“. Достатъчно е да се въведе оригиналният размер в пиксели по следната формула – например:

p {

  font-size: calc(24 / 16 * 1rem);

}

Тук ясно се вижда, че оригиналният размер в пиксели е 24, което за разработчиците дори е по-ясно, отколкото да се напише 1.5rem.

Обаче пак трябва да се внимава, защото натрупването на много calc() функции, може да доведе до по-бавно зареждане на страницата.

Така, че варианти много – въпрос на проучване е да се намери по-правилно решение за имплементация, в съответствие с добрите практики. За още полезна информация delieva.bg и/или ако искате да работите с мен – за връзка с мен.