Czy istnieje tylko styl CSS, aby stylizować <select>
menu rozwijane?
Muszę stylizować <select>
formularz tak bardzo, jak to tylko możliwe, bez JavaScript. Jakich właściwości mogę użyć w CSS?
Ten kod musi być zgodny ze wszystkimi głównymi przeglądarkami:
- Internet Explorer 6, 7 i 8
- Firefox
- Safari
Wiem, że mogę to zrobić za pomocą JavaScript: przykład .
I nie mówię o prostej stylizacji. Chcę wiedzieć, co najlepiej możemy zrobić tylko z CSS.
Znalazłem podobne pytania na temat przepełnienia stosu.
I ten na Doctype.com.
Odpowiedzi:
Oto trzy rozwiązania:
Rozwiązanie nr 1 - Wygląd: brak - z obejściem programu Internet Explorer 10–11 ( Demo )
-
Aby ukryć domyślny zestaw strzałek
appearance: none
na elemencie select, a następnie dodaj własną strzałkę niestandardową za pomocąbackground-image
Obsługa przeglądarki:
appearance: none
ma bardzo dobrą obsługę przeglądarki ( caniuse ) - z wyjątkiem Internet Explorera 11 (i późniejszych) i Firefox 34 (i późniejszych).Możemy ulepszyć tę technikę i dodać obsługę przeglądarki Internet Explorer 10 i Internet Explorer 11 poprzez dodanie
Jeśli problem dotyczy programu Internet Explorer 9, nie mamy możliwości usunięcia domyślnej strzałki (co oznaczałoby, że mamy teraz dwie strzałki), ale możemy użyć funkcyjnego selektora programu Internet Explorer 9.
Aby przynajmniej cofnąć naszą niestandardową strzałkę - pozostawiając domyślną strzałkę nienaruszoną.
Wszyscy razem:
Pokaż fragment kodu
To rozwiązanie jest łatwe i ma dobrą obsługę przeglądarki - ogólnie powinno wystarczyć.
Jeśli konieczna jest obsługa przeglądarki Internet Explorer 9 (i nowsze) i Firefox 34 (i nowsze), czytaj dalej ...
Rozwiązanie nr 2 Obetnij wybrany element, aby ukryć domyślną strzałkę ( wersja demonstracyjna )
-
(Przeczytaj więcej tutaj)
Zawiń
select
element w div o stałej szerokości ioverflow:hidden
.Następnie nadaj
select
elementowi szerokość około 20 pikseli większą niż div .W rezultacie domyślna strzałka rozwijana
select
elementu zostanie ukryta (ze względuoverflow:hidden
na na pojemniku) i możesz umieścić dowolny obraz tła, który chcesz, po prawej stronie div.Zaletą tego podejścia jest to, że z różnymi przeglądarkami (Internet Explorer 8 i nowsze, WebKit i Gecko ). Jednak wadą tego podejścia jest to, że lista rozwijana opcji wystaje po prawej stronie (o 20 pikseli, które ukryliśmy ... ponieważ elementy opcji przyjmują szerokość wybranego elementu).
[Należy jednak zauważyć, że jeśli niestandardowy element wyboru jest konieczny tylko dla urządzeń mobilnych - powyższy problem nie dotyczy - ze względu na sposób, w jaki każdy telefon natywnie otwiera element wyboru. Dla urządzeń mobilnych może to być najlepsze rozwiązanie.]
Pokaż fragment kodu
Jeśli niestandardowa strzałka jest niezbędna w przeglądarce Firefox - przed wersją 35 - ale nie musisz obsługiwać starych wersji programu Internet Explorer - czytaj dalej ...
Rozwiązanie nr 3 - Użyj
pointer-events
właściwości ( wersja demonstracyjna )-
(Przeczytaj więcej tutaj)
Chodzi o to, aby nałożyć element na natywną strzałkę rozwijaną (aby utworzyć naszą niestandardową), a następnie zabronić na nim zdarzeń wskaźnika.
Zaleta: Działa dobrze w WebKit i Gecko. Wygląda również dobrze (bez wystających
option
elementów).Wada: Internet Explorer (Internet Explorer 10 i nowsze) nie obsługuje
pointer-events
, co oznacza, że nie można kliknąć niestandardowej strzałki. Kolejną (oczywistą) wadą tej metody jest to, że nie można celować w nowy obraz strzałki za pomocą efektu aktywowania lub kursora ręki, ponieważ właśnie na nich wyłączyliśmy zdarzenia wskaźnika!Jednak za pomocą tej metody można użyć Modernizatora lub komentarzy warunkowych, aby przywrócić Internet Explorera do standardowej wbudowanej strzałki.
Uwaga: Ponieważ Internet Explorer 10 już nie obsługuje
conditional comments
: jeśli chcesz skorzystać z tego podejścia, prawdopodobnie powinieneś skorzystać z Modernizr . Nadal możliwe jest jednak wykluczenie CSS-a ze wskaźnikami z Internet Explorera 10 za pomocą opisanego tutaj hacka CSS .Pokaż fragment kodu
źródło
Jest to możliwe, ale niestety głównie w przeglądarkach opartych na WebKit w zakresie, w jakim my, jako programiści, wymagamy. Oto przykład stylu CSS zebranego z panelu opcji Chrome za pomocą wbudowanego inspektora narzędzi programistycznych, ulepszonego w celu dopasowania do obecnie obsługiwanych właściwości CSS w większości nowoczesnych przeglądarek:
Kiedy uruchomisz ten kod na dowolnej stronie w przeglądarce opartej na WebKit, powinien on zmienić wygląd pola wyboru, usunąć standardową strzałkę systemu operacyjnego i dodać strzałkę PNG, umieścić odstępy przed i po etykiecie, prawie wszystko, co chcesz.
Najważniejszą częścią jest
appearance
właściwość, która zmienia sposób zachowania elementu.Działa idealnie w prawie wszystkich przeglądarkach opartych na WebKit, w tym także na urządzeniach mobilnych, chociaż Gecko nie obsługuje
appearance
tak dobrze jak WebKit.źródło
text-indent: 0.01px; text-overflow: "";
, będzie działać jeszcze lepiejElement wyboru i jego rozwijana funkcja są trudne do stylizacji.
atrybuty stylu dla wybranego elementu autorstwa Chrisa Heilmanna potwierdzają to, co powiedział Ryan Dohery w komentarzu do pierwszej odpowiedzi:
źródło
Miałem dokładnie ten problem, ale nie mogłem używać obrazów i nie był ograniczony przez obsługę przeglądarki. To powinno być «w ciemno» i ze startu szczęście pracować wszędzie ostatecznie .
Używa warstwowych obróconych warstw tła, aby „wyciąć” strzałkę rozwijaną, ponieważ pseudoelementy nie działałyby dla wybranego elementu.
Edycja: W tej zaktualizowanej wersji używam zmiennych CSS i małego systemu tematycznego.
źródło
-moz-appearance: none;
Największą niespójnością, jaką zauważyłem podczas stylizowania menu rozwijanych wybranych, jest renderowanie Safari i Google Chrome (Firefox można w pełni dostosować za pomocą CSS). Po przeszukaniu niejasnych głębin Internetu natknąłem się na następujące, które prawie całkowicie rozwiązują moje problemy z WebKit:
Poprawka przeglądarki Safari i Google Chrome :
Spowoduje to jednak usunięcie strzałki rozwijanej. Możesz dodać strzałkę rozwijaną, używając pobliskiego
div
z tłem, ujemnym marginesem lub absolutnie umieszczonego nad rozwijanym wyborem.* Więcej informacji i inne zmienne są dostępne we właściwości CSS: -webkit-wygląd .
źródło
<select>
tagi mogą być stylizowane za pomocą CSS, tak jak każdy inny element HTML na stronie HTML renderowanej w przeglądarce. Poniżej znajduje się (zbyt prosty) przykład, który umieści element select na stronie i wyrenderuje tekst opcji na niebiesko.Przykładowy plik HTML (selectExample.html):
Przykładowy plik CSS (selectExample.css):
źródło
Wpis na blogu Jak rozwinąć styl CSS, JavaScript nie działa dla mnie, ale w Operze nie działa :
źródło
Oto wersja, która działa we wszystkich nowoczesnych przeglądarkach. Klawisz używa,
appearance:none
który usuwa domyślne formatowanie. Ponieważ całe formatowanie zniknęło, musisz dodać z powrotem strzałkę, która wizualnie odróżnia wybór od wejścia.Przykład roboczy: https://jsfiddle.net/gs2q1c7p/
źródło
Dotarłem do twojej sprawy za pomocą Bootstrap . To najprostsze rozwiązanie, które działa:
Uwaga: rzeczy base64 są
fa-chevron-down
w formacie SVG.źródło
W nowoczesnych przeglądarkach stylizacja
<select>
w CSS jest stosunkowo bezbolesna . Zappearance: none
jedynym Najtrudniejszą częścią jest zastąpienie strzałkę (jeśli to, co chcesz). Oto rozwiązanie wykorzystujące wbudowanydata:
identyfikator URI z jawnym tekstem SVG:Reszta stylizacji (obramowania, wypełnienie, kolory itp.) Jest dość prosta.
Działa to we wszystkich przeglądarkach, które właśnie wypróbowałem (Firefox 50, Chrome 55, Edge 38 i Safari 10). Jedna uwaga na temat Firefoksa polega na tym, że jeśli chcesz użyć
#
znaku w identyfikatorze URI danych (np.fill: #000
), Musisz go usunąć (fill: %23000
).źródło
height
i / lub tagu zamiast właściwości CSS .width
<svg>
background-size
źródło
Użyj
clip
właściwości, aby przyciąć ramki i strzałkęselect
elementu, a następnie dodaj własne style zastępowania do opakowania:Użyj drugiego wyboru z zerowym kryciem, aby przycisk można kliknąć:
Współrzędne różnią się między Webkitem a innymi przeglądarkami, ale zapytanie @media może to obejmować.
Bibliografia
źródło
Niestandardowe Wybierz style CSS
Testowany w Internet Explorerze (10 i 11), Edge, Firefox i Chrome
źródło
background-position: right 15px center, right 10px center;
Bardzo dobrym przykładem, który wykorzystuje
:after
i:before
do robienia sztuczek, jest Styling Select Box z CSS3 | CSSDeckźródło
Edycja tego elementu nie jest zalecana, ale jeśli chcesz spróbować, działa jak każdy inny element HTML.
Edytuj przykład:
źródło
Używa koloru tła dla wybranych elementów i usunąłem obraz.
źródło
Tak. Możesz stylizować dowolny element HTML według jego nazwy, na przykład:
Oczywiście możesz również użyć klasy CSS, aby ją stylizować, jak każdy inny element:
źródło
Oto rozwiązanie oparte na moich ulubionych pomysłach z tej dyskusji. Pozwala to na stylizowanie elementu <select> bezpośrednio, bez dodatkowych znaczników.
Działa Internet Explorer 10 (i nowsze wersje) z bezpieczną rezerwą dla Internet Explorera 8/9. Jednym z zastrzeżeń dla tych przeglądarek jest to, że obraz tła musi być ustawiony i być wystarczająco mały, aby ukryć się za natywną kontrolą rozwijania.
HTML
SCSS
CodePen
http://codepen.io/ralgh/pen/gpgbGx
źródło
Począwszy od Internet Explorera 10, możesz używać
::-ms-expand
selektora pseudoelementu do stylizowania i ukrywania elementu strzałki rozwijanej.Pozostała stylizacja powinna być podobna do innych przeglądarek.
Oto podstawowy rozwidlenie jsfiddle Danielda, który stosuje obsługę IE10
źródło
Jest prosty sposób.
Sprawdź to skrzypce i wybacz mi overstyling: https://jsfiddle.net/dkellner/7ac9us70/
Sztuczka: jak tylko tag <select> otrzyma właściwość o nazwie „size”, będzie się zachowywał jak lista o stałej wysokości i nagle, z jakiegoś powodu, pozwoli ci nadać mu styl. Mówiąc ściśle, ustalona lista jest efektem ubocznym - ale pomaga nam bardziej, ponieważ używamy jej do „rozwijanego wyglądu”.
Minimalny przykład:
(dla uproszczenia zrobiłem to z jQuery - ale możesz zrobić to samo bez tego)
Notatki dodatkowe
To rozwiązanie daje więcej niż tylko opcję wyboru: wartość można również edytować ręcznie. Użyj właściwości tylko do odczytu, jeśli wolisz domyślny sposób ograniczonego wyboru.
Aby zmaksymalizować możliwości stylizacji, znaczniki <optgroup> nie znajdują się wokół ich dzieci, są przenoszone przed nimi. Jest celowy, wizualnie wyraźniejszy i chętnie pracują w ten sposób, nie martw się.
Javascript: tak, wiem, że OP powiedział „nie Javascript”, ale zrozumiałem to, proszę, nie przejmuj się wtyczkami , co jest w porządku. Nie potrzebujesz do tego żadnych bibliotek. Nawet jQuery, jak powiedziałem, to tylko dla przejrzystości przykładu.
źródło
Zdecydowanie powinieneś zrobić to tak, jak w Styling select, optgroup i options with CSS . Pod wieloma względami kolor tła i kolor to tylko to, czego zwykle potrzebujesz do stylizacji opcji, a nie cały wybór.
źródło
Możesz także dodać styl aktywowania do menu rozwijanego.
źródło
Trzecia metoda w odpowiedzi Danielda może zostać ulepszona do pracy z efektami najechania myszą i innymi zdarzeniami myszy. Upewnij się tylko, że element „przycisku” pojawia się zaraz po elemencie select w znaczniku. Następnie celuj za pomocą selektora + CSS:
HTML:
CSS:
To jednak pokaże efekt najechania kursorem w dowolnym miejscu nad elementem wyboru, a nie tylko nad „przyciskiem”.
Używam tej metody w połączeniu z Angularem (ponieważ i tak mój projekt jest aplikacją Angular), aby objąć cały element select i pozwolić Angularowi wyświetlić tekst wybranej opcji w elemencie „button”. W takim przypadku doskonale ma sens, że efekt najechania na kursor ma zastosowanie, gdy najedziesz kursorem w dowolnym miejscu nad zaznaczeniem.
Nie działa jednak bez JavaScript, więc jeśli chcesz to zrobić, a Twoja strona musi działać bez JavaScript, powinieneś upewnić się, że twój skrypt dodaje elementy i klasy niezbędne do rozszerzenia. W ten sposób przeglądarka bez JavaScriptu otrzyma zwykły, niestylowany wybór, zamiast stylowej plakietki, która nie aktualizuje się poprawnie.
źródło
Rozwiązanie tylko CSS i HTML
Wydaje się być kompatybilny z Chrome, Firefox i Internet Explorer 11. Ale proszę zostawić swoją opinię na temat innych przeglądarek internetowych.
Jak sugeruje odpowiedź Danielda , zawijam mój wybór w div (nawet dwa div dla kompatybilności z przeglądarkami x), aby uzyskać oczekiwane zachowanie.
Zobacz http://jsfiddle.net/bjap2/
HTML:
Zwróć uwagę na dwa opakowania div.
Zwróć także uwagę na dodatkowy div dodany, aby umieścić przycisk strzałki w dół, gdziekolwiek chcesz (absolutnie ustawiony), tutaj umieszczamy go po lewej stronie.
CSS
źródło