Как убрать стрелку из выбранного элемента в Firefox - PullRequest
172 голосов
/ 06 мая 2011

Я пытаюсь стилизовать элемент select с помощью CSS3.Я получаю желаемые результаты в WebKit (Chrome / Safari), но Firefox играет не очень хорошо (я даже не беспокоюсь о IE).Я использую свойство CSS3 appearance, но по какой-то причине я не могу выкинуть выпадающий значок из Firefox.

Вот пример того, что я делаю: http://jsbin.com/aniyu4/2/edit

#dropdown {
 -moz-appearance: none;
 -webkit-appearance: none;
 appearance: none;
 background: transparent url('example.png') no-repeat right center;
 padding: 2px 30px 2px 2px;
 border: none;
}

Как видите, я не пытаюсь сделать что-то необычное.Я просто хочу удалить стили по умолчанию и добавить собственную стрелку раскрывающегося списка.Как я уже сказал, отлично подходит для WebKit, не очень хорошо для Firefox.Видимо, -moz-appearance: none не избавляется от выпадающего элемента.

Есть идеи?Нет, JavaScript не вариант

Ответы [ 30 ]

165 голосов
/ 19 августа 2013

Обновление: это было исправлено в Firefox v35.Подробнее см. полный текст .


Только что выяснил как убрать стрелку выбора из Firefox .Хитрость заключается в том, чтобы использовать смесь -prefix-appearance, text-indent и text-overflow.Это чистый CSS и не требует дополнительной разметки.

select {
    -moz-appearance: none;
    text-indent: 0.01px;
    text-overflow: '';
}

Протестировано на Windows 8, Ubuntu и Mac, последних версиях Firefox.

Пример Live: http://jsfiddle.net/joaocunha/RUEbp/1/

Больше по теме: https://gist.github.com/joaocunha/6273016

78 голосов
/ 18 июля 2013

Хорошо, я знаю, что этот вопрос старый, но 2 года спустя и Mozilla ничего не сделали.

Я придумала простой обходной путь.

Это, по существу, удаляет все форматирование поля выбора в Firefox и оборачивает элемент span вокруг поля выбора с вашим собственным стилем, но должно применяться только к Firefox.

Скажем, это ваше меню выбора:

<select class='css-select'>
  <option value='1'> First option </option>
  <option value='2'> Second option </option>
</select>

И давайте предположим, что класс css 'css-select':

.css-select {
   background-image: url('images/select_arrow.gif');
   background-repeat: no-repeat;
   background-position: right center;
   padding-right: 20px;
}

В Firefox это будет отображатьсяс меню выбора, за которым следует уродливая стрелка выбора Firefox, за которой следует ваш красивый вид.Не идеально.

Теперь, чтобы запустить это в Firefox, добавьте элемент span с классом 'css-select-moz':

   <span class='css-select-moz'>
     <select class='css-select'>
       <option value='1'> First option </option>
       <option value='2'> Second option </option>
     </select>
   </span>

Затем исправьте CSS, чтобы скрыть грязную стрелку Mozilla с помощью -moz-Appearance: окно и бросить пользовательскую стрелку в класс span 'css-select-moz', но заставить его отображаться только на mozilla, например так:

.css-select {
   -moz-appearance:window;
   background-image: url('images/select_arrow.gif');
   background-repeat: no-repeat;
   background-position: right center;
   padding-right: 20px;
}

@-moz-document url-prefix() {
.css-select-moz{
     background-image: url('images/select_arrow.gif');
     background-repeat: no-repeat;
     background-position: right center;
     padding-right: 20px;
  }
} 

Довольно круто, только чтобы наткнуться на этоошибка 3 часа назад (я новичок в веб-дизайне и полностью самоучка).Однако, это сообщество косвенно оказало мне такую ​​большую помощь, я думал, что пришло время вернуть что-то.

Я тестировал его только в Firefox (Mac) версии 18, а затем 22 (после того, как я обновил).

Все отзывы приветствуются.

59 голосов
/ 02 ноября 2011

Хитрость, которая работает для меня, это сделать выделенную ширину более 100% и применить переполнение: скрыто

select {
    overflow:hidden;
    width: 120%;
}

Это единственный способ скрыть стрелку раскрывающегося списка в FF.1005 * КСТАТИ.если вы хотите красивые выпадающие списки, используйте http://harvesthq.github.com/chosen/

26 голосов
/ 20 января 2015

Важное обновление:

Начиная с Firefox V35, свойство внешнего вида теперь работает !!

Из официальных примечаний к выпуску Firefox на V35 :

Использование -moz-appearance со значением none в выпадающем списке теперь удаляет кнопка выпадающего меню (ошибка 649849).

Так что теперь, чтобы скрыть стрелку по умолчанию - это так же просто, как добавить следующие правила для нашего элемента select:

select {
   -webkit-appearance: none;
   -moz-appearance: none;
   appearance: none;
}

DEMO

select {
  margin: 50px;
  border: 1px solid #111;
  background: transparent;
  width: 150px;
  padding: 5px;
  font-size: 16px;
  border: 1px solid #ccc;
  height: 34px;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
}
<select>
  <option>Apples</option>
  <option selected>Pineapples</option>
  <option>Chocklate</option>
  <option>Pancakes</option>
</select>
20 голосов
/ 11 марта 2012

Мы нашли простой и достойный способ сделать это.Это кросс-браузер, разлагаемый, и не нарушает форму сообщения.Сначала установите opacity в поле выбора на 0.

