Apakah ada cara khusus CSS untuk gaya <select>
dropdown?
Saya perlu mendesain <select>
formulir sebanyak mungkin secara manusiawi, tanpa JavaScript apa pun. Apa sajakah properti yang dapat saya gunakan untuk melakukannya di CSS?
Kode ini harus kompatibel dengan semua browser utama:
- Internet Explorer 6, 7, dan 8
- Firefox
- Safari
Saya tahu saya bisa membuatnya dengan JavaScript: Contoh .
Dan saya tidak berbicara tentang gaya sederhana. Saya ingin tahu, apa yang terbaik yang bisa kita lakukan dengan CSS saja.
Saya menemukan pertanyaan serupa di Stack Overflow.
Dan yang ini di Doctype.com.
Jawaban:
Inilah tiga solusi:
Solusi # 1 - penampilan: tidak ada - dengan solusi Internet Explorer 10 - 11 ( Demo )
-
Untuk menyembunyikan panah default yang diatur
appearance: none
pada elemen pilih, lalu tambahkan panah kustom Anda sendiri denganbackground-image
Dukungan Browser:
appearance: none
memiliki dukungan browser yang sangat bagus ( caniuse ) - kecuali untuk Internet Explorer 11 (dan yang lebih baru) dan Firefox 34 (dan yang lebih baru).Kami dapat meningkatkan teknik ini dan menambahkan dukungan untuk Internet Explorer 10 dan Internet Explorer 11 dengan menambahkan
Jika Internet Explorer 9 menjadi perhatian, kami tidak memiliki cara untuk menghapus panah default (yang berarti bahwa kami sekarang memiliki dua panah), tetapi, kami dapat menggunakan pemilih Internet Explorer 9 yang funky.
Untuk setidaknya membatalkan panah kustom kami - membiarkan panah pilih default tetap utuh.
Bersama:
Tampilkan cuplikan kode
Solusi ini mudah dan memiliki dukungan browser yang bagus - biasanya sudah cukup.
Jika dukungan browser untuk Internet Explorer 9 (dan yang lebih baru) dan Firefox 34 (dan yang lebih baru) diperlukan maka teruslah membaca ...
Solusi # 2 Pangkas elemen pilih untuk menyembunyikan panah default ( demo )
-
(Baca lebih lanjut di sini)
Bungkus
select
elemen dalam div dengan lebar tetap danoverflow:hidden
.Kemudian beri
select
elemen lebar sekitar 20 piksel lebih besar dari div .Hasilnya adalah panah drop-down default
select
elemen akan disembunyikan (karenaoverflow:hidden
pada wadah), dan Anda dapat menempatkan gambar latar belakang yang Anda inginkan di sisi kanan div.The Keuntungan dari pendekatan ini adalah bahwa itu adalah cross-browser (Internet Explorer 8 dan kemudian, WebKit , dan Gecko ). Namun, kelemahan dari pendekatan ini adalah bahwa pilihan drop-down menonjol di sisi kanan (oleh 20 piksel yang kami sembunyikan ... karena elemen opsi mengambil lebar elemen pilih).
[Namun, perlu dicatat bahwa jika elemen pilih khusus hanya diperlukan untuk perangkat seluler - maka masalah di atas tidak berlaku - karena cara masing-masing ponsel membuka elemen pilih secara native. Jadi untuk seluler, ini mungkin solusi terbaik.]
Tampilkan cuplikan kode
Jika panah khusus diperlukan di Firefox - sebelum Versi 35 - tetapi Anda tidak perlu mendukung versi Internet Explorer yang lama - maka teruslah membaca ...
Solusi # 3 - Gunakan
pointer-events
properti ( demo )-
(Baca lebih lanjut di sini)
Idenya di sini adalah untuk overlay elemen di atas panah drop down asli (untuk membuat custom kami) dan kemudian melarang event pointer di atasnya.
Keuntungan: Ini berfungsi baik di WebKit dan Gecko. Ini terlihat bagus juga (tidak ada
option
elemen menonjol ).Kerugian: Internet Explorer (Internet Explorer 10 ke bawah) tidak mendukung
pointer-events
, yang berarti Anda tidak dapat mengklik panah khusus. Juga, kerugian (jelas) lain dengan metode ini adalah bahwa Anda tidak dapat menargetkan gambar panah baru Anda dengan efek hover atau kursor tangan, karena kami baru saja menonaktifkan peristiwa pointer pada mereka!Namun, dengan metode ini Anda dapat menggunakan Modernizer atau komentar bersyarat untuk membuat Internet Explorer kembali ke panah bawaan bawaan.
NB: Karena Internet Explorer 10 tidak mendukung
conditional comments
lagi: Jika Anda ingin menggunakan pendekatan ini, Anda mungkin harus menggunakan Modernizr . Namun, masih dimungkinkan untuk mengecualikan pointer-event CSS dari Internet Explorer 10 dengan retasan CSS yang dijelaskan di sini .Tampilkan cuplikan kode
sumber
Itu mungkin, tapi sayangnya sebagian besar di browser berbasis WebKit sejauh yang kita, sebagai pengembang, butuhkan. Berikut adalah contoh gaya CSS yang dikumpulkan dari panel opsi Chrome melalui inspektur alat pengembang bawaan, ditingkatkan untuk mencocokkan properti CSS yang saat ini didukung di sebagian besar browser modern:
Ketika Anda menjalankan kode ini pada halaman apa pun dalam browser berbasis WebKit, kode ini harus mengubah tampilan kotak pilih, menghapus panah OS standar dan menambahkan tanda panah PNG, meletakkan spasi sebelum dan sesudah label, hampir semua yang Anda inginkan.
Bagian terpenting adalah
appearance
properti, yang mengubah cara elemen berperilaku.Ini berfungsi dengan baik di hampir semua browser berbasis WebKit, termasuk yang mobile, meskipun Gecko tidak mendukung
appearance
dan juga WebKit, tampaknya.sumber
text-indent: 0.01px; text-overflow: "";
akan bekerja lebih baikElemen pilih dan fitur dropdown -nya sulit untuk ditata.
atribut style untuk elemen terpilih oleh Chris Heilmann mengkonfirmasi apa yang dikatakan Ryan Dohery dalam komentar atas jawaban pertama:
sumber
Saya punya masalah persis ini, kecuali saya tidak bisa menggunakan gambar dan tidak dibatasi oleh dukungan browser. Ini harus «spesifik» dan dengan keberuntungan mulai bekerja di mana-mana pada akhirnya .
Ia menggunakan lapisan latar belakang yang diputar untuk «memotong» panah dropdown, karena elemen semu tidak akan bekerja untuk elemen pilih.
Sunting: Dalam versi yang diperbarui ini saya menggunakan variabel CSS dan sistem bertema kecil.
sumber
-moz-appearance: none;
Ketidakkonsistenan terbesar yang saya perhatikan ketika dropdown pemilihan styling adalah Safari dan rendering Google Chrome (Firefox sepenuhnya dapat dikustomisasi melalui CSS). Setelah beberapa pencarian melalui kedalaman Internet yang tidak jelas saya menemukan yang berikut, yang hampir sepenuhnya menyelesaikan keraguan saya dengan WebKit:
Safari dan perbaikan Google Chrome :
Namun, ini menghapus panah dropdown. Anda dapat menambahkan panah dropdown menggunakan terdekat
div
dengan latar belakang, margin negatif atau benar-benar diposisikan di atas dropdown pilih.* Informasi lebih lanjut dan variabel lain tersedia di properti CSS: -webkit-appearance .
sumber
<select>
tag dapat ditata melalui CSS seperti halnya elemen HTML lainnya pada halaman HTML yang dirender dalam browser. Di bawah ini adalah contoh (terlalu sederhana) yang akan memposisikan elemen pilih pada halaman dan membuat teks opsi dengan warna biru.Contoh file HTML (selectExample.html):
Contoh file CSS (selectExample.css):
sumber
Posting blog Bagaimana cara drop down gaya CSS tidak ada JavaScript berfungsi untuk saya, tetapi gagal di Opera :
sumber
Ini adalah versi yang berfungsi di semua browser modern. Kuncinya menggunakan
appearance:none
yang menghapus pemformatan default. Karena semua format sudah tidak ada, Anda harus menambahkan kembali panah yang membedakan secara visual pemilihan dari input.Contoh kerja: https://jsfiddle.net/gs2q1c7p/
sumber
Saya sampai pada kasus Anda menggunakan Bootstrap . Ini adalah solusi paling sederhana yang berfungsi:
Catatan: barang-barang base64 ada
fa-chevron-down
di SVG.sumber
Di peramban modern, relatif tidak mudah untuk mendesain
<select>
dalam CSS. Denganappearance: none
satu-satunya bagian yang sulit adalah mengganti panah (jika itu yang Anda inginkan). Berikut adalah solusi yang menggunakandata:
URI sebaris dengan SVG teks biasa:Sisa gaya (batas, bantalan, warna, dll.) Cukup mudah.
Ini berfungsi di semua browser yang baru saja saya coba (Firefox 50, Chrome 55, Edge 38, dan Safari 10). Satu catatan tentang Firefox adalah bahwa jika Anda ingin menggunakan
#
karakter dalam data URI (mis.fill: #000
) Anda harus menghindarinya (fill: %23000
).sumber
height
dan / atauwidth
pada<svg>
tag, alih-alih properti CSSbackground-size
.sumber
Kustom Pilih gaya CSS
Diuji di Internet Explorer (10 dan 11), Edge, Firefox, dan Chrome
sumber
background-position: right 15px center, right 10px center;
Gunakan
clip
properti untuk memotong perbatasan dan panahselect
elemen, lalu tambahkan gaya pengganti Anda sendiri ke pembungkus:Gunakan pilihan kedua dengan nol opacity untuk membuat tombol dapat diklik:
Koordinat berbeda antara Webkit dan peramban lain, tetapi kueri @media dapat mengatasinya.
Referensi
sumber
Contoh yang sangat bagus yang menggunakan
:after
dan:before
melakukan triknya adalah di Styling Select Box dengan CSS3 | CSSDecksumber
Edit elemen ini tidak disarankan, tetapi jika Anda ingin mencobanya seperti elemen HTML lainnya.
Edit contoh:
sumber
Ini menggunakan warna latar belakang untuk elemen tertentu dan saya menghapus gambar ..
sumber
Iya. Anda dapat mendesain elemen HTML apa pun dengan nama tag-nya, seperti ini:
Tentu saja, Anda juga dapat menggunakan kelas CSS untuk menatanya, seperti elemen lainnya:
sumber
Inilah solusi berdasarkan ide favorit saya dari diskusi ini. Ini memungkinkan styling elemen <select> secara langsung tanpa markup tambahan.
Ini berfungsi Internet Explorer 10 (dan lebih baru) dengan fallback aman untuk Internet Explorer 8/9. Satu peringatan untuk browser ini adalah bahwa gambar latar belakang harus diposisikan dan cukup kecil untuk bersembunyi di balik kontrol ekspansi asli.
HTML
SCSS
CodePen
http://codepen.io/ralgh/pen/gpgbGx
sumber
Pada Internet Explorer 10, Anda dapat menggunakan
::-ms-expand
pemilih elemen semu untuk bergaya, dan menyembunyikan, elemen panah turun bawah.Gaya yang tersisa harus serupa dengan browser lain.
Ini adalah garpu dasar jsfiddle Danield yang menerapkan dukungan untuk IE10
sumber
Ada cara yang mudah.
Periksa biola ini, dan maafkan saya overstyling: https://jsfiddle.net/dkellner/7ac9us70/
Trik di belakang: segera setelah tag <select> mendapatkan properti yang disebut "size", itu akan berperilaku sebagai daftar tinggi-tetap, dan, tiba-tiba, untuk beberapa alasan, memungkinkan Anda untuk mendesainnya. Sebenarnya, daftar tetap adalah efek samping - tetapi itu hanya membantu kita lebih banyak karena kita menggunakannya untuk "tampilan drop-down".
Contoh minimal:
(untuk membuatnya tetap sederhana, saya melakukannya dengan jQuery - tetapi Anda dapat melakukan hal yang sama tanpa itu)
Catatan samping
Solusi ini memberi Anda lebih dari sekadar pilihan: nilainya juga dapat diedit secara manual. Gunakan properti readonly jika Anda lebih suka cara pilih-pilih default.
Untuk memaksimalkan kemungkinan penataan, tag <optgroup> tidak ada di sekitar anak-anak mereka, mereka dipindahkan sebelum mereka. Disengaja, lebih jelas secara visual, dan mereka senang bekerja seperti ini, jangan khawatir.
Javascripts: ya saya tahu OP mengatakan "tidak Javascript" tapi saya memahaminya karena tolong jangan repot-repot dengan plugin , yang baik-baik saja. Anda tidak memerlukan pustaka untuk yang satu ini. Bahkan jQuery, seperti yang saya katakan, itu hanya untuk kejelasan contohnya.
sumber
Anda harus melakukannya seperti pada Styling styling, optgroup dan opsi dengan CSS . Dalam banyak hal, warna latar dan warna adalah apa yang biasanya Anda perlukan untuk menentukan gaya, bukan keseluruhan pilih.
sumber
Anda juga dapat menambahkan gaya melayang ke dropdown.
sumber
Metode ketiga dalam jawaban Danield dapat ditingkatkan untuk bekerja dengan efek hover dan peristiwa mouse lainnya. Pastikan elemen "tombol" muncul tepat setelah elemen pilih di markup. Kemudian targetkan menggunakan pemilih + CSS:
HTML:
CSS:
Akan tetapi, ini akan menunjukkan efek melayang ketika melayang di mana saja di atas elemen-pilih, bukan hanya di atas "tombol".
Saya menggunakan metode ini dalam kombinasi dengan Angular (karena proyek saya kebetulan merupakan aplikasi Angular), untuk mencakup seluruh elemen-pilih, dan biarkan Angular menampilkan teks dari opsi yang dipilih dalam elemen "tombol". Dalam hal ini masuk akal bahwa efek hover berlaku ketika melayang di mana saja selama pemilihan.
Itu tidak berfungsi tanpa JavaScript, jadi jika Anda ingin melakukan ini, dan situs Anda harus bekerja tanpa JavaScript, Anda harus memastikan bahwa skrip Anda menambahkan elemen dan kelas yang diperlukan untuk peningkatan. Dengan begitu, browser tanpa JavaScript hanya akan mendapatkan yang normal, tanpa gaya, pilih, alih-alih lencana bergaya yang tidak diperbarui dengan benar.
sumber
Solusi khusus CSS dan HTML
Tampaknya kompatibel dengan Chrome, Firefox, dan Internet Explorer 11. Tapi tolong tinggalkan umpan balik Anda tentang browser web lainnya.
Seperti yang disarankan oleh jawaban Danield , saya membungkus pilih saya dalam div (bahkan dua div untuk kompatibilitas x-browser) untuk mendapatkan perilaku yang diharapkan.
Lihat http://jsfiddle.net/bjap2/
HTML:
Perhatikan dua pembungkus div.
Perhatikan juga div tambahan yang ditambahkan untuk menempatkan tombol panah ke bawah di mana pun Anda suka (benar-benar diposisikan), di sini kami letakkan di sebelah kiri.
CSS
sumber