ฉันจะสร้างตัวแทนสำหรับกล่อง 'เลือก' ได้อย่างไร


1542

ฉันใช้ตัวยึดตำแหน่งสำหรับการป้อนข้อความที่ใช้งานได้ดี แต่ฉันต้องการใช้ตัวยึดตำแหน่งสำหรับ selectboxes ของฉันเช่นกัน แน่นอนฉันสามารถใช้รหัสนี้:

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

แต่ 'เลือกตัวเลือกของคุณ' เป็นสีดำแทนที่จะเป็นสีอ่อน ดังนั้นทางออกของฉันอาจเป็นไปตาม CSS jQuery ก็ใช้ได้เช่นกัน

สิ่งนี้ทำให้ตัวเลือกเป็นสีเทาเท่านั้นในดรอปดาวน์ (ดังนั้นหลังจากคลิกลูกศร):

option:first {
    color: #999;
}

คำถามคือ: ผู้คนสร้างตัวยึดตำแหน่งใน Selectboxes ได้อย่างไร แต่มันก็ได้รับคำตอบแล้วเสียงเชียร์

และการใช้ผลลัพธ์นี้ในค่าที่เลือกจะเป็นสีเทาเสมอ (แม้หลังจากเลือกตัวเลือกจริง):

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
เหตุผลที่นี่ไม่ใช่คำตอบที่ถูกต้องเพราะ (ฉันเชื่อ) ผู้ถามต้องการให้เลือกเป็นสีเทาจนกว่าจะมีการเลือกค่าอื่น คำตอบนี้ทำให้ตัวเลือกสีเทาในเมนูแบบเลื่อนลง; แต่ไม่ใช่องค์ประกอบที่เลือก
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):

วิธีนี้ได้รับการยืนยันว่าทำงานในเบราว์เซอร์ต่อไปนี้:

  • 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 (ตัวยึดสามารถมองเห็นได้ในดรอปดาวน์ แต่ไม่สามารถเลือกได้)

อัปเดต (ตุลาคม 2558):

ฉันลบstyle="display: none"แอตทริบิวต์ HTML5 hiddenที่รองรับได้กว้าง hiddenองค์ประกอบมีลักษณะคล้ายกันdisplay: noneใน Safari, Internet Explorer (โครงการสปาร์ตันต้องการตรวจสอบ) ที่optionปรากฏอยู่ในแบบเลื่อนลง แต่ก็ไม่ได้เลือก

อัปเดต (มกราคม 2559):

เมื่อselectองค์ประกอบคือrequiredมันช่วยให้การใช้:invalidCSS หลอกระดับซึ่งช่วยให้คุณสามารถสไตล์selectองค์ประกอบเมื่ออยู่ในสถานะ "ตัวยึด" ของมัน ทำงานที่นี่เพราะของมูลค่าว่างในตัวยึด:invalidoption

เมื่อตั้งค่าแล้ว:invalidคลาสหลอกจะถูกลบ คุณสามารถเลือกที่จะใช้:validถ้าคุณต้องการ

เบราว์เซอร์ส่วนใหญ่รองรับคลาสหลอกนี้ Internet Explorer 10 และใหม่กว่า สิ่งนี้ทำงานได้ดีที่สุดกับselectองค์ประกอบแบบกำหนดเอง ในบางกรณีเช่น (Mac ใน Chrome / Safari) ที่คุณจะต้องเปลี่ยนลักษณะเริ่มต้นของselectกล่องเพื่อให้การแสดงผลบางรูปแบบเช่นและbackground-color colorคุณสามารถค้นหาตัวอย่างบางส่วนและอื่น ๆ เกี่ยวกับการทำงานร่วมกันที่developer.mozilla.org

องค์ประกอบพื้นฐาน Native Mac ใน Chrome:

เลือก box native Mac ใน Chrome

การใช้องค์ประกอบเส้นขอบเปลี่ยนแปลงใน Mac:

