Я хочу выравнивать по вертикали текст в поле выбора

Я хочу вертикально выровнять текст в поле выбора. Я попытался использовать

select{
   verticle-align:middle;
}

однако он не работает ни в каких браузерах. Кажется, что Chrome по умолчанию выравнивает текст в поле выбора по центру. FF выравнивает его вверх, а IE выравнивает его снизу. Есть ли способ достичь этого? Я использую виджет GWT Select в UIBinder.

В настоящее время у меня есть:

select{
    height: 28px !important;
    border: 1px solid #ABADB3;
    margin: 0;
    padding: 0;
    vertical-align: middle;
}

Спасибо!

Ответ 1

Ваш лучший вариант, вероятно, будет заключаться в том, чтобы настроить верхнее дополнение и сравнить между браузерами. Это не идеально, но я думаю, что он как можно ближе.

padding-top:4px;

Размер отступов, который вам нужен, будет зависеть от размера шрифта.

Совет. Если ваш шрифт установлен в px, установите дополнение в px. Если ваш шрифт установлен в em, установите дополнение в em тоже.

ИЗМЕНИТЬ

Это параметры, которые, как я думаю, у вас есть, поскольку выравнивание по вертикали не согласовано между браузерами.

а. Удалите атрибут высоты и разрешите браузеру обрабатывать его. Это обычно работает лучше всего для меня.

 <style>
    select{
        border: 1px solid #ABADB3;
        margin: 0;
        padding: auto 0;
        font-size:14px;
    }
    </style>
    <select>
        <option>option 1</option>
        <option>number 2</option>
    </select>

В. Добавьте верхнюю прописку, чтобы нажимать текст. (В некоторых браузерах нажата стрелка вниз)

<style>
select{
    height: 28px !important;
    border: 1px solid #ABADB3;
    margin: 0;
    padding: 4px 0 0 0;
    font-size:14px;
}
</style>
<select>
    <option>option 1</option>
    <option>number 2</option>
</select>

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

<style>
select{
    height: 28px !important;
    border: 1px solid #ABADB3;
    margin: 0;
    padding: 0 0 0 0;
    font-size:17px;
}
</style>
<select>
    <option>option 1</option>
    <option>number 2</option>
</select>

Ответ 2

Я наткнулся на этот набор свойств css, которые, похоже, вертикально выравнивают текст в размерах элементов выбора в Firefox:

select
{
    box-sizing: content-box;
    -moz-box-sizing:content-box;
    -webkit-box-sizing:content-box;
}

Однако, если что-то еще больше помещает текст в IE8. Если я установил свойство box-sizing обратно в border-box, это, по крайней мере, не сделает IE8 хуже (и FF все еще применяет свойство -moz-box-sizing). Было бы неплохо найти решение для IE, но я не задерживаю дыхание.

Изменить: Nix this. После тестирования он не работает. Тем не менее, для всех, кто интересуется, проблема связана со встроенными стилями в файле FF forms.css, влияющим на элементы ввода и выбора. Это свойство line-height: normal! Important. Его нельзя переопределить. Я пробовал. Я обнаружил, что если я удалю встроенное свойство в Firebug, я получаю элемент select с достаточно вертикально-центрированным текстом.

Ответ 3

Мое решение состоит в том, чтобы добавить padding-top для выбора целевого для firefox только этого

// firefox vertical aligment of text
@-moz-document url-prefix() {
    select {
        padding-top: 13px;
   }
}

Ответ 4

Я столкнулся с этой проблемой точно. Мои параметры выбора были вертикально центрированы в webkit, но ff дефолтировали их сверху. Осмотревшись, я действительно не хотел создавать работу, которая была грязной и в конечном итоге не решила мою проблему.

Решение: Javascript.

if ($.browser.mozilla) {
            $('.styledSelect select').css( "padding-top","8px" );
        }

Это очень точно решает вашу проблему. Единственным недостатком здесь является то, что я использую jQuery, и если вы уже не используете jQuery в своем проекте, вы можете не захотеть включить js-библиотеку для одноразового использования.

Примечание. Я не рекомендую стилизовать что-либо с помощью js, если это абсолютно необходимо. CSS всегда должен быть основным решением для стилизации - подумайте о jQuery (в данном конкретном примере) как топор, обозначенный как "Break in Emergency".

