'선택'상자에 대한 자리 표시자를 만들려면 어떻게합니까?


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 년에 오신 것을 환영합니다;)
Jurik

답변:


2973

CSS가 아닌 JavaScript / jQuery 답변이 없습니다.

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


134
Firefox (10)는 비활성화 된 옵션을 기본 선택 (자리 표시 자)으로 표시하지 않습니다. 기본적으로 다음 항목을 표시합니다 (이 경우 "Durr").
jarnoan 2012

53
나는 보통 비활성화와 선택을 모두 추가합니다. FF에서도 작동하는 것 같습니다.
nilskp

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

183
이것이 정답이 아닌 이유는 다른 값을 선택할 때까지 asker가 선택을 회색으로 원하기 때문입니다. 이 답변은 드롭 다운에서 옵션을 회색으로 만듭니다. 그러나 select 요소는 아닙니다 .
Bill

22
{옵션 [사용 안함] 선택 {표시 : 없음; }}
Dimael Vertigo

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 년 7 월) :

이 방법은 다음 브라우저에서 작동하는 것으로 확인되었습니다.

  • 구글 크롬-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(가) 사파리, 인터넷 익스플로러, (프로젝트 스파르타가 검사를 필요로)의 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'스타일은 목록에서 "Please choose"를 숨겨서보기 좋게 만듭니다.
윌리엄 Isted

38
비활성화 된 옵션은 다시 선택할 수 없습니다. 선택이 필수 인 경우에는 괜찮지 만 선택이 선택 사항 인 경우는 아닙니다.
Robert Mark Bram

2
Explorer11은 display:none스타일을 무시합니다 .
T30

1
:invalid내가 해보기 전에 @MattW에게 도움을 청 했다.
William 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

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

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; }

자바 스크립트 :

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

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

실제 예 : http://jsfiddle.net/Zmf6t/


8
이것은 내가 최근에 한 일입니다. 그러나 키보드를 통해 옵션을 선택할 때 (화살표 또는 문자 바로 가기를 사용하여) 변경이 발생하도록 키업 처리기를 추가했습니다. jsfiddle.net/Zmf6t/131
Radu

이것은 나를 올바른 길로 데려 갔지만 제출 버튼을 클릭했을 때 여전히 첫 번째 옵션의 유효성을 검사하지 못하고 브라우저 팝업이 표시되도록 값 = ""(따옴표 사이에 아무것도 없음)을 만들었습니다. 옵션을 선택하려면 ... 감사 @Albireo
Craig Wayne

왜 변경 기능을 명시 적으로 호출 했습니까?
Foreever

@Foreever는 select의 change 이벤트 핸들러에서 CSS 클래스를 설정했기 때문에 컨트롤이 빌드 될 때 이벤트를 수동으로 올리지 않으면 스타일이 적용되지 않습니다 (사용자가 수동으로 값을 변경할 때만 적용됩니다).
Albireo


45

방금 option아래와 같이 숨겨진 속성을 추가했습니다 . 그것은 나를 위해 잘 작동합니다.

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


2
기록 상으로는 이것이 효과가 없습니다 (Chrome on Win10).
Chris Rae

그러나 설정을 해제 할 수는 없습니다. 결국 하나를 선택하지만 마음이 바뀌면 다시 설정할 수 없습니다.
Thielicious

네! 그러나 어쨌든 사용자는 해당 옵션 중 하나를 선택해야합니다. 필수 필드가 아닌 경우 숨겨진 속성을 제거하십시오.
Ajithkumar S

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;
}

자바 스크립트 :

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

고객이 첫 번째 선택을 한 후에는 회색이 필요하지 않으므로 JavaScript 코드가 클래스를 제거합니다 place_holder.

@ user1096901 덕분에 Internet Explorer 브라우저의 해결 방법으로 place_holder첫 번째 옵션을 다시 선택한 경우 클래스를 다시 추가 할 수 있습니다. :)


2
일부 브라우저에서 그는 display : none 옵션을 선택할 수 있습니다. 숨겨져 있지 않기 때문입니다.
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를 별도의 파일로 분리 할 수 ​​있습니다.

참고 : onload 기능은 새로 고침 버그를 수정합니다.


숨겨진 옵션이 유일한 옵션 인 경우 작동하지 않습니다
Eridanis