กล่องเลือกที่ถูกเปลี่ยนแปลง Mac ใน Chrome


5
@jaacob ในเบราว์เซอร์ที่ฉันได้ทดสอบสไตล์ 'display: none' จะซ่อน "โปรดเลือก" จากรายการที่ทำให้มันดูดีกว่า
William Isted

38
สิ่งสำคัญที่ควรทราบว่าตัวเลือกที่ปิดใช้งานไม่สามารถเลือกได้อีกครั้ง: หากตัวเลือกเป็นสิ่งจำเป็นคำสั่งนี้ใช้ได้ - แต่ไม่ใช่ถ้าตัวเลือกเป็นตัวเลือก
Robert Mark Bram

2
Explorer11 ละเว้นdisplay:noneสไตล์
T30

1
ความรุ่งโรจน์ถึง @MattW สำหรับ:invalidวิธีการทำงานก่อนที่ฉันจะ
วิลเลียม Isted

3
คุณสามารถเพิ่มกฎเพื่อ "รีเซ็ต" colorตัวเลือกในการสนับสนุนเบราว์เซอร์เช่นเดียวกับซอนี้ นี่จะช่วยเสริมว่า disbled optionเป็นตัวยึดตำแหน่ง (แก้ไข: ฉันเห็น MattW ได้กล่าวถึงเรื่องนี้ในคำตอบของเขาแล้ว)
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
น่าทึ่ง - มันเป็นคำตอบที่ด้านล่าง (ยังไม่มี upvotes) ที่ง่ายที่สุดและใช้งานได้จริงอย่างสมบูรณ์แบบ ขอบคุณ! หวังว่าคำตอบนี้จะเพิ่มขึ้นไปด้านบน
Dan Nissenbaum

2
@DanNissenbaum ฉันมาช้ามากในการเล่นเกมรวมถึงมันต้องมีrequiredการทำงานดังนั้นจึงไม่มีประโยชน์ถ้าคุณต้องการให้ฟิลด์เป็นตัวเลือก
MattW

1
เช่นกันที่:requiredเลือกไม่ได้รับการสนับสนุนใน IE8 และด้านล่าง :invalidเลือกไม่ได้รับการสนับสนุนใน IE9 และด้านล่าง quirksmode.org/css/selectors
Matt Wagner

4
ไม่มีวิธีแก้ปัญหาสำหรับตัวเลือกที่ไม่จำเป็น?
user3494047

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

ทำไมคุณถึงเรียกฟังก์ชั่นการเปลี่ยนแปลงอย่างชัดเจน
Foreever

@ ทุกอย่างเพราะฉันตั้งค่าคลาส CSS ในตัวจัดการเหตุการณ์การเปลี่ยนแปลงของตัวเลือกดังนั้นหากคุณไม่เพิ่มเหตุการณ์ด้วยตนเองเมื่อตัวควบคุมถูกสร้างขึ้นสไตล์จะไม่ถูกนำไปใช้ (มันจะถูกนำไปใช้เฉพาะเมื่อผู้ใช้เปลี่ยนค่าด้วยตนเอง)
Albireo

สิ่งนี้ไม่ทำงานกับ JQeury 3.4.1
geobudex

45

ฉันเพิ่งเพิ่มแอตทริบิวต์ที่ซ่อนอยู่ในรายการoptionด้านล่าง มันทำงานได้ดีสำหรับฉัน

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


2
เพียงบันทึกนี้ไม่ได้สำหรับฉัน (Chrome บน Win10)
Chris Rae

แต่คุณไม่สามารถล้างมันได้ คุณเลือกได้ แต่คุณไม่สามารถรีเซ็ตได้ในกรณีที่คุณเปลี่ยนใจ
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 ของการเลือกออกเป็นไฟล์แยก

หมายเหตุ:ฟังก์ชั่น onload แก้ไขข้อผิดพลาดในการรีเฟรช


วิธีนี้ใช้ไม่ได้หากตัวเลือกที่ซ่อนอยู่เป็นตัวเดียวเท่านั้น
Eridanis

