By 2020, when Facebook comes with Dark Mode, there’s no reason you don’t add a bit of dark to your site to increase the user experience a bit.
The better if you are a React developer, you can apply some simple steps below, the time is not too much but the effect will probably be quite good. If you understand this idea, you can convert it to Vuejs or JQuery project.
CSS
Let’s start a simple step with CSS first, you need to determine what Dark Mode needs to do, for me, it just needs to turn the bright white components of the website into dark colors such as the background and for example. contrast the dark content to a brighter color to stand out more on dark backgrounds, such as text, icons, borders, etc. depending on your senses.
And to do that, I will create 2 CSS files corresponding to 2 themes, dark and light
dark.css
1 2 3 4 5 | <span class="token selector">html[data-theme="dark"]</span> <span class="token punctuation">{</span> <span class="token property">--color</span> <span class="token punctuation">:</span> <span class="token function">rgb</span> <span class="token punctuation">(</span> 250, 250, 250 <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token property">--background-color</span> <span class="token punctuation">:</span> <span class="token function">rgb</span> <span class="token punctuation">(</span> 5, 5, 5 <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
light.css
1 2 3 4 5 | <span class="token selector">html[data-theme="light"]</span> <span class="token punctuation">{</span> <span class="token property">--color</span> <span class="token punctuation">:</span> <span class="token function">rgb</span> <span class="token punctuation">(</span> 5, 5, 5 <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token property">--background-color</span> <span class="token punctuation">:</span> <span class="token function">rgb</span> <span class="token punctuation">(</span> 250, 250, 250 <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Here I use 2 variables –color and –background-color , for you who do not know, the declaration with the first 2 dashes in CSS is considered variable declaration, and this variable you Can be used to style web pages.
And as seen, I will use these 2 variables to define the background and the lines of text throughout the site, if the theme is dark then set the background a bit dark, the text will be bright white and vice versa.
App.css
1 2 3 4 5 6 7 8 9 10 11 | <span class="token selector">.App-header</span> <span class="token punctuation">{</span> <span class="token property">background-color</span> <span class="token punctuation">:</span> <span class="token function">var</span> <span class="token punctuation">(</span> --background-color <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token property">min-height</span> <span class="token punctuation">:</span> 100vh <span class="token punctuation">;</span> <span class="token property">display</span> <span class="token punctuation">:</span> flex <span class="token punctuation">;</span> <span class="token property">flex-direction</span> <span class="token punctuation">:</span> column <span class="token punctuation">;</span> <span class="token property">align-items</span> <span class="token punctuation">:</span> center <span class="token punctuation">;</span> <span class="token property">justify-content</span> <span class="token punctuation">:</span> center <span class="token punctuation">;</span> <span class="token property">font-size</span> <span class="token punctuation">:</span> <span class="token function">calc</span> <span class="token punctuation">(</span> 10px + 2vmin <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token property">color</span> <span class="token punctuation">:</span> <span class="token function">var</span> <span class="token punctuation">(</span> --color <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Add a Component
Now the CSS is all that, ez too. Now to the main processing, you create a component named ToggleDarkMode , we will add a bit of code to index.js
as follows:
ToggleDarkMode/index.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">const</span> <span class="token function-variable function">DarkModeToggle</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> <span class="token punctuation">[</span> isDark <span class="token punctuation">,</span> setIsDark <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span> <span class="token punctuation">(</span> localStorage <span class="token punctuation">.</span> <span class="token function">getItem</span> <span class="token punctuation">(</span> <span class="token string">"theme"</span> <span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token string">"dark"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">useEffect</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> document <span class="token punctuation">.</span> <span class="token function">getElementsByTagName</span> <span class="token punctuation">(</span> <span class="token string">"HTML"</span> <span class="token punctuation">)</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">setAttribute</span> <span class="token punctuation">(</span> <span class="token string">"data-theme"</span> <span class="token punctuation">,</span> localStorage <span class="token punctuation">.</span> <span class="token function">getItem</span> <span class="token punctuation">(</span> <span class="token string">"theme"</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> input type <span class="token operator">=</span> <span class="token string">"checkbox"</span> defaultChecked <span class="token operator">=</span> <span class="token punctuation">{</span> isDark <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Here I use localStorage to save the theme’s state right in the user’s browser, every time I reload the website I will check this status to see if this person has enabled dark mode and at the same time assign. This state enters the data-theme attribute.
If you do not remember, you can turn on the CSS section, this attribute will be used as a selector to determine if we will use dark or light styles.
And I have a small checkbox that will be checked if the user is using a dark theme, now we will add the processing code to use this checkbox as a toggle for dark mode here.
ToggleDarkMode/index.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class="token keyword">const</span> <span class="token function-variable function">toggleThemeChange</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> isDark <span class="token punctuation">)</span> <span class="token punctuation">{</span> localStorage <span class="token punctuation">.</span> <span class="token function">setItem</span> <span class="token punctuation">(</span> <span class="token string">"theme"</span> <span class="token punctuation">,</span> <span class="token string">"light"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> document <span class="token punctuation">.</span> <span class="token function">getElementsByTagName</span> <span class="token punctuation">(</span> <span class="token string">"HTML"</span> <span class="token punctuation">)</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">setAttribute</span> <span class="token punctuation">(</span> <span class="token string">"data-theme"</span> <span class="token punctuation">,</span> <span class="token string">"light"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">setIsDark</span> <span class="token punctuation">(</span> <span class="token boolean">true</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> localStorage <span class="token punctuation">.</span> <span class="token function">setItem</span> <span class="token punctuation">(</span> <span class="token string">"theme"</span> <span class="token punctuation">,</span> <span class="token string">"dark"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> document <span class="token punctuation">.</span> <span class="token function">getElementsByTagName</span> <span class="token punctuation">(</span> <span class="token string">"HTML"</span> <span class="token punctuation">)</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">setAttribute</span> <span class="token punctuation">(</span> <span class="token string">"data-theme"</span> <span class="token punctuation">,</span> <span class="token string">"dark"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">setIsDark</span> <span class="token punctuation">(</span> <span class="token boolean">false</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">//...</span> <span class="token operator"><</span> input type <span class="token operator">=</span> <span class="token string">"checkbox"</span> defaultChecked <span class="token operator">=</span> <span class="token punctuation">{</span> isDark <span class="token punctuation">}</span> onChange <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token function">toggleThemeChange</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> |
This part is too easy, add an onChange event and in this event we will check what the current theme is, if it is light then we will change it to dark, and vice versa.
And finally the result:
Pretty simple, but surprisingly effective. You can define other color components at will, playing 7 RGB colors is always okay
Thanks for watching the article!