Why is it needed?
If you have been following web development for some time you would the hype around CSS Custom Properties. So let’s see Why So Hype ??( read in Heath Ledger Joker tone 😜)
We all are habituated to writing CSS and specifying properties for elements. However many times to maintain a similarity across the website we tend to write repetitive code. One of the major goals for developers is to reduce this repetitive code enabling easy, fast ways to change properties and enable efficient code writing and code debugging, and code refactoring.
This is where CSS Variables come into play . Take a look at the code below and see the amount of repetition used in the CSS file.
.list1 {
color: white;
background-color: darkviolet;
margin: 2rem;
width: 50px;
height: 50px;
display: block;
}
.list2 {
color: white;
background-color: darkblue;
margin: 2rem;
width: 150px;
height: 70px;
display: block;
}
.list3 {
color: white;
background-color: darkviolet;
margin: 2rem;
width: 75px;
}
.txt1 {
background-color: darkviolet;
}
Here is a Codepen Example with HTML and CSS to show the code.
https://codepen.io/aashirwad01/pen/XWzgKzN
Solution: So What to do?
To avoid such a need for repetition we can define properties using CSS variables to write once and use throughout the code.
This also enables us to change property once and update throughout the doc without having to change it all.
Thus facilitating easy debugging and refactoring of code alongside way less repetition.
CSS variables or also known as Custom CSS properties are values defined by the author to use throughout a document.
They are set using custom property notation (e.g. —main- color : black
) and are accessed using var() function (e.g. color : var( —main-color);
)
This might not look a big deal in small code however big websites and in complex code, we might use the same color
in hundreds of places requiring global search and update for changing a simple color
😪.
Custom properties allow us to store ( not such a good term to use we will see why later 😬) and reference in multiple places 😎.
How to use it?
In order to define any custom property we begin, its name with a double hyphen
(—
). and valid CSS property value. Just like any other CSS property, it is written within double brackets { } i.e a rule set.
:root {
--main-bg-color: darkviolet;
}
element {
--text-color: white;
}
You might have noticed:root
in the above code. It is a pseudo-class that allows us to define properties within it that can be used globally across entire HTML.
You can learn about :root
from below MDN doc.
:root - CSS: Cascading Style Sheets | MDN
Using it in Code
Enough Chitchat! Let’s start using it in Code 😋
So take an example of the above defined code .Pasting here again for reference.
.list1 {
color: white;
background-color: darkviolet;
margin: 2rem;
width: 50px;
height: 50px;
display: block;
}
.list2 {
color: white;
background-color: darkblue;
margin: 2rem;
width: 150px;
height: 70px;
display: block;
}
.list3 {
color: white;
background-color: darkviolet;
margin: 2rem;
width: 75px;
}
.txt1 {
background-color: darkviolet;
}
Here we declare a custom property of —main-bg-color
in root
and use it wherever required in code. Pretty Dope 😏
The result is the same, yet this is very useful for refactoring the style of the site at once.
:root{
--main-bg-color:darkviolet;
}
.list1 {
color: white;
background-color: var(--main-bg-color);
margin: 2rem;
width: 50px;
height: 50px;
display: block;
}
.list2 {
color: white;
background-color: darkblue;
margin: 2rem;
width: 150px;
height: 70px;
display: block;
}
.list3 {
color: white;
background-color: var(--main-bg-color);
margin: 2rem;
width: 75px;
}
.txt1 {
background-color: var(--main-bg-color);
}
Let me share a secret tip 🤫
To see and use Var()
in CSS here is the above code’s codepen snippet.
https://codepen.io/aashirwad01/pen/ZEayBew
Splitting Colors using Custom Properties 😳
This is one of the coolest use of custom properties 😎
Say we can define different values for hsl in custom variables and we can use combinations of them together or can change the color
value individually in specific cases.
https://codepen.io/aashirwad01/pen/vYWZxgw
Here is an article to see how individual values in elements can be changed in CSS.
https://css-tricks.com/now-css-custom-properties-thing-value-parts-can-changed-individually/
How to use Calc() with Custom properties 💪
Here is small sample code to see how to use calc()
with var()
function .
.d2{
--spacing: 1.2rem;
padding: calc(var(--spacing) / 2));
}
Custom property fallbacks
Say we have declared a custom property, what will happen if we don’t provide any value to the variable set 🤔
The callback will use the second comma-separated value instead 😏
For e.g
html {
font-family: var(--fonts, Helvetica, Arial, sans-serif);
}
Here if —fonts
doesn’t have any value specified font family takes additional fallback values 🤩
We can also have a series of fallbacks, but for that we need them to be nested.
Take this example :
html {
font-family: var(--fonts, var(--fontsfallback,Arial);
}
Pretty Cool 😁
Now, What will happen if the wrong value is given to Custom Property? 🥲
Whenever a invalid substitution in var()
is used , either the initial value or the inherited value is used .
Let’s see the below code
<p class="para">Because Var() is the hero CSS deserves,
but not the one it knows right now </p>
Let’s look at the CSS code ( wherein lies the mis step 😶)
:root { --text-color: 2rem; }
.para{
color:var(--text-color);
}
See how we have written 2rem
for —text-color
property . So the resulting .para
has a default color
set for it which is black
!
Since there is no parent from which .para
could inherit any color
, the initial color
which is default is used instead of the inherited one.
On that note let’s see Inheritance of Custom Properties 🤗
Inheritance of Custom Properties
For reference here is the codepen snippet below.
Below is a short description of how divs are arranged.
We have a div 1 with class d1
within which we have
- div 2 with
class d2
- Inside div 2 we have div 3 with
class d3
and div 4 withclass d4
- Inside div 2 we have div 3 with
https://codepen.io/aashirwad01/pen/rNYwWjR
In the above case, we have property spacing
to define padding spacing
in class d2
and padding spacing
and margin spacing
in class d3
.
We observe that :
- In Class
d2
padding spacing is1.2rem
. Specified using local custom property spacing - In Class
d3
padding spacing is2rem
and margin-bottom is also2rem
. Specified using local custom property spacing. - In Class
d4
padding spacing is1.2rem
( inherited from classd2
).
Gotcha! Does var “store” values? 🤔
Future of CSS
We have seen how using the var()
function we create a CSS Variable which gets substituted for the value of the Custom Property it refers to.
There is a suggestion for “Higher Level Custom Properties”.
Custom Properties that control a number of other CSS Properties. As per the proposal right now we have a new @if
at-rule and alongside var()
this would make custom properties Kaboom 💥💥.
Also, Atomic CSS is also in trend and hype these are immutable classes that have complete responsibility of applying a unit style to the selected component of the UI.
In Short and Crisp way Future of CSS is not Just Monstrous “ it’s Ahead Of The Curve “😉