Unsupported Color Function 'oklab' Error in html2canvas

I'm using html2canvas version 1.4.0, but I'm encountering an issue where the canvas fails to render properly. The following error is displayed:

Error: Attempting to parse an unsupported color function "oklab"

It seems that the oklab color function is not working. How can I resolve this issue?

Solution

Unfortunately, the oklab color function is not supported in the latest version of the html2canvas library.

To fix this issue, consider using html2canvas-pro. This library is a fork of html2canvas and maintains the same API while adding support for modern color functions such as color, lab, lch, oklab, and oklch.

Alternative #1

I've run into this with html2canvas and modern color functions like oklab. If you can't switch to html2canvas-pro, you can preprocess your CSS to convert oklab to a supported color format (like rgb or hex).

You can use a PostCSS plugin or a simple script to replace oklab colors before rendering:

// Example: Replace oklab() with rgb() fallback
const elements = document.querySelectorAll('*');
elements.forEach(el => {
  if (el.style.color.includes('oklab(')) {
    el.style.color = '#888888'; // fallback color
  }
});

This ensures html2canvas won't encounter unsupported color functions.

Alternative #2

If you have control over your CSS build process, use a tool like PostCSS with a plugin to convert oklab and other modern color functions to rgb or hex during your build step:

// postcss.config.js
module.exports = {
  plugins: [
    require('postcss-oklab'), // Converts oklab() to rgb()
    require('autoprefixer'),
  ]
};

This way, your production CSS will only contain supported color formats, and html2canvas will work as expected.

Alternative #3

If you're using a framework like React or Vue, you can use a runtime workaround to temporarily replace oklab colors before calling html2canvas, then restore them after:

function replaceOklabColors(element) {
  const originalColors = [];
  element.querySelectorAll('*').forEach(el => {
    if (el.style.color.includes('oklab(')) {
      originalColors.push({ el, color: el.style.color });
      el.style.color = '#888888';
    }
  });
  return originalColors;
}

function restoreColors(originalColors) {
  originalColors.forEach(({ el, color }) => {
    el.style.color = color;
  });
}

// Usage
const originals = replaceOklabColors(document.getElementById('target'));
html2canvas(document.getElementById('target')).then(canvas => {
  restoreColors(originals);
  // Use canvas
});

This lets you keep modern color functions in your codebase while still supporting html2canvas.

Last modified: April 27, 2025
Stay in the loop
Subscribe to our newsletter to get the latest articles delivered to your inbox