Как убрать стрелку из выбранного элемента в 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 ]

2 голосов
/ 06 мая 2011

К сожалению для вас это является"чем-то фантастическим".Обычно это не место для веб-авторов, чтобы перепроектировать элементы формы.Многие браузеры специально не позволяют вам стилизовать их, чтобы пользователь мог видеть элементы управления ОС, к которым он привык.

Единственный способ сделать это последовательно в браузерах и операционных системах - это использовать JavaScript и заменить элементы select на «DHTML».

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

http://www.queness.com/post/204/25-jquery-plugins-that-enhance-and-beautify-html-form-elements#1

1 голос
/ 22 мая 2013

Используйте свойство pointer-events.

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

Вот рабочий FIDDLE с использованием этого метода.

Также в этот SO ответ Я обсудил этот и другой метод более подробно.

1 голос
/ 02 августа 2011

Я знаю, что этот вопрос немного старый, но, поскольку он появляется в Google, и это "новое" решение:

appearance: normal Кажется, работает нормально в Firefox для меня (версия 5 сейчас). но не в опере и IE8 / 9

В качестве обходного пути для Opera и IE9 я использовал псевдоселектор :before, чтобы создать новый белый прямоугольник и поместить его поверх стрелки.

К сожалению, в IE8 это не работает. Поле отображается правильно, но стрелка все равно торчит ...: - /

Использование select:before прекрасно работает в Opera, но не в IE. Если я смотрю на инструменты разработчика, я вижу, что они правильно читают правила, а затем просто игнорируют их (они вычеркнуты). Поэтому я использую <span class="selectwrap"> вокруг фактического <select>.

select {
  -webkit-appearance: normal;
  -moz-appearance: normal;
  appearance: normal;
}
.selectwrap { position: relative; }
.selectwrap:before {
  content: "";
  height: 0;
  width: 0;
  border: .9em solid red;
  background-color: red;
  position: absolute;
  right: -.1em;
  z-index: 42;
}

Возможно, вам придется немного подправить это, но это работает для меня!

Отказ от ответственности: Я использую это, чтобы получить красивую печатную копию веб-страницы с формами, поэтому мне не нужно создавать вторую страницу. Я не 1337 haxx0r, которому нужны красные полосы прокрутки, <marquee> теги и еще много чего :-) Пожалуйста, не не применяйте чрезмерную стилизацию к формам, если у вас нет веских причин.

1 голос
/ 24 сентября 2013

Это работает (проверено на Firefox 23.0.1):

select {
    -moz-appearance: radio-container;
}
1 голос
/ 01 августа 2017

попробуйте это CSS

select {
    /*for firefox*/
    -moz-appearance: none;
    /*for chrome*/
    -webkit-appearance:none;
}

Работает

1 голос
/ 13 января 2015

Поскольку Firefox 35, "-moz-appearance:none", который вы уже написали в своем коде, наконец, при желании удалите кнопку со стрелкой.

Это была ошибка , исправленная с этой версии.

1 голос
/ 27 ноября 2013

на основе ответа @ JoãoCunha, одного стиля CSS, который полезен для более чем одного браузера

select {
    /*for firefox*/
    -moz-appearance: none;
    /*for chrome*/
    -webkit-appearance:none;
    text-indent: 0.01px;
    text-overflow: '';
}
/*for IE10*/
select::-ms-expand {
    display: none;
}
1 голос
/ 02 декабря 2013

Много дискуссий происходит здесь и там, но я не вижу правильного решения этой проблемы.Наконец закончилась написанием небольшого кода Jquery + CSS для выполнения этого HACK на IE и Firefox.

Рассчитать ширину элемента (SELECT Element) с помощью Jquery.Добавьте обертку вокруг элемента Select и держите переполнение скрытым для этого элемента.Убедитесь, что ширина этой обертки - appox.На 25 пикселей меньше, чем у элемента SELECT.Это можно легко сделать с помощью Jquery.Так что теперь наша икона ушла ..!и пришло время добавить наш значок изображения на элемент SELECT ... !!!Просто добавьте несколько простых строк для добавления фона, и все готово!Убедитесь, что вы используете переполнение, скрытое для внешней оболочки,

Вот пример кода, который был сделан для Drupal.Однако его можно использовать и для других, удалив несколько строк кода, специфичных для Drupal.

/*
 * Jquery Code for Removing Dropdown Arrow.
 * @by: North Web Studio
 */
(function($) {
  Drupal.behaviors.nwsJS = {
    attach: function(context, settings) {
      $('.form-select').once('nws-arrow', function() {
        $wrap_width = $(this).outerWidth();
        $element_width = $wrap_width + 20;
        $(this).css('width', $element_width);
        $(this).wrap('<div class="nws-select"></div>');
        $(this).parent('.nws-select').css('width', $wrap_width);
      });
    }
  };
})(jQuery);
/*
 * CSS Code for Removing Dropdown Arrow.
 * @by: North Web Studio
 */

.nws-select {
  border: 1px solid #ccc;
  overflow: hidden;
  background: url('../images/icon.png') no-repeat 95% 50%;
}
.nws-select .form-select {
  border: none;
  background: transparent;
}

Решение работает на всех браузерах IE, Chrome и Firefox. Нет необходимости в добавлении фиксированных хаков с использованием CSSВсе это обрабатывается динамически с использованием JQuery.!