แต่ทำไมคุณถึงมีเมนูแบบเลื่อนลงที่มีเพียงตัวเลือกเดียว?
Jacob Schneider

ฉันมีป๊อปอัพแบบแท็บและเมนูแบบเลื่อนลงจาก tab3 จะรับข้อมูลจาก tab2 ซึ่งจะแสดง คำตอบของคุณเป็นสิ่งที่ดีและเป็นกรณีมุม แต่ฉันคาดว่าค่าเริ่มต้นจะปรากฏเป็นตัวเลือกแรกแทนคุณจะได้รับการปล่อยว่างเปล่า ดูที่นี่: jsfiddle.net/n66L7sza
Eridanis

นั่นเป็นจุดที่ดีซึ่งในกรณีนี้คุณสามารถสแกนความยาวของดรอปดาวน์หากเป็นศูนย์ให้ลบแอตทริบิวต์ที่ซ่อนไว้ออก
Jacob Schneider

ดูเหมือนว่าจะทำงานไม่ถูกต้องใน Google Chrome 65.0.3325.181 บน MacOS แต่ก็ไม่ได้แสดงรายการที่ซ่อนอยู่และเลือกรายการด้านล่าง
เจมี่ 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

ที่นี่ฉันได้แก้ไขคำตอบของเดวิด (คำตอบที่ยอมรับได้) ในคำตอบของเขาเขาปิดการใช้งานและคุณลักษณะที่เลือกไว้บน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

หากคุณใช้แองกูลาร์ไปเช่นนี้:

<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จัดการกับตัวยึดตำแหน่งในการเลือกผ่านระบบที่ซับซ้อนขององค์ประกอบ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ที่ทำงานได้อย่างสวยงาม เนื้อหาจะถูกเพิ่ม (และวางตำแหน่งอย่างสัมพันธ์กับคอนเทนเนอร์) หลังจากองค์ประกอบที่มี ( ผ่าน: หลังคลาสเทียม )

มันได้รับข้อความจากแอตทริบิวต์ตัวแทนที่ฉันกำหนดที่ฉันใช้คำสั่ง ( attr (ตัวยึด) ) อีกหนึ่งปัจจัยสำคัญคือตัวชี้เหตุการณ์: ไม่มี - สิ่งนี้ช่วยให้การคลิกที่ข้อความตัวแทนที่จะผ่านไปยังการเลือก มิฉะนั้นจะไม่ลดลงหากผู้ใช้คลิกที่ข้อความ

ฉันจะเพิ่ม.emptyระดับตัวเองในคำสั่งเลือกของฉัน แต่ปกติผมพบเชิงมุมที่เพิ่ม / ลบ.ng ว่างเปล่าสำหรับผม (ฉันคิดว่ามันเป็นเพราะฉันฉีดรุ่น 1.2 ของเชิงมุมในตัวอย่างของรหัสของฉัน)

(ตัวอย่างยังสาธิตวิธีห่อองค์ประกอบ 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สามารถเอาชนะได้ (เช่นการไม่สามารถกำหนดสไตล์ของตัวเลือก)


อัปเดต : ฉันได้ปรับปรุงสิ่งนี้ (ส่วนที่เลือกโดยใช้ปุ่มขึ้น / ลง / 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]);

สำหรับการตรวจสอบเพิ่มเติม: 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 ()

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>

จาวาสคริ

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

ในเชิงมุมเราสามารถเพิ่มตัวเลือกเป็นตัวยึดที่สามารถซ่อนในตัวเลือกแบบเลื่อนลง เราสามารถเพิ่มไอคอนดร็อปดาวน์แบบกำหนดเองเป็นพื้นหลังที่แทนที่ไอคอนเบราว์เซอร์แบบหล่น

เคล็ดลับคือการเปิดใช้งานตัวยึด 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

วิธีแก้ปัญหาสำหรับเชิงมุม 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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.