CSS particle animation without JavaScript. The most important point is random movement of particles. The vignetting was created by mask-image property.
A Pen by Takeshi Kano on CodePen.
| .container | |
| img(src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/221808/sky.jpg").background | |
| p.message all your dreams can come true<br>if you have the courage to pursue them | |
| - for (i = 1; i <= 100; i++) | |
| .circle-container | |
| .circle |
CSS particle animation without JavaScript. The most important point is random movement of particles. The vignetting was created by mask-image property.
A Pen by Takeshi Kano on CodePen.
| * { | |
| margin: 0; | |
| padding: 0; | |
| } | |
| html, | |
| body { | |
| width: 100%; | |
| height: 100%; | |
| overflow: hidden; | |
| } | |
| body { | |
| background-color: #021027; | |
| } | |
| .container { | |
| width: 100%; | |
| height: 100%; | |
| overflow: hidden; | |
| position: relative; | |
| } | |
| .background { | |
| display: block; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| object-fit: cover; | |
| width: 100%; | |
| height: 100%; | |
| mask-image: radial-gradient( | |
| white 0%, | |
| white 30%, | |
| transparent 80%, | |
| transparent | |
| ); | |
| } | |
| .circle-container { | |
| $particleNum: 200; | |
| $particleColor: hsl(180, 100%, 80%); | |
| position: absolute; | |
| transform: translateY(-10vh); | |
| animation-iteration-count: infinite; | |
| animation-timing-function: linear; | |
| .circle { | |
| width: 100%; | |
| height: 100%; | |
| border-radius: 50%; | |
| mix-blend-mode: screen; | |
| background-image: radial-gradient( | |
| hsl(180, 100%, 80%), | |
| hsl(180, 100%, 80%) 10%, | |
| hsla(180, 100%, 80%, 0) 56% | |
| ); | |
| animation: fadein-frames 200ms infinite, scale-frames 2s infinite; | |
| @keyframes fade-frames { | |
| 0% { | |
| opacity: 1; | |
| } | |
| 50% { | |
| opacity: 0.7; | |
| } | |
| 100% { | |
| opacity: 1; | |
| } | |
| } | |
| @keyframes scale-frames { | |
| 0% { | |
| transform: scale3d(0.4, 0.4, 1); | |
| } | |
| 50% { | |
| transform: scale3d(2.2, 2.2, 1); | |
| } | |
| 100% { | |
| transform: scale3d(0.4, 0.4, 1); | |
| } | |
| } | |
| } | |
| $particleBaseSize: 8; | |
| @for $i from 1 through $particleNum { | |
| &:nth-child(#{$i}) { | |
| $circleSize: random($particleBaseSize); | |
| width: $circleSize + px; | |
| height: $circleSize + px; | |
| $startPositionY: random(10) + 100; | |
| $framesName: "move-frames-" + $i; | |
| $moveDuration: 28000 + random(9000) + ms; | |
| animation-name: #{$framesName}; | |
| animation-duration: $moveDuration; | |
| animation-delay: random(37000) + ms; | |
| @keyframes #{$framesName} { | |
| from { | |
| transform: translate3d( | |
| #{random(100) + vw}, | |
| #{$startPositionY + vh}, | |
| 0 | |
| ); | |
| } | |
| to { | |
| transform: translate3d( | |
| #{random(100) + vw}, | |
| #{- $startPositionY - random(30) + vh}, | |
| 0 | |
| ); | |
| } | |
| } | |
| .circle { | |
| animation-delay: random(4000) + ms; | |
| } | |
| } | |
| } | |
| } | |
| .message { | |
| position: absolute; | |
| right: 20px; | |
| bottom: 10px; | |
| color: white; | |
| font-family: "Josefin Slab", serif; | |
| line-height: 27px; | |
| font-size: 18px; | |
| text-align: right; | |
| pointer-events: none; | |
| animation: message-frames 1.5s ease 5s forwards; | |
| opacity: 0; | |
| @keyframes message-frames { | |
| from { | |
| opacity: 0; | |
| } | |
| to { | |
| opacity: 1; | |
| } | |
| } | |
| } |
| <link href="https://fonts.googleapis.com/css?family=Josefin+Slab:100" rel="stylesheet" /> |