Як зробити заполнитель для вікна "select"?


1542

Я використовую заповнювачі для введення тексту, що працює добре. Але я також хотів би використати заповнювач мітки для своїх вибраних скриньок. Звичайно, я можу просто використовувати цей код:

<select>
    <option value="">Select your option</option>
    <option value="hurr">Durr</option>
</select>

Але "Виберіть свій варіант" - чорний колір, а не світлий. Тож моє рішення могло б бути на базі CSS. jQuery теж добре.

Це робить параметр сірим у спадному меню (тому після натискання стрілки):

option:first {
    color: #999;
}

Питання полягає в тому, як люди створюють заповнювачі у виборчих скриньках? Але вже відповіли, ура.

І за допомогою цього результату вибране значення завжди буде сірим (навіть після вибору реальної опції):

select {
    color: #999;
}

1
На всякий випадок, коли хтось це прочитає - я розмістив більш поширене рішення для сучасних браузерів із вбудованим браузером перевірки. Ласкаво просимо в рік 2020;)
Юрік

Відповіді:


2973

Не CSS - немає відповіді на JavaScript / jQuery:

<select>
    <option value="" disabled selected>Select your option</option>
    <option value="hurr">Durr</option>
</select>


134
Firefox (10) не відображає вимкнений параметр як вибір за замовчуванням (заповнювач місця). Він показує наступний за замовчуванням, у цьому випадку "Durr".
jarnoan

53
Зазвичай я додаю як відключений, так і вибраний. Здається, теж працює у ФФ.
nilskp

11
<select> <option value="" disabled selected>Select your option</option> </select>
колипто

183
Причина, на яку це не правильна відповідь, полягає в тому, що (я вважаю) запитувач хоче, щоб вибір був сірим, поки не було вибрано інше значення. Ця відповідь робить варіант сірим у спадному меню; але не елемент вибору.
Білл

22
виберіть {варіант [вимкнено] {дисплей: немає; }}
Дімаель Вертіго

821

Я просто натрапив на це питання, і ось що працює у Firefox та Chrome (принаймні):

<style>
select:invalid { color: gray; }
</style>
<form>
<select required>
    <option value="" disabled selected hidden>Please Choose...</option>
    <option value="0">Open when powered (most valves do this)</option>
    <option value="1">Closed when powered, auto-opens when power is cut</option>
</select>
</form>

Параметр " Відключений " зупиняє <option>вибір як мишею, так і клавіатурою, а лише використанням'display:none' дозволяє користувачеві все одно вибирати за допомогою стрілок клавіатури. 'display:none'Стиль просто робить поле списку вид «хороший».

Примітка. Використання порожнього value атрибута в опції "заповнення місця" дозволяє перевірити (необхідний атрибут), щоб вирішити наявність "заповнення місця", тому, якщо параметр не змінено, але потрібно, браузер повинен запропонувати користувачеві вибрати варіант зі списку.

Оновлення (липень 2015 року):

Цей метод підтверджено в наступних браузерах:

  • Google Chrome - v.43.0.2357.132
  • Mozilla Firefox - v.39.0
  • Safari - v.8.0.7 (заповнювач місця видно у спадному меню, але його неможливо вибрати)
  • Microsoft Internet Explorer - v.11 (заповнювач місця видно у спадному меню, але його неможливо вибрати)
  • Проект Spartan - v.15.10130 (заповнювач місця видно у спадному меню, але його неможливо вибрати)

Оновлення (жовтень 2015 р.):

Я видалив style="display: none"атрибут на користь HTML5, hiddenякий має широку підтримку. hiddenЕлемент має схожі риси , якdisplay: none в Safari, Internet Explorer (Project Spartan потребує в перевірці) , де optionвидно в списку, що випадає, але не по вибору.

Оновлення (січень 2016 р.):

Коли selectелемент є, requiredвін дозволяє використовувати :invalidпсевдоклас CSS, який дозволяє стилювати selectелемент, коли він знаходиться в його "заповнювачі". :invalidпрацює тут через порожнє значення в заповнювачіoption .

Після встановлення значення :invalidпсевдоклас буде скинутий. Ви також можете використовувати:valid .

