Làm cách nào để tạo một trình giữ chỗ cho hộp 'chọn'?


1542

Tôi đang sử dụng trình giữ chỗ cho các kiểu nhập văn bản hoạt động tốt. Nhưng tôi cũng muốn sử dụng một trình giữ chỗ cho các hộp chọn của mình. Tất nhiên tôi chỉ có thể sử dụng mã này:

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

Nhưng 'Chọn tùy chọn của bạn' có màu đen thay vì màu xám. Vì vậy, giải pháp của tôi có thể dựa trên CSS. jQuery cũng tốt

Điều này chỉ làm cho tùy chọn màu xám trong danh sách thả xuống (vì vậy sau khi nhấp vào mũi tên):

option:first {
    color: #999;
}

Câu hỏi là: Làm thế nào để mọi người tạo giữ chỗ trong selectboxes? Nhưng nó đã được trả lời, chúc mừng.

Và sử dụng kết quả này trong giá trị được chọn luôn có màu xám (ngay cả sau khi chọn tùy chọn thực):

select {
    color: #999;
}

1
Chỉ trong trường hợp ai đó đọc được điều này - tôi đã đăng một giải pháp phổ biến hơn cho các trình duyệt hiện đại với xác thực được tích hợp sẵn của trình duyệt. Chào mừng đến năm 2020;)
Jurik

Câu trả lời:


2974

Không phải CSS - không có câu trả lời JavaScript / jQuery:

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


134
Firefox (10) không hiển thị tùy chọn bị tắt làm lựa chọn mặc định (giữ chỗ). Nó hiển thị cái tiếp theo theo mặc định, trong trường hợp này là "Durr".
jarnoan

53
Tôi thường thêm cả khuyết tật và chọn. Có vẻ để làm việc trong FF quá.
nilskp

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

183
Lý do đây không phải là câu trả lời đúng là vì (tôi tin) người hỏi muốn lựa chọn có màu xám cho đến khi giá trị khác được chọn. Câu trả lời này làm cho tùy chọn màu xám trong trình đơn thả xuống; nhưng không phải là yếu tố chọn.
Bill

22
chọn {tùy chọn [bị tắt] {display: none; }}
Dimael Vertigo

822

Tôi chỉ vấp phải câu hỏi này và đây là những gì hoạt động trong Firefox và Chrome (ít nhất):

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

Các Disabled tùy chọn dừng <option>được lựa chọn với cả chuột và bàn phím, trong khi chỉ sử dụng 'display:none'cho phép người dùng vẫn chọn thông qua các mũi tên trên bàn phím. Các 'display:none'phong cách chỉ làm cho danh sách hộp nhìn 'dễ thương'.

Lưu ý: Sử dụng valuethuộc tính trống trên tùy chọn "giữ chỗ" cho phép xác thực (thuộc tính bắt buộc) để giải quyết việc có "giữ chỗ", vì vậy nếu tùy chọn không thay đổi, nhưng bắt buộc, trình duyệt sẽ nhắc người dùng chọn tùy chọn từ danh sách.

Cập nhật (tháng 7 năm 2015):

Phương pháp này được xác nhận làm việc trong các trình duyệt sau:

  • Google Chrome - v.43.0.2357.132
  • Mozilla Firefox - v.39.0
  • Safari - v.8.0.7 (trình giữ chỗ hiển thị trong danh sách thả xuống, nhưng không thể chọn được)
  • Microsoft Internet Explorer - v.11 (Trình giữ chỗ hiển thị trong danh sách thả xuống nhưng không thể chọn)
  • Project Spartan - v.15.10130 (trình giữ chỗ có thể nhìn thấy trong danh sách thả xuống, nhưng không thể chọn được)

Cập nhật (tháng 10 năm 2015):

Tôi đã loại bỏ sự style="display: none"ưu ái của thuộc tính HTML5 hiddencó hỗ trợ rộng rãi. Phần hiddentử này có các đặc điểm tương tự như display: nonetrong Safari, Internet Explorer, (Kiểm tra nhu cầu của Project Spartan) trong đó optioncó thể nhìn thấy trong danh sách thả xuống, nhưng không thể chọn được.

