Skip to content

Bits of .NET

Daily micro-tips for C#, SQL, performance, and scalable backend engineering.

  • Asp.Net Core
  • C#
  • SQL
  • JavaScript
  • CSS
  • About
  • ErcanOPAK.com
  • No Access
  • Privacy Policy
CSS

CSS: Master CSS Variables for Theme Management

- 17.08.26 - ErcanOPAK

🎨 CSS Variables = Theme Management

Hard-coded colors are a maintenance nightmare. CSS Variables enable consistent theming and easy updates.

📝 CSS Variables Setup

:root {
    /* Colors */
    --color-primary: #3498db;
    --color-secondary: #2ecc71;
    --color-accent: #e74c3c;
    --color-background: #ffffff;
    --color-text: #2c3e50;
    --color-text-secondary: #7f8c8d;

    /* Typography */
    --font-family: 'Inter', -apple-system, sans-serif;
    --font-size-base: 16px;
    --font-size-large: 1.25rem;
    --font-size-small: 0.875rem;

    /* Spacing */
    --spacing-xs: 4px;
    --spacing-sm: 8px;
    --spacing-md: 16px;
    --spacing-lg: 24px;
    --spacing-xl: 32px;

    /* Borders */
    --border-radius-sm: 4px;
    --border-radius-md: 8px;
    --border-radius-lg: 16px;
    --border-color: #e0e0e0;

    /* Shadows */
    --shadow-sm: 0 2px 4px rgba(0,0,0,0.1);
    --shadow-md: 0 4px 8px rgba(0,0,0,0.12);
    --shadow-lg: 0 8px 16px rgba(0,0,0,0.15);
}

/* Using Variables */
.button-primary {
    background-color: var(--color-primary);
    color: white;
    padding: var(--spacing-md) var(--spacing-lg);
    border-radius: var(--border-radius-md);
    font-family: var(--font-family);
    box-shadow: var(--shadow-sm);
}

.card {
    background: var(--color-background);
    border: 1px solid var(--border-color);
    border-radius: var(--border-radius-lg);
    padding: var(--spacing-lg);
    box-shadow: var(--shadow-md);
}

🎯 Dynamic Theming with CSS Variables

/* Light Theme */
:root {
    --bg-color: #ffffff;
    --text-color: #2c3e50;
    --card-bg: #f8fafc;
}

/* Dark Theme */
[data-theme='dark'] {
    --bg-color: #1a1a2e;
    --text-color: #e0e0e0;
    --card-bg: #2d3748;
}

/* Theme Toggle with JavaScript */
function toggleTheme() {
    const html = document.documentElement;
    const currentTheme = html.getAttribute('data-theme');
    const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
    html.setAttribute('data-theme', newTheme);
    localStorage.setItem('theme', newTheme);
}

/* Responsive Variables */
@media (max-width: 768px) {
    :root {
        --font-size-base: 14px;
        --spacing-lg: 16px;
        --spacing-xl: 24px;
    }
}

/* Component-Specific Variables */
.card {
    --card-bg: var(--color-background);
    --card-border: var(--border-color);
    --card-padding: var(--spacing-lg);
}

.card-dark {
    --card-bg: #2d3748;
    --card-border: #4a5568;
}

/* Fallback Values */
.element {
    color: var(--text-color, #2c3e50);
    background: var(--bg-color, #ffffff);
}

💡 CSS Variables Best Practices

  • Use consistent naming conventions
  • Define all variables in :root
  • Use semantic names over color names
  • Provide fallback values
  • Update variables with JavaScript for theming

CSS Variables make theming effortless. Change one value, update your entire design system.

— UI Designer

Related posts:

CSS Flexbox Gap Not Working? — The Hidden Flex Wrapping Trap

CSS: Use CSS Variables for Consistent Theming

CSS: Master Font Sizing for Responsive Typography

Post Views: 4

Post navigation

Windows 11: Organize Workflows with Virtual Desktops
HTML: Master Responsive Images with Picture Element

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

October 2026
M T W T F S S
 1234
567891011
12131415161718
19202122232425
262728293031  
« Sep    

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (952)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)
  • How to enable, disable and check if Service Broker is enabled on a database in SQL Server (624)
  • Add Constraint to SQL Table to ensure email contains @ (590)
  • Average of all values in a column that are not zero in SQL (553)
  • How to use Map Mode for Vertical Scroll Mode in Visual Studio (526)
  • Find numbers with more than two decimal places in SQL (468)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps
  • Photoshop: Fix a Color Profile Mismatch That Makes Printed Output Look Nothing Like What You Saw On Screen
  • WordPress: Fix Search Results That Return Pages From a Theme You Deactivated Months Ago
  • Visual Studio: Fix a Test Project That Builds Fine Alone but Fails to Discover Any Tests After a NuGet Restore
  • ASP.NET Core: Fix a File Upload That Times Out on Slow Connections Only Because Kestrel’s Minimum Data Rate Feature Kicked In
  • JavaScript: Fix an Array Destructuring Default Value That Silently Never Applies Because null Was Passed Instead of Undefined

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (952)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps

Social

  • ErcanOPAK.com
  • GoodReads
  • LetterBoxD
  • Linkedin
  • The Blog
  • Twitter
© 2026 Bits of .NET | Built with Xblog Plus free WordPress theme by wpthemespace.com