Більшість браузерів підтримують цей псевдоклас. Internet Explorer 10 та новіших версій. Це найкраще працює з selectелементами, призначеними на замовлення ; в деяких випадках, тобто (Mac в Chrome / Safari), вам потрібно буде змінити зовнішній вигляд selectполя, щоб відображалися певні стилі, тобто background-colorі color. Ви можете знайти кілька прикладів та більше про сумісність на сайті developer.mozilla.org .

Зовнішній вигляд рідних елементів Mac у Chrome:

Виберіть вікно рідного Mac у Chrome

Використання зміненого елемента кордону Mac у Chrome:

Змінено поле вікна Mac у Chrome


5
@jaacob У браузерах, які я тестував, стиль "display: none" приховує зі списку "Please select" зі списку, який просто виглядає приємніше.
Вільям Істед

38
Важливо зауважити, що відключену опцію неможливо повторно вибрати: якщо вибір є обов'язковим, це нормально, але не, якщо вибір є необов'язковим.
Роберт Марк Брам

2
Explorer11 ігнорує display:noneстиль.
T30

1
Кудо, щоб @MattW для відпрацювання :invalidшляху до цього.
Вільям Істед

3
Ви також можете додати правило для "скидання" colorпараметрів у підтримуючих браузерах, як у цьому загадку . Це допоможе підтвердити, що інваліди optionє заповнювачами місця. (Редагувати: Я бачу, Метт вже висвітлював це у своїй відповіді)
Shaggy

251

Для обов'язкового поля існує сучасне рішення CSS у сучасних браузерах:

select:required:invalid {
  color: gray;
}
option[value=""][disabled] {
  display: none;
}
option {
  color: black;
}
<select required>
  <option value="" disabled selected>Select something...</option>
  <option value="1">One</option>
  <option value="2">Two</option>
</select>


7
Дивовижно - саме відповідь внизу (ще не було оновлень) була найпростішою, і насправді працює прекрасно. Дякую! Сподіваємось, ця відповідь підніметься до вершини.
Дан Ніссенбаум

2
@DanNissenbaum Я дуже запізнювався в грі, плюс їй потрібно requiredпрацювати, тому це не корисно, якщо ви хочете, щоб поле було необов’язковим.
MattW

1
Крім того, :requiredселектор не підтримується в IE8 та нижче. :invalidСелектор не підтримуються в IE9 і нижче. quirksmode.org/css/selectors
Метт Вагнер

4
Немає рішення для необов’язкового вибору?
користувач3494047

1
@ user3494047 не з таким підходом - requiredумова полягає в тому, що браузер застосовує :invalidпсевдоклас, коли вибрано заповнювач. [value=""]не працюватиме як заміна, оскільки те, що оновлюється взаємодією користувача, є властивістю значення, але синтаксис CSS посилається на (неіснуючий) атрибут .
MattW

105

Щось на зразок цього:

HTML:

<select id="choice">
    <option value="0" selected="selected">Choose...</option>
    <option value="1">Something</option>
    <option value="2">Something else</option>
    <option value="3">Another choice</option>
</select>

CSS:

#choice option { color: black; }
.empty { color: gray; }

JavaScript:

$("#choice").change(function () {
    if($(this).val() == "0") $(this).addClass("empty");
    else $(this).removeClass("empty")
});

$("#choice").change();

Приклад роботи: http://jsfiddle.net/Zmf6t/


