🎨 One Variable Change, Whole Site Updates
Sass variables compile once. CSS variables update at runtime. Dark mode, dynamic theming, component libraries — finally possible.
📦 Defining and Using Variables
/* Define on :root (global) */
:root {
--primary-color: #3498db;
--secondary-color: #2ecc71;
--spacing-unit: 8px;
--border-radius: 4px;
--font-size-base: 16px;
}
/* Use variables */
.button {
background-color: var(--primary-color);
padding: var(--spacing-unit) calc(var(--spacing-unit) * 2);
border-radius: var(--border-radius);
font-size: var(--font-size-base);
}
.button-secondary {
background-color: var(--secondary-color);
}
🎯 Dynamic Dark Mode
:root {
--bg-color: #ffffff;
--text-color: #333333;
--card-bg: #f5f5f5;
}
[data-theme='dark'] {
--bg-color: #1a1a2e;
--text-color: #e0e0e0;
--card-bg: #16213e;
}
body {
background-color: var(--bg-color);
color: var(--text-color);
transition: background-color 0.3s, color 0.3s;
}
.card {
background-color: var(--card-bg);
}
✅ JavaScript Integration
// Get variable value
const primaryColor = getComputedStyle(document.documentElement)
.getPropertyValue('--primary-color');
// Set variable value
document.documentElement.style.setProperty('--primary-color', '#e74c3c');
// Dark mode toggle
function toggleDarkMode() {
const isDark = document.body.dataset.theme === 'dark';
document.body.dataset.theme = isDark ? 'light' : 'dark';
}
// Responsive variables
const setResponsiveVars = () => {
const width = window.innerWidth;
if (width < 768) {
document.documentElement.style.setProperty('--spacing-unit', '4px');
} else {
document.documentElement.style.setProperty('--spacing-unit', '8px');
}
};
window.addEventListener('resize', setResponsiveVars);
💡 Browser Support
- Chrome 49+ ✅
- Firefox 31+ ✅
- Safari 9.1+ ✅
- Edge 15+ ✅
- IE: ❌ (use fallback: color: #333; color: var(--text-color);)
"Switched from Sass variables to CSS variables. Dark mode toggle now works instantly without page reload. Component library has 10x fewer duplicates. CSS variables are underrated."
