
let’s zoom in on CSS RGB Colors and break them down step-by-step so they’re crystal clear.
1. What is RGB in CSS?
RGB stands for Red, Green, Blue — the three primary colors of light.
Every color you see on a screen is created by mixing different intensities of these three colors.
- Red = controls how much red light is used
- Green = controls how much green light is used
- Blue = controls how much blue light is used
2. Syntax
rgb(red, green, blue)
- Each value can be 0 to 255 (integer) or 0% to 100% (percentage).
- 0 means none of that color, 255 means the maximum intensity.
3. Examples
color: rgb(255, 0, 0); /* Pure red */
color: rgb(0, 255, 0); /* Pure green */
color: rgb(0, 0, 255); /* Pure blue */
color: rgb(255, 255, 0); /* Yellow (red + green) */
color: rgb(0, 255, 255); /* Cyan (green + blue) */
color: rgb(255, 0, 255); /* Magenta (red + blue) */
color: rgb(255, 255, 255);/* White (all colors at max) */
color: rgb(0, 0, 0); /* Black (all colors at zero) */
4. Using Percentages
Instead of 0–255, you can use percentages:
color: rgb(100%, 0%, 0%); /* Red */
color: rgb(50%, 50%, 50%); /* Gray */
color: rgb(0%, 0%, 100%); /* Blue */
5. How RGB Mixing Works
RGB colors are additive — meaning:
- Adding more light → lighter colors
- Removing light → darker colors
Example:
rgb(255, 0, 0)
= bright redrgb(128, 0, 0)
= dark redrgb(255, 200, 200)
= pale pink
6. Where to Use RGB in CSS
You can use rgb()
anywhere a color is accepted:
body {
background-color: rgb(240, 248, 255); /* AliceBlue */
}
p {
color: rgb(60, 179, 113); /* MediumSeaGreen */
}
div {
border: 3px solid rgb(255, 165, 0); /* Orange */
}
7. Quick RGB Color Chart
Color | RGB Value | Preview |
---|---|---|
Red | rgb(255, 0, 0) | 🔴 |
Green | rgb(0, 255, 0) | 🟢 |
Blue | rgb(0, 0, 255) | 🔵 |
Yellow | rgb(255, 255, 0) | 🟡 |
Cyan | rgb(0, 255, 255) | 🟦 |
Magenta | rgb(255, 0, 255) | 🟪 |
White | rgb(255, 255, 255) | ⚪ |
Black | rgb(0, 0, 0) | ⚫ |
live HTML demo that shows an RGB color picker effect where you slide the red, green, and blue values to see the color change instantly. That would make RGB really click visually. 🎨
Live Rgb Color Demo – Css Rgb/rgba Explorer :
CSS RGB / RGBA Live Demo
import React, { useMemo, useState } from "react";
// Live, interactive RGB/RGBA color explorer
// - Drag sliders to change Red, Green, Blue, and Alpha
// - See the color preview and copy CSS strings (rgb, rgba, hex, hsl, hsla)
// - Clean UI with Tailwind, no external deps required
function toHex(n: number) {
const s = n.toString(16).padStart(2, "0");
return s.toUpperCase();
}
function rgbToHex(r: number, g: number, b: number) {
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
}
// Convert RGB [0-255] to HSL
function rgbToHsl(r: number, g: number, b: number) {
const r1 = r / 255, g1 = g / 255, b1 = b / 255;
const max = Math.max(r1, g1, b1), min = Math.min(r1, g1, b1);
let h = 0, s = 0;
const l = (max + min) / 2;
if (max !== min) {
const d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r1:
h = (g1 - b1) / d + (g1 < b1 ? 6 : 0);
break;
case g1:
h = (b1 - r1) / d + 2;
break;
case b1:
h = (r1 - g1) / d + 4;
break;
}
h /= 6;
}
return {
h: Math.round(h * 360),
s: Math.round(s * 100),
l: Math.round(l * 100),
};
}
// Relative luminance to pick readable text color
function getReadableTextOn(rgb: { r: number; g: number; b: number }) {
const toLin = (c: number) => {
const cs = c / 255;
return cs <= 0.03928 ? cs / 12.92 : Math.pow((cs + 0.055) / 1.055, 2.4);
};
const L = 0.2126 * toLin(rgb.r) + 0.7152 * toLin(rgb.g) + 0.0722 * toLin(rgb.b);
return L > 0.5 ? "#111827" /* gray-900 */ : "#FFFFFF";
}
function CopyField({ label, value }: { label: string; value: string }) {
const [copied, setCopied] = useState(false);
return (
<div className="flex items-center gap-2">
<div className="text-xs uppercase tracking-wide text-gray-500 w-24">{label}</div>
<input
className="flex-1 rounded-xl border border-gray-200 bg-white/60 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-indigo-400"
value={value}
readOnly
onFocus={(e) => e.currentTarget.select()}
/>
<button
className={`rounded-xl px-3 py-2 text-sm font-medium shadow-sm border ${
copied ? "bg-green-50 border-green-300" : "bg-white border-gray-200"
}`}
onClick={async () => {
await navigator.clipboard.writeText(value);
setCopied(true);
setTimeout(() => setCopied(false), 1200);
}}
>
{copied ? "Copied" : "Copy"}
</button>
</div>
);
}
function ChannelSlider({
label,
value,
onChange,
}: {
label: string;
value: number;
onChange: (v: number) => void;
}) {
return (
<div className="space-y-1">
<div className="flex justify-between text-sm">
<span className="font-medium text-gray-700">{label}</span>
<span className="tabular-nums text-gray-600">{value}</span>
</div>
<input
type="range"
min={0}
max={255}
step={1}
value={value}
onChange={(e) => onChange(parseInt(e.target.value, 10))}
className="w-full accent-indigo-600"
/>
<div className="text-xs text-gray-500">{Math.round((value / 255) * 100)}%</div>
</div>
);
}
function AlphaSlider({ value, onChange }: { value: number; onChange: (v: number) => void }) {
return (
<div className="space-y-1">
<div className="flex justify-between text-sm">
<span className="font-medium text-gray-700">Alpha</span>
<span className="tabular-nums text-gray-600">{value.toFixed(2)}</span>
</div>
<input
type="range"
min={0}
max={1}
step={0.01}
value={value}
onChange={(e) => onChange(parseFloat(e.target.value))}
className="w-full accent-indigo-600"
/>
<div className="text-xs text-gray-500">0 (transparent) → 1 (opaque)</div>
</div>
);
}
export default function RGBColorExplorer() {
const [r, setR] = useState(255);
const [g, setG] = useState(99);
const [b, setB] = useState(71); // Tomato-ish
const [a, setA] = useState(1);
const { rgb, rgba, hex, hsl, hsla, previewText } = useMemo(() => {
const rgb = `rgb(${r}, ${g}, ${b})`;
const rgba = `rgba(${r}, ${g}, ${b}, ${a.toFixed(2)})`;
const hex = rgbToHex(r, g, b);
const { h, s, l } = rgbToHsl(r, g, b);
const hsl = `hsl(${h}, ${s}%, ${l}%)`;
const hsla = `hsla(${h}, ${s}%, ${l}%, ${a.toFixed(2)})`;
const previewText = getReadableTextOn({ r, g, b });
return { rgb, rgba, hex, hsl, hsla, previewText };
}, [r, g, b, a]);
return (
<div className="min-h-screen w-full bg-gradient-to-b from-gray-50 to-white px-6 py-10">
<div className="mx-auto max-w-5xl">
<header className="mb-8">
<h1 className="text-3xl font-bold tracking-tight text-gray-900">CSS RGB / RGBA Live Demo</h1>
<p className="mt-2 text-gray-600">
Drag the sliders to mix <span className="font-semibold">Red</span>, <span className="font-semibold">Green</span>, and <span className="font-semibold">Blue</span>.
The panel updates in real time and shows equivalent CSS color strings you can copy.
</p>
</header>
<div className="grid grid-cols-1 gap-6 md:grid-cols-5">
{/* Controls */}
<section className="md:col-span-2 space-y-5">
<div className="rounded-2xl border border-gray-200 bg-white p-5 shadow-sm">
<div className="mb-4 text-sm font-semibold text-gray-700">Channels</div>
<div className="space-y-4">
<ChannelSlider label="Red" value={r} onChange={setR} />
<ChannelSlider label="Green" value={g} onChange={setG} />
<ChannelSlider label="Blue" value={b} onChange={setB} />
<AlphaSlider value={a} onChange={setA} />
</div>
</div>
<div className="rounded-2xl border border-gray-200 bg-white p-5 shadow-sm">
<div className="mb-3 text-sm font-semibold text-gray-700">Presets</div>
<div className="grid grid-cols-6 gap-3">
{[
{ name: "Black", v: [0, 0, 0] },
{ name: "White", v: [255, 255, 255] },
{ name: "Red", v: [255, 0, 0] },
{ name: "Lime", v: [0, 255, 0] },
{ name: "Blue", v: [0, 0, 255] },
{ name: "Yellow", v: [255, 255, 0] },
{ name: "Cyan", v: [0, 255, 255] },
{ name: "Magenta", v: [255, 0, 255] },
{ name: "Orange", v: [255, 165, 0] },
{ name: "Purple", v: [128, 0, 128] },
{ name: "Tomato", v: [255, 99, 71] },
{ name: "Slate", v: [112, 128, 144] },
].map((p) => (
<button
key={p.name}
className="group flex items-center gap-2 rounded-2xl border border-gray-200 bg-white p-2 text-xs shadow-sm hover:shadow"
onClick={() => {
setR(p.v[0]);
setG(p.v[1]);
setB(p.v[2]);
}}
title={p.name}
>
<span
className="h-5 w-5 rounded-full border border-gray-300"
style={{ background: `rgb(${p.v[0]}, ${p.v[1]}, ${p.v[2]})` }}
/>
<span className="text-gray-700">{p.name}</span>
</button>
))}
</div>
</div>
</section>
{/* Preview & Code */}
<section className="md:col-span-3 space-y-5">
<div className="rounded-2xl border border-gray-200 bg-white shadow-sm overflow-hidden">
<div className="p-5 border-b border-gray-200 flex items-center justify-between">
<div className="text-sm font-semibold text-gray-700">Preview</div>
<div className="text-xs text-gray-500">Move sliders to update</div>
</div>
<div className="p-6">
<div
className="rounded-2xl h-56 w-full flex items-center justify-center shadow-inner"
style={{ background: rgba }}
>
<div
className="text-center"
style={{ color: previewText }}
>
<div className="text-xl font-semibold">{rgba}</div>
<div className="text-sm opacity-80">(alpha affects live preview)</div>
</div>
</div>
</div>
</div>
<div className="rounded-2xl border border-gray-200 bg-white p-5 shadow-sm space-y-3">
<div className="text-sm font-semibold text-gray-700 mb-2">CSS Strings</div>
<div className="space-y-3">
<CopyField label="rgb()" value={rgb} />
<CopyField label="rgba()" value={rgba} />
<CopyField label="#hex" value={hex} />
<CopyField label="hsl()" value={hsl} />
<CopyField label="hsla()" value={hsla} />
</div>
</div>
<div className="rounded-2xl border border-gray-200 bg-white p-5 shadow-sm">
<div className="mb-2 text-sm font-semibold text-gray-700">CSS Usage Examples</div>
<pre className="overflow-x-auto rounded-xl bg-gray-50 p-4 text-sm text-gray-800">
{`/* Text color */\np {\n color: ${rgb};\n}\n\n/* Background color */\n.card {\n background-color: ${hex};\n}\n\n/* Border color */\n.box {\n border: 3px solid ${rgba};\n}\n\n/* HSL example */\nh1 {\n color: ${hsl};\n}`}
</pre>
</div>
</section>
</div>
<footer className="mt-8 text-center text-xs text-gray-500">
Tip: You can click a field to select and copy, or use the Copy button.
</footer>
</div>
</div>
);
}
Output / Run :
Check above code in CSS Compiler.