8
це саме те, що я зробив нещодавно. але я додав обробник клавіш, щоб зміни відбувалися і тоді, коли вибрано параметр за допомогою клавіатури (за допомогою стрілок або ярликів літер
Radu

це поставило мене на правильний шлях ... однак я зробив значення = "" (нічого між цитатами), щоб після натискання кнопки "Надіслати" все ще не вдалося перевірити перший варіант, і з'явиться спливаюче вікно браузера, яке повідомляє вас щоб вибрати варіант ... дякую @Albireo
Craig Wayne

Чому ви явно викликали функцію зміни.
Ніколи

@Бельш тому, що я встановив клас CSS в обробнику подій зміни змін, тому якщо ви не вручну піднімаєте подію при створенні елемента керування, стиль не застосовується (він застосовуватиметься лише тоді, коли користувач змінює значення вручну).
Альбірео

Це не працює на JQeury 3.4.1
geobudex

45

Я щойно додав прихований атрибут у optionподібному нижче. Це добре працює для мене.

<select>
  <option hidden>Sex</option>
  <option>Male</option>
  <option>Female</option>
</select>


2
Що стосується запису, для мене це не працює (Chrome на Win10).
Кріс Рай

Але ви не можете його зняти. Ви в кінцевому підсумку вибираєте один, але не можете скинути його в разі, якщо ви передумали.
Thielicious

Ага! Але всередині форми все одно користувач повинен вибрати будь-який із цих варіантів. Якщо його поле не є обов'язковим, видаліть прихований атрибут.
Ajithkumar S

35

Наведене нижче рішення працює і у Firefox, без JavaScript:

option[default] {
  display: none;
}
<select>
  <option value="" default selected>Select Your Age</option>
  <option value="1">1</option>
  <option value="2">2</option>
  <option value="3">3</option>
  <option value="4">4</option>
</select>


26

У мене була така ж проблема, і під час пошуку я натрапив на це питання, і після того, як я знайшов для мене гарне рішення, я хотів би поділитися ним із вами, хлопці, на випадок, якщо хтось може скористатися ним.

Ось:

HTML:

<select class="place_holder dropdown">
    <option selected="selected" style=" display: none;">Sort by</option>
    <option>two</option>
    <option>something</option>
    <option>4</option>
    <option>5</option>
</select>

CSS:

.place_holder {
    color: gray;
}
option {
    color: #000000;
}

JavaScript:

jQuery(".dropdown").change(function () {
    jQuery(this).removeClass("place_holder");
});

Після того, як клієнт робить перший вибір, немає необхідності в сірому кольорі, тому код JavaScript видаляє клас place_holder.

Завдяки @ user1096901, як вирішення для браузера Internet Explorer, ви можете додати place_holderклас ще раз, якщо перша опція буде обрана знову :)


2
У деяких браузерах він все ще може вибирати дисплей: жодна опція, оскільки це не приховано.
Srneczek

Робота над цим полягає в тому, щоб знову додати клас "place_holder", якщо буде обраний перший варіант :)
rramiii

23

Немає потреби в JavaScript або CSS, лише три атрибути:

<select>
    <option selected disabled hidden>Default Value</option>
    <option>Value 1</option>
    <option>Value 2</option>
    <option>Value 3</option>
    <option>Value 4</option>
</select>

Він взагалі не показує варіант; він просто встановлює значення опції як стандартне.

Однак якщо вам просто не сподобається заповнювач, який має той самий колір, що і решта , ви можете виправити його в рядку таким чином:

<!DOCTYPE html>
<html>
    <head>
        <title>Placeholder for select tag drop-down menu</title>
    </head>

    <body onload="document.getElementById('mySelect').selectedIndex = 0">
        <select id="mySelect" onchange="document.getElementById('mySelect').style.color = 'black'"     style="color: gray;    width: 150px;">
          <option value="" hidden>Select your beverage</option> <!-- placeholder -->
          <option value="water" style="color:black" >Water</option>
          <option value="milk" style="color:black" >Milk</option>
          <option value="soda" style="color:black" >Soda</option>
        </select>
    </body>
</html>

Очевидно, що ви можете розділити функції та принаймні CSS-файли вибору на окремі файли.

Примітка: функція завантаження виправляє помилку оновлення.


Це не працює, якщо прихований варіант єдиний
Еріданіс,

але чому б у вас випадаюче меню було лише одним варіантом?
Яків Шнайдер

У мене з'являється спливаюче вкладка, і випадаюче меню з tab3 приймає дані з tab2, які він відображає. Ваша відповідь хороша, і це кутовий випадок, але я б очікував, що значення за замовчуванням відобразиться як перший варіант, натомість ви отримаєте порожнє падіння вниз. Дивіться тут: jsfiddle.net/n66L7sza
Еріданіс

Це хороший момент, і в цьому випадку ви можете сканувати довжину спаду, якщо він дорівнює нулю, а потім видалити прихований атрибут
Якоб Шнайдер