Cập nhật (tháng 1 năm 2016):

Khi selectphần tử là requirednó cho phép sử dụng :invalidlớp giả CSS cho phép bạn định kiểu selectphần tử khi ở trạng thái "giữ chỗ". :invalidhoạt động ở đây vì giá trị trống trong trình giữ chỗ option.

Khi một giá trị đã được đặt, lớp :invalidgiả sẽ bị loại bỏ. Bạn có thể tùy chọn cũng có thể sử dụng :validnếu bạn muốn.

Hầu hết các trình duyệt hỗ trợ lớp giả này. Internet Explorer 10 trở lên. Điều này hoạt động tốt nhất với các selectyếu tố theo kiểu tùy chỉnh ; trong một số trường hợp, ví dụ (Mac trong Chrome / Safari), bạn sẽ cần thay đổi giao diện mặc định của selecthộp để các kiểu nhất định hiển thị, nghĩa là background-colorcolor. Bạn có thể tìm thấy một số ví dụ và nhiều thông tin khác về khả năng tương thích tại developer.mozilla.org .

Xuất hiện yếu tố bản địa Mac trong Chrome:

Chọn hộp Mac gốc trong Chrome

Sử dụng phần tử viền đã thay đổi Mac trong Chrome:

Thay đổi hộp chọn Mac trong Chrome


5
@jaacob Trong các trình duyệt tôi đã thử nghiệm, kiểu 'display: none' ẩn "Vui lòng chọn" khỏi danh sách giúp nó trông đẹp hơn.
William Isted

38
Điều quan trọng cần lưu ý rằng một tùy chọn bị vô hiệu hóa không thể được chọn lại: nếu lựa chọn là bắt buộc, điều này là ổn - nhưng không phải nếu lựa chọn là tùy chọn.
Robert Mark Bram

2
Explorer11 bỏ qua display:nonephong cách.
T30

1
Kudos đến @MattW để làm việc :invalidtrước khi tôi làm.
William Isted

3
Bạn cũng có thể thêm một quy tắc để "đặt lại" colorcác tùy chọn trong việc hỗ trợ các trình duyệt như trong câu đố này . Điều này sẽ giúp củng cố rằng người bị biến dạng optionlà một người giữ chỗ. (Chỉnh sửa: Tôi thấy MattW đã trình bày điều này trong câu trả lời của anh ấy)
Shaggy

251

Đối với trường bắt buộc, có một giải pháp CSS thuần trong các trình duyệt hiện đại:

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
Thật tuyệt vời - đó là câu trả lời ở phía dưới (chưa có upvote nào) đơn giản nhất và thực sự hoạt động hoàn hảo. Cảm ơn! Hy vọng câu trả lời này sẽ tăng lên hàng đầu.
Dan Nissenbaum

2
@DanNissenbaum Tôi đã đến trò chơi rất muộn, cộng với việc nó cần phải requiredhoạt động nên không có ích gì nếu bạn muốn trường này là tùy chọn.
Matt

1
Bên cạnh đó, :requiredbộ chọn không được hỗ trợ trong IE8 trở xuống. Bộ :invalidchọn không được hỗ trợ trong IE9 trở xuống. quirksmode.org/css/selector
Matt Wagner

4
Không có giải pháp cho một lựa chọn không yêu cầu?
dùng3494047

1
@ user3494047 không theo cách tiếp cận này - requiredđiều kiện là nguyên nhân khiến trình duyệt áp dụng lớp :invalidgiả khi giữ chỗ được chọn. [value=""]sẽ không làm việc như một sự thay thế vì những gì được cập nhật bởi tương tác người dùng là giá trị tài sản nhưng mà cú pháp CSS dùng để chỉ một (không tồn tại) thuộc tính .
MattW

105

Một cái gì đó như thế này:

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

Ví dụ hoạt động: http://jsfiddle.net/Zmf6t/


8
đây chính xác là những gì tôi đã làm gần đây nhưng tôi đã thêm trình xử lý khóa để thay đổi cũng xảy ra khi tùy chọn được chọn qua bàn phím (sử dụng mũi tên hoặc phím tắt chữ cái) jsfiddle.net/Zmf6t/131
Radu

