vw, vh и vmin — что за ними таится

в 21:37, , рубрики: css, css3, viewport, Веб-разработка, типографика

CSS3 привнесло в нашу жизнь новые единицы измерения: vw, vh, и vmin. С недавних пор dev-версия Chrome (под номером 20) тоже поддерживает их, а это дарует некоторую надежду, что и разработчики других браузеров последуют этому примеру. На самом деле, это было бы кстати, ведь это очень удобно и практично, а я попробую рассказать, почему это так.

Почему это клево?

Много причин. Вот две из них:

  1. Существует такая вещь, как длина строки текста, при которой чтение является комфортным. Я не хочу разжигать холивары, но, допустим, это 80 символов. Так вот, эти единицы измерения позволяют вам соблюдать это значение на любом размере экрана
  2. Еще они могут регулировать отношение заголовка к основному тексту, как, например, в одном из постов Trent Walton (англ.)

Как это работает?

Единица каждого из этих трех значений составляет 1% от размера экрана. Например, если размер экрана составляет 40 сантиметров по ширине, то 1vw равен 0.4 см.

1vw = 1% ширины окна
1vh = 1% высоты окна
1vmin = 1vw или 1vh, в зависимости от того, что меньше

Использование

О, это очень просто:

h1 {
	font-size: 5.9vw;
}
h2 {
	font-size: 3.0vh;
}
p {
	font-size: 2vmin;
}

Поддержка браузерами

Chrome 20+ и IE 10+
Я проверял в Opera Next (12), Safari 5.2 и Firefox Beta (13) — безрезультатно.

Демо

Небольшое видео, в котором показывается использование vw:

Тут можно попробовать самому (убедитесь, что Ваш браузер поддерживает данные единицы измерения)

Баги

Поддержка есть в Chrome 20, но немного кривая. Когда окна браузера изменяется, шрифт не приспосабливается в соответствии с новым размером окна. Спецификация говорит:

Если высота или ширина окна изменится, они масштабируются соотвественно

Я отправил заявку в баг-трекер. Возможно, это не большая-то и проблема, шрифт все же изменяется на «чистой» загрузке страницы. Такие мелочи интересны только только нам, гикам в дизайне, которые тщательно относятся к таким вещам, но все-таки.

Чтобы устранить эту проблему (разрешить изменение размеров без перезагрузки страницы), Вам необходимо вызвать перерисовку элемента. Я использовал jQuery и просто поэкспериментировал с z-index значениями каждого элемента, который вызывает перерисовку.

causeRepaintsOn = $( "h1, h2, h3, p" );

$( window ).resize( function( ) {
	causeRepaintsOn.css( "z-index", 1 );
});

Не только font-size

Между прочим, это всего лишь единицы. Как em, px, что угодно. Вы можете их использовать повсеместно, дело не ограничивается только размером шрифта.

Используйте!

Нативное использование

Не забудьте оставить callback для тех браузеров, которые пока еще не поддерживают данные единицы:

h1 {
	font-size: 36px;
	font-size: 5.4vw;
}
Проверка поддержки

У Modernizr пока еще нет теста для данной проверки, но вы можете проверить самостоятельно, используя небольшой скрипт на JS.

var testEl = $( "#vw-test" );

var viewport = $( window );

testEl.css( {
	width: "100vw"
} );

if ( testEl.width( ) == viewport.width( ) ) {
	$( "html" ).addClass( "vw-support" );
} else {
	$( "html" ).append( "vw-unsupported" );
};
Имитация функциональности с FitText.js

Эта идея заключается в том, что связывает общую ширину заголовка с шириной родительского элемента, что и делает FitText.js. Правда он делает это через Javascript, математику, span-теги и еще кучу всего. Теоретически, Вы можете запустить проверку и использовать Modernizr.load для загрузки FitText.js, если поддержки не обнаружено.

Автор: theaqua


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js