Ответ 1
Да, я боюсь, что это неизбежная проблема с кнопками стилизации, что IE (и Opera) будет перемещать содержимое кнопки вниз и вправо на один пиксель при нажатии.
Здесь у вас есть несколько возможных подходов:
-
Используйте
<button>
с<span>
внутри него вместо<input type="button">
. Установите кнопкуrelative
и диапазонabsolute
наtop
/left
0
, так что перемещение содержимого кнопки не влияет на диапазон. Ужасно, и он будет разбит на другие браузеры, поэтому вы хотите, чтобы этот стиль применялся для IE и, возможно, Opera. -
Используйте ссылку, обозначенную как кнопка вместо фактической кнопки, с script, примененным к ее событию
click
. В отличие от кнопок, вы получаете полный контроль над последовательным стилем для ссылок. Я бы посоветовал это сделать, поскольку вы перетаскиваете нагрузку на поведение ссылок, которые не имеют смысла для кнопки, например, щелчок по центру, щелчок правой кнопкой мыши, перетаскивание и т.д. Многие люди используют ссылки делать кнопочные задачи, но IMO это крайне нежелательно. (Особенно, когда они используют ссылкиjavascript:
... ghastly.) -
Используйте неактивный элемент, например
<span>
вместо фактической кнопки, с script, примененным к его событиюclick
. Опять же, вы получаете полный контроль над стилем. Это то, что SO использует для таких действий, как "добавить комментарий". Проблема в том, что вы нарушаете навигацию по клавиатуре; вы не можете использовать вкладку, пробел и т.д. для навигации и активации элементов управления. Вы можете включить навигацию на клавиатуре в большинстве браузеров, указав атрибут atabindex
, но помещатьtabindex
в неактивный элемент является недопустимым HTML. Вы также можете записать его из script, а также добавить script, чтобы разрешить пробел или вернуться, чтобы активировать кнопку faux. Но вы никогда не сможете полностью воспроизвести поведение поля формы браузера. -
Замените все это на
<input type="image">
. Естественно, вы получаете пиксельный контроль над изображением! Но, пытаясь сопоставить стили рендеринга и генерировать новое изображение для каждой кнопки, обычно слишком большая боль в шее.
В вариантах 2 и 3 также возникает проблема, заключающаяся в том, что они вносят зависимость от JavaScript, поэтому ваша форма будет ломаться, когда JS недоступен. Вы можете уменьшить это, используя обычную <button>
в разметке и заменяя ее другими элементами управления из script, или если вы создаете их из script, в любом случае не проблема. Но, в конце концов, мой обычный вывод заключается в том, что это слишком много усилий и слишком хрупкий результат, и что лучше всего путать вариант 0:
- Живи с ним. Обычно это не так уж плохо, что содержимое кнопки немного движется, когда вы нажимаете на нее.