하지만 왜 하나의 옵션 만있는 드롭 다운 메뉴가 있습니까?
Jacob Schneider

탭 팝업이 있고 tab3의 드롭 다운 메뉴가 tab2에서 입력을 받아 표시됩니다. 귀하의 답변은 훌륭하고 모호한 경우이지만 기본값이 첫 번째 옵션으로 표시되는 대신 빈 드롭 다운이 나타납니다. 여기를보십시오 : jsfiddle.net/n66L7sza
Eridanis

이 제로의 경우, 드롭 다운의 길이를 스캔 할 수있는 경우에 좋은 포인트가, 즉, 다음 숨김 속성을 제거
야곱 슈나이더

MacOS의 Chrome 65.0.3325.181에서는 제대로 작동하지 않는 것 같습니다. 숨겨진 항목을 표시하지 않고 그 아래 항목을 선택합니다.
Jamie 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>
    <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

자리 표시자를 밝은 회색으로 만들지 않습니다.
Chloe

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선택한 후에는 회색입니다. 이렇게하면 닫힌 선택 상자가 항상 회색으로 표시됩니다.
Chloe

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 Component 에이 답변을 어떻게 채택했는지 추가하고 싶습니다 . 통합 react-select하고 사용하는 것은 매우 간단 하지만,이 리포지토리가 제공하는 놀라운 기능이 필요하지 않은 경우, 해당 프로젝트에는 필요하지 않은 번들에 더 이상 킬로바이트를 추가 할 필요가 없습니다. 참고 react-select여러가지의 복잡한 시스템을 통해 선택에 자리를 처리 inputshtml소자.

React에서 제어되는 구성 요소의 경우 selected옵션에 속성을 추가 할 수 없습니다 . React는 값 자체가 옵션 자체 내의 값 속성 중 하나와 일치해야하는 변경 핸들러와 함께 value속성 select자체 를 통해 선택 상태를 처리합니다 .

예를 들어

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

부적절하고 실제로 selected옵션 중 하나에 속성을 추가하는 데 오류가 발생하므로 어떻게해야합니까?

일단 생각하면 대답은 간단합니다. 우리는 우리의 첫 번째는 원하기 때문에 optionselected뿐만 아니라 disabled하고 hidden, 우리는 세 가지를 수행해야합니다

  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

이 HTML 부분에 대해 SELECT가 선택 될 때까지 SELECT가 회색이되기를 원했습니다.

<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 솔루션입니다. 내용은 포함 요소 뒤에 추가됩니다 (그리고 컨테이너에 대해 절대적으로 배치 됩니다 : via after after pseudo-class ).

지시어 ( attr (placeholder) )를 사용한 위치를 정의한 자리 표시 자 속성에서 텍스트를 가져옵니다 . 또 다른 주요 요소는 포인터 이벤트입니다. none- 자리 표시 자 텍스트를 클릭하면 선택 항목을 통과 할 수 있습니다. 그렇지 않으면 사용자가 텍스트를 클릭해도 드롭 다운되지 않습니다.

내 선택 지시문에 .empty 클래스를 직접 추가 하지만 일반적으로 angular가 .ng-empty 를 추가 / 제거 한다는 것을 알았 습니다 (코드 샘플에 Angular 1.2 버전을 주입하기 때문이라고 가정합니다).

(이 샘플에서는 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극복 할 수 있습니다 (예 : 옵션 스타일링이 불가능 함).


업데이트 : 나는 이것을 향상시키고 (위 / 아래 / 입력 키를 사용하여 선택) 출력을 약간 정리하고 이것을 객체로 바꿨습니다. 전류 출력 :

<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 (이름 변경).


업데이트 : 다시 작성했습니다. 목록을 사용하는 대신 선택을 사용할 수 있습니다. 이렇게하면 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 () 내장되어 있습니다.

부트 스트랩 에는 좋은 예가 있습니다.

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>

자바 스크립트

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>

이렇게하면 옵션을 선택할 때까지 전체 선택 요소가 회색으로 표시되어 잠재적으로 원하지 않는 동작이 발생합니다.
wickedchild

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

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>

select option:first-child자리 표시자가 열릴 때 회색으로 유지하기 위해 CSS ( )를 더 추가 할 수 있지만 그 점에 대해서는 신경 쓰지 않았습니다.


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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.