How to dynamically change CSS variables with JavaScript?
使用document.documentElement获取:root CSS变量,用style.setProperty()设置(需--前缀和字符串值),getComputedStyle().getPropertyValue()读取,批量更新用cssText避免重排。

Getting the root element for :root CSS variables
You need a reference to the element where your CSS variables are declared — most often that’s the :root pseudo-element, which maps to document.documentElement. Using document.body or other elements works too, but only if the variables are defined there and inherited properly.
Don’t assume document.querySelector(':root') — it won’t match. Stick with document.documentElement.
Setting CSS variables with style.setProperty()
Once you have the target element (e.g., document.documentElement), call style.setProperty() with the custom property name (including --) and value:
document.documentElement.style.setProperty('--primary-color', '#3b82f6');- The property name must include the
--prefix —'primary-color'won’t work - Values are strings — even numbers or units like
'2rem'or'0.75'need quotes - This overrides the variable at that element level; it does not edit the original CSS file or
<style>block
Reading current CSS variable values with getComputedStyle()
To read an active value (after it’s been set or inherited), use getComputedStyle() on the same element and access getPropertyValue():
const root = document.documentElement;
root.style.setProperty('--accent', 'tomato');
const accent = getComputedStyle(root).getPropertyValue('--accent'); // 'tomato'getComputedStyle()returns computed values — so--accentresolves to its actual used value, not the raw CSS token- If the variable is undefined or falls back to an invalid value,
getPropertyValue()returns an empty string - It won’t reflect changes made *before* the style has been applied in the render cycle — avoid reading immediately after
setProperty()if timing matters
Updating multiple variables without repeated reflows
Calling style.setProperty() repeatedly triggers layout recalculations. For bulk updates, batch them using CSSStyleDeclaration.cssText or assign to style.cssText with a semicolon-separated string:
const root = document.documentElement; root.style.cssText = '; --primary: #1e40af; --spacing-md: 1.5rem; --radius: 6px;';
- Appending to
cssTextpreserves existing inline styles — unlike direct assignment, which overwrites all - Each declaration must end in
;, and no spaces before;— otherwise parsing fails silently - Prefer
setProperty()for single updates; reservecssTextfor coordinated theme switches or config-driven batches
CSS variables don’t cascade like regular properties — their scope depends entirely on where they’re set and how selectors inherit. If a change doesn’t appear, check whether the consuming element actually inherits from the element you modified, and whether any more-specific rule (e.g., a local style="--color: red") is overriding it.
The above is the detailed content of How to dynamically change CSS variables with JavaScript?. For more information, please follow other related articles on the PHP Chinese website!
Hot AI Tools
Undress AI Tool
Undress images for free
AI Clothes Remover
Online AI tool for removing clothes from photos.
Undresser.AI Undress
AI-powered app for creating realistic nude photos
ArtGPT
AI image generator for creative art from text prompts.
Stock Market GPT
AI powered investment research for smarter decisions
Hot Article
Popular tool
Notepad++7.3.1
Easy-to-use and free code editor
SublimeText3 Chinese version
Chinese version, very easy to use
Zend Studio 13.0.1
Powerful PHP integrated development environment
Dreamweaver CS6
Visual web development tools
SublimeText3 Mac version
God-level code editing software (SublimeText3)
Hot Topics
20518
7
13631
4
How does CSS manage component colors in different states_Using CSS pseudo-classes to cooperate with variable switching
Mar 06, 2026 pm 04:00 PM
How to use pseudo-classes such as :hover:focus and CSS variables to change colors. It is of course possible to directly change the color or background-color in the pseudo-class. However, once there are many states (such as :hover, :focus, :active, :disabled) and you want to change the theme color uniformly, hard-writing the color value four times will make it easy to miss changes and difficult to maintain. The correct approach is to extract the color into a variable and only overwrite the variable value in the pseudo class: :root{--btn-bg:#007bff;--btn-bg-hover:#0056b3;--btn-bg-active:#004085;}.btn
How CSS uses Less's Recursive Mixins to implement recursive logic_Generate complex CSS layout through loops
Mar 06, 2026 pm 01:22 PM
Less recursive mixins need to set clear termination conditions (such as counter decrement whenguard) to avoid infinite expansion; if there are more than 20 layers of explosive stacks, JS plug-ins or pre-generation should be used first; parameter passing must prevent variable overwriting, and splicing selectors should use @{var}; non-essential scenarios (such as simple repetition, responsive nesting) should not force recursion.
How to make a search bar that automatically fills the remaining space with CSS_Stretch the input box css through the Flex-grow attribute
Mar 06, 2026 pm 02:27 PM
To make the search box automatically fill the remaining space, you need to put the input into the display:flex container and set flex-grow:1; the parent container must enable Flex layout to avoid conflicts between width and flex-grow, and reset min-width:0 to prevent browser default restrictions.
CSS mobile performance optimization_Use will-change to inform transition attributes in advance
Mar 12, 2026 am 11:15 AM
Will-change should only be declared for transform and opacity attributes that will change frequently and can trigger synthesis; avoid abusing invalid attributes such as all, left, top, etc., which must be added/removed dynamically, and be used with caution in scrolling containers. Mobile terminals need to take into account compatibility and memory limitations.
How does CSS adapt to the layout of large-screen TV browsers such as TV_CSS styles optimized through long-distance interaction
Mar 05, 2026 pm 08:57 PM
TV browser disables:hover, you need to use:focus-visible to simulate focus; unit priority is vh/vw; scroll-snap needs to be combined with smooth; high-resolution screens use box-shadow scale to replace the 1px border.
How to avoid content overflow when using CSS with float_Set the box-sizing of the box model and ensure that the sum of the percentages does not exceed 100%
Mar 12, 2026 pm 12:00 PM
If the floating element cannot open the parent container, BFC needs to be triggered. Overflow:hidden is commonly used; box-sizing:border-box must be set on the floating element itself; the percentage exceeds 100% due to whitespace characters, border/padding and pixel rounding; in IE, pay attention to the box-sizing prefix and margin parsing bugs.
How to make a simple fixed bottom toolbar with CSS_Set bottom:0 through position:fixed
Mar 10, 2026 pm 02:12 PM
The main reason why bottom:0 does not take effect is that the ancestor element triggers transform/will-change/filter to create a new containing block, so that the fixed element is positioned relative to it rather than the viewport; dynamic changes in the iOS Safari address bar cause occlusion; fixed elements need to be given way with padding-bottom; z-index failure is often caused by the parent creating a cascading context.
How to customize core components of CSS through Bootstrap's Sass source code_modify variables and recompile the css framework
Mar 06, 2026 pm 01:54 PM
To make Bootstrap's $primary and other variables take effect, they must be imported in order in the custom SCSS file: first declare the variables, then import functions, variables, mixins, and finally import bootstrap; otherwise, the variables will fall back to their default values.