điều này đưa tôi đi đúng hướng ... tuy nhiên tôi đã tạo giá trị = "" (không có gì giữa các trích dẫn) để khi nhấp vào nút gửi, nó vẫn không thể xác thực tùy chọn đầu tiên và một cửa sổ bật lên trình duyệt sẽ xuất hiện thông báo cho bạn để chọn một tùy chọn ... cảm ơn @Albireo
Craig Wayne

Tại sao bạn gọi hàm thay đổi một cách rõ ràng.
Trước

@Foreever vì tôi đã đặt lớp CSS trong trình xử lý sự kiện thay đổi của lựa chọn, vì vậy nếu bạn không nâng cao sự kiện theo cách thủ công khi điều khiển được xây dựng thì kiểu không được áp dụng (nó sẽ chỉ được áp dụng khi người dùng thay đổi giá trị theo cách thủ công).
Albireo

Điều này không hoạt động trên JQeury 3.4.1
geobudex

45

Tôi chỉ cần thêm một thuộc tính ẩn trong optionnhư dưới đây. Nó đang làm việc tốt cho tôi.

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


2
Chỉ để ghi lại, điều này không phù hợp với tôi (Chrome trên Win10).
Chris Rae

Nhưng bạn không thể bỏ đặt nó. Cuối cùng, bạn chọn một nhưng bạn không thể thiết lập lại trong trường hợp nếu bạn đổi ý.
Thielicy

Vâng! Nhưng bên trong mẫu dù sao người dùng cũng phải chọn bất kỳ một trong các tùy chọn đó. Nếu nó không phải là một trường bắt buộc loại bỏ thuộc tính ẩn thì.
Ajithkumar S

35

Giải pháp bên dưới cũng hoạt động trong Firefox mà không cần bất kỳ JavaScript nào:

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

Tôi có cùng một vấn đề và trong khi tìm kiếm tôi đã gặp câu hỏi này, và sau khi tôi tìm thấy một giải pháp tốt cho mình, tôi muốn chia sẻ nó với các bạn trong trường hợp ai đó có thể hưởng lợi từ nó.

Đây là:

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

Sau khi khách hàng thực hiện lựa chọn đầu tiên, không cần bất kỳ màu xám nào, vì vậy mã JavaScript sẽ loại bỏ lớp place_holder.

Nhờ @ user1096901, như một cách giải quyết cho trình duyệt Internet Explorer, bạn có thể thêm place_holderlớp một lần nữa trong trường hợp tùy chọn đầu tiên được chọn lại :)


2
Trong một số trình duyệt, anh ta vẫn có thể chọn màn hình: không có tùy chọn nào, vì nó không bị ẩn.
Srneczek

Công việc xung quanh việc này là thêm lớp "place_holder" trong trường hợp tùy chọn đầu tiên được chọn :)
rramiii

23

Không cần bất kỳ JavaScript hay CSS nào, chỉ có ba thuộc tính:

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

Nó hoàn toàn không hiển thị tùy chọn; nó chỉ đặt giá trị của tùy chọn làm mặc định.

Tuy nhiên, nếu bạn không thích một trình giữ chỗ có cùng màu với phần còn lại , bạn có thể sửa nó theo dòng như sau:

<!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>

Rõ ràng, bạn có thể tách các chức năng và ít nhất là CSS được chọn thành các tệp riêng biệt.

Lưu ý: chức năng onload sửa lỗi làm mới.


Điều này không hoạt động nếu tùy chọn ẩn là duy nhất
Eridanis

nhưng tại sao bạn lại có một menu thả xuống chỉ với một lựa chọn?
Jacob Schneider

Tôi có một cửa sổ bật lên được gắn thẻ và menu thả xuống từ tab3 lấy đầu vào từ tab2, nó hiển thị. Câu trả lời của bạn là tốt và đây là một trường hợp góc, nhưng tôi đã mong đợi giá trị mặc định sẽ hiển thị như là tùy chọn đầu tiên, thay vào đó bạn nhận được một thả xuống. Xem tại đây: jsfiddle.net/n66L7sza
Eridanis

