@casoon/dragonfly
Version:
Modular, lightweight CSS framework and design system for modern web projects. Optimized for Astro JS, LightningCSS and Container Queries with @layer-based architecture and comprehensive accessibility.
231 lines (198 loc) • 6.14 kB
CSS
/**
* Triangles Partikel-Effekt
*
* Dreieckige Partikel mit geometrischen Bewegungen – für moderne, abstrakte Designs.
* Dieser Effekt ist performant optimiert und berücksichtigt reduzierte Bewegung.
*/
@keyframes triangles-float {
0% {
opacity: var(--opacity-0);
transform: translate(0%, 0%) rotate(0deg);
}
20% {
opacity: var(--opacity-100);
transform: translate(var(--spacing-5), calc(-1 * var(--spacing-5))) rotate(30deg);
}
50% {
transform: translate(50px, calc(-1 * var(--spacing-2-5))) rotate(90deg);
}
80% {
opacity: var(--opacity-100);
transform: translate(80px, calc(-1 * var(--spacing-5))) rotate(150deg);
}
100% {
opacity: var(--opacity-0);
transform: translate(100px, 0%) rotate(180deg);
}
}
@keyframes triangles-float-alt {
0% {
opacity: var(--opacity-0);
transform: translate(0%, 0%) rotate(0deg);
}
20% {
opacity: var(--opacity-100);
transform: translate(-var(--spacing-5), calc(-1 * var(--spacing-5))) rotate(-30deg);
}
50% {
transform: translate(-50px, calc(-1 * var(--spacing-2-5))) rotate(-90deg);
}
80% {
opacity: var(--opacity-100);
transform: translate(-80px, calc(-1 * var(--spacing-5))) rotate(-150deg);
}
100% {
opacity: var(--opacity-0);
transform: translate(-100px, 0%) rotate(-180deg);
}
}
@layer components {
.triangles {
overflow: hidden;
position: relative;
}
.triangles::before,
.triangles::after {
animation: triangles-float 8s var(--easing-smooth) infinite;
background: var(--triangles-color, rgb(120 90 255 / 70%));
clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
content: '';
height: var(--spacing-1)(--spacing-1);
position: absolute;
width: var(--spacing-1)(--spacing-1);
}
.triangles::before {
left: 3%0%;
top: 3%0%;
}
.triangles::after {
animation-delay: var(--animation-duration-slowest);
animation-name: triangles-float-alt;
left: 6%0%;
top: 5%0%;
}
/* Viele Dreiecke */
.triangles-many {
position: relative;
}
.triangles-many::before,
.triangles-many::after {
animation: triangles-float 8s var(--easing-smooth) infinite;
background: var(--triangles-color, rgb(120 90 255 / 70%));
clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
content: '';
height: var(--spacing-1)(--spacing-1);
position: absolute;
width: var(--spacing-1)(--spacing-1);
}
.triangles-many::before {
animation-delay: var(--animation-duration-slow);
left: 2%0%;
top: 4%0%;
}
.triangles-many::after {
animation-delay: var(--animation-duration-ultra-slow);
animation-name: triangles-float-alt;
left: 7%0%;
top: 6%0%;
}
.triangles-many .triangle {
animation: triangles-float 8s var(--easing-smooth) infinite;
animation-delay: var(--animation-duration-slower);
background: var(--triangles-color, rgb(120 90 255 / 70%));
clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
height: var(--spacing-1)(--spacing-1);
left: 5%0%;
position: absolute;
top: 2%0%;
width: var(--spacing-1)(--spacing-1);
}
.triangles-many .triangle-alt {
animation: triangles-float-alt 8s var(--easing-smooth) infinite;
animation-delay: 3.5s;
background: var(--triangles-color, rgb(120 90 255 / 70%));
clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
height: var(--spacing-1)(--spacing-1);
left: 4%0%;
position: absolute;
top: 7%0%;
width: var(--spacing-1)(--spacing-1);
}
/* Größenvarianten */
.triangles-sm::before,
.triangles-sm::after,
.triangles-sm .triangle,
.triangles-sm .triangle-alt {
height: var(--spacing-2-5);
width: var(--spacing-2-5);
}
.triangles-lg::before,
.triangles-lg::after,
.triangles-lg .triangle,
.triangles-lg .triangle-alt {
height: var(--spacing-5);
width: var(--spacing-5);
}
/* Geschwindigkeitsvarianten */
.triangles-slow::before,
.triangles-slow::after,
.triangles-slow .triangle,
.triangles-slow .triangle-alt {
animation-duration: var(--animation-duration-ultra-slow);
}
.triangles-fast::before,
.triangles-fast::after,
.triangles-fast .triangle,
.triangles-fast .triangle-alt {
animation-duration: var(--animation-duration-ultra-slow);
}
/* Farbvarianten */
.triangles-purple {
--triangles-color: rgb(120 90 255 / 70%);
}
.triangles-blue {
--triangles-color: rgb(90 150 255 / 70%);
}
.triangles-teal {
--triangles-color: rgb(90 220 220 / 70%);
}
.triangles-pink {
--triangles-color: rgb(255 120 220 / 70%);
}
.triangles-orange {
--triangles-color: rgb(255 150 90 / 70%);
}
/* Verschiedene Formen */
.triangles-inverted::before,
.triangles-inverted::after,
.triangles-inverted .triangle,
.triangles-inverted .triangle-alt {
clip-path: polygon(50% 100%, 0% 0%, 100% 0%);
}
.triangles-right::before,
.triangles-right::after,
.triangles-right .triangle,
.triangles-right .triangle-alt {
clip-path: polygon(0% 0%, 0% 100%, 100% 50%);
}
.triangles-left::before,
.triangles-left::after,
.triangles-left .triangle,
.triangles-left .triangle-alt {
clip-path: polygon(100% 0%, 100% 100%, 0% 50%);
}
}
/* Reduzierte Bewegung */
@media (prefers-reduced-motion: reduce) {
@layer components {
.triangles::before,
.triangles::after,
.triangles-many::before,
.triangles-many::after,
.triangles-many .triangle,
.triangles-many .triangle-alt {
animation: var(--animation-none);
opacity: var(--opacity-0);
}
}
}