I think removing the native cascading effect of css variables will be awesome.
variables should be accessible to other selectors not within the scope of the :root element.
more like:
{
--variable_name: value;
}
selector{
property: var(--variable_name);
}
code sample:
index.html
<div class="question">
<h1>questions</H1>
<ul>
<li>Whats your name</li>
</ul>
<div>
<div class="greet">
<p>hello world</p>
</div>
index.css
/*
proposed css variable declaration
*/
{
--bg_color: #111;
--font_color: #fff;
}
.question{
background-color: var(--bg_color);
color: var(--font_color);
}
/*
The greet class is on a different scope from the question class, but still shares the varible values with .question
*/
.greet{
background-color: var(--bg_color);
color: var(--font_color);
}
This are my thoughts though, I'd love to hear your thoughts about this too..
Top comments (4)
I don’t understand the purpose of this post. Your “proposal” is the same of the actual behavior. Variables declared inside :root are accessible and they can be redeclared inside any selector.
A variable declared within :root is only accessible to it and its children. Other elements outside of :root will not have access to the variable unless they are re-declared in this element.
But what if we can declare a variable once with a
GLOBAL SCOPE
, such that it's not bound to any :root element and its children, but can be easily accessed by every other element regardless of their position(in or outside the :root element).In HTML there can't be anything outside the document root element, it is always the
<html>
tag.I think you don't know CSS Properties and Values API Level 1. Registering custom properties by CSS you must bind it to a selector since in css you can't write nothing outside
{}
. Since in CSS:root {}
is the document root element (<html>
) it works as a "global scope" because there is nothing outside it. So any custom property declarede at:root
level is accessible by the entire document.BTW, right now you can also register custom properties directly to the document object through JS using Houdini api...
There is also a postcss plugin that allows you (trying to bring a lv2 proposal) to do the reverse thing, register a document-level custom property inside CSS:
github.com/jonathantneal/postcss-r...
Ok, i get your point now,
html{}
is the solution.Thanks for sharing your knowledge about CSS internals.