'Loop div background-color through all rainbow colors gradually | CSS
How to change the background-color of a div over time through all color of a rainbow and then set it back again to its original color and loop that process infinitely ?
The code below is the result I want but in just one div that changes its color gradually.
<div id="rainbow"></div>
.rainbow {
background-color: blue;
float:left;
width: 70px;
height:70px;
border: 1px solid white;
}
.rainbow:first-child {
background-color: red;
}
.rainbow:nth-child(2) {
background-color: orange;
}.rainbow:nth-child(3) {
background-color: yellow;
}.rainbow:nth-child(4) {
background-color: Chartreuse;
}.rainbow:nth-child(5) {
background-color: cyan;
}.rainbow:nth-child(6) {
background-color: blue;
}.rainbow:nth-child(7) {
background-color: DarkOrchid;
}.rainbow:nth-child(8) {
background-color: DeepPink;
}.rainbow:nth-child(9) {
background-color: red;
}
.rainbow:last-child {
background-color: Chartreuse;
float:left;
border: 1px solid white;
clear:both;
}
<div class="rainbow">Original color</div>
<div class="rainbow">After some time</div>
<div class="rainbow">After some time</div>
<div class="rainbow">After some time</div>
<div class="rainbow">After some time</div>
<div class="rainbow">After some time</div><div class="rainbow">After some time</div><div class="rainbow">After some time</div><div class="rainbow">Come back to red and loop</div>
<br style="clear:both">
All of the above in just one div
Solution 1:[1]
You can create css animation to change background color. To make animation loop you can add infinite
and to get smooth transition of colors you can use linear
div {
background-color: #FF0000;
animation: bgColor 5s infinite linear;
width: 200px;
height: 100px;
}
@keyframes bgColor {
12.5% {
background-color: #FF0000;
}
25% {
background-color: #FFA500;
}
37.5% {
background-color: #FFFF00;
}
50% {
background-color: #7FFF00;
}
62.5% {
background-color: #00FFFF;
}
75% {
background-color: #0000FF;
}
87.5% {
background-color: #9932CC;
}
100% {
background-color: #FF1493;
}
}
<div></div>
Solution 2:[2]
You need to use keyframes to animate css
#rainbow {
background-color: blue;
float:left;
width: 70px;
height:70px;
border: 1px solid white;
-webkit-animation-name: example; /* Chrome, Safari, Opera */
-webkit-animation-duration: 4s; /* Chrome, Safari, Opera */
animation-name: example;
animation-duration: 4s;
animation-iteration-count: infinite;
}
@keyframes example {
0% {background-color: red; }
25% {background-color: yellow; }
50% {background-color: blue; }
75% {background-color: green; }
100% {background-color: red; }
}
/* Chrome, Safari, Opera */
@-webkit-keyframes example {
0% {background-color: red; }
25% {background-color: yellow; }
50% {background-color: blue; }
75% {background-color: green; }
100% {background-color: red; }
}
<div id="rainbow"></div>
Solution 3:[3]
you can achieve this with keyframes
.rainbow {
float:left;
width: 70px;
height:70px;
border: 1px solid white;
}
.rainbow:last-child {
float:left;
border: 1px solid white;
clear:both;
}
@keyframes color {
0% {
background-color: red;
}
10% {
background-color: orange;
}
20% {
background-color: yellow;
}
30% {
background-color: Chartreuse;
}
40% {
background-color: cyan;
}
50% {
background-color: blue;
}
60% {
background-color: DarkOrchid;
}
70% {
background-color: DeepPink;
}
80% {
background-color: red;
}
90% {
background-color: red;
}
100% {
background-color: red;
}
}
.rainbow {
animation: color 8s infinite;
}
<div class="rainbow">Original color</div>
<div class="rainbow">After some time</div>
<div class="rainbow">After some time</div>
<div class="rainbow">After some time</div>
<div class="rainbow">After some time</div>
<div class="rainbow">After some time</div><div class="rainbow">After some time</div><div class="rainbow">After some time</div><div class="rainbow">Come back to red and loop</div>
<br style="clear:both">
All of the above in just one div
Solution 4:[4]
I made this in pure Javascript. (Also on github)
let r = 255
let g = 0
let b = 0
function rgb(r, g, b){
return "rgb("+r+","+g+","+b+")"
}
function myTimer () {
if (r < 255 && g == 0 && b == 0) {
r++
} else if (r == 255 && g < 255 && b == 0) {
g++
} else if (r > 0 && g == 255 && b == 0) {
r--
} else if (r == 0 && g == 255 && b < 255) {
b++
} else if (r == 0 && g > 0 && b == 255) {
g--
} else if (r < 255 && g == 0 && b == 255) {
r++
} else if (r == 255 && g== 0 && b > 0) {
b--
}
document.body.style.backgroundColor = rgb(r, g, b)
}
setInterval(myTimer, 10)
Solution 5:[5]
How about this?
.text-rainbow-animation {
font-family:arial black;
font-size:70px;
background-image:
linear-gradient(to right, red,orange,yellow,green,blue,indigo,violet, red);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: rainbow-animation 35s linear infinite;
}
@keyframes rainbow-animation {
to {
background-position: 4500vh;
}
}
<div class="text-rainbow-animation">How about this?
</div>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Nenad Vracar |
Solution 2 | sailens |
Solution 3 | Rudi Urbanek |
Solution 4 | |
Solution 5 | Hoà ng Vũ Tgtt |