Try it yourself with our free Color Picker tool — runs entirely in your browser, no signup needed.

How to Convert colors (HEX/RGB/HSL) in JavaScript

How to Convert Colors (HEX/RGB/HSL) in JavaScript

Converting colors between different formats is a common task in web development, particularly when working with design systems, theming, or color manipulation. In this guide, we will explore how to convert colors between HEX, RGB, and HSL formats in JavaScript. We will provide a quick example, a step-by-step breakdown, and cover common edge cases, mistakes, and performance tips.

Quick Example

function hexToRgb(hex) {
  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null;
}

console.log(hexToRgb('#ff0000')); // Output: { r: 255, g: 0, b: 0 }

This example demonstrates how to convert a HEX color code to an RGB object.

Step-by-Step Breakdown

Let's break down the hexToRgb function:

  • const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);: This line uses a regular expression to match the HEX color code. The ^ symbol matches the start of the string, #? matches an optional # symbol, and ([a-f\d]{2}) matches exactly two hexadecimal digits. The i flag makes the match case-insensitive.
  • return result ? { ... } : null;: If the regular expression matches, the function returns an object with the RGB values. If the input is invalid, the function returns null.
  • r: parseInt(result[1], 16), g: parseInt(result[2], 16), b: parseInt(result[3], 16): These lines extract the RGB values from the match and convert them from hexadecimal to decimal using parseInt.

Handling Edge Cases

Empty/Null Input

console.log(hexToRgb('')); // Output: null
console.log(hexToRgb(null)); // Output: null

The function returns null for empty or null input.

Invalid Input

console.log(hexToRgb(' invalid')); // Output: null
console.log(hexToRgb('# invalid')); // Output: null

The function returns null for invalid input.

Large Input

console.log(hexToRgb('#ffffffffffffffff')); // Output: null

The function returns null for input that exceeds the expected length.

Unicode/Special Characters

console.log(hexToRgb('#ff00🔴00')); // Output: null

The function returns null for input containing Unicode or special characters.

Common Mistakes

Mistake 1: Not handling invalid input

// Wrong
function hexToRgb(hex) {
  return {
    r: parseInt(hex.slice(1, 3), 16),
    g: parseInt(hex.slice(3, 5), 16),
    b: parseInt(hex.slice(5, 7), 16)
  };
}

// Corrected
function hexToRgb(hex) {
  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null;
}

Not handling invalid input can lead to unexpected behavior.

Mistake 2: Not using a regular expression

// Wrong
function hexToRgb(hex) {
  return {
    r: parseInt(hex.slice(1, 3), 16),
    g: parseInt(hex.slice(3, 5), 16),
    b: parseInt(hex.slice(5, 7), 16)
  };
}

// Corrected
function hexToRgb(hex) {
  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null;
}

Not using a regular expression can lead to incorrect parsing.

Mistake 3: Not handling case sensitivity

// Wrong
function hexToRgb(hex) {
  const result = /^#([a-f]{2})([a-f]{2})([a-f]{2})$/.exec(hex);
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null;
}

// Corrected
function hexToRgb(hex) {
  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null;
}

Not handling case sensitivity can lead to incorrect parsing.

Performance Tips

  1. Use a regular expression: Regular expressions are optimized for string matching and can be faster than manual string manipulation.
  2. Use parseInt with a radix: Specifying the radix (16 for hexadecimal) can improve performance and prevent unexpected behavior.
  3. Avoid unnecessary computations: Only perform computations when necessary, such as when the input is valid.

FAQ

Q: How do I convert RGB to HEX?

A: You can use the rgbToHex function:

function rgbToHex(rgb) {
  return `#${((1 << 24) + (rgb.r << 16) + (rgb.g << 8) + rgb.b).toString(16).slice(1)}`;
}

Q: How do I convert HSL to RGB?

A: You can use the hslToRgb function:

function hslToRgb(hsl) {
  const h = hsl.h / 360;
  const s = hsl.s / 100;
  const l = hsl.l / 100;
  let r, g, b;
  if (s === 0) {
    r = g = b = l;
  } else {
    const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
    const p = 2 * l - q;
    r = hueToRgb(p, q, h + 1/3);
    g = hueToRgb(p, q, h);
    b = hueToRgb(p, q, h - 1/3);
  }
  return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255) };
}

function hueToRgb(p, q, t) {
  if (t < 0) t += 1;
  if (t > 1) t -= 1;
  if (t < 1/6) return p + (q - p) * 6 * t;
  if (t < 1/2) return q;
  if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
  return p;
}

Q: How do I convert HEX to HSL?

A: You can use the hexToHsl function:

function hexToHsl(hex) {
  const rgb = hexToRgb(hex);
  const r = rgb.r / 255;
  const g = rgb.g / 255;
  const b = rgb.b / 255;
  const max = Math.max(r, g, b);
  const min = Math.min(r, g, b);
  let h, s, l = (max + min) / 2;
  if (max === min) {
    h = s = 0;
  } else {
    const d = max - min;
    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
    switch (max) {
      case r:
        h = (g - b) / d + (g < b ? 6 : 0);
        break;
      case g:
        h = (b - r) / d + 2;
        break;
      case b:
        h = (r - g) / d + 4;
        break;
    }
    h /= 6;
  }
  return { h: Math.round(h * 360), s: Math.round(s * 100), l: Math.round(l * 100) };
}

Q: Can I use this code in a production environment?

A: Yes, this code is designed to be used in a production environment. However, you should always test and validate the code in your specific use case.

Q: How do I handle errors and exceptions?

A: You can use try-catch blocks to handle errors and exceptions. For example:

try {
  const rgb = hexToRgb(hex);
  // ...
} catch (error) {
  console.error(error);
  // Handle the error
}

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp