Кратко
СкопированоСвойство will позволяет заранее сообщить браузеру об изменениях (анимация, перемещение и т.д), которые могут произойти с элементом. Так браузер успеет оптимизировать выполнение этих изменений до того, как они произойдут. Это повышает скорость работы сайта.
Пример
СкопированоЧтобы включить will, нужно добавить следующее правило для элемента, который будет изменяться:
div { will-change: /* значение */;}
div {
will-change: /* значение */;
}
Значения
СкопированоСвойство will принимает одно из четырёх возможных значений:
auto— не указывает никакого конкретного свойства, браузер будет работать как обычно. Значение по умолчанию.scroll— указывает, что ожидается изменение положения элемента при прокрутке страницы. Браузер заранее готовится и отрисовывает содержимое за пределами видимой части страницы.- position contents— указывает, что ожидается изменение содержимого элемента. Браузер ограничивает или полностью прекращает кэширование элемента и отрисовывает его с нуля при каждом изменении его содержимого.- меняющееся свойство — имя свойства, которое будет изменяться (transform, opacity и т.д). Несколько свойств разделяются запятыми.
Примеры:
div { will-change: transform; will-change: opacity; will-change: top, left, bottom, right;}
div {
will-change: transform;
will-change: opacity;
will-change: top, left, bottom, right;
}
Подсказки
Скопировано💡 Не стоит использовать will для большого числа элементов. Браузер и так пытается максимально оптимизировать работу страницы. Если заставить его отслеживать все возможные изменения элементов, это вызовет большой расход ресурсов и может замедлить работу сайта.
💡 will используется как крайнее средство, если есть видимые задержки в работе сайта.
На практике
Скопированосоветует
Скопировано🛠 will необходимо включить до изменения состояния элемента. Если применить это свойство в процессе изменения состояния, оно не успеет сработать и не даст никакого эффекта.
Такой код не сработает:
/* Изменение элемента происхожит при наведении курсора */.element:hover { /* нужно подготовиться к изменению, которое уже происходит, код не сработает */ will-change: transform; transition: transform 2s; transform: rotate(30deg) scale(1.5);}
/* Изменение элемента происхожит при наведении курсора */
.element:hover {
/* нужно подготовиться к изменению, которое уже происходит, код не сработает */
will-change: transform;
transition: transform 2s;
transform: rotate(30deg) scale(1.5);
}
Если изменение элемента происходит при клике на него, will можно включать при наведении курсора на элемент. Это даёт браузеру время подготовиться до того, как произойдёт изменение .
.element { /* правила */ transition: transform 1s ease-out;}.element:hover { /* браузер начинает готовиться к изменению состояния */ will-change: transform;}.element:active { /* происходит изменение состояния */ transform: rotateY(180deg);}
.element {
/* правила */
transition: transform 1s ease-out;
}
.element:hover {
/* браузер начинает готовиться к изменению состояния */
will-change: transform;
}
.element:active {
/* происходит изменение состояния */
transform: rotateY(180deg);
}
Если изменение происходит при наведении курсора на элемент, то можно включать will при наведении на родительский элемент:
.element { transition: opacity 0.3s linear;}/* включаем will-change для элемента, когда мышка наводится на его родительский элемент */.parent:hover .element { will-change: opacity;}/* применение изменения, когда мышка наведена на элемент */.element:hover { opacity: 0.5;}
.element {
transition: opacity 0.3s linear;
}
/* включаем will-change для элемента, когда мышка наводится на его родительский элемент */
.parent:hover .element {
will-change: opacity;
}
/* применение изменения, когда мышка наведена на элемент */
.element:hover {
opacity: 0.5;
}
🛠 Рекомендуется отключать will сразу после того, как закончится изменение элемента. Поэтому лучше назначать это свойство через JavaScript. Если назначить его через CSS, его невозможно будет убрать после выполнения изменения и оно будет продолжать расходовать ресурсы.
Пример назначения через JS:
// Получаем доступ к элементу, который будет изменяться при клике по немуconst el = document.getElementById('element')// Включаем will-change при наведении курсора на элементel.addEventListener('mouseenter', hintBrowser)el.addEventListener('transitionend', removeHint)function hintBrowser() { // Свойства, которые будут изменяться в блоке // описания анимации и которые можно заранее оптимизировать this.style.willChange = 'transform, opacity'}// Для отключения свойства устанавливаем ему значение по умолчаниюfunction removeHint() { this.style.willChange = 'auto'}
// Получаем доступ к элементу, который будет изменяться при клике по нему
const el = document.getElementById('element')
// Включаем will-change при наведении курсора на элемент
el.addEventListener('mouseenter', hintBrowser)
el.addEventListener('transitionend', removeHint)
function hintBrowser() {
// Свойства, которые будут изменяться в блоке
// описания анимации и которые можно заранее оптимизировать
this.style.willChange = 'transform, opacity'
}
// Для отключения свойства устанавливаем ему значение по умолчанию
function removeHint() {
this.style.willChange = 'auto'
}
Иногда will допускается назначать через CSS. Это относится к часто используемым элементам (например, анимация кнопки или сайдбара) и к изменениям, которые происходят на странице постоянно (например, анимация, которая происходит при движении курсора мышки).
В остальных случаях will лучше назначать через JS и отключать после завершения изменения элемента.