.select { 
    opacity : 0;
    width: 200px;
    height: 15px;
}

<select class='select'>
    <option value='foo'>bar</option>    
</select>

, чтобы вы все еще могли щелкнуть по нему

Затем выполните div с теми же размерами, что и в окне выбора.Див должен лежать под окном выбора в качестве фона.Используйте { position: absolute } и z-index для достижения этой цели.

.div {
    width: 200px;
    height: 15px;
    position: absolute;
    z-index: 0;
}

<div class='.div'>{the text of the the current selection updated by javascript}</div>
<select class='select'>
    <option value='foo'>bar</option>    
</select>

Обновите div-файл innerHTML с помощью javascript.Easypeasy с jQuery:

$('.select').click(function(event)) { 
    $('.div').html($('.select option:selected').val());
}

Вот и все!Просто стиль вашего div вместо поля выбора.Я не тестировал приведенный выше код, поэтому вам, вероятно, понадобится настроить его.Но, надеюсь, вы понимаете суть.

Я думаю, что это решение превосходит {-webkit-appearance: none;}.То, что браузеры должны делать в лучшем случае, это диктовать взаимодействие с элементами формы, но определенно не то, как они изначально отображаются на странице, поскольку это нарушает дизайн сайта.

14 голосов
/ 04 апреля 2012

Попробуйте следующим образом:

-webkit-appearance: button;
-moz-appearance: button;

Затем вы можете использовать другое изображение в качестве фона и разместить его:

background-image: url(images/select-arrow.png);
background-position: center right;
background-repeat: no-repeat;

Существует еще один способ для браузеров moz:

text-indent:10px;

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

Это работает для меня!;)

6 голосов
/ 06 июня 2011

Хотя это не полное решение, я обнаружил, что ...

-moz-appearance: window;

... работает в некоторой степени. Вы не можете изменить фон (-color или -image), но элемент можно сделать невидимым с помощью color: transparent. Не идеально, но это начало, и вам не нужно заменять элемент системного уровня на js.

4 голосов
/ 23 июля 2014

Я думаю, что нашел решение, совместимое с FF31 !!!Вот два варианта, которые хорошо объяснены по этой ссылке:http://www.currelis.com/hiding-select-arrow-firefox-30.html
Я использовал вариант 1: Rodrigo-Ludgero опубликовал это исправление на Github, включая онлайн-демонстрацию.Я протестировал эту демонстрацию на Firefox 31.0, и она, кажется, работает правильно.Протестировано на Chrome и IE.Вот HTML-код:

<!DOCTYPE html>
<html>
    <head>
    <meta charset="utf-8">
    <title>Custom Select</title>
    <link href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <div class="custom-select fa-caret-down">
            <select name="" id="">
                <option value="">Custom Select</option>
                <option value="">Custom Select</option>
                <option value="">Custom Select</option>
            </select>
        </div>
    </body>
</html>

и CSS:

.custom-select {
    background-color: #fff;
    border: 1px solid #ccc;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    margin: 0 0 2em;
    padding: 0;
    position: relative;
    width: 100%;
    z-index: 1;
}

.custom-select:hover {
    border-color: #999;
}

.custom-select:before {
    color: #333;
    display: block;
    font-family: 'FontAwesome';
    font-size: 1em;
    height: 100%;
    line-height: 2.5em;
    padding: 0 0.625em;
    position: absolute;
    top: 0;
    right: 0;
    text-align: center;
    width: 1em;
    z-index: -1;
}

.custom-select select {
    background-color: transparent;
    border: 0 none;
    box-shadow: none;
    color: #333;
    display: block;
    font-size: 100%;
    line-height: normal;
    margin: 0;
    padding: .5em;
    width: 100%;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
}

.custom-select select::-ms-expand {
    display: none; /* to ie 10 */
}

.custom-select select:focus {
    outline: none;
}
/* little trick for custom select elements in mozilla firefox  17/06/2014 @rodrigoludgero */
:-moz-any(.custom-select):before {
    background-color: #fff; /* this is necessary for overcome the caret default browser */
    pointer-events: none; 
    z-index: 1; /* this is necessary for overcome the pseudo element */
}

http://jsbin.com/pozomu/4/edit
Это работает очень хорошо для меня!

2 голосов
/ 21 июня 2014
/* Try this in FF30+ Covers up the arrow, turns off the background */ 
/* still lets you style the border around the image and allows selection on the arrow */


@-moz-document url-prefix() {

    .yourClass select {
        text-overflow: '';
        text-indent: -1px;
        -moz-appearance: none;
        background: none;

    }

    /*fix for popup in FF30 */
    .yourClass:after {
        position: absolute;
        margin-left: -27px;
        height: 22px;
        border-top-right-radius: 6px;
        border-bottom-right-radius: 6px;
        content: url('../images/yourArrow.svg');
        pointer-events: none;
        overflow: hidden;
        border-right: 1px solid #yourBorderColour;
        border-top: 1px solid #yourBorderColour;
        border-bottom: 1px solid #yourBorderColour; 
    }
}
2 голосов
/ 15 октября 2014

Мне нравится стиль выбора.

<select style="     -moz-appearance: radio-container;
                -webkit-appearance: none;
                 appearance: none;
">

Он работает для меня в FF, Safari и Chrome во всех протестированных мной версиях.

В IE я ставлю:1006 *

 select::-ms-expand {
 display: none;
}
/*to remove in all selects*/

Также вы можете: .yourclass :: - ms-expand {display: none;} .yourid :: - ms-exapan {display: none;}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...