Кратко
СкопированоВендорные префиксы — это приставки перед свойствами, селекторами, функциями или другими сущностями в CSS, позволяющие браузерам внедрять экспериментальные фичи до того, как они полностью стандартизированы и готовы для использования. Когда префикс отбрасывается — это знак, что всё готово.
Кто такие вендоры?
СкопированоЧтобы понять, что такое вендорные префиксы и зачем они нужны, надо немного разобраться с тем, как и кто разрабатывает CSS.
CSS — это одна из трёх основных мощных технологий, на которых строится веб. Его используют в своей работе тысячи разработчиков. А результат — стили сайта — видят миллионы пользователей.
Чтобы CSS во всём мире был единым, над его развитием работает так называемая Рабочая группа CSS (CSS Working Group), или коротко CSSWG. Они собирают потребности разработчиков сайтов и описывают возможности CSS в новых модулях. Получившийся документ называется спецификацией. В ней содержится описание того, как новое свойство должно работать.
Дальше наступает этап внедрения в браузеры. Каждый браузер разрабатывает отдельная компания, отдельные команды разработки. Когда в черновиках спецификации появляется новая CSS-фича, разработчики браузера начинают её реализовывать. Поскольку в спецификации не всегда описаны конкретные технические решения (черновик на то и черновик, что может меняться), то каждая команда разработки может делать это чуть иначе и принципы работы фичи вполне могут меняться со временем. До момента, пока не стабилизируется спецификация или пока не будут написаны все тесты, фича может работать в тестовом режиме, с вендорным префиксом.
Каждый браузер — это отдельный вендор (от англ. vendor — продавец) услуг просмотра сайтов, интернета. Отсюда и слово «вендорный». Буквально это означает, что существуют некие отдельные префиксы — они же приставки — которые работают в конкретном браузере — вендоре.
Префиксы
СкопированоОсновные браузеры используют следующие префиксы:
-webkit
— Safari, Chrome, Opera 15+ и другие браузеры на основе движка WebKit или Blink.- -moz
— Firefox и браузеры на движке Gecko.- -o
— Opera 12 и раньше, на движке Presto.- -ms
— Internet Explorer и старый Microsoft Edge 12–18.-
Где нужны префиксы?
СкопированоВ CSS существует много разных сущностей: селекторы и псевдоэлементы, свойства и их значения, функции, директивы. В процессе внедрения любой новой фичи используются вендорные префиксы.
Директивы
СкопированоСамый частый случай, когда вам может пригодиться вендорный префикс для директивы — @keyframes
:
@-webkit-keyframes animation { 0% { left: 0; } 100% { left: 100%; }}@keyframes animation { 0% { left: 0; } 100% { left: 100%; }}
@-webkit-keyframes animation { 0% { left: 0; } 100% { left: 100%; } } @keyframes animation { 0% { left: 0; } 100% { left: 100%; } }
Написать директивы @
и @keyframes
через запятую, чтобы не дублировать их содержимое, не получится.
Псевдоклассы
СкопированоВ последнее время в CSS появляется много новых очень мощных псевдоклассов. Например, стилизовать плейсхолдер в поле ввода можно при помощи такого кода:
input::-webkit-input-placeholder { color: #BADA55;}input:-moz-placeholder { color: #BADA55;}input::-moz-placeholder { color: #BADA55;}input:-ms-input-placeholder { color: #BADA55;}input::-ms-input-placeholder { color: #BADA55;}input::placeholder { color: #BADA55;}
input::-webkit-input-placeholder { color: #BADA55; } input:-moz-placeholder { color: #BADA55; } input::-moz-placeholder { color: #BADA55; } input:-ms-input-placeholder { color: #BADA55; } input::-ms-input-placeholder { color: #BADA55; } input::placeholder { color: #BADA55; }
Как и в случае с директивами, префиксы в псевдоэлементах тоже приводят к дублированию кода: если перечислить всё через запятую, браузеры вас не поймут.
Значения свойств
СкопированоБывает и так, что свойство старое, а вот значение для него новое, экспериментальное. В данный момент таким новым значением является функция image
для свойства background
:
div { background-image: url('image.png'); background-image: -webkit-image-set(url('image.png') 1x, url('image-2x.png') 2x); background-image: image-set('image.png' 1x, 'image-2x.png' 2x);}
div { background-image: url('image.png'); background-image: -webkit-image-set(url('image.png') 1x, url('image-2x.png') 2x); background-image: image-set('image.png' 1x, 'image-2x.png' 2x); }
Сначала браузер прочитает свойство background
со значением url
, которое он точно понимает. Потом увидит такое же свойство с другим значением, и если он его поймёт, то забудет первое свойство и применит второе. Это называется фолбэк.
Но браузер на этом не остановится и пойдёт дальше: если он поддерживает значение без префикса, то он предпочтёт его — ведь оно последнее. Поэтому порядок следования свойств с префиксами в значениях тоже важен: сначала идут значения с префиксами, потом — без, чтобы браузеры выбрали последний, максимально современный вариант.
Селекторы
СкопированоСлучается так, что в процессе внедрения фича меняется. Изначально планировалось, что функция выбора нескольких селекторов будет называться :any
, потом :match
, а в итоге пришли к :is
. Чтобы селектор сработал везде, даже в старых браузерах, где функция называлась иначе, нужна будет такая запись:
:-moz-any(header, footer) a:hover { color: red;}:-webkit-any(header, footer) a:hover { color: red;}:matches(header, footer) a:hover { color: red;}:is(header, footer) a:hover { color: red;}
:-moz-any(header, footer) a:hover { color: red; } :-webkit-any(header, footer) a:hover { color: red; } :matches(header, footer) a:hover { color: red; } :is(header, footer) a:hover { color: red; }
В примере выше мы задаём красный цвет для ссылок при наведении курсора при условии, что эти ссылки находятся внутри <header>
или <footer>
.
Как всё запомнить?
СкопированоСкорее всего, вы сейчас думаете, а как же запомнить, где какие префиксы нужно писать, и для каких свойств они действительно нужны, а какие поддерживаются и без них.
Самый простой способ проверить поддержку свойства — найти его на сайте Can I use. Там, в том числе, написано, какие префиксы для каких браузеров нужны.
Но чаще всего разработчики не пишут префиксы руками, а используют инструменты автоматизации. Самым популярным из них на сегодня является Автопрефиксер. Вы можете попробовать его онлайн: вставляете ваш CSS, указываете, какие браузеры должны поддерживаться, и получаете код с проставленными префиксами там, где это нужно.
Порядок важен
СкопированоОчень важно указывать сущности (свойства, селекторы, директивы и так далее) с вендорными префиксами выше, чем без префиксов:
div { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;}
div { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }
Это нужно для того, чтобы браузер использовал самую последнюю стабильную реализацию. Если браузер уже поддерживает фичу без префиксов, то применится последнее из перечисленных. А если нет, то сработает подходящая запись из кода выше.