Đó là một điểm tốt, trong trường hợp bạn có thể quét độ dài của danh sách thả xuống, nếu nó bằng 0, thì hãy xóa thuộc tính ẩn
Jacob Schneider

Điều này dường như không hoạt động chính xác trên Google Chrome 65.0.3325.181 trên MacOS, nó không hiển thị mục ẩn và chọn mục bên dưới nó.
Jamie H

19

Người dùng không nên thấy trình giữ chỗ trong các tùy chọn chọn. Tôi đề nghị sử dụng hiddenthuộc tính cho tùy chọn giữ chỗ và bạn không cần selectedthuộc tính cho tùy chọn này. Bạn chỉ có thể đặt nó là đầu tiên.

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
hoặc select:invalidcũng hợp lệ.
elquimista

2
Tôi khuyên bạn nên cái này vì nó không có văn bản giữ chỗ trong danh sách, ít nhất là trong Chrome.
JoeRaid

Lưu ý rằng phong cách không hoạt động mà không córequired
akmalhakimi1991

18

Ở đây tôi đã sửa đổi câu trả lời của David (câu trả lời được chấp nhận). Theo câu trả lời của mình, anh ta đặt thuộc tính bị vô hiệu hóa và được chọn vàooption thẻ, nhưng khi chúng tôi cũng đặt thẻ ẩn thì nó sẽ trông tốt hơn nhiều.

Bằng cách thêm một thuộc tính ẩn bổ sung trên optionthẻ, nó sẽ ngăn tùy chọn "Chọn tùy chọn của bạn" được chọn lại sau khi tùy chọn "Durr" được chọn.

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


Cảm ơn đã cập nhật, nhưng câu trả lời vẫn không giải thích được tại sao nó trông khác. Ví dụ: câu trả lời này ngăn tùy chọn "Chọn tùy chọn của bạn" được chọn lại sau khi tùy chọn "Durr" được chọn. Thuộc tính nào gây ra hành vi này?
bgran

16

Đây là của tôi:

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>


Bạn chỉ có thể thêm <option value="" selected disabled>Please select</option>như là tùy chọn đầu tiên.
sstauross

Nó không làm cho chỗ giữ màu xám nhạt.
Chloe

12

Tôi thấy các dấu hiệu của câu trả lời đúng, nhưng để kết hợp tất cả lại, đây sẽ là giải pháp của tôi:

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
Durrcó màu xám sau khi bạn chọn nó. Điều này buộc hộp chọn đóng phải có màu xám luôn.
Chloe

9

Nếu bạn đang sử dụng Angular, hãy đi như thế này:

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


Bạn có thể thêm hiddenthuộc tính để tùy chọn đó không hiển thị khi mở select. Nhưng cảm ơn bất kỳ cách nào cho câu trả lời đó, nó đã làm việc cho tôi.
dcg

5

HTML + CSSGiải pháp này hiệu quả với tôi:

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>

Chúc may mắn...


Nó dường như không hoạt động trong JQuery 3.4.1
geobudex

5

Một khả năng khác trong 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');
    }
});

Câu đố


4

Tôi thích giải pháp được chấp nhận và nó hoạt động tuyệt vời mà không cần JavaScript.

Tôi chỉ muốn thêm cách tôi chấp nhận câu trả lời này cho Thành phần Phản ứng được chọn có kiểm soát , bởi vì tôi phải mất một vài lần để tìm ra nó. Sẽ rất đơn giản để kết hợp react-selectvà thực hiện với nó, nhưng trừ khi bạn cần chức năng tuyệt vời mà kho lưu trữ này cung cấp, mà tôi không có cho dự án đang đề cập, không cần thêm bất kỳ kilobyte nào vào gói của tôi. Lưu ý, react-selectxử lý giữ chỗ trong các lựa chọn thông qua một hệ thống phức tạp gồm nhiều yếu tố inputshtmlyếu tố khác nhau .