Схоже, це не працює належним чином у Google Chrome 65.0.3325.181 на MacOS, він не показує прихований запис і вибирає той, що знаходиться під ним.
Джеймі Н

19

Користувач не повинен бачити заповнювач місця в опціях вибору. Я пропоную використовувати hiddenатрибут для опції заповнення, і вам не потрібен selectedатрибут для цього параметра. Ви можете просто поставити його як перше.

select:not(:valid) {
  color: #999;
}
<select required>
    <option value="" hidden>Select your option</option>
    <option value="0">First option</option>
    <option value="1">Second option</option>
</select>


2
або select:invalidтакож є дійсним.
elquimista

2
Я рекомендую цей, оскільки він не містить тексту-заповнювача серед списку, принаймні в Chrome.
JoeRaid

Зауважте, що стиль не працює без ньогоrequired
akmalhakimi1991

18

Тут я змінив відповідь Девіда (прийнята відповідь). У відповідь він поставив інвалід і вибрав атрибут наoption тег, але коли ми також поставимо прихований тег, він виглядатиме набагато краще.

Додавши додатковий прихований атрибут у optionтег, це запобіжить повторному вибору опції "Вибрати свій варіант" після вибору параметра "Durr".

<select>
    <option value="" disabled selected hidden>Select your option</option>
    <option value="hurr">Durr</option>
</select>


Дякуємо за оновлення, але відповідь все ще не пояснює, чому це виглядає інакше. Наприклад, ця відповідь перешкоджає повторному вибору опції "Вибрати свій варіант" після вибору параметра "Durr" . Який атрибут викликає таку поведінку?
bgran

16

Ось моя:

select:focus option.holder {
  display: none;
}
<select>
    <option selected="selected" class="holder">Please select</option>
    <option value="1">Option #1</option>
    <option value="2">Option #2</option>

</select>


Ви можете просто додати <option value="" selected disabled>Please select</option>як перший варіант.
sstauross

Це не робить заповнювач світло-сірим.
Хлоя

12

Я бачу ознаки правильних відповідей, але щоб зібрати все це разом, це було б моїм рішенням:

select {
  color: grey;
}

option {
  color: black;
}

option[default] {
   display: none;
}
<select>
    <option value="" default selected>Select your option</option>
    <option value="hurr">Durr</option>
</select>


8
Durrпісля вибору вибрано сірий колір. Це змушує закрите поле вибору завжди бути сірим.
Хлоя,

9

Якщо ви використовуєте Angular, перейдіть так:

<select>
    <option [ngValue]="undefined"  disabled selected>Select your option</option>
    <option [ngValue]="hurr">Durr</option>
</select>


Ви можете додати hiddenатрибут, щоб ця опція не відображалася під час відкриття select. Але дякую будь-яким чином за цю відповідь, це спрацювало для мене.
dcg

5

Це HTML + CSSрішення працювало для мене:

form select:invalid {
  color: gray;
}

form select option:first-child {
  color: gray;
}

form select:invalid option:not(:first-child) {
  color: black;
}
<form>
  <select required>
    <option value="">Select Planet...</option>
    <option value="earth">Earth</option>
    <option value="pandora">Pandora</option>
  </select>
</form>

Щасти...


Здається, це не працює в JQuery 3.4.1
geobudex

5

Ще одна можливість у JavaScript:

 $('body').on('change', 'select', function (ev){
    if($(this).find('option:selected').val() == ""){
        $(this).css('color', '#999');
        $(this).children().css('color', 'black');
    }
    else {
        $(this).css('color', 'black');
        $(this).children().css('color', 'black');
    }
});

JSFiddle


4

Я люблю прийняте рішення , і воно чудово працює без JavaScript.

Я просто хочу додати, як я прийняв цю відповідь для контрольованого вибору Реактивний компонент , тому що мені знадобилося кілька спроб розібратися. Включити його react-selectі зробити з ним було б дуже просто , але якщо вам не потрібна дивовижна функціональність, яку надає це сховище, що я не стосується проекту, немає необхідності додавати більше кілобайт в мій пакет. Зверніть увагу, react-selectобробляє наповнювачі в вибираєш через складну систему різних inputsі htmlелементи.

