Normally keep the overlay hidden below the element with `transform: translateY(100%)`, then slide it to `translateY(0)` on hover (or whenever the cursor is inside the card's bounds). Moving position rather than just fading `opacity` gives it a clear "sliding out" direction.
To avoid hover flickering between the card and its children (a button, say), it's easier to bind the event once on the top-level card and propagate state down internally. A 0.2–0.3s transition reads as unhurried.
Touch devices have no hover, so you need a fallback — toggle on tap, or just expose some of that information up front.
When to use
Use it for captions or action buttons over image cards, edit icons on table rows — anything secondary that doesn't need to be visible by default.