Trong React, đối với thành phần được kiểm soát , bạn không thể thêm selectedthuộc tính vào tùy chọn của mình. React xử lý trạng thái của lựa chọn thông qua một valuethuộc tính trên selectchính nó, cùng với trình xử lý thay đổi, trong đó giá trị phải khớp với một trong các thuộc tính giá trị trong chính các tùy chọn.

Chẳng hạn như, ví dụ

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

Vì nó sẽ không phù hợp và trên thực tế sẽ đưa ra một lỗi để thêm selectedthuộc tính vào một trong các tùy chọn, sau đó thì sao?

Câu trả lời rất đơn giản khi bạn nghĩ về nó. Kể từ khi chúng tôi muốn chúng tôi đầu tiên optionselectedcũng như disabledhidden, chúng ta cần phải làm ba việc:

  1. Thêm thuộc tính hiddendisabledvào định nghĩa đầu tiên option.
  2. Đặt giá trị của đầu tiên optionlà một chuỗi rỗng.
  3. Khởi tạo giá trị của chuỗi selectcũng là một chuỗi rỗng.
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>

Bây giờ bạn có thể định kiểu chọn như được chỉ ra ở trên (hoặc thông qua classNamenếu bạn muốn).

select:invalid { color: gray; }

3

[type="text"]Giữ chỗ kiểu đầu vào cho các thành phần chọn

Giải pháp sau đây mô phỏng trình giữ chỗ vì nó liên quan đến một input[type="text"]yếu tố:

