Modern CSS Animations
Keyframe animations for cards, icons, loaders and headings - drop a class on an element and it comes alive.
1Floating Animation
Lets any card, icon or image drift gently up and down as if it were weightless. Class: fx-floating-animation
Networking lounges
Hover to pause
<div class="d-flex flex-wrap align-items-center justify-content-center gap-3 p-3 h-100" style="min-height:200px">
<div class="card border-0 shadow text-center fx-floating-animation" style="width:12rem">
<div class="card-body">
<div class="fs-1 text-primary mb-2">
<i class="bi bi-rocket-takeoff-fill" aria-hidden="true"></i>
</div>
<h3 class="h6 mb-1">Networking lounges</h3>
<p class="small text-body-secondary mb-0">Hover to pause</p>
</div>
</div>
</div>
/* CSS (already in assets/css/effects.css) */
.fx-floating-animation { animation: fx-floating-animation-float 3.6s ease-in-out infinite; will-change: transform; }
.fx-floating-animation:hover { animation-play-state: paused; }
@keyframes fx-floating-animation-float {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-12px); }
}
@media (prefers-reduced-motion: reduce) {
.fx-floating-animation, .fx-floating-animation::before, .fx-floating-animation::after, .fx-floating-animation *, .fx-floating-animation *::before, .fx-floating-animation *::after { animation: none !important; transition: none !important; }
}2Bouncing Text
Makes each letter of a short word hop in turn; wrap every letter in a span with --i set to its index. Class: fx-bouncing-text
<div class="d-flex flex-wrap align-items-center justify-content-center gap-3 p-3 h-100" style="min-height:200px">
<h2 class="display-5 fw-bold mb-0 fx-bouncing-text" aria-label="Ready?"><span style="--i:0" aria-hidden="true">R</span><span style="--i:1" aria-hidden="true">e</span><span style="--i:2" aria-hidden="true">a</span><span style="--i:3" aria-hidden="true">d</span><span style="--i:4" aria-hidden="true">y</span><span style="--i:5" aria-hidden="true">?</span></h2>
</div>
/* CSS (already in assets/css/effects.css) */
.fx-bouncing-text { display: inline-flex; }
.fx-bouncing-text > span {
display: inline-block;
animation: fx-bouncing-text-bounce 1.6s ease-in-out infinite;
animation-delay: calc(var(--i, 0) * .09s);
}
@keyframes fx-bouncing-text-bounce {
0%, 60%, 100% { transform: translateY(0); }
25% { transform: translateY(-14px); color: var(--wt-primary-ink); }
40% { transform: translateY(2px); }
}
@media (prefers-reduced-motion: reduce) {
.fx-bouncing-text, .fx-bouncing-text::before, .fx-bouncing-text::after, .fx-bouncing-text *, .fx-bouncing-text *::before, .fx-bouncing-text *::after { animation: none !important; transition: none !important; }
}3Shimmer Skeleton
Loading placeholders with a light sweep; add the class to every grey block of a skeleton card. Class: fx-shimmer-skeleton
<div class="d-flex flex-wrap align-items-center justify-content-center gap-3 p-3 h-100" style="min-height:200px">
<div class="card w-100" style="max-width:18rem" aria-busy="true" aria-label="Loading content">
<div class="card-body">
<div class="d-flex align-items-center gap-3 mb-3">
<span class="fx-shimmer-skeleton rounded-circle flex-shrink-0" style="width:48px;height:48px"></span>
<div class="flex-grow-1">
<span class="fx-shimmer-skeleton mb-2" style="width:70%"></span><span class="fx-shimmer-skeleton" style="width:45%"></span>
</div>
</div>
<span class="fx-shimmer-skeleton mb-2" style="height:70px"></span> <span class="fx-shimmer-skeleton mb-2"></span> <span class="fx-shimmer-skeleton" style="width:60%"></span>
</div>
</div>
</div>
/* CSS (already in assets/css/effects.css) */
.fx-shimmer-skeleton {
display: block; min-height: .9rem; border-radius: var(--wt-radius, .5rem);
background: linear-gradient(90deg, rgba(var(--wt-primary-rgb), .08) 25%, rgba(var(--wt-primary-rgb), .22) 37%, rgba(var(--wt-primary-rgb), .08) 63%);
background-size: 400% 100%;
animation: fx-shimmer-skeleton-shine 1.4s ease infinite;
}
@keyframes fx-shimmer-skeleton-shine { 0% { background-position: 100% 50%; } 100% { background-position: 0 50%; } }
@media (prefers-reduced-motion: reduce) {
.fx-shimmer-skeleton, .fx-shimmer-skeleton::before, .fx-shimmer-skeleton::after, .fx-shimmer-skeleton *, .fx-shimmer-skeleton *::before, .fx-shimmer-skeleton *::after { animation: none !important; transition: none !important; }
}