This feature is well established and works across many devices and browser versions. It’s been available across browsers since December 2021.
* Some parts of this feature may have varying levels of support.
The cursor CSS property sets the mouse cursor, if any, to show when the mouse pointer is over an element.
The cursor setting should inform users of the mouse operations that can be performed at the current location, including: text selection, activating help or context menus, copying content, resizing tables, and so on. You can specify either the type of cursor using a keyword, or load a specific icon to use (with optional fallback images and mandatory keyword as a final fallback).
cursor: help;
cursor: wait;
cursor: crosshair;
cursor: not-allowed;
cursor: zoom-in;
cursor: grab;
<section class="default-example container" id="default-example">
<div id="example-element">
Move over this element to see the cursor style.
</div>
</section>
#example-element {
display: flex;
background-color: #1766aa;
color: white;
height: 180px;
width: 360px;
justify-content: center;
align-items: center;
font-size: 14pt;
padding: 5px;
}
/* Keyword value */
cursor: auto;
cursor: pointer;
/* … */
cursor: zoom-out;
/* URL with mandatory keyword fallback */
cursor: url("hand.cur"), pointer;
/* URL and coordinates, with mandatory keyword fallback */
cursor:
url("cursor_1.png") 4 12,
auto;
cursor:
url("cursor_2.png") 2 2,
pointer;
/* URLs and fallback URLs (some with coordinates), with mandatory keyword fallback */
cursor:
url("cursor_1.svg") 4 5,
url("cursor_2.svg"),
/* …, */ url("cursor_n.cur") 5 5,
progress;
/* Global values */
cursor: inherit;
cursor: initial;
cursor: revert;
cursor: revert-layer;
cursor: unset;
The cursor property is specified as zero or more <url> values, separated by commas, followed by a single mandatory keyword value. Each <url> should point to an image file. The browser will try to load the first image specified, falling back to the next if it can't, and falling back to the keyword value if no images could be loaded (or if none were specified).
Each <url> may be optionally followed by a pair of space-separated numbers, which set the <x> and <y> coordinates of the cursor's hotspot relative to the top-left corner of the image.
<url> OptionalA url() or a comma separated list url(), url(), …, pointing to an image file. More than one <url> may be provided as fallbacks, in case some cursor image types are not supported. A non-URL fallback (one or more of the keyword values) must be at the end of the fallback list.
<x>, <y> OptionalOptional x- and y-coordinates indicating the cursor hotspot; the precise position within the cursor that is being pointed to.
The numbers are in units of image pixels. They are relative to the top left corner of the image, which corresponds to 0 0, and are clamped within the boundaries of the cursor image. If these values are not specified, they may be read from the file itself, and will otherwise default to the top-left corner of the image.
keywordA keyword value must be specified, indicating either the type of cursor to use, or the fallback cursor to use if all specified icons fail to load.
The available keywords are listed in the table below. Other than none, which means no cursor, there is an image showing how the cursors used to be rendered. You can hover your mouse over the table rows to see the effect of the different cursor keyword values on your browser today.
| Category | Keyword | Example | Description |
|---|---|---|---|
| General | auto | The UA will determine the cursor to display based on the current context. E.g., equivalent to text when hovering text. | |
default | The platform-dependent default cursor. Typically an arrow. | ||
none | No cursor is rendered. | ||
| Links & status | context-menu | A context menu is available. | |
help | Help information is available. | ||
pointer | The cursor is a pointer that indicates a link. Typically an image of a pointing hand. | ||
progress | The program is busy in the background, but the user can still interact with the interface (in contrast to wait). | ||
wait | The program is busy, and the user can't interact with the interface (in contrast to progress). Sometimes an image of an hourglass or a watch. | ||
| Selection | cell | The table cell or set of cells can be selected. | |
crosshair | Cross cursor, often used to indicate selection in a bitmap. | ||
text | The text can be selected. Typically the shape of an I-beam. | ||
vertical-text | The vertical text can be selected. Typically the shape of a sideways I-beam. | ||
| Drag & drop | alias | An alias or shortcut is to be created. | |
copy | Something is to be copied. | ||
move | Something is to be moved. | ||
no-drop | | An item may not be dropped at the current location. Firefox bug 275173: On Windows and macOS, no-drop is the same as not-allowed. | |
not-allowed | The requested action will not be carried out. | ||
grab | Something can be grabbed (dragged to be moved). | ||
grabbing | Something is being grabbed (dragged to be moved). | ||
| Resizing & scrolling | all-scroll | Something can be scrolled in any direction (panned). Firefox bug 275174: On Windows, all-scroll is the same as move. | |
col-resize | The item/column can be resized horizontally. Often rendered as arrows pointing left and right with a vertical bar separating them. | ||
row-resize | The item/row can be resized vertically. Often rendered as arrows pointing up and down with a horizontal bar separating them. | ||
n-resize | | Some edge is to be moved. For example, the se-resize cursor is used when the movement starts from the south-east corner of the box.In some environments, an equivalent bidirectional resize cursor is shown. For example, n-resize and s-resize are the same as ns-resize. | |
e-resize | | ||
s-resize | | ||
w-resize | | ||
ne-resize | | ||
nw-resize | | ||
se-resize | | ||
sw-resize | | ||
ew-resize | Bidirectional resize cursor. | ||
ns-resize | |||
nesw-resize | |||
nwse-resize | |||
| Zooming | zoom-in | Something can be zoomed (magnified) in or out. | |
zoom-out |
| Initial value | auto |
|---|---|
| Applies to | all elements |
| Inherited | yes |
| Computed value | as specified, but with <url> values made absolute |
| Animation type | discrete |
cursor =
<cursor-image>#? <cursor-predefined>
<cursor-image> =
[ <url> | <url-set> ] [ <number>{2} ]?
<cursor-predefined> =
auto |
default |
none |
context-menu |
help |
pointer |
progress |
wait |
cell |
crosshair |
text |
vertical-text |
alias |
copy |
move |
no-drop |
not-allowed |
grab |
grabbing |
e-resize |
n-resize |
ne-resize |
nw-resize |
s-resize |
se-resize |
sw-resize |
w-resize |
ew-resize |
ns-resize |
nesw-resize |
nwse-resize |
col-resize |
row-resize |
all-scroll |
zoom-in |
zoom-out
<url> =
<url()> |
<src()>
<url()> =
url( <string> <url-modifier>* ) |
<url-token>
<src()> =
src( <string> <url-modifier>* )
While the specification does not limit the cursor image size, user agents commonly restrict them to avoid potential misuse. For example, on Firefox and Chromium cursor images are restricted to 128x128 pixels by default, but it is recommended to limit the cursor image size to 32x32 pixels. Cursor changes using images that are larger than the user-agent maximum supported size will generally just be ignored.
User agents are required by the specification to support PNG files, SVG v1.1 files in secure static mode that contain a natural size, and any other non-animated image file formats that they support for images in other properties. Desktop browsers also broadly support the .cur file format.
The specification further indicates that user agents should also support SVG v1.1 files in secure animated mode that contain a natural size, along with any other animated images file formats they support for images in other properties. User agents may support both static and animated SVG images that do not contain a natural size.
iPadOS supports pointer devices like trackpads and mouses. By default, the iPad cursor is displayed as a circle, and the only supported value that will change an appearance of the pointer is text.
Cursor changes that intersect toolbar areas are commonly blocked to avoid spoofing.
.foo {
cursor: crosshair;
}
.bar {
cursor: zoom-in;
}
/* A fallback keyword value is required when using a URL */
.baz {
cursor: url("hyper.cur"), auto;
}
| Specification |
|---|
| CSS Basic User Interface Module Level 4> # cursor> |
| Desktop | Mobile | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on IOS | Samsung Internet | WebView Android | WebView on iOS | |
cursor |
1 | 12 | 1Starting in Firefox 67, the maximum size allowed for custom cursors is 32x32 pixels due to cursors being misused by certain malicious sites. |
7 | 1.2 | 18 | 95 | 14 | 13.4["This property is only supported on iPads with an external pointing device.", "Unsupported values use thedefault pointer as a fallback."] |
1.0 | 4.4 | 13.4["This property is only supported on iPads with an external pointing device.", "Unsupported values use thedefault pointer as a fallback."] |
alias |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
all-scroll |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
auto |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | 13.4 | 1.0 | 4.4 | 13.4 |
cell |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | 13.4 | 1.0 | 4.4 | 13.4 |
col-resize |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
context-menu |
1This cursor is only supported on macOS and Linux. |
12 | 1.5This cursor is only supported on macOS and Linux. |
10.6 | 3 | 18This cursor is only supported on macOS and Linux. |
95 | 14This cursor is only supported on macOS and Linux. |
NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0This cursor is only supported on macOS and Linux. |
4.4This cursor is only supported on macOS and Linux. |
NoIf this value is used, the iPad will display thedefault pointer instead. |
copy |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
crosshair |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
default |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
e-resize |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
ew-resize |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
grab |
68Chrome also continues to support the prefixed versions.1Chrome 22 added Windows support. |
14 | 271.5 |
55Opera also continues to support the prefixed versions.15Opera 22 added Windows support. |
114 |
68Chrome Android also continues to support the prefixed versions.18Chrome Android 25 added Windows support. |
95 |
48Opera also continues to support the prefixed versions.14Opera 22 added Windows support. |
NoIf this value is used, the iPad will display thedefault pointer instead. |
10.01.0 |
68WebView Android also continues to support the prefixed versions.4.4WebView Android 4.4 added Windows support. |
NoIf this value is used, the iPad will display thedefault pointer instead. |
grabbing |
681Chrome 22 added Windows support. |
7979Edge 79 added Windows support. |
27 | 5515Opera 15 added Windows support. |
11 | 6818Chrome Android 25 added Windows support. |
95 | 4814Opera Android 14 added Windows support. |
NoIf this value is used, the iPad will display thedefault pointer instead. |
10.01.0Samsung Internet 1.5 added Windows support. |
684.4WebView Android 4.4 added Windows support. |
NoIf this value is used, the iPad will display thedefault pointer instead. |
help |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
move |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
n-resize |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
ne-resize |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
nesw-resize |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
no-drop |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
none |
5 | 12 | 3 | 15 | 5 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
not-allowed |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
ns-resize |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
nw-resize |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
nwse-resize |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
pointer |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
progress |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
row-resize |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
s-resize |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
se-resize |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
sw-resize |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
text |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | 13.4 | 1.0 | 4.4 | 13.4 |
url |
1 | 12 | 1.5Firefox 4 added macOS support. |
15 | 3 | 18 | 95 | 14 | 13.4 | 1.0 | 4.4 | 13.4 |
url_positioning_syntax |
1 | 79 | 1.5Firefox 4 added macOS support. |
15 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
vertical-text |
1 | 12 | 1.5 | 10.6 | 3 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
w-resize |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
wait |
1 | 12 | 1 | 7 | 1.2 | 18 | 95 | 14 | NoIf this value is used, the iPad will display thedefault pointer instead. |
1.0 | 4.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
zoom-in |
371 | 12 | 241 | 2415–23 | 93 | 3718 | 95 | 2414–24 | NoIf this value is used, the iPad will display thedefault pointer instead. |
3.01.0 | 374.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
zoom-out |
371 | 12 | 241 | 2415–23 | 93 | 3718 | 95 | 2414–24 | NoIf this value is used, the iPad will display thedefault pointer instead. |
3.01.0 | 374.4 | NoIf this value is used, the iPad will display thedefault pointer instead. |
pointer-events<url> typecursor attribute
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/cursor