#заметка дня
Вы наверняка заметили, что призывы отказаться от пикселей звучат всё чаще и чаще. Я не буду сейчас описывать плюсы и минусы перехода на относительные единицы, я покажу простейшее решение. 
Любителям шлюзов будет другая статья. Хотите — обсудим в 
чате.
vw+vhИтак, вам кровь из носу нужно, чтобы сайт был абсолютно резиновым и реагировал на изменение размера окна пропорционально. Прочитали, что нужно использовать 
vw (viewport width) или 
vh (viewport height).
1vw это 1% от ширины видимой области экрана включая скроллбар, 1vh от, соответственно, высоты. Я рекомендую 
vw, ибо чаще всего, ширина макета это константа (я про макеты! не про результат, ниже поясню).
Теперь такой простой, но такой сложный секрет: чтобы ваши блоки изменяли размер пропорционально изменению ширины или высоты окна, 
нужно использовать что-то одно.
Единицы 
vh и 
vw – разные по определению! Прямоугольник 10vw на 10vh это не квадрат! Если вы изменяете ширину окна, высота-то остаётся постоянной. И наоборот. 
Второе: если уж взялись, то используйте их везде: размер блоков, шрифта, отступы, поля, базис – всё должно быть или в v-единицах (или в процентах, кто понимает). Это же касается, впрочем, и 
rem.
Третье: чтобы не сидеть с калькулятором (знаю таких кадров лично), я предлагаю воспользоваться следующей функцией для SCSS:
$base-width: 1920;
@function strip-unit($num) {
  @return $num / ($num * 0 + 1);
}
@function vw($num) {
  @return strip-unit($num) / $base-width * 100vw;
}
Пример:
.my-block {
  width: vw(100px);
  padding: vw(20px);
}
100px это ширина блока на макете 1920px. Не при разрешении экрана в 1920 по ширине, а на вашем макете от дизайнера. То есть: 100px ➗ 1920px ✖️ 100vw, по формуле простых процентов.
Многих смущает функция strip-unit. Мол, там же единица получается в знаменателе.
Нет, ребята. Не единица. По правилам SCSS 20px ➗ 1 = 20px, а 20px ➗ 1px = 20. Это простая алгебра дробей. Ну и соответственно, 20px ✖️ 100vw не имеет никакого смысла, а 20 ✖️ 100vw — имеет. Не умножайте сантиметры на килограммы (и не смейтесь над мемами с учителями).
Четвёртое: не забывайте про скроллбар, он ненулевой ширины, но при расчёте v-единиц не учитывается.
Пятое: сайт, свёрстанный таким образом, перестаёт зумиться на десктопах. Зато на мобильных – просто сказка, горячо рекомендую.
И шестое: в какой-то момент сайт станет просто мелким :)
remС 
rem (root em), единый размер шрифта корневого элемента, 
html, верны ровно всё те же утверждения и применима всё та же формула:
$base-font: 16;
@function rem($num) {
  @return strip-unit($num) / $base-font * 1rem;
}
Пример:
.my-block {
  width: rem(100px);
  padding: rem(20px);
}
Почему 16? Потому что 16px это размер шрифта тега 
html по-умолчанию в любом браузере. Не надо ставить 62.5% на 
html в надежде получить 10px, я вас умоляю! Да, числа выглядят красиво, но в вашу логику кому-то ещё въехать предстоит. Что понятнее, 10rem из 62.5% или rem(100px)? 
Хотя ладно, тут кому как.
Главное: не ставьте 
никогда размер шрифта 
html в px, вы потеряете всю красоту доступности 
rem для людей, которые изменяют размер шрифта браузера по-умолчанию.
К плюсам 
rem точно можно отнести возможность изменять размер всего сайта простым переключением размера шрифта. Например, на сайте Минэкономразвития РФ так сделана панель для слабовидящих (но ошибка с 16px в корне присутствует). 
Второй плюс: когда дизайнер неопытный, он запросто может вам прислать макет в 1440px, например. А большинство экранов имеют размер 1280 и 1366. Не каждый макет можно аккуратно адаптировать. И вот тут магия быстрого изменения масштаба очень нужна. Меняете себе размер шрифта по медиа-запросам и готово.
Минусы – зум будет работать, но не очень адекватно.
Шлюзы, 
em, правильную резину и проценты я рассмотрю как-нибудь позже.
Краткий выводВерстать 
весь сайт в 
vh и 
vw имеет смысл только если у вас реально что-то сложное, с большим количеством просчитанных заранее взаимодействий. 
Когда верстаете в px (всё же они проще), шрифт вполне можно указывать в 
rem, а отступы — в 
em.
#css #em #rem #vh #vw