算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
micro-interactions【设计与创意】Small purposeful animations — toggles, animated icons, success moments. Use when designing interactive feedback, success states or loaders.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
A micro-interaction is a moment. A checkbox that draws its checkmark. A heart that pulses when liked. A toggle that eases into place with a little overshoot. A confetti burst on completing a goal. These moments are small in duration — 200–600ms — but they communicate that the product was made by people who cared.
The reference is always the natural world. Nothing in nature snaps instantly. Everything has weight, momentum, and a moment of settling.
A micro-interaction earns its place when it:
It fails when it:
Physical objects have inertia, springiness, and weight. UI that borrows these properties feels intuitive because it matches expectations built over a lifetime.
| Natural behaviour | UI equivalent |
|---|---|
| A door swinging to rest | Toggle that overshoots slightly before settling |
| Water dripping | Staggered list item reveals |
| A rubber band snapping back | Pull-to-refresh bounce |
| A leaf falling | Gentle fade + drift downward on dismiss |
| A bell ringing | Icon that briefly oscillates (shakes) on trigger |
| A stamp pressing paper | Inner element shift (e.g. icon nudge) without shifting button bounds |
The motion should feel inevitable — as if the element has physical properties and cannot behave any other way.
Icons that animate on trigger communicate state change more vividly than a static swap.
Checkmark draw-on: A checkmark that draws itself from start to end point on completion.
@keyframes check-draw {
from { stroke-dashoffset: 20; }
to { stroke-dashoffset: 0; }
}
.checkmark path {
stroke-dasharray: 20;
animation: check-draw 300ms ease-out forwards;
}
Heart pulse on like: Scale up slightly then settle back.
@keyframes heart-pulse {
0% { transform: scale(1); }
40% { transform: scale(1.25); }
100% { transform: scale(1); }
}
Hamburger → close morphing: Lines animate to form an × when a menu opens.
Bell shake on notification: A brief oscillating rotation.
Loading spinner: Rotate with easing rather than linear — a spring rotation feels alive; linear feels mechanical.
A toggle should feel like a physical switch, not a state change.
.toggle-thumb {
transition: transform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
/* cubic-bezier with overshoot — the thumb slides and bounces slightly */
}
.toggle:checked .toggle-thumb {
transform: translateX(20px);
}
The cubic-bezier (0.34, 1.56, 0.64, 1) produces a spring effect — the thumb overshoots and settles. This is the difference between a switch that feels cheap and one that feels premium.
Mark moments of genuine completion — a form submitted, an onboarding step finished, a goal reached.
Accordions, tooltips, and popovers that open via a small reveal feel more considered than appearing instantly.
.accordion-content {
overflow: hidden;
max-height: 0;
transition: max-height 250ms ease-out;
}
.accordion-content.open {
max-height: 500px; /* generous upper bound */
}
Content that slides down as if gravity is pulling it into place feels natural. Content that blinks into existence does not.
Buttons must never change their outer dimensions or shift their position in the layout when hovered, focused, or clicked.
.btn {
transition: background-color 150ms ease-out, box-shadow 150ms ease-out;
}
.btn:hover {
background-color: var(--color-brand-600); /* subtle shift in hue or brightness */
}
.btn:active {
background-color: var(--color-brand-700); /* deeper contrast on press */
box-shadow: inset 0 2px 4px rgba(0,0,0,0.1); /* inner shadow suggests depth without scaling */
}
The button remains rock-solid in the layout. Feedback is conveyed through colour, internal shadows, or subtle micro-animations of inner elements (like an arrow moving 2px to the right) that do not affect the button's footprint.
When content loads, do not flash it in. Fade it over the skeleton at 150–200ms. The skeleton dissolves, the content arrives.
.content-loaded {
animation: fade-in 150ms ease-out;
}
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
Users often miss updates that occur far away from their current focus or click area (change blindness). If an area changes that the user is not currently looking at—such as a notification in a distant corner—use a subtle animation to guide their eye.
Rule: The animation should be non-looping. Once the eye is caught, the motion must stop to avoid becoming a permanent distraction.
Interactive elements — especially buttons — must be layout-stable.
transform: scale() on hover or click for buttons. It causes visual vibrating and can feel "squishy" rather than premium.translate or margins that change the element's position relative to its neighbors.Transitions for state, keyframes for sequences. A CSS transition can be interrupted: move the cursor away mid-hover and the element turns around from where it is. A keyframe animation cannot — it plays to the end, then snaps. Every hover, focus, active and selected state is a transition. Reserve @keyframes for a staged entrance or a loop that runs on its own.
Name the properties. transition: all animates whatever happens to change, including layout properties that force the browser to re-lay-out the page every frame — and it is how a component starts sliding when an unrelated class lands on it.
/* the element decides what moves */
transition-property: opacity, scale;
transition-duration: 200ms;
transition-timing-function: cubic-bezier(0.2, 0, 0, 1);
will-change is a last resort. Add it only when you have seen the first frame stutter, only on transform, opacity or filter, and remove it when the animation ends. It reserves a compositor layer; applied broadly it costs more memory than it saves time.
Micro-interactions are seasoning, not the meal.
prefers-reduced-motion — always@media (prefers-reduced-motion: reduce) {
* { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
}
Ask for each interaction: does this make the result clearer, or just more visually busy? If the answer is the latter, remove it.
prefers-reduced-motion respected?