Подробнее Описано в: - http://northwebstudio.com/blogs/1/jquery/remove-drop-down-arrow-html-select-element-using-jquery-and-css

1 голос
/ 22 декабря 2014

В дополнение к ответу Жоао Куньи эта проблема теперь в списке задач Mozilla и предназначена для версии 35.

Для тех, кто хочет, есть обходной путьТодд Паркер, на который ссылается блог Куньи, который работает сегодня:

http://jsfiddle.net/xvushd7x/

HTML:

<label class="wrapper">This label wraps the select
    <div class="button custom-select ff-hack">
        <select>
            <option>Apples</option>
            <option>Bananas</option>
            <option>Grapes</option>
            <option>Oranges</option>
            <option>A very long option name to test wrapping</option>
        </select>
    </div>
</label>

CSS:

/* Label styles: style as needed */
label {
  display:block;
  margin-top:2em;
  font-size: 0.9em;
  color:#777;
}

/* Container used for styling the custom select, the buttom class below adds the bg gradient, corners, etc. */
.custom-select {
  position: relative;
  display:block;
  margin-top:0.5em;
  padding:0;
}

/* These are the "theme" styles for our button applied via separate button class, style as you like */
.button {
  border: 1px solid #bbb;
  border-radius: .3em;
  box-shadow: 0 1px 0 1px rgba(0,0,0,.04);
  background: #f3f3f3; /* Old browsers */
  background: -moz-linear-gradient(top, #ffffff 0%, #e5e5e5 100%); /* FF3.6+ */
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(100%,#e5e5e5)); /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(top, #ffffff 0%,#e5e5e5 100%); /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(top, #ffffff 0%,#e5e5e5 100%); /* Opera 11.10+ */
  background: -ms-linear-gradient(top, #ffffff 0%,#e5e5e5 100%); /* IE10+ */
  background: linear-gradient(to bottom, #ffffff 0%,#e5e5e5 100%); /* W3C */
}

/* This is the native select, we're making everything but the text invisible so we can see the button styles in the wrapper */
.custom-select select {
  width:100%;
  margin:0;
  background:none;
  border: 1px solid transparent;
  outline: none;
  /* Prefixed box-sizing rules necessary for older browsers */
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  /* Remove select styling */
  appearance: none;
  -webkit-appearance: none;
  /* Font size must the 16px or larger to prevent iOS page zoom on focus */
  font-size:16px;
  /* General select styles: change as needed */
  font-family: helvetica, sans-serif;
  font-weight: bold;
  color: #444;
  padding: .6em 1.9em .5em .8em;
  line-height:1.3;
}


/* Custom arrow sits on top of the select - could be an image, SVG, icon font, etc. or the arrow could just baked into the bg image on the select. Note this si a 2x image so it will look bad in browsers that don't support background-size. In production, you'd handle this resolution switch via media query but this is a demo. */

.custom-select::after {
  content: "";
  position: absolute;
  width: 9px;
  height: 8px;
  top: 50%;
  right: 1em;
  margin-top:-4px;
  background-image: url(http://filamentgroup.com/files/select-arrow.png);
  background-repeat: no-repeat;
  background-size: 100%;
  z-index: 2;
  /* These hacks make the select behind the arrow clickable in some browsers */
  pointer-events:none;
}


/* Hover style */
.custom-select:hover {
  border:1px solid #888;
}

/* Focus style */
.custom-select select:focus {
  outline:none;
  box-shadow: 0 0 1px 3px rgba(180,222,250, 1);
  background-color:transparent;
  color: #222;
  border:1px solid #aaa;
}

/* Set options to normal weight */
.custom-select option {
  font-weight:normal;
}
0 голосов
/ 06 апреля 2016

Если вы не против возиться с JS, я написал небольшой плагин jQuery, который поможет вам в этом.С ним вам не нужно беспокоиться о префиксах поставщиков.

 $.fn.magicSelectBox = function() {
  var $e = this;

  $e.each(function() {
    var $select = $(this);

    var $magicbox = $('<div></div>').attr('class', $select.attr('class')).attr('style', $select.attr('style')).addClass('magicbox');
    var $innermagicbox = $('<div></div>').css({
      position: 'relative',
      height: '100%'
    });
    var $text = $('<span></span>').css({
      position: 'absolute'
    }).text($select.find("option:selected").text());

    $select.attr('class', null).css({
      width: '100%',
      height: '100%',
      opacity: 0,
      position: 'absolute'
    }).on('change', function() {
      $text.text($select.find("option:selected").text());
    });

    $select.parent().append($magicbox);
    $innermagicbox.append($text, $select);
    $magicbox.append($innermagicbox);
  });

  return $e;
};

Fiddle здесь: JS Fiddle

Условие состоит в том, что вы должны стилизовать выбор изнуля (это означает установку фона и границы), но вы, вероятно, захотите сделать это в любом случае.

Кроме того, поскольку функция заменяет исходное выделение на div, вы потеряете все стили, сделанные непосредственно в селекторе выбора в вашем CSS.Поэтому присвойте элементу выбора класс и стилизуйте его.

Поддерживает большинство современных браузеров. Если вы хотите использовать более старые браузеры, вы можете попробовать более старую версию jQuery, но, возможно, придется заменить on () на bind() в функции (не проверено)

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