Custom Cursors: Creating CUR Files from Canvas

A recent product design required switching various custom, dynamic cursors at runtime. These were prepared at runtime and drawn onto a Canvas:

In Chrome and Firefox those canvases can be used as a cursor by setting the cursor property in CSS to url(canvas.toDataURL()). The data URL is guaranteed to contain a base64 encoded PNG image of the canvas.

Edge though currently only supports CUR files. Those files wrap the cursor image, optionally at different sizes, with some metadata. Luckily for us, a newer version of the CUR file format allows embedding PNG file data directly.

So I wrote a small library that reads a canvas into PNG blob and then inserts this data into a new Blob that builds up the CUR file. We can then create an "object URL" of that CUR file which can be used in CSS similarly to the above method.

Example:

// call the `curObjectURLFromCanvas` function to retrieve an object URL pointing to a `CUR` file containing the canvas' image
const cursorObjectURL = curObjectURLFromCanvas(canvas);

// Use this URL in your inline style (or in a programatically created `StyleSheet`)
body.style.cursor = `url(${cursorObjectURL}), pointer`;

The library is called cursor-utilities and is available on npm, and the source is on GitHub.