FireFox и вертикальное выравнивание текста в input[submit]

30 ноября 2009 г.

Либо я плохо искал, либо проблема только у меня и я чего-то не знаю (в чем сомневаюсь), но в Интернете по сабжу ничего не нашел. Поэтому данный пост - это вопрос к читателям.

При верстке форм я давно наблюдаю следующую проблемную ситуацию: независимо от версии браузера FireFox, в которой смотрится страница, вертикальное выравнивание текста в кнопке, созданной с помощью тега <input type=”submit” />, отличается от всех других популярных браузеров на 1-2 пикселя (в зависимости от высоты кнопки и размера шрифта).

Для сравнения проведем элементарный тест:

  1. Создаем страницу с единственным элементом содержимого - HTML-кнопкой:

    1
    2
    3
    4
    5
    <html>
    <body>
      <input type="submit" value="Submit" class="submit" />
    </body>
    </html>
  2. Для кроссбраузерности оформляем эту кнопку с помощью CSS следующим образом:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    input.submit {
      width: 80px;
      height: 25px;
      border: 1px solid #BBB;
      border-top-color: #DDD;
      border-left-color: #DDD;
      background: #EEE;
      font: 12px Arial, Tahoma, sans-serif;
    }
  3. Делаем скриншоты этой кнопки в браузерах: Opera, FireFox, Internet Explorer, Safari, Chrome, и для наглядности в фотошопе рисуем специальные линии (кликните на изображение для просмотра его с увеличенным масштабом):

    FireFox и вертикальное выравнивание текста в input[submit]

Как видим, текст кнопки в FireFox’e на 1 пиксель ниже по сравнению со всеми остальными браузерами.

Применение свойств vertical-align: middle или line-height, равный высоте кнопки, проблему не решают.

Так вот, господа веб-мастера, хотелось бы узнать - если вы сталкивались с подобной ситуаций, то каким образом вы устраняете эту недоделку FireFox?

Мне пока что приходится использовать для него CSS-хак, который не валиден, что, естественно, не есть хорошо.

Теги: , , , автор: Dimox | рубрика CSS-верстка