У React для керованого компонента ви не можете додати selectedатрибут до своїх параметрів. React обробляє стан вибору через valueатрибут наselect собі, а також обробник змін, де значення має відповідати одному з атрибутів значення в самих параметрах.

Такі як, наприклад

<select value={this.state.selectValue} onChange={this.handleChange} required={true}>
    {options}
</select>

Оскільки це було б неправильно і насправді призвело б до помилки, щоб додати selectedатрибут до одного з варіантів, що тоді?

Відповідь проста, коли ви думаєте про це. Оскільки ми хочемо, щоб наше перше optionбуло selectedтаким же, як disabledі hidden, нам потрібно зробити три речі:

  1. Додайте hiddenта disabledатрибут до першого визначеного option.
  2. Встановіть значення першого optionдля порожнього рядка.
  3. Ініціалізуйте значення значення також, selectщоб бути порожнім рядком.
state = { selectValue = "" } // State or props or their equivalent

// In the render function
<select value={this.state.selectValue} onChange={this.handleChange} required={true}>
    <option key="someKey" value="" disabled="disabled" hidden="hidden">Select from Below</option>
    {renderOptions()}
</select>

Тепер ви можете стилізувати вибір, як зазначено вище (або за допомогою параметра a, classNameякщо вам зручніше).

select:invalid { color: gray; }

3

[type="text"]Заповнювач стилю вводу для вибраних елементів

Наступне рішення імітує заповнювач, що стосується input[type="text"]елемента:

$('.example').change(function () {
  $(this).css('color', $(this).val() === '' ? '#999' : '#555');
});
.example {
  color: #999;
}

.example > option {
  color: #555;
}

