Używam symboli zastępczych do wprowadzania tekstu, co działa dobrze. Ale chciałbym również użyć symbolu zastępczego dla moich pól wyboru. Oczywiście mogę po prostu użyć tego kodu:
<select>
<option value="">Select your option</option>
<option value="hurr">Durr</option>
</select>
Ale „Wybierz opcję” ma kolor czarny zamiast jasnoszarego. Więc moje rozwiązanie może być oparte na CSS. jQuery też jest w porządku.
To powoduje, że opcja ta staje się szara w menu rozwijanym (więc po kliknięciu strzałki):
option:first {
color: #999;
}
Pytanie brzmi: w jaki sposób ludzie tworzą symbole zastępcze w polach wyboru? Ale już na to odpowiedziano, na zdrowie.
A użycie tego powoduje, że wybrana wartość jest zawsze szara (nawet po wybraniu rzeczywistej opcji):
select {
color: #999;
}
html
css
html-select
placeholder
Tomasz
źródło
źródło
Odpowiedzi:
Non-CSS - brak odpowiedzi na JavaScript / jQuery:
źródło
<select> <option value="" disabled selected>Select your option</option> </select>
Właśnie natknąłem się na to pytanie, a oto, co działa w Firefoksie i Chrome (przynajmniej):
Opcja Wyłączona zatrzymuje zaznaczanie
<option>
zarówno myszą, jak i klawiaturą, natomiast samo użycie'display:none'
pozwala użytkownikowi nadal wybierać za pomocą strzałek na klawiaturze.'display:none'
Styl po prostu sprawia, że pole listy wygląd „miły”.Uwaga: użycie pustego
value
atrybutu w opcji „symbol zastępczy” pozwala na sprawdzenie poprawności (wymagany atrybut) w celu obejścia posiadania „symbolu zastępczego”, więc jeśli opcja nie zostanie zmieniona, ale jest wymagana, przeglądarka powinna poprosić użytkownika o wybranie opcji z listy.Aktualizacja (lipiec 2015 r.):
Ta metoda została potwierdzona w następujących przeglądarkach:
Aktualizacja (październik 2015 r.):
Usunąłem na
style="display: none"
korzyść atrybutu HTML5,hidden
który ma szerokie wsparcie.hidden
Element ma podobne cechy jakdisplay: none
w Safari, Internet Explorer (projekt Spartan wymaga kontroli), gdzieoption
jest widoczny na liście rozwijanej, ale to nie jest wybierana.Aktualizacja (styczeń 2016 r.):
Gdy
select
element jestrequired
, pozwala na użycie:invalid
pseudoklasy CSS, która umożliwia stylizacjęselect
elementu w stanie „zastępczym”.:invalid
działa tutaj z powodu pustej wartości w symbolu zastępczymoption
.Po ustawieniu wartości
:invalid
pseudoklasa zostanie porzucona. Opcjonalnie możesz również użyć,:valid
jeśli chcesz.Większość przeglądarek obsługuje tę pseudoklasę. Internet Explorer 10 i nowszy. Działa to najlepiej w przypadku niestandardowych
select
elementów; w niektórych przypadkach, np. (Mac w Chrome / Safari), musisz zmienić domyślny wyglądselect
pudełka, aby wyświetlały się określone style, tj .background-color
icolor
. Przykłady i więcej informacji na temat zgodności można znaleźć na stronie developer.mozilla.org .Wygląd elementu natywnego Mac w Chrome:
Używanie zmienionego elementu obramowania Mac w Chrome:
źródło
display:none
styl.:invalid
sposobu, zanim to zrobiłem.color
opcje obsługi przeglądarek tak jak w tym skrzypce . Pomogłoby to potwierdzić, że wyłączonyoption
jest symbolem zastępczym. (Edycja: Widzę, że MattW już to omówił w swojej odpowiedzi)W przypadku wymaganego pola istnieje nowoczesne rozwiązanie CSS w czysto CSS:
źródło
required
działać, więc nie ma sensu, jeśli chcesz, aby pole było opcjonalne.:required
selektor nie jest obsługiwany w IE8 i niższych wersjach.:invalid
Selektor nie jest obsługiwana w IE9 i poniżej. quirksmode.org/css/selectorsrequired
warunek powoduje, że przeglądarka stosuje:invalid
pseudoklasę po wybraniu symbolu zastępczego.[value=""]
nie będzie działać jako zamiennik, ponieważ to, co jest aktualizowane przez interakcję użytkownika, jest właściwością value, ale ta składnia CSS odnosi się do (nieistniejącego) atrybutu .Coś takiego:
HTML:
CSS:
JavaScript:
Przykład roboczy: http://jsfiddle.net/Zmf6t/
źródło
Właśnie dodałem ukryty atrybut w
option
podobny sposób poniżej. Dla mnie działa dobrze.źródło
Poniższe rozwiązanie działa również w przeglądarce Firefox bez JavaScript:
źródło
Miałem ten sam problem i podczas wyszukiwania natknąłem się na to pytanie, a kiedy znalazłem dla siebie dobre rozwiązanie, chciałbym się z wami podzielić na wypadek, gdyby ktoś mógł z niego skorzystać.
Oto on:
HTML:
CSS:
JavaScript:
Po tym, jak klient dokona pierwszego wyboru, szary kolor nie jest potrzebny, więc kod JavaScript usuwa klasę
place_holder
.Dzięki @ user1096901, jako obejście dla przeglądarki Internet Explorer, możesz
place_holder
ponownie dodać klasę na wypadek, gdyby pierwsza opcja została ponownie wybrana :)źródło
Nie ma potrzeby używania JavaScript ani CSS, tylko trzy atrybuty:
W ogóle nie pokazuje opcji; po prostu ustawia wartość opcji jako domyślną.
Jeśli jednak nie podoba ci się symbol zastępczy tego samego koloru, co pozostałe , możesz to naprawić w następujący sposób:
Oczywiście możesz podzielić funkcje i przynajmniej CSS select na osobne pliki.
Uwaga: funkcja onload naprawia błąd odświeżania.
źródło
Użytkownik nie powinien widzieć symbolu zastępczego w wybranych opcjach. Sugeruję użycie
hidden
atrybutu dla opcji zastępczej i nie potrzebujeszselected
atrybutu dla tej opcji. Możesz to po prostu ustawić jako pierwszy.źródło
select:invalid
jest również ważny.required
Tutaj zmodyfikowałem odpowiedź Dawida (odpowiedź zaakceptowana). Na swoją odpowiedź umieścił wyłączony i wybrany atrybut na
option
tagu, ale kiedy również umieścimy ukryty tag, będzie on wyglądał znacznie lepiej.Dodanie dodatkowego ukrytego atrybutu do
option
tagu zapobiegnie ponownemu wybraniu opcji „Wybierz opcję” po wybraniu opcji „Durr”.źródło
Tutaj jest moje:
źródło
<option value="" selected disabled>Please select</option>
jako pierwszą opcję.Widzę oznaki poprawnych odpowiedzi, ale aby to wszystko połączyć, oto moje rozwiązanie:
źródło
Durr
jest zaznaczone na szaro po wybraniu. Zmusza to zawsze zamknięte pole wyboru do szarości.Jeśli używasz Angulara, wykonaj następujące czynności:
źródło
hidden
atrybut, aby ta opcja nie była wyświetlana podczas otwieraniaselect
. Ale dzięki w jakikolwiek sposób za tę odpowiedź, zadziałała dla mnie.To
HTML + CSS
rozwiązanie działało dla mnie:Powodzenia...
źródło
Inna możliwość w JavaScript:
JSFiddle
źródło
Uwielbiam przyjęte rozwiązanie i działa świetnie bez JavaScript.
Chcę tylko dodać, w jaki sposób zastosowałem tę odpowiedź dla kontrolowanego komponentu React , ponieważ zajęło mi to kilka prób, aby to rozgryźć. Byłoby to naprawdę łatwe do włączenia
react-select
i wykonania, ale jeśli nie potrzebujesz niesamowitej funkcjonalności, jaką zapewnia to repozytorium, czego nie mam w przypadku omawianego projektu, nie ma potrzeby dodawania więcej kilobajtów do mojego pakietu. Uwaga:react-select
obsługuje symbole zastępcze w selekcjach poprzez złożony system różnych elementówinputs
ihtml
elementów.W React dla kontrolowanego komponentu nie można dodać
selected
atrybutu do opcji. React obsługuje stan zaznaczenia za pomocąvalue
atrybutu naselect
sobie, wraz z modułem obsługi zmian, w którym wartość powinna pasować do jednego z atrybutów wartości w samych opcjach.Takich jak na przykład
Ponieważ byłoby to niewłaściwe i w rzeczywistości spowodowałoby błąd dodania
selected
atrybutu do jednej z opcji, co wtedy?Odpowiedź jest prosta, gdy się nad tym zastanowisz. Ponieważ chcemy, aby nasz pierwszy
option
byłselected
równie dobry,disabled
ihidden
musimy zrobić trzy rzeczy:hidden
idisabled
do pierwszego zdefiniowanegooption
.option
na pusty ciąg.select
to również pusty ciąg.Teraz możesz stylizować zaznaczenie jak wskazano powyżej (lub za pomocą a,
className
jeśli wolisz).źródło
[type="text"]
Symbol zastępczy stylu wprowadzania dla wybranych elementówPoniższe rozwiązanie symuluje symbol zastępczy, ponieważ odnosi się do
input[type="text"]
elementu:źródło
Chciałem, aby SELECT był szary, dopóki nie zostanie wybrany, więc dla tego fragmentu HTML:
Dodałem te definicje CSS:
Działa zgodnie z oczekiwaniami w Chrome / Safari i może także w innych przeglądarkach, ale nie sprawdziłem.
źródło
Oto rozwiązanie CSS , które działa pięknie. Zawartość jest dodawana (i absolutnie pozycjonowana względem kontenera) po elemencie zawierającym ( przez: po pseudoklasie ).
Pobiera tekst z atrybutu placeholder, który zdefiniowałem w miejscu, w którym użyłem dyrektywy ( attr (placeholder) ). Kolejnym kluczowym czynnikiem są zdarzenia wskaźnikowe: brak - pozwala to na kliknięcie tekstu zastępczego w celu przejścia do zaznaczenia. W przeciwnym razie nie spadnie, jeśli użytkownik kliknie tekst.
Sam dodaję klasę .empty do mojej dyrektywy select, ale zwykle uważam, że angular dodaje / usuwa .ng-empty dla mnie (zakładam, że to dlatego, że wstrzykuję wersję 1.2 Angulara do mojej próbki kodu).
(Przykład pokazuje również, jak zawijać elementy HTML w AngularJS, aby tworzyć własne niestandardowe dane wejściowe)
źródło
Nie mogłem sprawić, aby którykolwiek z nich działał obecnie, ponieważ dla mnie jest to (1) nie wymagane i (2) potrzebuję opcji powrotu do domyślnego wyboru. Tak więc, jeśli używasz jQuery:
źródło
Nie jestem zadowolony z rozwiązań opartych tylko na HTML / CSS, więc zdecydowałem się utworzyć niestandardowy
select
za pomocą JavaScript.Jest to coś, co napisałem w ciągu ostatnich 30 minut, dzięki czemu można go jeszcze ulepszyć.
Wszystko, co musisz zrobić, to stworzyć prostą listę z kilkoma atrybutami danych. Kod automatycznie zamienia listę w rozwijalne menu do wyboru. Dodaje również ukryty
input
do przechowywania wybranej wartości, dzięki czemu można go użyć w formularzu.Wejście:
Wynik:
Tekst elementu, który ma być symbolem zastępczym, jest wyszarzony. Symbol zastępczy można wybrać na wypadek, gdyby użytkownik chciał cofnąć swój wybór. Również za pomocą CSS
select
można przezwyciężyć wszystkie wady (np. Niemożność stylizacji opcji).Pokaż fragment kodu
Aktualizacja : Ulepszyłem to (wybór za pomocą klawiszy góra / dół / enter), trochę posprzątałem wynik i zamieniłem go w obiekt. Wyjście prądowe:
Inicjalizacja:
Do dalszego badania: JSFiddle ,
GitHub(przemianowany).Aktualizacja: przepisałem to ponownie. Zamiast korzystać z listy, możemy po prostu użyć opcji select. W ten sposób będzie działać nawet bez JavaScript (w przypadku, gdy jest wyłączony).
Wejście:
Wynik:
JSFiddle , GitHub .
źródło
Potrzebujesz sprawdzania poprawności formularza, a nowoczesne przeglądarki oferują to od zera.
Nie musisz więc uważać, aby użytkownik nie mógł wybrać pola. Ponieważ kiedy to robi, walidacja przeglądarki powie mu, że jest to zły wybór.
Przeglądarka ma wbudowaną funkcję sprawdzania poprawności checkValidity () .
Bootstrap ma również dobry przykład.
HTML
JavaScript
źródło
źródło
W Angular możemy dodać opcję jako symbol zastępczy, który można ukryć w menu rozwijanym opcji. Możemy nawet dodać niestandardową ikonę rozwijaną jako tło, która zastępuje ikonę rozwijaną przeglądarki .
Sztuką jest, aby umożliwić zastępczy css tylko wtedy, gdy wartość nie jest wybrany
/ ** Mój szablon komponentu * /
/ ** My Component.TS * /
/**global.scss*/
źródło
Rozwiązanie dla Angular 2
Utwórz etykietę na górze zaznaczenia
i zastosuj CSS, aby umieścić go na wierzchu
pointer-events: none
pozwala wyświetlić opcję wyboru po kliknięciu etykiety, która jest ukryta po wybraniu opcji.kątowy HTML css
źródło
Oto mój wkład. Haml + CoffeeScript + SCSS
Haml
CoffeeScript
SCSS
Można używać tylko CSS, zmieniając kod serwera i ustawiając style klas tylko w zależności od bieżącej wartości właściwości, ale ten sposób wydaje się łatwiejszy i czystszy.
Możesz dodać więcej CSS (
select option:first-child
), aby zachować symbol zastępczy szary, gdy się otworzy, ale mnie to nie obchodziło.źródło
Wypróbuj to dla odmiany:
źródło
Oto działający przykład, jak to osiągnąć za pomocą czystego JavaScript, który obsługuje kolor opcji po pierwszym kliknięciu:
źródło
Opierając się na odpowiedzi MattW , możesz uczynić opcję wyboru symbolu zastępczego widoczną w menu rozwijanym po dokonaniu prawidłowego wyboru, warunkowo ukrywając ją tylko wtedy, gdy symbol zastępczy pozostaje wybrany (a zatem wybór jest: nieważny).
źródło
Na podstawie odpowiedzi Albireo ta wersja nie używa jQuery, a specyfika CSS jest lepsza.
źródło