「選択」ボックスのプレースホルダーを作成するにはどうすればよいですか?


1542

私はうまく機能しているテキスト入力用のプレースホルダーを使用しています。しかし、selectboxにもプレースホルダーを使用したいと思います。もちろん、私はこのコードを使用することができます:

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

ただし、「オプションを選択してください」はライトグレーではなく黒で表示されます。したがって、私のソリューションはCSSベースである可能性があります。jQueryも問題ありません。

これにより、ドロップダウンのオプションがグレーになります(矢印をクリックした後)。

option:first {
    color: #999;
}

問題は、人々はどのようにしてセレクトボックスにプレースホルダーを作成するのかということです。しかし、それはすでに答えられています、乾杯。

これを使用すると、選択された値は常に(実際のオプションを選択した後でも)灰色になります。

select {
    color: #999;
}

1
誰かがこれを読んだ場合に備えて、私はブラウザの組み込み検証を備えた最新のブラウザ向けのより一般的なソリューションを投稿しました。2020年へようこそ;)
Jurik

回答:


2974

非CSS-JavaScript / jQuery回答なし:

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


134
Firefox(10)では、デフォルトの選択(プレースホルダー)として無効なオプションが表示されません。デフォルトでは次のもの、この場合は「Durr」が表示されます。
jarnoan

53
通常、無効と選択の両方を追加します。FFでも動作するようです。
nilskp

11
<select> <option value="" disabled selected>Select your option</option> </select>
kolypto

183
これが正しい答えではない理由は、別の値が選択されるまで、質問者が選択を灰色にしたい(と思う)ためです。この答えは、ドロップダウンのオプションを灰色にします。しかしではない select要素。
ビル・

22
選択{オプション[無効] {表示:なし。}}
Dimael Vertigo 2015

822

私はこの質問を偶然見つけました。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年7月):

このメソッドは、次のブラウザで動作することが確認されています。

  • Google Chrome-v.43.0.2357.132
  • Mozilla Firefox-v.39.0
  • Safari-v.8.0.7(プレースホルダーはドロップダウンに表示されますが、選択できません)
  • Microsoft Internet Explorer-v.11(プレースホルダーはドロップダウンに表示されますが、選択できません)
  • Project Spartan-v.15.10130(プレースホルダーはドロップダウンに表示されますが、選択できません)

アップデート(2015年10月):

幅広くサポートされているstyle="display: none"HTML5属性hiddenを優先して削除しました。hidden要素は同様の特性を持っているdisplay: noneのSafari、Internet Explorerで、(プロジェクトスパルタンはチェックが必要)ここで、optionドロップダウンに表示されているが、それは選択できません。

アップデート(2016年1月):

ときにselect要素があるrequiredことは、使用可能に:invalidあなたのスタイルを可能にするCSSの擬似クラスselectときに「プレースホルダ」状態の要素を。:invalidプレースホルダーに空の値があるため、ここで機能しますoption

値が設定されると、:invalid疑似クラスは削除されます。オプションで使用することもできます:validすること。

ほとんどのブラウザはこの疑似クラスをサポートしています。Internet Explorer 10以降。これはカスタムスタイルのselect要素で最もよく機能します。場合によっては(つまり、Chrome / SafariのMac)、selectボックスのデフォルトの外観を変更して、特定のスタイル、つまりとbackground-colorを表示する必要がありますcolor。互換性に関するいくつかの例と詳細については、developer.mozilla.orgを参照してください

Chromeのネイティブ要素の外観Mac:

ChromeのセレクトボックスネイティブMac

Chromeで変更された境界要素Macを使用する:

Chromeで選択ボックスMacを変更


5
@jaacob私がテストしたブラウザでは、「display:none」スタイルを使用すると、リストから「選択してください」が非表示になり、見栄えがよくなります。
ウィリアム・イステッド

38
無効化されたオプションは再選択できないことに注意してください。選択が必須の場合、これは問題ありませんが、選択がオプションの場合はできません。
Robert Mark Bram

2
Explorer11はdisplay:noneスタイルを無視します。
T30 2014

1
@MattWへの称賛:invalid
ウィリアムIsted