.example > option[value=""] {
  color: #999;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<select class="example">
  <option value="">Select Option</option>
  <option>Option 1</option>
  <option>Option 2</option>
  <option>Option 3</option>
</select>


3

Я хотів, щоб SELECT був сірим, поки не буде вибрано цей фрагмент HTML:

<select>
  <option value="" disabled selected>Select your option</option>
  <option value="hurr">Durr</option>
</select>

Я додав ці визначення CSS:

select { color: grey; }
select:valid { color: black; }

Він працює, як очікувалося в Chrome / Safari, а може бути, і в інших браузерах, але я не перевіряв.


3

Ось CSS- рішення, яке прекрасно працює. Вміст додається (і абсолютно розміщується відносно контейнера) після містить елемента ( через: після псевдокласу ).

Він отримує свій текст з атрибута placeholder, який я визначив, де я використав директиву ( attr (placeholder) ). Ще одним ключовим фактором є покажчик події: жоден - це дозволяє клікам на тексті заповнювача проходити до вибору. Інакше він не випадає, якщо користувач натисне текст.

Я сам додаю клас .empty в свою директиву вибору, але зазвичай я вважаю, що кутовий додає / видаляє .ng-empty для мене (я припускаю, що це тому, що я версію 1.2 Angular у свій зразок коду).

(Зразок також демонструє, як обернути HTML-елементи в AngularJS, щоб створити власні власні введення)

var app = angular.module("soDemo", []);
app.controller("soDemoController", function($scope) {
  var vm = {};
  vm.names = [{
      id: 1,
      name: 'Jon'
    },
    {
      id: 2,
      name: 'Joe'
    }, {
      id: 3,
      name: 'Bob'
    }, {
      id: 4,
      name: 'Jane'
    }
  ];
  vm.nameId;
  $scope.vm = vm;
});

app.directive('soSelect', function soSelect() {
  var directive = {
    restrict: 'E',
    require: 'ngModel',
    scope: {
      'valueProperty': '@',
      'displayProperty': '@',
      'modelProperty': '=',
      'source': '=',
    },
    link: link,
    template: getTemplate
  };
  return directive;


  /////////////////////////////////
  function link(scope, element, attrs, ngModelController) {
    init();
    return;


    ///////////// IMPLEMENTATION

    function init() {
      initDataBinding();
    }


    function initDataBinding() {
      ngModelController.$render = function() {
        if (scope.model === ngModelController.$viewValue) return;
        scope.model = ngModelController.$viewValue;
      }

      scope.$watch('model', function(newValue) {
        if (newValue === undefined) {
          element.addClass('empty');
          return;
        }
        element.removeClass('empty');
        ngModelController.$setViewValue(newValue);
      });
    }
  }


  function getTemplate(element, attrs) {
    var attributes = [
      'ng-model="model"',
      'ng-required="true"'
    ];

    if (angular.isDefined(attrs.placeholder)) {
      attributes.push('placeholder="{{placeholder}}"');
    }

    var ngOptions = '';

    if (angular.isDefined(attrs.valueProperty)) {
      ngOptions += 'item.' + attrs.valueProperty + ' as ';
    }

    ngOptions += 'item.' + attrs.displayProperty + ' for item in source';
    ngOptions += '"';
    attributes.push('ng-options="' + ngOptions + '"');

    var html = '<select ' + attributes.join(' ') + '></select>';

    return html;
  }
});
so-select {
  position: relative;
}

so-select select {
  font-family: 'Helvetica';
  display: inline-block;
  height: 24px;
  width: 200px;
  padding: 0 1px;
  font-size: 12px;
  color: #222;
  border: 1px solid #c7c7c7;
  border-radius: 4px;
}

so-select.empty:before {
  font-family: 'Helvetica';
  font-size: 12px;
  content: attr(placeholder);
  position: absolute;
  pointer-events: none;
  left: 6px;
  top: 3px;
  z-index: 0;
  color: #888;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="soDemo" ng-controller="soDemoController">
  <so-select value-property="id" display-property="name" source="vm.names" ng-model="vm.nameId" placeholder="(select name)"></so-select>
</div>


3

Я не міг змусити жодне з них працювати зараз, тому що для мене це (1) не потрібно і (2) потрібна опція для повернення до вибору за замовчуванням. Тож ось важка опція, якщо ви використовуєте jQuery:

var $selects = $('select');
$selects.change(function () {
  var option = $('option:default', this);
  if(option && option.is(':selected')) {
    $(this).css('color', '#999');
  }
  else {
    $(this).css('color', '#555');
  }
});

$selects.each(function() {
  $(this).change();
});
option {
    color: #555;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select name="in-op">
    <option default selected>Select Option</option>
    <option>Option 1</option>
    <option>Option 2</option>
    <option>Option 3</option>
</select>


Спасибі, для мене це було найкраще, як ви сказали ... потрібен елемент вибору.
Mousa Alfhaily

3

Я не задоволений рішеннями, що стосуються лише HTML / CSS, тому я вирішив створити нестандартний selectза допомогою JavaScript.

Це те, що я писав за останні 30 хвилин, таким чином, це можна вдосконалити.

Все, що вам потрібно зробити, - це створити простий список з невеликими атрибутами даних. Код автоматично перетворює список у вибір, що випадає. Він також додає приховане inputдля утримання вибраного значення, тому його можна використовувати у формі.

Вхід:

<ul class="select" data-placeholder="Role" data-name="role">
  <li data-value="admin">Administrator</li>
  <li data-value="mod">Moderator</li>
  <li data-value="user">User</li>
</ul>

Вихід:

<div class="ul-select-container">
    <input type="hidden" name="role" class="hidden">
    <div class="selected placeholder">
        <span class="text">Role</span>
        <span class="icon"></span>
    </div>
    <ul class="select" data-placeholder="Role" data-name="role">
        <li class="placeholder">Role</li>
        <li data-value="admin">Administrator</li>
        <li data-value="mod">Moderator</li>
        <li data-value="user">User</li>
    </ul>
</div>

Текст елемента, який повинен бути заповнювачем місця, відтіняється сірим кольором. Заповнювач заповнення можна вибрати, якщо користувач хоче повернути свій вибір. Також за допомогою CSS selectможна усунути всі недоліки (наприклад, неможливість стилізації параметрів).


Оновлення : я покращив це (вибір за допомогою клавіш вгору / вниз / введення), трохи прилаштував вихід і перетворив це на об'єкт. Поточний вихід:

<div class="li-select-container">
    <input type="text" readonly="" placeholder="Role" title="Role">
    <span class="arrow"></span>
    <ul class="select">
        <li class="placeholder">Role</li>
        <li data-value="admin">Administrator</li>
        <li data-value="mod">Moderator</li>
        <li data-value="user">User</li>
    </ul>
</div>

Ініціалізація:

new Liselect(document.getElementsByTagName("ul")[0]);

Для подальшого вивчення: JSFiddle , GitHub (перейменований).


Оновлення: я переписав це ще раз. Замість списку ми можемо просто використовувати select. Таким чином він буде працювати навіть без JavaScript (у разі відключення).

Вхід:

<select name="role" data-placeholder="Role" required title="Role">
    <option value="admin">Administrator</option>
    <option value="mod">Moderator</option>
    <option>User</option>
</select>

new Advancelect(document.getElementsByTagName("select")[0]);

Вихід:

<div class="advanced-select">
    <input type="text" readonly="" placeholder="Role" title="Role" required="" name="role">
    <span class="arrow"></span>
    <ul>
        <li class="placeholder">Role</li>
        <li data-value="admin">Administrator</li>
        <li data-value="mod">Moderator</li>
        <li>User</li>
    </ul>
</div>

JSFiddle , GitHub .


2

Вам потрібна перевірка форми, і сучасні браузери пропонують це з нуля.

Тож вам не потрібно дбати про те, щоб користувач не міг вибрати поле. Тому що коли він це робить, перевірка браузера скаже йому, що це неправильний вибір.

У браузері вбудована функція перевірки checkValidity () .

У Bootstrap є і хороший приклад.

HTML

<form class="needs-validation">
  <select required>
    <option value="">Please select an option</option>
    <option value="1">Foo</option>
    <option value="2">Bar</option>
  </select>
<form>

Javascript

form = document.getElementByClassName('needs-validation');
if(form.checkValidity() === true) {
  //form validation succeeded
} else {
  //form validation failed
}

1

Ви можете зробити це без використання Javascriptтільки з допомогою HTMLвам необхідно встановити по замовчуванням виберіть опцію disabled=""і selected=""і виберіть тег required="".браузер не дозволяють користувачеві відправити форму без вибору опції.

<form action="" method="POST">
    <select name="in-op" required="">
        <option disabled="" selected="">Select Option</option>
        <option>Option 1</option>
        <option>Option 2</option>
        <option>Option 3</option>
    </select>
    <input type="submit" value="Submit">
</form>

Це призводить до того, що весь вибраний елемент буде сірим, поки не буде обраний варіант, що спричинить потенційно небажану поведінку.
злий

1

У Angular ми можемо додати параметр як заповнювач, який можна приховати у спадному варіанті. Ми навіть можемо додати спеціальний значок спаду як фон, що замінює значок спаду браузера .

Трюк полягає в включити заміщає CSS тільки тоді , коли значення не вибрано

/ ** Шаблон мого компонента * /

 <div class="dropdown">
      <select [ngClass]="{'placeholder': !myForm.value.myField}"
 class="form-control" formControlName="myField">
        <option value="" hidden >Select a Gender</option>
        <option value="Male">Male</option>
        <option value="Female">Female</option>
      </select>
    </div>

/ ** Мій компонент.TS * /

constructor(fb: FormBuilder) {
  this.myForm = this.fb.build({
    myField: ''
  });
}

/**global.scss*/

.dropdown {
  width: 100%;
  height: 30px;
  overflow: hidden;
  background: no-repeat white;
  background-image:url('angle-arrow-down.svg');
  background-position: center right;
  select {
    background: transparent;
    padding: 3px;
    font-size: 1.2em;
    height: 30px;
    width: 100%;
    overflow: hidden;

    /*For moz*/
    -moz-appearance: none;
    /* IE10 */
    &::-ms-expand {
      display: none;
    }
    /*For chrome*/
    -webkit-appearance:none;
    &.placeholder {
      opacity: 0.7;
      color: theme-color('mutedColor');
    }
    option {
      color: black;
    }
  }
}

1

Рішення для кутових 2

Створіть ярлик поверх вибору

<label class="hidden-label" for="IsActive"
    *ngIf="filterIsActive == undefined">Placeholder text</label>
<select class="form-control form-control-sm" type="text" name="filterIsActive"
    [(ngModel)]="filterIsActive" id="IsActive">
    <option value="true">true</option>
    <option value="false">false</option>
</select>

і застосуйте CSS, щоб розмістити його зверху

.hidden-label {
    position: absolute;
    margin-top: .34rem;
    margin-left: .56rem;
    font-style: italic;
    pointer-events: none;
}

pointer-events: none дозволяє відображати вибраний при натисканні на етикетку, який приховано при виборі опції.


1

Ось мій внесок. Haml + CoffeeScript + SCSS

Haml

=f.collection_select :country_id, [us] + Country.all, :id, :name, {prompt: t('user.country')}, class: 'form-control'

CoffeeScript

  $('select').on 'change', ->
    if $(this).val()
      $(this).css('color', 'black')
    else
      $(this).css('color', 'gray')
  $('select').change()

SCSS

select option {
  color: black;
}

Можна використовувати лише CSS, змінивши код сервера та встановивши лише стилі класу залежно від поточного значення властивості, але цей спосіб здається простішим та чистішим.

$('select').on('change', function() {
  if ($(this).val()) {
    return $(this).css('color', 'black');
  } else {
    return $(this).css('color', 'gray');
  }
});

$('select').change();
    select option {
      color: black;
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select class="form-control" name="user[country_id]" id="user_country_id">
  <option value="">Country</option>
                      <option value="231">United States</option>
                      <option value="1">Andorra</option>
                      <option value="2">Afghanistan</option>
                      <option value="248">Zimbabwe</option></select>

Ви можете додати більше CSS ( select option:first-child), щоб заповнити заповнення сірим кольором, коли він відкриється, але мене це не хвилювало.


1

Спробуйте це для зміни:

$("select").css("color", "#757575");
$(document).on("change", "select", function(){
    if ($(this).val() != "") {
        $(this).css("color", "");
    } 
    else {
        $(this).css("color", "#757575");
    }
});

1

Ось робочий приклад, як цього досягти за допомогою чистого JavaScript, який обробляє колір параметрів після першого клацання:

<!DOCTYPE html>
<html>
  <head>
    <style>
      #myselect {
        color: gray;
      }
    </style>
  </head>

  <body>
    <select id="myselect">
      <option disabled selected>Choose Item
      </option>

      <option>Item 1
      </option>

      <option>Item 2
      </option>

      <option>Item 3
      </option>
    </select>

    <script>
      // Add event listener to change color in the first click
      document.getElementById("myselect").addEventListener("click", setColor)
      function setColor()
      {
        var combo = document.getElementById("myselect");
        combo.style.color = 'red';
        // Remove Event Listener after the color is changed at the first click
        combo.removeEventListener("click", setColor);
      }
    </script>
  </body>
</html>

1

Спираючись на відповідь MattW , ви можете зробити параметр виділення заповнювача видимим у спадному меню після того, як був зроблений дійсний вибір, умовно приховавши його лише тоді, коли заповнювач заповнення залишається обраним (і вибір таким чином: недійсний).

select:required:invalid {
  color: gray;
}
select:invalid > option[value=""][disabled] {
  display: none;
}
option {
  color: black;
}
<select required>
    <option value="" disabled selected>Select something...</option>
    <option value="1">One</option>
    <option value="2">Two</option>
</select>


0

На основі відповіді Albireo , ця версія не використовує jQuery, і специфіка CSS є кращою.

const triggerEvent = (el, eventName) => {
  let event = document.createEvent('HTMLEvents')
  event.initEvent(eventName, true, false)
  el.dispatchEvent(event)
}

let select = document.querySelector('.placeholder-select')
select.addEventListener('change', (e) => {
  e.target.classList[e.target.value == 0 ? 'add' : 'remove']('empty')
})
triggerEvent(select, 'change')
.placeholder-select option {
  color: #000000;
}
.placeholder-select option:first-child {
  color: #444444;
  font-style: italic;
  font-weight: bold;
}
.placeholder-select.empty {
  color: #7F7F7F;
}
<select class="placeholder-select">
  <option value="0" selected="selected">Choose...</option>
  <option value="1">Something</option>
  <option value="2">Something else</option>
  <option value="3">Another choice</option>
</select>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.