Комментарии (37): »

  1. А если для Firefox’a завести свой отдельный .css и прописать в нём padding-top: -1px; ?

  2. И как же образом, интересно, можно завести для него отдельный .css?

  3. По ряду причин без хаков не получится.

    Во-первых, FireFox жестко задает lin-height: normal !important для всех кнопок (это в resource://gre/res/forms.css)

    Во-вторых, вертикальное выравнивание будет задавать только позицию самой кнопки относительно инлайнового текста вокруг нее.

    Есть такое решение: http://stackoverflow.com/questions/1679952/input-typesubmit-text-vertical-alignment-in-firefox
    Но оно конфликтует с IE8. Так что без хаков здесь никак.

    Либо использовать input type=”image” с alt-текстом, если это приемлемо.

    @
  4. А если попробовать указывать необходимый padding для кнопки сверху и снизу? (правда придется отказаться от указания высоты - с одновременным указанием высоты и отступов все браузеры начинают чудить)

    @
  5. 5
    игорь гольдберг

    Для всех блоковых элементов я использую такую доморощенную конструкцию -

    #button { border:solid 1px #bbb; background:#888; padding:5px 10px 5px 10px; margin:10px 0px 10px 0px;}
    #button:hover { border:solid 1px #bbb; background: #fff; padding:5px 10px 5px 10px; margin:10px 0px 10px 0px;}

    Проблем с кроссбраузерностью не возникало, но кнопки смотрятся несколько не по-кнопочному.

    @
  6. Чаще встречается именно такой вариант, как на скриншоте.

    Я не понимаю, неужели никто из веб-разработчиков не писал баг-репорт по этому поводу? Ведь это со 2-й версии FF (если еще не раньше) тянется.

  7. Для ФФ все равно придется другой паддинг писать, все из-за того же пикселя. Пробовал я разные варианты, самым оптимальным пока остается указание высоты + паддинг для FF через хак.

  8. Добавляю padding-bottom: Xpx

  9. использовать для него CSS-хак, который не валиден

    А если так:

    1
    html:not([xmlns*=""]) #id:not([id="ID"]) input[type="submit"] {}

    или

    1
    html:not([xmlns*=""]) .class:not([class="CLASS"]) input[type="submit"] {}

    (предполагая, что у формы задан класс или ID)

    @
  10. Попробуйте вместо padding:5px 10px 5px 10px сделать padding:2px 10px 2px 10px и увидите, что не кроссбраузерно. Так что это не выход.

  11. И чем он лучше от хака, которым пользуюсь я?

    1
    2
    3
    @-moz-document url-prefix() {
      .style {}
    }
  12. Вряд ли. Этот валидатор - http://jigsaw.w3.org/css-validator/#validate_by_input - говорит об обратном.

  13. Странно. Мне говорит, что все ОК: https://url.odesk.com/7ngef Valid CSS 3.

    @
  14. Да, Дима, это проблема FF достала :)
    Писал об этом у себя: “В стремлении к идеалу…”
    Но без хака для FF, решения так и не нашел :(

    @
  15. Там по умолчанию проверяется как CSS 2.1, если выбрать 3, то всё хорошо.

  16. А, ясно, ты проверял на CSS3, а я - по умолчанию (CSS2.1). Значит можно юзать этот хак. Спасибо, Владимир!

  17. Меня удивляет, почему никто не пишет об этом баге в Мозиллу, либо пишут, но она ничего не предпринимает.

    P.S. Кстати, Сергей, нужно было оповестить подписчиков твоего блога, что у тебя сменился адрес RSS. Я вот только недавно узнал, когда задумался о том, что ты давно ничего не писал, а оказалось, что писал. А мужики-то не знают.

  18. Меня удивляет, почему никто не пишет об этом баге в Мозиллу, либо пишут, но она ничего не предпринимает.

    Да, видимо писать безполезно :(
    Сколько багов у OPERA, о чем тоже писал не однократно, а воз и ныне там :)

    Кстати, Сергей, нужно было оповестить подписчиков твоего блога, что у тебя сменился адрес RSS.

    Есть такое :)
    Но на хосте нет PHP5 и RSS лента вроде, как не работает :(

    @
  19. Сколько багов у OPERA, о чем тоже писал не однократно, а воз и ныне там :)

    Ну если ты только на блоге писал, то это вряд ли что-то изменит. Или ты писал в соответствующие инстанции?

    Но на хосте нет PHP5 и RSS лента вроде, как не работает :(

    Действительно, а я и не заметил.

  20. Товарищ, поделись инфой, где ты такой смайл UTF’ный надыбал? =)

  21. Ну если ты только на блоге писал…

    Знаю многих, кто пишет разработчикам, но ни разу никто не ответил и мер не принял :(
    Стоит, только соответствующие форумы почитать :)

    @
  22. Потому что в дефолтной кнопке без линейки это баг не заметен и не критичен. Я сверстал не меньше сотни макетов пока не узнал об этом дефекте и потом еще. Это совсем не критично, что в прочем не отменяет того факта, что исправить девелоперам FF не помешало бы.

  23. Просто открыл стандартную таблицу символов, выбрал шрифт, где всего интересного побольше, стал смотреть, что есть, и нашёл символ 30C4 - Katakana Letter Tu, типа в японском такая буква хорошая есть.

  24. Нашел его тоже. Спасибо! Прикольные смайлы シ

  25. Очевидно на сервере, по заголовку User-Agent.
    При генерировании страницы, дополнять отдельным CSS или при генерировании самого CSS.

    ..bw

  26. Столкнулся с данной проблемой пару лет назад. Написа вначале на форум мозиловский - там ткнули в решение с хаком (неважно каким, важен факт), затем три раза баг-репорт писал, даже ответа не дождался. Обидно. А проблема ведь действительно есть.

    @
  27. В общем не знаю, может быть я тут капитан очевидность и поскольку других вариантов нету, то все используют тот же метод что и я но я использую дополнительный элемент с текстом (к примеру спан) и кладу его поверх кнопки. :-[

    @
  28. Мда… похоже, что они преследуют только свои меркантильные интересы.

  29. Тоже использую нижний отступ в 1-2px.

  30. С каких пор padding отрицательный работает, расскажите пожалуйста?

  31. Кстати есть еще следующая конструкция

    1
    element::-moz-focus-inner{padding:0;border:0}

    . Убирает внутренние отступы в ff.

  32. Спасибо. В следущий раз попробую воспользоваться.

  33. Вполне подходящий прием

    @
  34. form .submit, x:-moz-any-link, x:default {padding: 0 0 2px 0;} Увеличеваеи или уменшаем padding-bottom для кросбраузерности

    @
  35. Попытался уже несколько раз использовать этот хак, но никаких изменений не происходит.

  36. Решение красивое, буду теперь использовать его. Только жаль, что не валидное. Кстати, достаточно и такого варианта:

    1
    element::-moz-focus-inner {border: 0}

Присоединяйтесь к обсуждению!

Отправляя кoммeнтapий, Вы автоматически принимаете правила кoммeнтиpoвaния на этом блоге.

Правила кoммeнтиpoвaния на блоге dimox.name:

  1. Первый кoммeнтapий всегда проходит премодерацию.
  2. В поле "URL блога" можно указывать только ссылку на главную страницу вашего блога. Ссылки на прочие веб-ресурсы (в том числе блоги/сплоги, созданные не для людей) будут удалены.
  3. Запрещается использовать в качестве имени комментатора слоганы/названия сайтов, рекламные фразы, ключевые и т.п. слова. В случае несоблюдения этого условия имя изменяется по усмотрению владельца блога. Просьба указывать нормальное имя или ник.
  4. Весьма вероятно, что короткий и неинформативный кoммeнтapий вида "Спасибо!", "Интересная статья", будет удален. Исключение составляют знакомые автору блога комментаторы.

Подписаться, не комментируя

Предыдущие из рубрики