$('.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

Tôi muốn CHỌN có màu xám cho đến khi được chọn vì vậy đoạn HTML này:

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

Tôi đã thêm các định nghĩa CSS này:

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

Nó hoạt động như mong đợi trong Chrome / Safari và có thể trong các trình duyệt khác, nhưng tôi chưa kiểm tra.


3

Đây là một giải pháp CSS hoạt động rất đẹp. Nội dung được thêm vào (và được định vị tuyệt đối so với vùng chứa) sau phần tử chứa ( thông qua: sau lớp giả ).

Nó nhận được văn bản từ thuộc tính giữ chỗ mà tôi đã xác định nơi tôi đã sử dụng lệnh ( attr (giữ chỗ) ). Một yếu tố quan trọng khác là các sự kiện con trỏ: không có - điều này cho phép các nhấp chuột vào văn bản giữ chỗ để chuyển qua lựa chọn. Nếu không, nó sẽ không rơi xuống nếu người dùng nhấp vào văn bản.

Tôi tự thêm lớp .empty vào chỉ thị đã chọn của mình, nhưng thông thường tôi thấy rằng góc đó thêm / xóa .ng-blank cho tôi (tôi cho rằng đó là vì tôi đang tiêm phiên bản 1.2 của Angular trong mẫu mã của mình).

(Mẫu cũng trình bày cách bọc các phần tử HTML trong AngularJS để tạo đầu vào tùy chỉnh của riêng bạn)

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

Hiện tại tôi không thể làm cho bất kỳ thứ nào trong số này hoạt động được, vì đối với tôi, nó là (1) không bắt buộc và (2) cần tùy chọn để trở về mặc định có thể chọn. Vì vậy, đây là một tùy chọn nặng tay nếu bạn đang sử dụng 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>


Cảm ơn, đây là điều tốt nhất cho tôi, như bạn đã nói ... yếu tố chọn là bắt buộc.
Mousa Alfh Daily

3

Tôi không hài lòng với các giải pháp chỉ HTML / CSS, vì vậy tôi đã quyết định tạo một tùy chỉnh selectbằng JavaScript.

Đây là điều tôi đã viết trong 30 phút qua, do đó nó có thể được cải thiện hơn nữa.

Tất cả bạn phải làm là tạo một danh sách đơn giản với một vài thuộc tính dữ liệu. Mã sẽ tự động biến danh sách thành một danh sách thả xuống có thể lựa chọn. Nó cũng thêm một ẩninput để giữ giá trị đã chọn, vì vậy nó có thể được sử dụng trong một biểu mẫu.

Đầu vào:

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

Đầu ra:

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

Văn bản của mục được cho là giữ chỗ bị mờ đi. Giữ chỗ có thể lựa chọn, trong trường hợp người dùng muốn hoàn nguyên lựa chọn của mình. Cũng sử dụng CSS, tất cả các nhược điểm của selectcó thể được khắc phục (ví dụ: không có khả năng tạo kiểu của các tùy chọn).


Cập nhật : Tôi đã cải thiện điều này (lựa chọn sử dụng phím lên / xuống / nhập), thu dọn đầu ra một chút và biến điều này thành một đối tượng. Sản lượng hiện tại:

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

Khởi tạo:

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

Để kiểm tra thêm: JSFiddle , GitHub (đã đổi tên).


Cập nhật: Tôi đã viết lại điều này một lần nữa. Thay vì sử dụng một danh sách, chúng ta chỉ có thể sử dụng một lựa chọn. Bằng cách này, nó sẽ hoạt động ngay cả khi không có JavaScript (trong trường hợp nó bị vô hiệu hóa).

Đầu vào:

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

Đầu ra:

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

Mã thông báo , GitHub .


2

Bạn cần xác thực mẫu và các trình duyệt hiện đại cung cấp điều này từ đầu.

Vì vậy, bạn không cần phải quan tâm rằng người dùng không thể chọn trường. Bởi vì khi anh ta đang làm điều đó, xác nhận trình duyệt sẽ cho anh ta biết rằng đây là một lựa chọn sai.

Trình duyệt được xây dựng trong chức năng xác thực checkValids () .

Bootstrap cũng có một ví dụ hay.

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

Bạn có thể làm điều này mà không sử dụng Javascriptchỉ sử dụng HTMLbạn cần phải thiết lập mặc định chọn tùy chọn disabled=""selected=""và chọn thẻ required="".trình duyệt không cho phép người sử dụng để gửi biểu mẫu mà không chọn một lựa chọn.

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

Điều này làm cho toàn bộ phần tử chọn bị mờ đi cho đến khi một tùy chọn được chọn, do đó gây ra một hành vi không mong muốn tiềm tàng.
wickychild

1

Trong Angular, chúng ta có thể thêm một tùy chọn là trình giữ chỗ có thể được ẩn trong trình đơn thả xuống tùy chọn. Chúng tôi thậm chí có thể thêm biểu tượng thả xuống tùy chỉnh làm nền thay thế biểu tượng thả xuống của trình duyệt .

Các mẹo là để cho phép giữ chỗ css chỉ khi giá trị không được chọn

/ ** Mẫu thành phần của tôi * /

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

/ ** Thành phần của tôi.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

Giải pháp cho góc 2

Tạo nhãn trên đầu chọn

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

và áp dụng CSS để đặt nó lên hàng đầu

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

pointer-events: none cho phép bạn hiển thị lựa chọn khi bạn nhấp vào nhãn, được ẩn khi bạn chọn một tùy chọn.


1

Đây là đóng góp của tôi. Haml + CoffeeScript + SCSS

Haml

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

Cà phê

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

SCSS

select option {
  color: black;
}

Chỉ có thể sử dụng CSS bằng cách thay đổi mã máy chủ và chỉ đặt kiểu lớp tùy thuộc vào giá trị hiện tại của thuộc tính, nhưng cách này có vẻ dễ dàng và sạch sẽ hơn.

$('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>

Bạn có thể thêm nhiều CSS ( select option:first-child) để giữ chỗ giữ màu xám khi mở, nhưng tôi không quan tâm đến điều đó.


1

Hãy thử điều này để thay đổi:

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

1

Dưới đây là một ví dụ hoạt động làm thế nào để đạt được điều này với JavaScript thuần xử lý màu tùy chọn sau lần nhấp đầu tiên:

<!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

Dựa trên câu trả lời của MattW , bạn có thể hiển thị tùy chọn giữ chỗ đã chọn trong menu thả xuống sau khi lựa chọn hợp lệ được thực hiện, bằng cách ẩn nó một cách có điều kiện trong khi giữ chỗ vẫn được chọn (và do đó lựa chọn là: không hợp lệ).

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

Dựa trên phản hồi của Albireo , phiên bản này không sử dụng jQuery và tính đặc hiệu CSS sẽ tốt hơn.

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.