The cursor property sets the mouse cursor shown when the pointer is over an element. Use it to signal what the user can do: click, select text, wait, or that an action is blocked.
You can use a keyword such as pointer, or load a custom image with url() and a mandatory keyword fallback. The property is inherited, so a parent cursor applies to children unless they override it.
Baseline · Widely available.
Not deprecated. Core keywords are widely supported. Some keywords and custom image formats still have uneven support across browsers and platforms (for example iPadOS mainly changes appearance for text).
Idle state.grab tells the user the item can be dragged.
Active state.:active switches to grabbing while the button is held.
Feedback only. Cursor does not implement drag logic. Pair it with pointer events or a drag library.
Hover and press. Move over the box, then press to compare the two cursors in the editor.
Edge Cases & Pitfalls
If the cursor looks wrong or never changes, check these first.
url
Custom images need a keyword fallback
cursor: url("hand.cur") alone is invalid. End with a keyword: cursor: url("hand.cur"), pointer;. Prefer small PNG/CUR icons around 32×32.
inherit
Cursor is inherited
A pointer on a card can make nested text look clickable. Override children with cursor: auto or text when needed.
touch
No mouse means no visible cursor
Touch-first phones do not show a mouse cursor. Keep affordances clear with layout and focus styles, not cursor alone. pointer-events is a different property.
platform
Some keywords look the same on some OS
MDN notes cases such as no-drop matching not-allowed on Windows/macOS in Firefox. Test critical feedback on your target platforms.
a11y
Cursor is not a substitute for state
Do not use pointer on non-interactive text, or not-allowed without disabling the control. Keyboard users need real HTML state and focus styles.
Compatibility
Browser Support
cursor is a browser CSS property for pointer appearance. Node.js, Deno, and Bun do not apply it.
✓ Baseline · Widely available
cursor
Keyword cursors work in all modern browsers and Internet Explorer. Some keywords and custom images have partial or platform-specific behavior.
97%Core keyword support
Google ChromeAll modern versions
Full support
Mozilla FirefoxAll modern versions
Full support
Apple SafariAll modern versions
Full support
Microsoft EdgeAll modern versions
Full support
OperaAll modern versions
Full support
Samsung InternetSupported
Full support
Internet ExplorerCore keywords
Partial
cursorWidely supported
Bottom line: Safe for everyday keywords such as pointer, text, and not-allowed. Verify custom images and less common keywords on target devices. It is not a runtime API.
Remember
Key Takeaways
Role: show what the mouse can do over an element.
Initial value:auto. The property is inherited.
Common picks:pointer, text, not-allowed, grab, wait.
Custom images: always end url() lists with a keyword fallback.
One line: set cursor to match the action — and never use it as the only sign that something is interactive.
Frequently Asked Questions
It sets the mouse cursor shown when the pointer is over an element. Use it to signal clickable, editable, busy, or disabled actions.
The initial value is auto. The browser chooses a cursor from context, such as text over selectable text or pointer over links.
default is the platform arrow. pointer is the hand icon used for links and clickable controls.
Yes. A cursor on a parent applies to children unless a child sets its own value.
Yes. Use one or more url() images, optional hotspot coordinates, and end with a mandatory keyword fallback, for example cursor: url('hand.cur'), pointer;
Keyword cursors are Baseline Widely available. Some keywords and custom images have uneven support. It is a browser CSS property, not a Node.js feature.