Hand-Driven Elements: Swipe, FAB, Carousel, Menu
How should swipe actions, FABs, carousels and menus behave in a mobile UI? They should follow the finger and carry its speed after release; offer a non-gesture alternative to swipes, show a peek of the next carousel card, and grow menus from the tapped button.
Elements you drag or push must follow the finger exactly. After the finger lifts, they should carry its speed to move naturally.
Terms and previews
Tap a preview to pause it; tap again to play.
Swipe actions
Swiping a list row sideways reveals delete or archive buttons
Speed dial FAB
Tapping the floating button opens several sub-buttons
Hide-on-scroll FAB
Hides when scrolling down and returns when scrolling up
Carousel
A set of cards you swipe through sideways
Peek
Shows a sliver of the next card at the edge
Scroll snap
When you let go, the card stops at an exact position
Menu reveal
The menu grows from the position of the tapped button
How to use it
- For any feature done by swiping to delete, always provide another way too (such as a kebab menu). Swiping is hidden, and many people do not know it.
- After a swipe delete, show an undo snackbar.
- Show 10 to 20% of the next card in a carousel to signal there is more. Do not auto-advance.
- Menus and popovers should grow from the button that was tapped (transform-origin). If they grow from the screen center, it is unclear where they came from.
Prompts to copy
Mail list swipe
Add Swipe actions to the mail list. - Swipe left for a red [Delete], swipe right for [Archive]. - The row follows the finger. If released after moving 40% or more of the screen width, run the action. Otherwise return to place with a spring. - After the action, show a "Deleted [Undo]" snackbar for 4 seconds. - Also add the same actions to a Kebab menu on each row.
Card carousel
Build a recommended-products Carousel. - Peek: show 15% of the next card on the right. - Scroll snap: stops card by card when released. - No auto-advance. Add position dots below.
Source posts: @ui_motion_prompts, @ui_motion_prompts, @ui_motion_prompts, @ui_motion_prompts