HEX, RGB, and HSL Color Formats Explained

May 26, 202610 min read

Introduction to Color Formats in Web Design

When working with colors in web development, you'll encounter three primary color notation formats: HEX, RGB, and HSL. Each format represents colors differently and serves distinct purposes in modern web design. Understanding these formats is essential for any web developer or designer who wants precise control over their color palette.

Colors on the web are typically represented using the sRGB (standard Red Green Blue) color space, which can display approximately 16.7 million different colors. While this might seem limiting compared to modern display technologies, it remains the standard for web content and works consistently across all browsers and devices.

HEX Color Format

HEX (hexadecimal) is perhaps the most recognizable color format for web developers. It uses a base-16 numbering system to represent colors as a six-digit code preceded by a hash symbol (#).

HEX Syntax

A HEX color code consists of three pairs of hexadecimal digits:

#RRGGBB

Each pair represents the intensity of red, green, and blue respectively, with values ranging from 00 to FF (0 to 255 in decimal).

Common HEX Examples

HEX CodeColorDescription
#FF0000RedMaximum red, no green or blue
#00FF00GreenMaximum green, no red or blue
#0000FFBlueMaximum blue, no red or green
#FFFFFFWhiteMaximum of all three colors
#000000BlackNo color intensity
#808080GrayEqual mid-intensity values

Advantages of HEX

  • Compact notation: Short and easy to copy-paste
  • Widely supported: Works in all browsers since the early days of the web
  • Familiar to developers: Most web developers learn HEX first
  • Shorthand available: Three-digit shorthand for some colors (e.g., #F00 for #FF0000)

Disadvantages of HEX

  • Not intuitive: Difficult to adjust brightness or saturation mentally
  • No direct relationship to color properties: Hard to create variations of a color
  • Limited transparency support: Requires separate alpha channel format (#RRGGBBAA)

RGB Color Format

RGB (Red, Green, Blue) represents colors by specifying the intensity of each primary color component. Unlike HEX, RGB uses decimal values from 0 to 255 for each channel.

RGB Syntax

rgb(255, 0, 0)  /* Pure red */
rgb(0, 255, 0)  /* Pure green */
rgb(0, 0, 255)  /* Pure blue */

RGB with Alpha Transparency

Modern CSS also supports RGBA, which adds an alpha channel for transparency:

rgba(255, 0, 0, 0.5)  /* Semi-transparent red */

The alpha value ranges from 0 (completely transparent) to 1 (completely opaque).

Advantages of RGB

  • Explicit channel values: Clear what each number represents
  • Built-in transparency support: RGBA handles alpha without separate format
  • Easy to generate programmatically: Simple to work with in JavaScript
  • Familiar to programmers: Similar to how computer screens actually work

Disadvantages of RGB

  • Verbose syntax: More characters than HEX
  • Still not intuitive for design: Adjusting hue or saturation requires changing multiple values
  • Less common in design tools: Many designers prefer HSL for adjustments

HSL Color Format

HSL (Hue, Saturation, Lightness) represents colors in a way that aligns more closely with human perception of color. It separates color properties into three distinct dimensions.

HSL Syntax

hsl(0, 100%, 50%)    /* Pure red */
hsl(120, 100%, 50%)  /* Pure green */
hsl(240, 100%, 50%)  /* Pure blue */

HSL Components Explained

  1. Hue (0-360): Represents the color type, measured in degrees on a color wheel
    • 0° or 360° = Red
    • 60° = Yellow
    • 120° = Green
    • 180° = Cyan
    • 240° = Blue
    • 300° = Magenta
  2. Saturation (0-100%): The intensity or purity of the color
    • 100% = Full color
    • 50% = Muted color
    • 0% = Gray (no color)
  3. Lightness (0-100%): How light or dark the color is
    • 100% = White
    • 50% = Pure color
    • 0% = Black

HSL with Alpha Transparency

hsla(0, 100%, 50%, 0.5)  /* Semi-transparent red */

Advantages of HSL

  • Intuitive for humans: Matches how we perceive and describe colors
  • Easy color manipulation: Adjust lightness to create lighter/darker variants
  • Perfect for theming: Simple to generate color palettes programmatically
  • Designer-friendly: Aligns with color theory principles

Disadvantages of HSL

  • Newer format: Not as universally known among developers
  • Less compact: More verbose than HEX
  • Browser support: Requires modern browsers (though now widely supported)

Color Format Conversion Formulas

Understanding how to convert between formats is valuable when working with different tools and systems.

HEX to RGB Conversion

  1. Split the HEX code into three pairs: #RRGGBB
  2. Convert each pair from hexadecimal to decimal:
R = parseInt(RR, 16)
G = parseInt(GG, 16)
B = parseInt(BB, 16)

Example: #FF8040

  • R = parseInt("FF", 16) = 255
  • G = parseInt("80", 16) = 128
  • B = parseInt("40", 16) = 64
  • Result: rgb(255, 128, 64)

RGB to HEX Conversion

  1. Convert each decimal value to two-digit hexadecimal:
RR = R.toString(16).padStart(2, '0')
GG = G.toString(16).padStart(2, '0')
BB = B.toString(16).padStart(2, '0')
  1. Combine: #${RR}${GG}${BB}

RGB to HSL Conversion

This conversion is more complex:

  1. Normalize RGB values to 0-1 range: r = R/255, g = G/255, b = B/255
  2. Find maximum and minimum: max = Math.max(r,g,b), min = Math.min(r,g,b)
  3. Calculate lightness: l = (max + min) / 2
  4. Calculate saturation:
    • If max === min: saturation = 0 (gray)
    • Else: s = l < 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min)
  5. Calculate hue:
    • If max === r: h = ((g - b) / (max - min)) % 6
    • If max === g: h = (b - r) / (max - min) + 2
    • If max === b: h = (r - g) / (max - min) + 4
    • Convert to degrees: h *= 60, ensure positive

When to Use Each Format

Use HEX When:

  • Working with legacy codebases
  • Copying colors from design tools that export HEX
  • Needing compact color notation
  • Working with developers who prefer traditional formats

Use RGB When:

  • Needing transparency (RGBA)
  • Generating colors dynamically with JavaScript
  • Working with APIs that return RGB values
  • Creating gradients programmatically

Use HSL When:

  • Building design systems and themes
  • Creating color variations (lighter/darker shades)
  • Working with designers who think in hue/saturation/lightness
  • Need to adjust colors based on user preferences (dark mode, etc.)
  • Generating accessible color palettes with consistent lightness

Practical CSS Examples

Here's how the same color looks in all three formats:

/* All represent the same coral color */
.element-hex { color: #FF7F50; }
.element-rgb { color: rgb(255, 127, 80); }
.element-hsl { color: hsl(16, 100%, 66%); }

/* Creating a color palette with HSL */
.primary-light { color: hsl(200, 100%, 80%); }
.primary-base  { color: hsl(200, 100%, 50%); }
.primary-dark  { color: hsl(200, 100%, 30%); }

Modern CSS Color Functions

CSS is evolving with new color functions:

/* Relative color syntax (modern browsers) */
color: hsl(from var(--primary) h s calc(l - 20%));

/* Modern color spaces */
color: oklch(70% 0.15 120);  /* Perceptually uniform */
color: oklab(70% 0.15 -0.05);
color: display-p3(1, 0.5, 0);  /* Wide gamut */

Conclusion

While HEX remains the most common format due to its historical prevalence, HSL is increasingly popular for modern web development because it aligns with human color perception. RGB fills the gap for programmatic color manipulation. Understanding all three formats makes you a more versatile developer and allows you to choose the best tool for each specific task.

For most modern projects, consider using HSL for your design system and theme variables, RGB for dynamic color generation, and HEX for quick prototypes or when working with legacy code.

Try It Yourself

Use our free Color Converter to convert colors between HEX, RGB, and HSL formats instantly.