Hello World!
New episode of the series! - A CSS/JS trick in 5 minutes - Last 4 episodes were Javascript tricks so this time I want to show you a CSS one. I will try to do not exceed 20 lines of code like all other episodes of the series. So I will divide it into two bigs parts. In the first one, you will discover how to do a background with clouds, and in the second how to make a rain effect (maybe when the user hover something or enter a wrong info). Let's start!
Background:
body { height: 100vh; margin: 0; padding: 0; overflow-x: hidden; background-color: #22c5ff; // A blue that seems the sky display: flex; justify-content: center; flex-direction: column; }
Clouds:
HTML:
<div id="background-wrap"> <div class="x1"> <div class="cloud"></div> </div> <div class="x2"> <div class="cloud"></div> </div> <div class="x3"> <div class="cloud"></div> </div> <div class="x4"> <div class="cloud"></div> </div> <div class="x5"> <div class="cloud"></div> </div> </div>
We are just creating 6 divs, 5 are clouds and 1 is the container.
CSS:
First we style the container:
#background-wrap { bottom: 0; left: 0; padding-top: 50px; position: fixed; right: 0; top: 0; z-index: -1; }
Now we style all the clouds together:
.cloud { background: #fff; background: linear-gradient(top, #fff 5%, #f1f1f1 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff', endColorstr='#f1f1f1',GradientType=0 ); border-radius: 100px; box-shadow: 0 8px 5px rgba(0, 0, 0, 0.1); height: 120px; position: relative; width: 350px; } .cloud:after, .cloud:before { background: #fff; content: ""; position: absolute; z-index: -1; } .cloud:after { border-radius: 100px; height: 100px; left: 50px; top: -50px; width: 100px; } .cloud:before { border-radius: 200px; width: 180px; height: 180px; right: 50px; top: -90px; }
Then we style each cloud to look unique:
.x1 { animation: animateCloud 35s linear infinite; // The animation will be infinite, when a cloud disappear from one side it will reappear on the other transform: scale(0.65); } .x2 { animation: animateCloud 20s linear infinite; transform: scale(0.3); } .x3 { animation: animateCloud 30s linear infinite; transform: scale(0.5); } .x4 { animation: animateCloud 18s linear infinite; transform: scale(0.4); } .x5 { animation: animateCloud 25s linear infinite; transform: scale(0.55); }
So each cloud have a different size (scale) and velocity (seconds to finish the animation)
Now we add the animation "animateCloud":
@keyframes animateCloud { 0% { margin-left: -1000px; } 100% { margin-left: 100%; } }
We are just changing the margin so the cloud goes from left to right.
Make it rain:
We just need a div/section with .rain class. To make thing dynamically you can add the class in javascript as I explain in this article
.rain { width: 100%; height: 100vh; position: relative; position: absolute; top: 0; left: 0; background-image: url(https://media.geeksforgeeks.org/wp-content/uploads/20200828184719/rain-300x300.png); animation: rain 0.5s linear infinite; opacity: 0; }
And the animation...
@keyframes rain { 0% { background-position: 0 0; opacity: 1; } 100% { background-position: 10% 60%; opacity: 1; } }
You can have here a live preview:
Open Me for full screen best experience:
Hope this helped and thanks for reading!
Please smash that like button to make me understand that you want the series to continue :)
Check this article about how to write CSS like a pro!
Subscribe to my Newsletter!
A loooong, and fun, weekly recap for you
Free PDF version of my articles
Highly customizable inbox
That's --> free <-- and you help me!
Top comments (0)