css properties will-change

The will-change CSS property hints to browsers how an element is expected to change. Browsers may set up optimizations before an element is actually changed. These kinds of optimizations can increase the responsiveness of a page by doing potentially expensive work before they are actually required.

Warning: will-change is intended to be used as a last resort, in order to try to deal with existing performance problems. It should not be used to anticipate performance problems.

Proper usage of this property can be a bit tricky:

Syntax

/* Keyword values */
will-change: auto;
will-change: scroll-position;
will-change: contents;
will-change: transform; /* Example of <custom-ident> */
will-change: opacity; /* Example of <custom-ident> */
will-change: left, top; /* Example of two <animatable-feature> */

/* Global values */
will-change: inherit;
will-change: initial;
will-change: revert;
will-change: revert-layer;
will-change: unset;

Values

auto

This keyword expresses no particular intent; the user agent should apply whatever heuristics and optimizations it normally does.

The <animatable-feature> can be one of the following values:

scroll-position

Indicates that the author expects to animate or change the scroll position of the element in the near future.

contents

Indicates that the author expects to animate or change something about the element's contents in the near future.

<custom-ident>

Indicates that the author expects to animate or change the property with the given name on the element in the near future. If the property given is a shorthand, it indicates the expectation for all the longhands the shorthand expands to. It cannot be one of the following values: unset, initial, inherit, will-change, auto, scroll-position, or contents. The spec doesn't define the behavior of particular value, but it is common for transform to be a compositing layer hint. Chrome currently takes two actions, given particular CSS property idents: establish a new compositing layer or a new stacking context.

Via stylesheet

It may be appropriate to include will-change in your style sheet for an application that does page flips on key presses like an album or a slide deck presentation where the pages are large and complex. This will let browser prepare the transition ahead of time and allow for snappy transitions between the pages as soon as the key is pressed. But use caution with the will-change property directly in stylesheets. It may cause the browser to keep the optimization in memory for much longer than it is needed.

.slide {
  will-change: transform;
}

Formal definition

Initial valueauto
Applies toall elements
Inheritedno
Computed valuespecified value
Animation typenot animatable

Formal syntax

auto | <animateable-feature>#

Examples

Via script

This is an example showing how to apply the will-change property through scripting, which is probably what you should be doing in most cases.

const el = document.getElementById("element");

// Set will-change when the element is hovered
el.addEventListener("mouseenter", hintBrowser);
el.addEventListener("animationEnd", removeHint);

function hintBrowser() {
  // The optimizable properties that are going to change
  // in the animation's keyframes block
  this.style.willChange = "transform, opacity";
}

function removeHint() {
  this.style.willChange = "auto";
}

See also