3
このフィドルのcolorように、サポートするブラウザーのオプションを「リセット」するルールを追加することもできます。これは障害者がプレースホルダーであることを補強するのに役立ちます。(編集:私はMattWが彼の回答ですでにこれをカバーしていると思います)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
すばらしい-一番下にある答え(まだ賛成投票はありません)が最も単純で、実際には完全に機能しました。ありがとう!うまくいけば、この答えがトップに上がるでしょう。
Dan Nissenbaum、2015年

2
@DanNissenbaum私はゲームに非常に遅れていました。加えて、動作する必要があるrequiredので、フィールドをオプションにしたい場合は使用できません。
MattW、

1
余談ですが、:requiredセレクターはIE8以下ではサポートされていません。:invalidセレクタはIE9で、以下はサポートされていません。 quirksmode.org/css/selectors
Matt Wagner、

4
不要な選択のソリューションはありませんか?
user3494047

1
@ user3494047はこのアプローチでは使用できません- プレースホルダーが選択されたときにrequiredブラウザーが:invalid疑似クラスを適用するのはこの条件です。[value=""]ユーザーインタラクションによって更新されるのはvalue プロパティですが、そのCSS構文は(存在しない)属性を参照しているため、代替としては機能しません。
MattW 2016年

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
これはまさに私が最近やったことです。変更はまた、オプションは、キーボード(矢印や文字のショートカットを使用して)を介して選択されたときに起こるように、私はkeyUpイベントハンドラを追加 jsfiddle.net/Zmf6t/131
ラドゥ

これは私を正しい軌道に乗せました...しかし、値= ""(引用符の間に何もない)にしたので、送信ボタンがクリックされたときに、最初のオプションを検証できず、ブラウザのポップアップが表示されますオプションを選択してください... @Albireoに感謝
クレイグウェイン

なぜ変更関数を明示的に呼び出したのですか?
Foreever

@Foreeverは、selectの変更イベントハンドラーでCSSクラスを設定したため、コントロールの作成時に手動でイベントを発生させない場合、スタイルは適用されません(ユーザーが手動で値を変更した場合にのみ適用されます)。
アルビレオ2014年

これはJQeury 3.4.1では動作しません
geobudex

45

option以下のような隠し属性を追加しました。それは私にとってはうまくいきます。

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


2
念のため、これは私には機能しません(Chrome on Win10)。
Chris Rae 2017年

ただし、設定を解除することはできません。いずれかを選択することになりますが、気が変わった場合に備えてリセットすることはできません。
Thielicious 2017

うん!ただし、フォーム内では、ユーザーはいずれかのオプションを選択する必要があります。必須フィールドでない場合は、非表示の属性を削除してください。
Ajithkumar S 2017

35

以下の解決策は、JavaScriptがなくてもFirefoxでも機能します。

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
一部のブラウザでは、非表示になっていないため、display:noneオプションを選択できます。
Srneczek 2014

この問題を回避するには、最初のオプションが選択されている場合に備えて、「place_holder」クラスを再度追加します:)
rramiii '27

23

JavaScriptやCSSは必要ありません。3つの属性があります。

<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を別々のファイルに分けることができます。

注: onload関数は、更新のバグを修正します。


非表示のオプションが唯一のオプションである場合、これは機能しません
Eridanis

しかし、なぜオプションが1つしかないドロップダウンメニューがあるのでしょうか。
Jacob Schneider

タブ付きポップアップがあり、tab3のドロップダウンメニューはtab2から入力を受け取り、表示します。あなたの答えは良いです、これはコーナーケースですが、私はデフォルト値が最初のオプションとして表示されることを期待していましたが、代わりに空白のドロップダウンが表示されます。ここを参照してください:jsfiddle.net/n66L7sza
Eridanis

これは良い点です。この場合、ドロップダウンの長さをスキャンして、それがゼロの場合、非表示の属性を削除できます
Jacob Schneider

これはMacOS上のGoogle Chrome 65.0.3325.181では正しく動作しないようで、非表示のエントリが表示されず、その下のエントリが選択されます。
ジェイミーH

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

ここで、Davidの回答(承認された回答)を変更しました。彼の答えでは、彼はoptionタグに無効化および選択された属性を配置しましたが、非表示のタグも配置すると、はるかによく見えます。