* ОБНОВЛЕНИЕ * Это старый пост, и, поскольку кажется, что люди все еще ссылаются на это решение, я должен указать (как указано в комментариях), что с 1.9 эта функция была удалена из jQuery. Пожалуйста, см. Проект Modernizr для выполнения обнаружения функции вместо браузера sniffing.

Ответ 5

как раз была эта проблема, но для мобильных устройств, в основном мобильных firefox. Трюк для меня состоял в том, чтобы определить высоту высота, отступы, высота строки и, наконец, размер окна, все на элемент выбора. Не используйте ваши номера примеров здесь, но для примера:

padding: 20px;
height: 60px;
line-height: 1;
-webkit-box-sizing: padding-box;
-moz-box-sizing: padding-box;
box-sizing: padding-box;

Ответ 6

Пока это отлично работает для меня:

line-height: 100%;

Ответ 7

Я пробовал как следует, и это сработало для меня:

select {
     line-height:normal;
     padding:3px;
} 

Ответ 8

Я обнаружил, что просто установка высоты линии и высоты в одну и ту же величину пикселя дает самый последовательный результат. Под "самой последовательной" я имею в виду оптимальную последовательность, но, конечно, она не является 100-процентным "пиксельным совершенством" в браузерах. Кроме того, я обнаружил, что Firefox (v. 17.x) имеет тенденцию толковать текст опции справа от стрелки раскрывающегося списка; Я уменьшил это с помощью небольшого количества исправлений, установленных только на элементе OPTION. Этот параметр не влияет на внешний вид в IE 7-9.

Мой результат:

select, option {
    font-size:10px;
    height:19px;
    line-height: 19px;
    padding:0;
    margin:0;
}

option {
    padding-right:6px; /* Firefox */
}

ПРИМЕЧАНИЕ. - Мой элемент SELECT использует меньший шрифт, 10px. Очевидно, вам нужно будет соответствующим образом скорректировать пропорции для вашего конкретного контекста пользовательского интерфейса.

Ответ 10

Раньше я использовал height и line-height с теми же значениями, но доказал, что они не соответствуют друг другу. Мой текущий подход состоит в том, чтобы смешать это с заполнением, как это.

select {
  font-size:14px;
  height:18px;
  line-height:18px;
  padding:5px 0;
  width:200px;
  text-align:center;
}

Вы также можете использовать padding для горизонтального значения вместо width + text-align

Ответ 11

У меня была такая же проблема, и я работал над ней часами. Я, наконец, придумал то, что работает.

В принципе, я не пробовал работать в каждой ситуации, пока я не разместил div для репликации текста первого параметра над полем выбора и оставил фактический первый вариант пустым. Я использовал {pointer-events: none;}, чтобы пользователи щелкали по div.

HTML

    <div class='custom-select-container'>
      <select>
        <option></option>
        <option>option 1</option>
        <option>option 2</option>
      </select>
      <div class='custom-select'>
        Select an option
      </div>
    <div>

CSS

.custom-select{position:absolute; left:28px; top:10px; z-index:1; display:block; pointer-events:none;}

Ответ 12

Я обнаружил, что только добавление padding-top сдвинуло вниз по стрелке вниз со стрелкой вниз справа, что было нежелательно.

Метод, который работал у меня, заключался в том, чтобы войти в инспектор и постепенно добавлять padding, пока текст не будет центрирован. Это также уменьшит размер выпадающего значка, но он будет центрирован, так что это не так визуально тревожит.

Ответ 13

Теперь это исправлено в Firefox Nightly и будет в следующей версии firefox.

Пожалуйста, просмотрите эту ошибку для получения дополнительной информации https://bugzilla.mozilla.org/show_bug.cgi?id=610733

Ответ 14

Вы можете дать:

select{
   position:absolute;
   top:50%;
   transform: translateY(-50%);
}

и родителю вы должны указать положение: относительное. это будет работать.

Ответ 15

display: flex;
align-items: center;

Ответ 16

Ближайшее общее решение, которое я знаю, использует свойство box-align, как описано здесь. Рабочий пример здесь (я могу проверить его только в Chrome, полагаю, что имеет эквивалент для других браузеров).

CSS

select{
  display:-webkit-box;
  display:-moz-box;
  display:box;
  height: 30px;;
}
select:nth-child(1){
  -webkit-box-align:start;
  -moz-box-align:start;
  box-align:start;
}
select:nth-child(2){
  -webkit-box-align:center;
  -moz-box-align:center;
  box-align:center;
}
select:nth-child(3){
  -webkit-box-align:end;
  -moz-box-align:end;
  box-align:end;
}