При каком значении свойства cursor выводится стрелка
- Содержание
- Краткая информация
- Синтаксис
- Значения
- Пример
- Примечание
- Спецификация
- Браузеры
Устанавливает форму курсора, когда он находится в пределах элемента. Вид курсора зависит от операционной системы и установленных параметров.
Краткая информация
Значение по умолчанию | auto |
---|---|
Наследуется | Да |
Применяется | Ко всем элементам |
Анимируется | Нет |
Синтаксис
Обозначения
Описание | Пример | |
---|---|---|
<тип> | Указывает тип значения. | <размер> |
A && B | Значения должны выводиться в указанном порядке. | <размер> && <цвет> |
A | B | Указывает, что надо выбрать только одно значение из предложенных (A или B). | normal | small-caps |
A || B | Каждое значение может использоваться самостоятельно или совместно с другими в произвольном порядке. | width || count |
[ ] | Группирует значения. | [ crop || cross ] |
* | Повторять ноль или больше раз. | [,<время>]* |
+ | Повторять один или больше раз. | <число>+ |
? | Указанный тип, слово или группа не является обязательным. | inset? |
{A, B} | Повторять не менее A, но не более B раз. | <радиус>{1,4} |
# | Повторять один или больше раз через запятую. | <время># |
Значения
Остальные допустимые значения приведены в табл. 1. Чтобы увидеть как курсор выглядит в реальности, наведите на колонку Тест.
В зависимости от операционной системы и её настроек вид курсора может отличаться от приведённых в таблице.
При добавлении курсора из файла синтаксис несколько видоизменится.
cursor: url(<адрес>), url(<адрес>), …, <курсор>
Через запятую допускается указывать несколько значений url, в этом случае браузер попытается открыть первый файл с курсором и если это по каким-либо причинам не получится, перейдёт к следующему файлу. Список обязательно заканчивается ключевым словом, например, auto или pointer, допустимые значения перечислены выше.
Пример
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>cursor</title>
<style>
.cross { cursor: crosshair; }
.help { cursor: help; }
</style>
</head>
<body>
<p class=”cross”>На этом тексте курсор мыши примет вид перекрестья.</p>
<p>
<a href=”page/help.html” class=”help”>СПРАВКА 1</a><br>
<a href=”page/help.html” class=”help”>СПРАВКА 2</a><br>
<a href=”page/help.html” class=”help”>СПРАВКА 3</a>
</p>
</body>
</html><!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>cursor</title>
<style>
a { cursor: url(/example/cursor/sniper.cur), pointer; }
</style>
</head>
<body>
<p>Обычный текст</p>
<p><a href=”page/1.html”>Ссылка 1</a> <a href=”page/2.html”>Ссылка 2</a>
<a href=”page/3.html”>Ссылка 3</a></p>
</body>
</html>
Примечание
Internet Explorer в качестве формата файла курсора поддерживает CUR и ANI. Firefox, Chrome, Safari поддерживают форматы CUR, PNG, GIF, JPG.
Chrome до версии 36, Opera до версии 24 и Safari до версии 9 поддерживают значения -webkit-zoom-in и -webkit-zoom-out.
Firefox до версии 24 поддерживает значения -moz-zoom-in и -moz-zoom-out.
Chrome до версии 22, Opera до версии 24 и Safari до версии 9 поддерживают значения -webkit-grab и -webkit-grabbing.
Firefox до версии 27 поддерживает значения -moz-grab и -moz-grabbing.
Браузеры на мобильных устройствах не поддерживают свойство cursor.
Спецификация
Каждая спецификация проходит несколько стадий одобрения.
- Recommendation (Рекомендация) — спецификация одобрена W3C и рекомендована как стандарт.
- Candidate Recommendation (Возможная рекомендация) — группа, отвечающая за стандарт, удовлетворена, как он соответствует своим целям, но требуется помощь сообщества разработчиков по реализации стандарта.
- Proposed Recommendation (Предлагаемая рекомендация) — на этом этапе документ представлен на рассмотрение Консультативного совета W3C для окончательного утверждения.
- Working Draft (Рабочий проект) — более зрелая версия черновика после обсуждения и внесения поправок для рассмотрения сообществом.
- Editor’s draft (Редакторский черновик) — черновая версия стандарта после внесения правок редакторами проекта.
- Draft (Черновик спецификации) — первая черновая версия стандарта.
Браузеры
auto, crosshair, default, move, text, wait, help, n-resize, e-resize, s-resize, w-resize, ne-resize, nw-resize, se-resize, sw-resize | 4 | 12 | 1 | 7 | 1.2 | 1 | ||||
pointer, progress | 6 | 12 | 1 | 7 | 1.2 | 1 | ||||
url() | 6 | 12 | 1 | 15 | 3 | 1.5 | ||||
not-allowed, no-drop, vertical-text, all-scroll, col-resize, row-resize | 6 | 12 | 1 | 10.6 | 3 | 1.5 | ||||
alias, cell, copy, ew-resize, ns-resize, nesw-resize, nwse-resize, context-menu | 10 | 12 | 1 | 10.6 | 3 | 1.5 | ||||
none | 6 | 14 | 5 | 15 | 5 | 3 | ||||
zoom-in, zoom-out | 12 | 4 | 36 | 15 | 24 | 3.1 | 9 | 2 | 24 | |
grab, grabbing | 12 | 4 | 22 | 15 | 24 | 4 | 9 | 1.5 | 27 |
Браузеры
В таблице браузеров применяются следующие обозначения.
- — свойство полностью поддерживается браузером со всеми допустимыми значениями;
- — свойство браузером не воспринимается и игнорируется;
- — при работе возможно появление различных ошибок, либо свойство поддерживается лишь частично, например, не все допустимые значения действуют или свойство применяется не ко всем элементам, которые указаны в спецификации.
Число указывает версию браузера, начиная с которой свойство поддерживается.
Автор и редакторы
Автор: Влад Мержевич
Последнее изменение: 29.02.2020
Редакторы: Влад Мержевич
Источник
CSS свойства
Определение и применение
CSS свойство cursor определяет тип отображаемого курсора.
Поддержка браузерами
IE не поддерживает пользовательские курсоры URL(), значения zoom-in, zoom-out.
Значение context-menu имеет ограниченную поддержку браузерами. Значения grab и grabbing требуют индекс производителя.
CSS синтаксис:
cursor:”alias | all-scroll | auto | cell | context-menu | col-resize | copy | crosshair | default | e-resize | ew-resize | grab | grabbing | help | move | n-resize | ne-resize | nesw-resize | ns-resize | nw-resize | nwse-resize | no-drop | none | not-allowed | pointer | progress | row-resize | s-resize | se-resize | sw-resize| text | URL (свой) | vertical-text | w-resize | wait | zoom-in | zoom-out | initial | inherit”;
JavaScript синтаксис:
object.style.cursor = “alias”
Значения свойства
Наведите на строку с интересующим Вас значением курсора для изменения его вида:
Значение | Описание |
---|---|
alias | Курсор указывает, что алиас или ярлык будет создан. |
all-scroll | Курсор показывает, что что-то можно прокручивать в любом направлении. |
auto | Браузер устанавливает курсор. Это значение по умолчанию. |
cell | Курсор указывает на то, что ячейка (или группа ячеек) может быть выбрана. |
context-menu | Курсор указывает на то, что контекстное меню доступно. |
col-resize | Курсор указывает, что столбец может быть изменен по горизонтали. |
copy | Курсор указывает, что что-то может быть скопировано. |
crosshair | Курсор в виде перекрестия. Go! go! go!. |
default | Курсор по умолчанию. |
e-resize | Курсор указывает, что край блока перемещается вправо (east-восток). |
ew-resize | Курсор указывает, двунаправленное изменение размера. |
grab | Курсор указывает, что что-то можно схватить (перенести). |
grabbing | Курсор указывает, что что-то переносится. |
help | Курсор указывает на то, что доступна помощь. |
move | Курсор указывает на то, что что-то можно переместить. |
n-resize | Курсор указывает, что край блока перемещается вверх (north – север). |
ne-resize | Курсор указывает, что край блока перемещается вверх и право (north/east – север/восток). |
nesw-resize | Курсор указывает, двунаправленное изменение размера. |
ns-resize | Курсор указывает, двунаправленное изменение размера. |
nw-resize | Курсор указывает, что край блока перемещается вверх и влево (north/west – север/запад). |
nwse-resize | Курсор указывает, двунаправленное изменение размера. |
no-drop | Курсор указывает, что перетаскиваемый объект не может быть помещён здесь. |
none | Курсор не отображается для элемента. |
not-allowed | Курсор указывает, что запрошенное действие не будет выполняться. |
pointer | Курсор-указатель (как правило указывает ссылку). |
progress | Курсор указывает на то, что программа выполняется. |
row-resize | Курсор указывает на то, что ряд может быть изменен по вертикали. |
s-resize | Курсор указывает, что край блока перемещается вниз (south – юг). |
se-resize | Курсор указывает, что край блока перемещается вниз и право (south/east – юг/восток). |
sw-resize | Курсор указывает, что край блока перемещается вниз и влево (south/west – юг/запад). |
text | Курсор указывает, что текст может быть выбран (выделен). |
URL (свой) | Пользовательский курсор. Допускается указывать через запятую несколько вариантов. IExplorer не поддерживает пользовательские курсоры. Если у Вас не отображается Ваше изображение – попробуйте в графическом редакторе убрать у него задний фон (сделать прозрачным). Пример (если для курсора не загружено первое изображение, то браузер использует второе, если и второе не будет загружено, то браузер установит курсор по умолчанию): cursor: url(/images/mini3.png), url(/images/mini5.png), auto; |
vertical-text | Курсор указывает, что вертикальный текст может быть выбран (выделен). |
w-resize | Курсор указывает, что край блока перемещается влево (west-запад). |
wait | Курсор указывает на то, что программа в настоящее время занята. |
zoom-in | Курсор показывает, что что-то может быть увеличено. |
zoom-out | Курсор показывает, что что-то может быть уменьшено. |
initial | Устанавливает свойство в значение по умолчанию. |
inherit | Указывает, что значение наследуется от родительского элемента. |
Версия CSS
CSS2
Наследуется
Да.
Анимируемое
Нет.
Пример использования
<!DOCTYPE html>
<html>
<head>
<title>Пример изменения курсора в CSS</title>
<style>
.hidden {
visibility : hidden; /* скрываем блок (место под него остается) */
width : 125px; /* устанавливаем ширину невидимого блока */
text-align : center; /* выравниваем текст по центру */
}
.button {
visibility : visible; /* внутри скрытого блока элемент будет отображаться */
border : 1px solid orange; /* сплошная граница оранжевого цвета размером в 1 пиксель */
}
.hidden:hover {
visibility : visible; /* при наведении мышкой скрытый блок будет отображен */
cursor : wait; /* при наведении курсор примет вид “программа занята” */
}
</style>
</head>
<body>
<div class = “hidden”>Пожалуйста, подождите…
<div class = “button”>Наведи на меня.</div>
</div>
</body>
</html>
Результат примера:
Открыть пример в новом окне
CSS свойства
Источник
Свойство cursor устанавливает форму курсора, когда он находится в пределах элемента.
Вид курсора зависит от операционной системы и установленных параметров.
Интерфейс
Синтаксис¶
cursor: pointer;
cursor: auto;
/* Using URL and coordinates */
cursor: url(‘cursor1.png’) 4 12, auto;
cursor: url(‘cursor2.png’) 2 2, pointer;
/* Global values */
cursor: inherit;
cursor: initial;
cursor: unset;
Значения¶
url
Позволяет установить свой собственный курсор, для этого нужно указать путь к файлу с курсором.
auto
Вид курсора по умолчанию для текущего элемента.
none
Отключает отображение курсора.
Остальные допустимые значения приведены в табл. 1.
Вид | Значение | Тест | Пример |
---|---|---|---|
![default](default.png) | default | P | |
![context-menu](context-menu.png) | context-menu | P | |
![help](help.png) | help | P | |
![pointer](pointer.png) | pointer | P | |
![progress](progress.png) | progress | P | |
![wait](wait.png) | wait | P | |
![cell](cell.png) | cell | P | |
![crosshair](crosshair.png) | crosshair | P | |
![text](text.png) | text | P | |
![vertical-text](vertical-text.png) | vertical-text | P | |
![alias](alias.png) | alias | P | |
![copy](copy.png) | copy | P | |
![move](move.png) | move | P | |
![no-drop](no-drop.png) | no-drop | P | |
![not-allowed](not-allowed.png) | not-allowed | P | |
![all-scroll](all-scroll.png) | all-scroll | P | |
![col-resize](col-resize.png) | col-resize | P | |
![row-resize](row-resize.png) | row-resize | P | |
![n-resize](n-resize.png) | n-resize | P | |
![ne-resize](ne-resize.png) | ne-resize | P | |
![e-resize](e-resize.png) | e-resize | P | |
![se-resize](se-resize.png) | se-resize | P | |
![s-resize](s-resize.png) | s-resize | P | |
![sw-resize](sw-resize.png) | sw-resize | P | |
![w-resize](w-resize.png) | w-resize | P | |
![nw-resize](nw-resize.png) | nw-resize | P | |
![nesw-resize](nesw-resize.png) | nesw-resize | P | |
![nwse-resize](nwse-resize.png) | nwse-resize | P | |
![zoom-in](zoom-in.png) | zoom-in | P | |
![zoom-out](zoom-out.png) | zoom-out | P | |
![grab](grab.png) | grab | P | |
![grabbing](grabbing.png) | grabbing | P |
В зависимости от операционной системы и её настроек вид курсора может отличаться от приведённых в таблице.
При добавлении курсора из файла синтаксис несколько видоизменится.
Через запятую допускается указывать несколько значений url, в этом случае браузер попытается открыть первый файл с курсором и если это по каким-либо причинам не получится, перейдёт к следующему файлу. Список обязательно заканчивается ключевым словом, например, auto или pointer, допустимые значения перечислены выше.
Примечание¶
Internet Explorer в качестве формата файла курсора поддерживает CUR и ANI. Firefox, Chrome, Safari поддерживают форматы CUR, PNG, GIF, JPG.
Chrome до версии 36, Opera до версии 24 и Safari до версии 9 поддерживают значения -webkit-zoom-in и -webkit-zoom-out.
Firefox до версии 24 поддерживает значения -moz-zoom-in и -moz-zoom-out.
Chrome до версии 22, Opera до версии 24 и Safari до версии 9 поддерживают значения -webkit-grab и -webkit-grabbing.
Firefox до версии 27 поддерживает значения -moz-grab и -moz-grabbing.
Браузеры на мобильных устройствах не поддерживают свойство cursor.
Значение по-умолчанию:
Применяется ко всем элементам
Спецификации¶
- CSS Basic User Interface Module Level 3
- CSS Level 2 (Revision 1)
Поддержка браузерами¶
Can I Use css3-cursors? Data on support for the css3-cursors feature across the major browsers from caniuse.com.
cursor: zoom-in/zoom-out:
Can I Use css3-cursors-newer? Data on support for the css3-cursors-newer feature across the major browsers from caniuse.com.
Примеры¶
Пример 1¶
<html>
<head>
<meta charset=”utf-8″ />
<title>cursor</title>
<style>
.cross {
cursor: crosshair;
}
.help {
cursor: help;
}
</style>
</head>
<body>
<p class=”cross”>
На этом тексте курсор мыши примет вид перекрестья.
</p>
<p>
<a href=”page/help.html” class=”help”>СПРАВКА 1</a
><br />
<a href=”page/help.html” class=”help”>СПРАВКА 2</a
><br />
<a href=”page/help.html” class=”help”>СПРАВКА 3</a>
</p>
</body>
</html>
Пример 2¶
<html>
<head>
<meta charset=”utf-8″ />
<title>cursor</title>
<style>
a {
cursor: url(‘cursor/sniper.cur’), pointer;
}
</style>
</head>
<body>
<p>Обычный текст</p>
<p>
<a href=”page/1.html”>Ссылка 1</a>
<a href=”page/2.html”>Ссылка 2</a>
<a href=”page/3.html”>Ссылка 3</a>
</p>
</body>
</html>
Ссылки¶
- Свойство cursor на сайте MDN
Источник
Здравствуйте, уважаемые читатели блога webcodius.ru. Сегодня мы рассмотрим небольшую тему как изменить курсор мыши при помощи css. В операционной системе вашего компьютера предусмотрено несколько возможных вариантов курсора мыши в зависимости от совершаемых действий. Курсор может приобретать вид различных стрелок, руки, перекрестья, песочных часов и т.п.
Такие же образы может приобретать курсор мыши и при работе в браузере при просмотре различных веб страниц. Это возможно благодаря каскадным таблицам стилей, которые предоставляют нам такую замечательную возможность как изменение курсора мыши при наведении его на элементы html страницы.
Курсор мыши можно поменять с помощью правила css cursor, которое позволяет установить форму курсора мыши при наведении его на данный элемент веб-страницы. Этот атрибут можно применять к любому элементу веб страницы, будь это строчный или блочный элемент.
Если посмотреть спецификацию css, то вы заметите, что возможных значений у атрибута cursor довольно много:
cursor: auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|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|inherit
Большинство значений на практике применяется довольно редко. По умолчанию для свойста cursor применяется значение auto. В этом случае браузер отображает курсор по умолчанию для текущего элемента. Например, при наведении на ссылку курсор приобретает форму руки, в тексте показывается обычный текстовый курсор, а на пустых местах простая стрелочка.
Все основные возможные значения приведены в таблице ниже. Столбец «Значение» содержит значения параметра cursor, во втором столбце «Вид» отображение курсора на моем компьютере, в третьем пример использования параметра с данным значением. При наведении курсора мыши на ячейки со значениями вы сможете увидеть как он изменяется в вашем браузере и сравнить с моим вариантом. В зависимости от вашей операционной системы и настроек вид курсора может отличаться.
Некоторые значения для css правила cursor перечисленные выше могут не работать в различных браузерах. Особенно часто проблемы возникают с Оперой, иногда что то может не работать в браузерах Mozila Firefox и Chrome. Установленный по умолчанию в операционной системе Windows браузер Internet Explorer поддерживает все значения.
С помощью правила cursor также можно задать свой собственный курсор, задав путь к соответствующей картинке. Расширение файла картинки с курсом обычно бывает .cur. Кроме формата CUR Internet Explorer в качестве формата файла курсора поддерживает еще и формат ANI. А Firefox, Chrome и Safari кроме CUR поддерживают еще форматы PNG, GIF и JPG.
При указании своего собственного курсора синтаксис правила немного меняется. Через запятую перечисляется одно или несколько значений url, а последним значением обязательно должно быть одно из ключевых слов:
cursor: url (‘адрес картинки 1’), url (‘адрес картинки 2’), …, <ключевое слово>
При таком стилевом правиле браузер сначала попытается открыть первый файл с курсором, а если открыть его не по каким-либо причинам не удается, перейдет к следующему файлу и так далее. Кстати, для этого абзаца я настроил нестандартный курсор. Поэтому при наведении на него мышкой, если ваш браузер поддерживает формат файла, курсор будет меняться. Чтобы достигнуть такого эффекта достаточно такой записи:
<p style=”cursor:url (‘//webcodius.ru/images/cursor.cur’), pointer;”>текст абзаца</p>
Вообще CSS правило Cursor веб-мастера применяю довольно редко, чтобы не вводить пользователя в заблуждение. Прежде чем переделать вид курсора, определите, будет ли это изменение к месту. Ведь, допустим, что может подумать пользователь, если вместо традиционной руки, появляющейся при наведении на ссылку, возникнет что-то другое.
На этом о курсорах все. Не забудьте подписаться на обновления блога и буду благодарен если воспользуетесь кнопочками социальных сетей:
Источник
На всех активных элементах по наведению должен меняться курсор. В большинстве случаев это будет cursor: pointer.
Под активными элементами подразумеваются ссылки, кнопки, селекты, лейблы вместе с чекбоксами или радиокнопками и другие аналогичные элементы.
«Активными» такие элементы должны называться, когда нажатие на подобный элемент вызывает какое-либо действие. Таким образом, ведущий на текущую страницу пункт меню, выбранная радиокнопка или задизейбленные кнопки и ссылки — не активные элементы, и по наведению на них ничего не должно меняться.
Мне казалось, что это правило очевидно, однако, оказалось, что очень многие разработчики считают иначе. Внимательно прочитав все точки зрения, я так и не нашёл ни одного серьёзного аргумента против добавления смены курсора по ховеру всем активным элементам.
В этой статье я сначала распишу свои аргументы за, после чего пройдусь по аргументам против, объясняя, почему же этих аргументов оказалось недостаточно чтобы меня переубедить.
Преимущества использования cursor:pointer
Обратная связь
Лично для меня основная польза от смены курсора — обратная связь. В идеале у кастомных элементов должно быть прописано состояние при наведении. Скажем, подсветка фона или смена цвета текста. Но в реальной жизни подобное изменение может или вовсе отсутствовать (дизайнер не нарисовал, а верстальщик не подумал), или быть не особо заметным, не привычным или срабатывать не моментально. Таким образом, обратной связи может или не быть, или она будет не совсем очевидна.
Изменение же курсора — всегда моментально и одинаково. Клик, следующий за наведением, будет интуитивным, тогда как в противном случае мозгу придётся либо сопоставить положение курсора с элементом, либо распознать изменение и трактовать его как наведение на активную область нужного элемента.
Изменение курсора — самая естественная, заметная и понятная обратная связь, которая может быть в интерфейсе.
Определение границ активной области
Во многих случаях имеет смысл подсказывать пользователям о том, что «вот уже сейчас можно нажать». Часто можно захотеть увеличить кликабельную область для тех или иных элементов, например для какой-нибудь небольшой иконки или пунктов меню, находящимся по краям экрана. В этом случае добавление меняющегося курсора расскажет пользователям о том, когда уже можно нажать на тот или иной элемент.
В некоторых случаях, когда несколько элементов будут находиться рядом, одной смены курсора не будет достаточно для того, чтобы сказать над каким элементом находится курсор — в этом случае нужно менять ещё и визуальное отображение соответствующего элемента: менять ему фон, цвет текста или что-то ещё. Но это полезно делать в любом случае.
Так или иначе, если подсказать пользователям о том, когда можно использовать тот или иной активный элемент, пользователи привыкнут к этому, и в следующий раз при использовании интерфейса им придётся меньше целиться — они будет примерно представлять, где находятся границы области, в которую им нужно кликнуть. Ведя в сторону элемента курсор, пользователям достаточно будет кликнуть тогда, когда курсор окажется около элемента. В противном случае, для клика, например, по маленькой иконке или чекбоксу, пользователям придётся каждый раз целиться в меньшую область.
Кстати, кто-то может утверждать то, что область клика должна проходить по визуальным границам элемента, но я могу с этим поспорить, хотя это уже тема для отдельной статьи.
Аргументы против смены курсора
Как бы я ни искал, я не смог найти достойных аргументов против смены курсора над активными элементами. Большая часть найденных контраргументов можно описать фразой «не нужно ломать пользовательские привычки».
Начну с того, что рассматривать привычки в качестве аргумента — нельзя. Привычка — это всего лишь знак того, что какой-либо из вариантов был когда-то, по каким-то причинам, выбран и использовался определённой группой пользователей чаще других. Привычка может быть важна только в контексте того, что повлечёт её нарушение, будет ли оно деструктивным или всего лишь вызовет небольшой дискомфорт на время отвыкания от неё.
Дальше надо сразу отметить, что не все привычки полезные. Если идти на поводу у пользователей и давать им только то, к чему они привыкли, то прогресс остановится. Часто у пользователей формируются привычки, которые им только мешают. В качестве довольно яркого примера подобной привычки можно взять подписи к чекбоксам или радиокнопкам. Ленивые разработчики годами забывали связывать текст и соответствующие контролы, из-за чего пользователи обычно даже и не пытаются кликать на текст, тратя своё время и усилия на попытки попасть по маленьким областям контролов. Это отличный пример почему имеет смысл не просто связать контрол с лейблом, но и всеми доступными способами рассказать об этом пользователю.
Аргументы «по привычке» можно разделить на несколько категорий. Я попробую ответить на наиболее часто используемые аргументы против смены курсора над активными областями.
«В ОС используется обычный курсор»
В операционных системах преобладающий курсор — обычная стрелка. Курсор над кнопками или другими элементами форм обычно не меняется при наведении. Однако, тут стоит задаться вопросом: а хорошо ли это? Привычно — да. Но удобно ли? Я бы не отказался от более явной обратной связи во многих десктопных приложениях — очень часто разработчики совсем забывают про ховер и приходится догадываться о кликабельной области наугад.
Кстати, если говорить про десктоп, то стоит упомянуть и такой частую разновидность приложений как игры. В играх курсор почти всегда кастомный, и очень часто именно он меняется при наведении на различные активные области. Можно провести параллели между играми и веб-приложениями — и, действительно, в веб-приложениях всё чаще можно встретить использование различных специальных курсоров — для изменения размеров элементов или для их перетаскивания. Так почему же в этом случае другие активные элементы должны иметь стандартный курсор? Раз специального курсора для «кнопок», «селектов» или «чекбоксов» нет, то к кнопкам подойдёт cursor: pointer, ранее использовавшийся только для ссылок. Правда, случай с чекбоксами и радиокнопками немного особый: если вокруг них, с подписью, по ховеру меняется фон, то курсор-руку можно и не добавлять. Однако, надо не забыть сменить курсор для сопроводительного текста на default, ведь курсор-стрелка как раз чаще всего используется для выбора элементов. Но вот если выбор чекбокса или радиокнопки вызовет какие-то изменения на странице (скажем, раскрытие части аккордеона), можно добавить и курсор-руку для того, чтобы сказать пользователям о том, что «сейчас что-то произойдёт».
«Я вижу курсор — считаю это ссылкой»
Этот аргумент также встречается довольно часто. Раньше, когда веб-приложений ещё не было, все сайты были всего лишь связанные ссылками документы. В приложениях подобных связей почти не было, но в HTML соответствующий элемент пришлось добавить, и про него надо было как-то рассказать пользователям. Это сделали добавлением подчёркивания, синего цвета и курсора. При этом, для кнопок и прочих элементов использовались системные контролы, и никакого дополнительного поведения для них не добавили.
Шли годы, сайты становились всё насыщеннее, на страницах появлялись разные кастомные элементы, в том числе и ссылки, стилизованные под кнопки. И, в большинстве случаев, никто не убирал ссылочное поведение — и на таких кнопках смена курсора оставалась. Если сейчас посмотреть на большинство подобных кастомных кнопок, сделанных ссылками, на них всех осталось поведение ссылок.
«Ссылку можно открыть в новом окне и вызвать для неё контекстное меню»
Ну да — ссылка это не кнопка, а кнопка — не ссылка. Но из этого не следует, что поведение кнопок и ссылок по наведению должно отличаться.
Никто не будет ожидать у кнопок возможностей открыть в новом окне или скопировать адрес. В каждом случае и кнопка, и ссылка будут иметь свой контекст, в котором пользователи могут или ожидать поведения ссылки, или же этого не ожидать. Неважно какой будет в этом случае курсор — если пользователи увидят курсор в контексте ссылки (а многие дизайнеры сейчас чуть ли не всё рисуют в виде кнопок), они будет обращаться с ней как с ссылкой не задумываясь. И, наоборот, если там будет кнопка, а пользователи не будет ожидать ссылки, всё будет в порядке. Если они захотят прикрепить файл — их не смутит, что там, внезапно, курсор-рука. Если они захотят найти что-то через поисковую форму, их не смутит, что там на кнопке изменился курсор. Они просто на неё нажмут. Пользователи могут возмутиться разве что в случаях когда кнопка будет замаскирована под ссылку, не находясь при этом в контексте формы.
Дальше — больше. Очень часто можно встретить ссылки, которые не являются ссылками — я почему-то не слышал возмущений насчёт того, что у подобных псевдо-ссылок меняется по наведению курсор. Различные выпадушки, фильтры, раскрывашки катов, закрывающие крестики, ссылки «отмена» — на многих сайтах можно найти огромное число элементов с изменённым поведением, но везде на подобных элементах остаётся смена курсора по наведению. Почему бы в этом случае не добавить курсор к кнопке или селекту, чем они будет отличаться от всех этих элементов?
Кстати, вот отличный пример передового сервиса г+:
Если хотите, можете попробовать догадаться, какие из отмеченных цифрами элементов изначально являются ссылками, какие нет; у каких есть курсор-поинтер, а у каких — нет. И что вообще произойдёт если на тот или иной элемент навести курсор, а потом и нажать. Чуть позже я дам ответ, а пока продолжу.
Если прямолинейно говорить, что «всё, у чего есть href — должно иметь курсор-поинтер, а то, у чего нет — не должно», то могут возникнуть некрасивые противоречивые случаи: в разных местах визуально кнопкой может быть сделана и ссылка. Если у таких элементов будет различаться поведение по ховеру, то это будет смущать пользователей больше, чем если бы у них было любое, но одинаковое поведение. Другой случай — когда рядом находятся и кнопка (button или input), и псевдо-ссылка. Например, часто делают попапы с кнопкой «Ок» и ссылкой «отмена». Тут получается так, что у кнопки курсора нет, а у ссылки (которая ссылкой только притворяется) — курсор есть. Я считаю, что подобные неоднородности только мешают. Но из двух вариантов приведения к общему знаменателю кто выберет отсутствие курсора по ховеру у ссылки?
Теперь рассмотрим ситуацию с отключённым состоянием. Что, если мы задизейблим какую-то кнопку? Она перестанет нажиматься. А если задизейблим ссылку? По-хорошему, мы должны будем убрать и курсор. Представим: сначала пользователи сталкиваются с задизейбленной ссылкой без курсора, потом каким-то действием её раздизейбливают и видят сменившийся курсор. Потом где-то в интерфейсе пользователи видят кастомную серую кнопку без курсора — как в этом случае пользователям понять, что она не задизейбленна?
В итоге можно собрать множество примеров конфликтов кнопок, ссылок, их состояний и поведения. Подобные разногласия будут возникать только в случаях когда курсор меняется строго у элементов-ссылок, если же приравнять смену курсора к любой смене состояния (когда логично было бы менять фон/цвет/что-то ещё), то этих проблем не будет.
Вернёмся к иллюстрации из г+:
Итак, список с разъяснениями где какой элемент:
Пермалинк поста, ок. Ссылка есть, по наведению появляются подчёркивание и курсор.
Это вовсе не ссылка, просто текст 🙂
Это псевдоссылка, ссылки нет, по ховеру — и подчёркивание и курсор. По клику появится дропдаун.
Аналогично — просто контрол, без ссылки, по ховеру меняются цвет и курсор.
Опять не ссылка. В этом сниппете ссылкой являются только заголовок и картинка.
Тут и юзерпик, и имя — ссылки. Две, не связанные, но ведущие в одно место, на обеих меняется курсор по ховеру, у текста появляется подчёркивание.
Псевдоссылка — без хрефа. Как положено, появляется подчёркивание и меняется курсор.
Казалось бы — кнопка. По ховеру курсор не меняется, но — внезапно — появляется выпадушка. По ховеру.
Ок, допустим, «системный» элемент (хоть и кастомный) — кнопка — не имеет курсора. Но последним элементом тут обозначен чекбокс (который тоже, по той же логике, «системный») с подписью. Но тут, внезапно, хоть ссылки-то и нет, курсор по ховеру меняется. Плюс еле заметно подсвечивается чекбокс.
Что тут можно сказать? Никакой последовательности, куча интерфейсных ошибок и отсутствие курсора на кнопке. Выводы можете сделать сами.
Вообще, очень интересно ходить по разным сервисам различных компаний и подмечать подобные моменты — никто не безгрешен и всегда можно найти к чему придраться, но, в конечном счёте, если всё внимательно анализировать, то становится ясно какой элемент для чего предназначен и нужно ли что-то с ним делать по ховеру.
«В спецификации написано…»
SelenIT приводит такой аргумент, что в спецификациях CSS2.1 и CSS3 Basic UI сказано: «The cursor is a pointer that indicates a link». Кроме того, он ссылается на сообщение Жерара Тальбо, в котором он отказывает в изменении одного из тестов к CSS 2.1. Однако, вряд ли подобное сообщение можно как-либо трактовать в пользу отсутствия курсора у кнопок. Контекст сообщения — тесты к спецификациям, и если в спецификации написано о том, что «курсор-поинтер указывает на ссылку», то это должно и в тестах значить только это.
В спецификации не сказано, что этот курсор не может использоваться для чего-либо ещё. Указано, скорее, его применение по умолчанию. На месте разработчиков спецификаций я бы изменил этот момент на «The cursor is a pointer that indicates an element that can be clicked» (по аналогии с тем, что предлагалось в тесте) или аналогичное, более общее, высказывание.
Это место в спецификации так и тянется как минимум с 1997 года, но веб с того времени сильно изменился и уже нельзя говорить о том, что «курсор-указатель указывает на ссылку», фактически его уже очень часто используют и для многих других элементов.
«Мерцание»
Мне тут подсказали ещё один аргумент: если на странице много активных элементов, то при перемещении курсор будет постоянно «мерцать», меняя состояние с обычного на поинтер.
Но такой аргумент — не проблема курсора на активных элементах. «Мерцание» курсора будет всего лишь симптомом, а проблемы могут быть следующими:
Активные элементы могут быть расположены не вплотную друг к другу. В этом случае, во-первых, польз?