optionタグに隠し属性を追加すると、「Durr」オプションが選択された後に「Select your option」オプションが再選択されなくなります。

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


更新してくれてありがとう。でも、なぜそれが違って見えるのか、答えはまだ説明していません。たとえば、この回答は、「Durr」オプションが選択された後に「Select your option」オプションが再選択されるのを防ぎます。この動作を引き起こすのはどの属性ですか?
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 2017年

プレースホルダーを薄い灰色にしません。
クロエ

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 2018

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のもう1つの可能性:

 $('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コンポーネントにこの回答を採用する方法を追加したいのですが、それを理解するために数回の試行が必要でした。それを組み込んreact-selectで実行するのは本当に簡単ですが、このリポジトリが提供する驚くべき機能が必要でない限り、問題のプロジェクトには必要ありませんが、バンドルにキロバイトを追加する必要はありません。ノート、react-select種々の複雑なシステムを通して選択のプレースホルダを処理inputsし、html要素。

Reactでは、制御されたコンポーネントの場合selected、オプションに属性を追加できません。Reactは、value属性を介して選択の状態を処理します。select変更ハンドラーとともにそれ自体のます。値は、オプション自体の値属性の1つと一致する必要があります。

たとえば、

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

それは不適切であり、実際selectedにオプションの1つに属性を追加するとエラーがスローされるため、何をしますか?

考えてみれば答えは簡単です。私たちは私たちの最初たいのでoptionことはselected同様にdisabledしてhidden、我々は3つのことを行う必要があります。

  1. hiddenand 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>

これで、上記のように(または、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ソリューションを次に示します。コンテンツは、(:after擬似クラスを介して)含まれている要素の後に追加されます(コンテナに対して絶対的に配置されます)。

ディレクティブを使用した場所で定義したプレースホルダー属性からテキストを取得します(attr(placeholder))。もう1つの重要な要素は、ポインターイベントです:なし -これにより、プレースホルダーテキストのクリックが選択に渡されます。そうでない場合、ユーザーがテキストをクリックしてもドロップダウンしません。

.emptyクラスを自分の選択ディレクティブに自分で追加しますが、通常は角度が.ng-emptyを追加/削除することがわかります(コードサンプルにバージョン1.2のAngularを注入しているためだと思います)。

(サンプルは、AngularJSでHTML要素をラップして独自のカスタム入力を作成する方法も示しています)

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>


ありがとう、あなたが言ったように、これは私にとって最高でした... select要素は必須です。
Mousa Alfhaily

3

HTML / CSSのみのソリューションには満足していないため、selectJavaScriptを使用してカスタムを作成することにしました。

これは過去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克服できます(たとえば、オプションのスタイル設定ができないなど)。


更新:これを改善し(上/下/ Enterキーを使用して選択)、出力を少し整頓し、これをオブジェクトに変更しました。現在の出力:

<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]);

さらなる調査のために: JSFiddleGitHub(改名)。


更新:これを再度書き直しました。リストを使用する代わりに、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>

JSFiddleGitHub


2

フォームの検証が必要であり、最新のブラウザはこれをゼロから提供します。

したがって、ユーザーがフィールドを選択できないことに注意する必要はありません。彼がそれをしているとき、ブラウザ検証は彼にこれが間違った選択であることを教えてくれるからです。

ブラウザに組み込まれた検証関数checkValidity()

ブートストラップにも良い例があります。

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>

これにより、オプションが選択されるまでselect要素全体がグレー表示され、望ましくない動作が発生する可能性があります。
wickedchild 2017

1

では角度我々は、プレースホルダとしてオプションを追加することができます非表示にすることができるオプションのドロップダウンに。ブラウザのドロップダウンアイコンを置き換える背景としてカスタムドロップダウンアイコンを追加することもできます。

トリックするプレースホルダイネーブルのみ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>

/ ** My Component.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

Angular 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

ハムル

=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の回答に基づいて、有効な選択が行われた後、プレースホルダーが選択されたままである間のみ選択的にプレースホルダーオプションをドロップダウンメニューに表示することができます(したがって、選択は:invalidです)。

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>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.