Bir <select> açılır menüsünü yalnızca CSS ile nasıl şekillendirebilirim?


1333

<select>Açılır menü oluşturmanın tek bir CSS yolu var mı ?

<select>Herhangi bir JavaScript olmadan, mümkün olduğunca insanca bir form stil gerekir . CSS'de bunu yapmak için kullanabileceğim özellikler nelerdir?

Bu kodun tüm önemli tarayıcılarla uyumlu olması gerekir:

  • Internet Explorer 6, 7 ve 8
  • Firefox
  • Safari

JavaScript ile yapabileceğimi biliyorum: Örnek .

Ve basit stilden bahsetmiyorum. Sadece CSS ile neler yapabileceğimizi bilmek istiyorum.

Stack Overflow ile ilgili benzer sorular buldum .

Ve bu Doctype.com'da.


1
google sadece js çözümü üzerinde çok fazla bir şey bulunamadı
Jitendra Vyas

41
Bunun meşru bir soru olduğunu hissediyorum, ancak cevap "hayır, gerçekten değil" veya "istediğiniz şekilde değil". Ama hiç kimse (ben de) bundan% 100 emin değil, bu belirsizlik duygusu okuyucunun derisinin altına giriyor ve sorunun meşruluğu sorgulanıyor.
ZJR

1
@ Jitendra, neye gittiğini biliyorum. Sorunuzu daha açık hale getirirseniz seviniriz. Artı, aradığınızı bulduğumu düşünüyorum. Bu deneysel, ancak bir göz
atın

1
@jeremyosborne - Cevabınız için teşekkürler. Javascript ile yapabileceğimi biliyorum. eaxmple bağlantınız JS tabanlıdır. Neden bu soruyu sordum çünkü bilmek istedim, kimse sadece css ile yapabileceğimiz en iyi şeyleri biliyor mu?
Jitendra Vyas

@Jitendra Sorunuzu güncellediğiniz için teşekkür ederiz. Sahip olduğunuz kısıtlamalarla güvenilir bir şekilde yapabileceğiniz en iyi şey (yalnızca CSS ve JS yok) yazı tipini (yazı tipi), arka planı ve ön plan (metin) renklerini, kenarlık boyutunu, görünümünü ve renklerini, yerleşimini ve boyutunu (genellikle yazı tipini kullanarak) değiştirmektir. yazı tipi aracılığıyla ayarlama). O zaman bile, şeylerin tüm tarayıcılarda aynı görünmesini sağlamak için muhtemelen birkaç ayar yapmanız gerekecek. Keşke bundan daha iyi bir cevap biliyor olsaydım ve belki de kaçırdığım bir cevap var, ama sanmıyorum.
jeremyosborne

Yanıtlar:


1027

İşte üç çözüm:

Çözüm # 1 - Görünüm: Yok - Internet Explorer 10-11 Geçici Çözümü ile ( Demo )

-

appearance: noneSeçme öğesinde ayarlanan varsayılan oku gizlemek için ,background-image

select {
   -webkit-appearance: none;
   -moz-appearance: none;
   appearance: none;       /* Remove default arrow */
   background-image: url(...);   /* Add custom arrow */
}

Tarayıcı Desteği:

appearance: noneçok iyi tarayıcı desteğine ( caniuse ) sahiptir - Internet Explorer 11 (ve üstü) ve Firefox 34 (ve üstü) hariç.

Bu tekniği geliştirebilir ve ekleyerek Internet Explorer 10 ve Internet Explorer 11 için destek ekleyebiliriz

select::-ms-expand {
    display: none; /* Hide the default arrow in Internet Explorer 10 and Internet Explorer 11 */
}

Internet Explorer 9 bir endişe kaynağıysa, varsayılan oku kaldırmamız mümkün değildir (bu, şimdi iki okumuz olacağı anlamına gelir), ancak korkak bir Internet Explorer 9 seçicisini kullanabiliriz.

En azından özel okumuzu geri almak için - varsayılan seçme okunu olduğu gibi bırakarak.

/* Target Internet Explorer 9 to undo the custom arrow */
@media screen and (min-width:0\0) {
    select {
        background-image:none\9;
        padding: 5px\9;
    }
}

Hep birlikte:

Bu çözüm kolaydır ve iyi tarayıcı desteğine sahiptir - genellikle yeterlidir.


Internet Explorer 9 (ve üstü) ve Firefox 34 (ve üstü) için tarayıcı desteği gerekiyorsa, okumaya devam edin ...

Çözüm # 2 Varsayılan oku gizlemek için seçme öğesini kısaltın ( demo )

-

(Daha fazlasını buradan okuyun)

Sarma selectbir ile bir div elemanı sabit genişlik ve overflow:hidden.

Ardından selectöğeye div'den yaklaşık 20 piksel daha büyük bir genişlik verin .

Sonuç olarak, selectöğenin varsayılan açılır oku gizlenir ( overflow:hiddenkapsayıcıda olduğundan dolayı ) ve istediğiniz arka plan resmini div'in sağ tarafına yerleştirebilirsiniz.

Avantajı bu yaklaşımın bu çapraz tarayıcı (Internet Explorer 8 ve üstü, olmasıdır WebKit ve Gecko ). Bununla birlikte, bu yaklaşımın dezavantajı , seçenekler açılır menüsünün sağ tarafta çıkmasıdır (sakladığımız 20 piksel ile ... çünkü seçenek öğeleri seçme öğesinin genişliğini alır).

Resim açıklamasını buraya girin

[Ancak, özel seçim öğesinin yalnızca mobil cihazlar için gerekli olması durumunda - yukarıdaki sorunun geçerli olmadığı - her telefonun doğal olarak seçme öğesini açma biçimi nedeniyle not edilmesi gerekir. Mobil cihazlar için bu en iyi çözüm olabilir.]


Firefox'ta ( Sürüm 35'ten önce) özel ok gerekiyorsa, ancak Internet Explorer'ın eski sürümlerini desteklemeniz gerekmiyorsa - okumaya devam edin ...

Çözüm # 3 - pointer-eventsMülkü Kullanın ( demo )

-

(Daha fazlasını buradan okuyun)

Buradaki fikir, bir öğeyi yerel açılır ok üzerine yerleştirmek (özel olanı oluşturmak için) ve ardından işaretçi olaylarına izin vermemektir.

Avantajı: WebKit ve Gecko'da iyi çalışır. Çok iyi görünüyor (çıkıntı optionelemanları yok).

Dezavantajı: Internet Explorer (Internet Explorer 10 ve aşağısı) desteklenmez pointer-events, yani özel oku tıklayamazsınız. Ayrıca, bu yöntemin bir diğer (belirgin) dezavantajı, yeni ok görüntünüzü bir fareyle üzerine gelme efekti veya el imleci ile hedefleyememenizdir, çünkü üzerlerindeki işaretçi olaylarını devre dışı bıraktık!

Ancak, bu yöntemle Internet Explorer'ın yerleşik ok standartlarına geri dönmesini sağlamak için Modernizer veya koşullu yorumları kullanabilirsiniz.

Not: Internet Explorer 10'un conditional commentsartık desteklemediği : Bu yaklaşımı kullanmak istiyorsanız, muhtemelen Modernizr'i kullanmalısınız . Bununla birlikte, burada anlatılan bir CSS kesmekle işaretçi olayları CSS'sini Internet Explorer 10'dan hariç tutmak mümkündür .


1
Bu 2 yöntemden hangisi size göre en iyisidir?
Jitendra Vyas

3
Tasarım gereksinimlerine bağlıdır. Açılır pencerede çıkma konusunda sorun yaşıyorsanız - o zaman bu en iyisidir çünkü çapraz tarayıcı (IMO allbrowsers + IE8 + çapraz tarayıcı olarak kabul edilebilir) ama bence çok fazla - bu olmayacak. Yani aslında yukarıdaki açıklamamda # 2'nin en iyisi olduğunu söyledim.
Danield

4
Ayrıca, yayınladığım keman IE'nin varsayılan okunu kullanmasına izin vermek için koşullu ifadelerle # 2 yaklaşımını kullanır.
Danield

3
@AlexisLeclerc Div ve aynı genişlikteki seçimi sabitlemek yalnızca Chrome gibi -webkit tarayıcılarında çalışır. (çünkü ben kural dahil - webkit-
view

4
Yaklaşım # 1 için bir iyileştirme önerebilirsem, sağ taraftaki sınır eksikliği veya seçim halo eksikliğini çok can sıkıcı buluyorum. Kemanınızı şu anki projemde kullandığım bir şeyle güncelledim: jsfiddle.net/YvCHW/1745 . Bana ne düşündüğünü söyle!
Alexis Leclerc

233

Bu, ancak maalesef çoğunlukla WebKit tabanlı tarayıcılarda, geliştiriciler olarak ihtiyaç duyduğumuz ölçüde. Aşağıda, çoğu modern tarayıcıda şu anda desteklenen CSS özelliklerine uyacak şekilde geliştirilmiş yerleşik geliştirici araçları denetçisi aracılığıyla Chrome seçenekleri panelinden toplanan CSS stil örneği verilmiştir:

select {
    -webkit-appearance: button;
    -moz-appearance: button;
    -webkit-user-select: none;
    -moz-user-select: none;
    -webkit-padding-end: 20px;
    -moz-padding-end: 20px;
    -webkit-padding-start: 2px;
    -moz-padding-start: 2px;
    background-color: #F07575; /* Fallback color if gradients are not supported */
    background-image: url(../images/select-arrow.png), -webkit-linear-gradient(top, #E5E5E5, #F4F4F4); /* For Chrome and Safari */
    background-image: url(../images/select-arrow.png), -moz-linear-gradient(top, #E5E5E5, #F4F4F4); /* For old Firefox (3.6 to 15) */
    background-image: url(../images/select-arrow.png), -ms-linear-gradient(top, #E5E5E5, #F4F4F4); /* For pre-releases of Internet Explorer  10*/
    background-image: url(../images/select-arrow.png), -o-linear-gradient(top, #E5E5E5, #F4F4F4); /* For old Opera (11.1 to 12.0) */
    background-image: url(../images/select-arrow.png), linear-gradient(to bottom, #E5E5E5, #F4F4F4); /* Standard syntax; must be last */
    background-position: center right;
    background-repeat: no-repeat;
    border: 1px solid #AAA;
    border-radius: 2px;
    box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);
    color: #555;
    font-size: inherit;
    margin: 0;
    overflow: hidden;
    padding-top: 2px;
    padding-bottom: 2px;
    text-overflow: ellipsis;
    white-space: nowrap;
}

Bu kodu WebKit tabanlı bir tarayıcıdaki herhangi bir sayfada çalıştırdığınızda, seçim kutusunun görünümünü değiştirmeli, standart OS-oku kaldırmalı ve bir PNG-oku eklemeli, etiketin önüne ve arkasına, istediğiniz her şeye biraz boşluk bırakmalıdır.

En önemli kısım, appearanceelemanın davranış biçimini değiştiren özelliktir.

Gecko, appearanceWebKit kadar iyi desteklemese de , mobil olanlar da dahil olmak üzere neredeyse tüm WebKit tabanlı tarayıcılarda mükemmel çalışıyor .


4
Hey, seçim kutularının Firefox 12'den çok farklı görünmeye başladığını fark ettim (Chrome'a ​​(Mac'im gibi) çok benziyor) ve FF 12'nin daha fazla görünüm özelliğini desteklediği anlaşılıyor.
CWSpear

3
sadece krom için bir çözüm ... Bunun için ne de müvekkilim için ödeme yapmam. bir x-tarayıcı çözümü için @ Dianeld'in cevabına bakınız.
Adrien Be

41
@AdrienBe Çözümüm neredeyse 3 yıl önce önerildi; o zaman, JavaScript kütüphanelerini veya eklentilerini içermeden seçme kutularını yeniden başlatmanın tek makul yolu buydu. Önceden eklenmiş özellikleri bırakmaya karar verirseniz hala geçerli, ancak yalnızca Webkit tabanlı tarayıcılarda güvenilir bir şekilde çalışır (Safari, yeni Opera + Android de). Şu anda, belki daha iyi çözümler var, bu yüzden anlamsız yorumlar eklemek yerine, sadece daha iyi gördüğünüz çözüme oy verin ve gelecekte "cevaplanan" tarihi kontrol edin. Teşekkürler.
Matthew Morek

4
@MatthewMorek: 3 yıl önce bile daha iyi bir çözüm vardı. Daniel'in yanıtı tarayıcılar arası destek konusunda çok daha iyi (IE8 ve üstü, WebKit ve Gecko'yu destekliyor). Soru "kodun tüm büyük tarayıcılarla uyumlu olması gerekiyor: Internet Explorer 6,7 ve 8, Firefox & Safari" sorusunu sordu. Bu x-tarayıcı gereksinimi 2013 yılında Paul Sweatte tarafından eklenmiş olabilir ... durum böyle ise özür dilerim.
Adrien Be

3
Eğer eklerseniz text-indent: 0.01px; text-overflow: "";daha da iyi çalışır
Ivan

64

Seçme elemanı ve açılan özelliği olan bir tarzda zor.

Chris Heilmann'ın select elementi için stil özellikleri, Ryan Dohery'nin ilk cevaba yaptığı bir yorumda söylediklerini doğruladı:

"Select öğesi, tarayıcı kromunun değil, işletim sisteminin bir parçasıdır. Bu nedenle, stil oluşturmak çok güvenilmezdir ve yine de denemek mantıklı değildir."


47

Görüntüleri tam olarak kullanamadığım ve tarayıcı desteği ile sınırlı olmadığım için bu kesin problemim vardı. Bu «spec üzerinde» olmalı ve şans sonunda her yerde çalışmaya başlamalıdır .

Sözde öğeler seçme öğesi için işe yaramayacağından, bir açılır oku "kesmek" için katmanlı döndürülmüş arka plan katmanları kullanır.

Düzenleme: Bu güncellenmiş sürümünde CSS değişkenleri ve küçük bir tema sistemi kullanıyorum.

:root {
  --radius: 2px;
  --baseFg: dimgray;
  --baseBg: white;
  --accentFg: #006fc2;
  --accentBg: #bae1ff;
}

.theme-pink {
  --radius: 2em;
  --baseFg: #c70062;
  --baseBg: #ffe3f1;
  --accentFg: #c70062;
  --accentBg: #ffaad4;
}

.theme-construction {
  --radius: 0;
  --baseFg: white;
  --baseBg: black;
  --accentFg: black;
  --accentBg: orange;
}

select {
  font: 400 12px/1.3 sans-serif;
  -webkit-appearance: none;
  appearance: none;
  color: var(--baseFg);
  border: 1px solid var(--baseFg);
  line-height: 1;
  outline: 0;
  padding: 0.65em 2.5em 0.55em 0.75em;
  border-radius: var(--radius);
  background-color: var(--baseBg);
  background-image: linear-gradient(var(--baseFg), var(--baseFg)),
    linear-gradient(-135deg, transparent 50%, var(--accentBg) 50%),
    linear-gradient(-225deg, transparent 50%, var(--accentBg) 50%),
    linear-gradient(var(--accentBg) 42%, var(--accentFg) 42%);
  background-repeat: no-repeat, no-repeat, no-repeat, no-repeat;
  background-size: 1px 100%, 20px 22px, 20px 22px, 20px 100%;
  background-position: right 20px center, right bottom, right bottom, right bottom;   
}

select:hover {
  background-image: linear-gradient(var(--accentFg), var(--accentFg)),
    linear-gradient(-135deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(-225deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(var(--accentFg) 42%, var(--accentBg) 42%);
}

select:active {
  background-image: linear-gradient(var(--accentFg), var(--accentFg)),
    linear-gradient(-135deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(-225deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(var(--accentFg) 42%, var(--accentBg) 42%);
  color: var(--accentBg);
  border-color: var(--accentFg);
  background-color: var(--accentFg);
}
<select>
  <option>So many options</option>
  <option>...</option>
</select>

<select class="theme-pink">
  <option>So many options</option>
  <option>...</option>
</select>

<select class="theme-construction">
  <option>So many options</option>
  <option>...</option>
</select>


5
Vay canına, bu gördüğüm en havalı çözümlerden biri. Mac için Chrome ve Safari'nin en son sürümlerinde benim için çalışıyor. Diğer tarayıcılara ne dersiniz?
Tintin81

2
Firefox'ta benim için çalışıyor-moz-appearance: none;
Zac

45

Seçili açılır menüleri şekillendirirken fark ettiğim en büyük tutarsızlık Safari ve Google Chrome oluşturmadır (Firefox, CSS aracılığıyla tamamen özelleştirilebilir). İnternetin belirsiz derinliklerinde arama yaptıktan sonra, WebKit'teki niteliklerimi neredeyse tamamen çözen aşağıdakilerle karşılaştım:

Safari ve Google Chrome düzeltmesi :

select {
  -webkit-appearance: none;
}

Ancak bu, açılır oku kaldırır. Yakınlarda divarka plan, negatif kenar boşluğu bulunan veya seçim açılır menüsünün üzerinde kesinlikle konumlandırılmış bir açılır menü oku ekleyebilirsiniz .

* Daha fazla bilgi ve diğer değişkenler CSS özelliğinde mevcuttur : -webkit-view .


1
Bundan sonra stilinizi eklemeyi unutmayın;) Ama bugün bu yorumu okuduğum için çok mutluyum.
teewuane

1
Lütfen "Firefox CSS aracılığıyla tamamen özelleştirilebilir" ifadesini ayrıntılı bir şekilde açıklar mısınız? Firefox'un görünüş özelliğini desteklemediği anlaşılıyor ... Peki bu Firefox'ta nasıl yapılır?
Danield

36

<select>etiketler, bir tarayıcıda oluşturulan bir HTML sayfasındaki diğer HTML öğelerinde olduğu gibi CSS aracılığıyla da biçimlendirilebilir. Aşağıda, bir seçme öğesini sayfaya yerleştirecek ve seçeneklerin metnini mavi hale getirecek (aşırı basit) bir örnek verilmiştir.

Örnek HTML dosyası (selectExample.html):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <title>Select Styling</title>
  <link href="selectExample.css" rel="stylesheet">
</head>
<body>
<select id="styledSelect" class="blueText">
  <option value="apple">Apple</option>
  <option value="orange">Orange</option>
  <option value="cherry">Cherry</option>
</select>
</body>
</html>

Örnek CSS dosyası (selectExample.css):

/* All select elements on page */
select {
  position: relative;
}

/* Style by class. Effects the text of the contained options. */
.blueText {
  color: #0000FF;
}

/* Style by id. Effects position of the select drop down. */
#styledSelect {
  left: 100px;
}

30
Şaşırtıcı, ilk kez kaba olmadan internette yer alan "anneler" gördüm. Bunun için +1!
BaL

34
Bu cevap bu soruyu çözmez. Sadece stilleri açılan girişini seçmek değil
Kyborek

14
Bu yanıt, tarayıcılar arası tutarlılık için bir açılır liste oluşturmanın zorluklarını tamamen görmezden geliyor. Bu çok düşük bir çaba cevabıdır.
BentOnCoding

18

Blog yazısı CSS formu açılır stili benim için JavaScript çalışmıyor, ancak Opera'da başarısız oluyor :

select {
  border: 0 none;
  color: #FFFFFF;
  background: transparent;
  font-size: 20px;
  font-weight: bold;
  padding: 2px 10px;
  width: 378px;
  *width: 350px;
  *background: #58B14C;
}

#mainselection {
  overflow: hidden;
  width: 350px;
  -moz-border-radius: 9px 9px 9px 9px;
  -webkit-border-radius: 9px 9px 9px 9px;
  border-radius: 9px 9px 9px 9px;
  box-shadow: 1px 1px 11px #330033;
  background: url("arrow.gif") no-repeat scroll 319px 5px #58B14C;
}
<div id="mainselection">
  <select>
    <option>Select an Option</option>
    <option>Option 1</option>
    <option>Option 2</option>
  </select>
</div>


17

İşte tüm modern tarayıcılarda çalışan bir sürüm. Anahtarappearance:none varsayılan biçimlendirmeyi kaldıran . Tüm biçimlendirme gittiğinden, seçimi görsel olarak girişten ayıran oka geri eklemeniz gerekir.

Çalışma örneği: https://jsfiddle.net/gs2q1c7p/

select:not([multiple]) {
    -webkit-appearance: none;
    -moz-appearance: none;
    background-position: right 50%;
    background-repeat: no-repeat;
    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAMCAYAAABSgIzaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDZFNDEwNjlGNzFEMTFFMkJEQ0VDRTM1N0RCMzMyMkIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDZFNDEwNkFGNzFEMTFFMkJEQ0VDRTM1N0RCMzMyMkIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NkU0MTA2N0Y3MUQxMUUyQkRDRUNFMzU3REIzMzIyQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NkU0MTA2OEY3MUQxMUUyQkRDRUNFMzU3REIzMzIyQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuGsgwQAAAA5SURBVHjaYvz//z8DOYCJgUxAf42MQIzTk0D/M+KzkRGPoQSdykiKJrBGpOhgJFYTWNEIiEeAAAMAzNENEOH+do8AAAAASUVORK5CYII=);
    padding: .5em;
    padding-right: 1.5em
}

#mySelect {
    border-radius: 0
}
<select id="mySelect">
    <option>Option 1</option>
    <option>Option 2</option>
</select>


16

Bootstrap kullanarak davanıza ulaştım . Bu, çalışan en basit çözümdür:

select.form-control {
    -moz-appearance: none;
    -webkit-appearance: none;
    appearance: none;
    background-position: right center;
    background-repeat: no-repeat;
    background-size: 1ex;
    background-origin: content-box;
    background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDM1Ljk3MDk4MyAyMy4wOTE1MTgiCiAgIGhlaWdodD0iNi41MTY5Mzk2bW0iCiAgIHdpZHRoPSIxMC4xNTE4MTFtbSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAyLjAxNDUxLC00MDcuMTIyMjUpIgogICAgIGlkPSJsYXllcjEiPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MzMzNiIKICAgICAgIHk9IjYyOS41MDUwNyIKICAgICAgIHg9IjI5MS40Mjg1NiIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjQwcHg7bGluZS1oZWlnaHQ6MTI1JTtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIj48dHNwYW4KICAgICAgICAgeT0iNjI5LjUwNTA3IgogICAgICAgICB4PSIyOTEuNDI4NTYiCiAgICAgICAgIGlkPSJ0c3BhbjMzMzgiPjwvdHNwYW4+PC90ZXh0PgogICAgPGcKICAgICAgIGlkPSJ0ZXh0MzM0MCIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0MHB4O2xpbmUtaGVpZ2h0OjEyNSU7Zm9udC1mYW1pbHk6Rm9udEF3ZXNvbWU7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpGb250QXdlc29tZTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgzMzQ1IgogICAgICAgICBzdHlsZT0iZmlsbDojMzMzMzMzO2ZpbGwtb3BhY2l0eToxIgogICAgICAgICBkPSJtIDIzNy41NjY5Niw0MTMuMjU1MDcgYyAwLjU1ODA0LC0wLjU1ODA0IDAuNTU4MDQsLTEuNDczMjIgMCwtMi4wMzEyNSBsIC0zLjcwNTM1LC0zLjY4MzA0IGMgLTAuNTU4MDQsLTAuNTU4MDQgLTEuNDUwOSwtMC41NTgwNCAtMi4wMDg5MywwIEwgMjIwLDQxOS4zOTM0NiAyMDguMTQ3MzIsNDA3LjU0MDc4IGMgLTAuNTU4MDMsLTAuNTU4MDQgLTEuNDUwODksLTAuNTU4MDQgLTIuMDA4OTMsMCBsIC0zLjcwNTM1LDMuNjgzMDQgYyAtMC41NTgwNCwwLjU1ODAzIC0wLjU1ODA0LDEuNDczMjEgMCwyLjAzMTI1IGwgMTYuNTYyNSwxNi41NDAxNyBjIDAuNTU4MDMsMC41NTgwNCAxLjQ1MDg5LDAuNTU4MDQgMi4wMDg5MiwwIGwgMTYuNTYyNSwtMTYuNTQwMTcgeiIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=");
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
<section class="container">
  <form class="form-horizontal">
    <select class="form-control">
      <option>One</option>
      <option>Two</option>
    </select>
  </form>
</section>

Not: base64 içeriği fa-chevron-downSVG'de.


12

Modern tarayıcılarda <select>CSS'de stil oluşturmak nispeten ağrısızdır . İle appearance: noneilgili bir püf (eğer istediğin buysa) oka değiştiriliyor. İşte data:düz metin SVG ile satır içi URI kullanan bir çözüm :

select {
  -moz-appearance: none;
  -webkit-appearance: none;
  appearance: none;
  
  background-repeat: no-repeat;
  background-size: 0.5em auto;
  background-position: right 0.25em center;
  padding-right: 1em;
  
  background-image: url("data:image/svg+xml;charset=utf-8, \
    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60 40'> \
      <polygon points='0,0 60,0 30,40' style='fill:black;'/> \
    </svg>");
}
<select>
  <option>Option 1</option>
  <option>Option 2</option>
</select>

<select style="font-size: 2rem;">
  <option>Option 1</option>
  <option>Option 2</option>
</select>

Stilin geri kalanı (kenarlıklar, dolgu, renkler vb.) Oldukça basittir.

Bu, yeni denediğim tüm tarayıcılarda çalışır (Firefox 50, Chrome 55, Edge 38 ve Safari 10). Firefox hakkında bir not, #karakteri veri URI'sinde kullanmak istiyorsanız (örneğin fill: #000) karakterden kaçmanız gerektiğidir ( fill: %23000).


1
SVG'yi , CSS özelliği yerine etikette heightve / veya widthözelliğiyle de boyutlandırabilirsiniz . <svg>background-size
gitaarik

10
select  {
    outline: 0;
    overflow: hidden;
    height: 30px;
    background: #2c343c;
    color: #747a80;
    border: #2c343c;
    padding: 5px 3px 5px 10px;
    -moz-border-radius: 6px;
    -webkit-border-radius: 6px;
    border-radius: 10px;
}

select option {border: 1px solid #000; background: #010;}

Mevcut Chrome ile bununla hiçbir şey seçilemiyor.
Vitaly Zdanevich

9

Özel Seçim CSS stilleri

Internet Explorer (10 ve 11), Edge, Firefox ve Chrome'da test edildi

select::-ms-expand {
  display: none;
}
select {
  display: inline-block;
  box-sizing: border-box;
  padding: 0.5em 2em 0.5em 0.5em;
  border: 1px solid #eee;
  font: inherit;
  line-height: inherit;
  -webkit-appearance: none;
  -moz-appearance: none;
  -ms-appearance: none;
  appearance: none;
  background-repeat: no-repeat;
  background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: right 15px top 1em, right 10px top 1em;
  background-size: 5px 5px, 5px 5px;
}
<select name="">
  <option value="">Lorem</option>
  <option value="">Lorem Ipsum</option>
</select>

<select name="" disabled>
  <option value="">Disabled</option>
</select>

<select name="" style="color:red;">
  <option value="">Color!</option>
  <option value="">Lorem Ipsum</option>
</select>


Biraz daha uyarlanabilir (ancak tüm tarayıcılarda test edilmedi):background-position: right 15px center, right 10px center;
Robin Stewart

8

Öğenin clipkenarlıklarını ve okunu kırpmak için özelliği kullanın select, ardından sarmalayıcıya kendi değiştirme stillerinizi ekleyin:

    <!DOCTYPE html>
    <html>
      <head>
        <style>
          select { position: absolute; clip:rect(2px 49px 19px 2px); z-index:2; }
          body > span { display:block; position: relative; width: 64px; height: 21px; border: 2px solid green;  background: url(http://www.stackoverflow.com/favicon.ico) right 1px no-repeat; }
        </style>
      </head>
      <span>
        <select>
          <option value="">Alpha</option>
          <option value="">Beta</option>
          <option value="">Charlie</option>
        </select>
      </span>
    </html>

Düğmeyi tıklanabilir hale getirmek için sıfır opaklığa sahip ikinci bir seçim kullanın:

    <!DOCTYPE html>
    <html>
      <head>
        <style>
          #real { position: absolute; clip:rect(2px 51px 19px 2px); z-index:2; }
          #fake { position: absolute; opacity: 0; }
    
          body > span { display:block; position: relative; width: 64px; height: 21px; background: url(http://www.stackoverflow.com/favicon.ico) right 1px no-repeat; }
        </style>
      </head>
      <span>
        <select id="real">
          <option value="">Alpha</option>
          <option value="">Beta</option>
          <option value="">Charlie</option>
        </select>
        <select id="fake">
          <option value="">Alpha</option>
          <option value="">Beta</option>
          <option value="">Charlie</option>
        </select>
      </span>
    </html>

Koordinatlar Webkit ve diğer tarayıcılar arasında farklılık gösterir, ancak bir @media sorgusu bunu kapsayabilir.

Referanslar


1
Benim için iyi çalışıyor, en azından krom: position: absolute; klip: rekt (2px 85px 128px 2px); z-endeksi: 2; dolgu sol: 18 piksel; dolgu hakkı: 18 piksel; kenar boşluğu: 7 piksel otomatik; renk: # 555; yazı tipi boyutu: miras; arka plan rengi: şeffaf;
BrianFreud

1
Seçtiğiniz sınır üzerinde hiçbir kontrole sahip olmadığınız için IE7'de okun sadece yarım çalışmasını kırptım.
CpILL


1
@ PaulSweatte, vay be, bu senin 20. büyücün ! Tebrikler. Ayrıca altın bir büyücü rozeti için tüm sorgularımı tamamladınız .
Nemo


5

Bu öğeyi düzenle önerilmez, ancak bunu denemek isterseniz başka bir HTML öğesi gibi.

Örneği düzenle:

/* Edit select */
select {
    /* CSS style here */
}

/* Edit option */
option {
    /* CSS style here */
}

/* Edit selected option */
/* element  attr    attr value */
option[selected="selected"] {
    /* CSS style here */
}
<select>
    <option >Something #1</option>
    <option selected="selected">Something #2</option>
    <option >Something #3</option>
</select>

2
@MikkoP: düzenlemeler önerirken, lütfen daha açıklayıcı bir düzenleme özeti verir misiniz? "İleti geliştirildi" bize yorumcular için üst düzey bir özet olarak çok yararlı değildir. Teşekkürler.
Jean-François Corbett

1
@ Jean-FrançoisCorbett Daha spesifik olmaya çalışacağım :)
MikkoP

1
seçenek öğelerini stil
uygulayamazsınız

4
label {
    position: relative;
    display: inline-block;
}
select {
    display: inline-block;
    padding: 4px 3px 5px 5px;
    width: 150px;
    outline: none;
    color: black;
    border: 1px solid #C8BFC4;
    border-radius: 4px;
    box-shadow: inset 1px 1px 2px #ddd8dc;
    background-color: lightblue;
}

Bu, seçili öğeler için arka plan rengini kullanır ve görüntüyü kaldırdım.


4

Evet. Herhangi bir HTML öğesini etiket adına göre şu şekilde stil uygulayabilirsiniz:

select {
  font-weight: bold;
}

Tabii ki, diğer herhangi bir öğe gibi stil vermek için bir CSS sınıfı da kullanabilirsiniz:

<select class="important">
  <option>Important Option</option>
  <option>Another Important Option</option>
</select>

<style type="text/css">
  .important {
    font-weight: bold;
  }
</style>

6
Ben böyle hakkında konuşmuyorum açılan ok başka bir şey değiştirmek istiyorum
Jitendra Vyas

5
Açılır oku başka bir görüntüye biçimlendiremezsiniz, işletim sistemi tarafından kontrol edilir. Gerçekten ihtiyacınız varsa, en iyi seçeneğiniz bir DHTML açılır widget'ı kullanmaktır.
Ryan Doherty

3
CSS özelliklerini yalnızca CSS aracılığıyla değiştirebilirsiniz. Kenar boşluğunu, dolguyu, yazı tipi özelliklerini, arka plan rengini vb. Değiştirebilirsiniz. Tamamen farklı görünmesini istiyorsanız, temel olarak JavaScript aracılığıyla çalışma zamanında grafiklerle değiştirmeniz gerekir (iyi yapılırsa korkunç bir çözüm değildir) ).
Dave Ward

4

İşte bu tartışmadaki en sevdiğim fikirlerime dayanan bir çözüm. Bu, bir <select> öğesini herhangi bir ek işaretleme olmadan doğrudan şekillendirmeye izin verir.

Internet Explorer 10 (ve üstü), Internet Explorer 8/9 için güvenli bir geri dönüş ile çalışır. Bu tarayıcılar için bir uyarı, arka plan görüntüsünün konumlandırılması ve yerel genişletme kontrolünün arkasına gizlenecek kadar küçük olması gerektiğidir.

HTML

<select name='options'>
  <option value='option-1'>Option 1</option>
  <option value='option-2'>Option 2</option>
  <option value='option-3'>Option 3</option>
</select>

SCSS

body {
  padding: 4em 40%;
  text-align: center;
}

select {
  $bg-color: lightcyan;
  $text-color: black;
  appearance: none; // Using -prefix-free http://leaverou.github.io/prefixfree/
  background: {
    color: $bg-color;
    image: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/1255/caret--down-15.png");
    position: right;
    repeat: no-repeat;
  }
  border: {
    color: mix($bg-color, black, 80%);
    radius: .2em;
    style: solid;
    width: 1px;
    right-color: mix($bg-color, black, 60%);
    bottom-color: mix($bg-color, black, 60%);
  }
  color: $text-color;
  padding: .33em .5em;
  width: 100%;
}

// Removes default arrow for Internet Explorer 10 (and later)
// Internet Explorer 8/9 gets the default arrow which covers the caret
// image as long as the caret image is smaller than and positioned
// behind the default arrow
select::-ms-expand {
    display: none;
}

CodePen

http://codepen.io/ralgh/pen/gpgbGx



3

Kolay bir yol var.

Bu kemanı kontrol et ve aşırı dövüşü affet: https://jsfiddle.net/dkellner/7ac9us70/

Arkadaki hile: <select> etiketi "size" adlı bir özellik alır almaz, sabit bir yükseklik listesi gibi davranacak ve aniden, bir nedenden dolayı, cehennemden çıkmanıza izin veriyor. Kesin olarak, sabit liste bir yan etkidir - ancak bize daha fazla yardımcı olur, çünkü bunu "bırakılan görünüm" için kullanırız.

Minimal bir örnek:

<style>

    .stylish span   {position:relative;}
    .stylish select {position:absolute;left:0px;display:none}

</style>
...
<div class="stylish">
    <label> Choose your superhero: </label>
    <span>
        <input onclick="$(this).closest('div').find('select').slideToggle(110)"><br>
        <select size=15 onclick="$(this).hide().closest('div').find('input').val($(this).find('option:selected').text());">

            <optgroup label="Fantasy"></optgroup>
            <option value="1">  Gandalf        </option>
            <option value="2">  Harry Potter   </option>
            <option value="3">  Jon Snow       </option>

            <!-- ... and so on -->

        </select>
    </span>
</div>

(basit tutmak için jQuery ile yaptım - ama onsuz da yapabilirsiniz)

Yan notlar

  • Bu çözüm size bir seçimden daha fazlasını sunar: değer ayrıca manuel olarak düzenlenebilir. Varsayılan seçme kısıtlı yolunu tercih ediyorsanız salt okunur özelliğini kullanın.

  • Olanaklarını stil maksimize etmek için, <OPTGROUP> etiketleri değil etrafında çocuklarının, onlar taşındı konum önce kendilerine. Kasıtlı, görsel olarak daha net ve böyle çalışmaktan mutluluk duyuyorlar, endişelenmeyin.

  • Javascripts: evet OP "hayır Javascript" dedi biliyorum ama ben iyi gibi eklentileri ile rahatsız etmeyin lütfen anladım . Bunun için herhangi bir kütüphaneye ihtiyacınız yok. Dediğim gibi jQuery bile, sadece örnek netliği için.



2

Açılır menüye bir fareyle üzerine gelme stili de ekleyebilirsiniz.

select {position:relative; float:left; width:21.4%; height:34px; background:#f9f9e0; border:1px solid #41533f; padding:0px 10px 0px 10px; color:#41533f; margin:-10px 0px 0px 20px; background: transparent; font-size: 12px; -webkit-appearance: none; -moz-appearance: none; appearance: none; background: url(https://alt-fit.com/images/global/select-button.png) 100% / 15% no-repeat #f9f9e0;}
select:hover {background: url(https://alt-fit.com/images/global/select-button.png) 100% / 15% no-repeat #fff;}
<html>
<head>
</head>
<body>
<select name="type" class="select"><option style="color:#41533f;" value="Select option">Select option</option>
<option value="Option 1">Option 1</option>
<option value="Option 2">Option 2</option>
<option value="Option 3">Option 3</option>
</select>
</body>
</html>


2

Danield'ın cevabındaki üçüncü yöntem fareyle üzerine gelme efektleri ve diğer fare olaylarıyla çalışmak üzere geliştirilebilir. "Düğme" öğesinin işaretlemedeki seçim öğesinden hemen sonra geldiğinden emin olun. Ardından + CSS seçiciyi kullanarak hedefleyin:

HTML:

<select class="select-input">...</select>
<div class="select-button"></div>

CSS:

.select-input:hover+.select-button {
    <Hover styles here>
}

Ancak bu, yalnızca "düğmenin" üzerinde değil, seçim öğesinin üzerinde herhangi bir yere geldiğinde fareyle üzerine gelme efektini gösterir.

Bu yöntemi Açısal ile birlikte kullanıyorum. Bu durumda, fareyle üzerine gelme efektinin seçimin herhangi bir yerine getirildiğinde geçerli olması mükemmel olur.

Yine de JavaScript olmadan çalışmaz, bu yüzden bunu yapmak istiyorsanız ve sitenizin JavaScript olmadan çalışması gerekiyorsa, komut dosyanızın geliştirme için gerekli öğeleri ve sınıfları eklediğinden emin olmalısınız. Bu şekilde, JavaScript içermeyen bir tarayıcı, düzgün güncellenmeyen stilli bir rozet yerine normal, stilsiz bir seçim alır.


1
Herhangi bir downvotes nedenini bilmek isterim, böylece nasıl geliştirmek biliyorum! 🙂
Adrian Schmidt

1

Yalnızca CSS ve yalnızca HTML çözümü

Chrome, Firefox ve Internet Explorer 11 ile uyumlu görünüyor. Ancak lütfen diğer web tarayıcılarıyla ilgili görüşlerinizi bırakın.

Danield'ın cevabının önerdiği gibi , beklenen davranışı elde etmek için seçimimi bir div'de (x-tarayıcı uyumluluğu için iki div bile) sararım .

Bkz. Http://jsfiddle.net/bjap2/

HTML:

<div class="sort-options-wrapper">
    <div class="sort-options-wrapper-2">
        <select class="sort-options">
                <option value="choiceOne">choiceOne</option>
                <option value="choiceOne">choiceThree</option>
                <option value="choiceOne">choiceFour</option>
                <option value="choiceFiveLongTestPurpose">choiceFiveLongTestPurpose</option>
        </select>
    </div>
    <div class="search-select-arrow-down"></div>
</div>

İki div paketleyicisine dikkat edin.

Ayrıca, aşağı ok düğmesini istediğiniz yere (kesinlikle konumlandırılmış) yerleştirmek için eklenen ekstra div'a dikkat edin, burada solda bırakıyoruz.

CSS

.sort-options-wrapper {
    display: inline-block;
    position: relative;
    border: 1px solid #83837F;
}

/* This second wrapper is needed for x-browser compatibility */
.sort-options-wrapper-2 {
    overflow: hidden;
}

select {
    margin-right: -19px; /* That's what is hiding the default-provided browser arrow */
    padding-left: 13px;
    margin-left: 0;
    border: none;
    background: none;

    /* margin-top & margin-bottom must be set since some
       browsers have default values for select elements */
    margin-bottom: 1px;
    margin-top: 1px;
}

select:focus {
    outline: none; /* Removing default browsers outline on focus */
}
.search-select-arrow-down {
    position: absolute;
    height: 10px;
    width: 12px;
    background: url(http://i.imgur.com/pHIYN06.png) scroll no-repeat 2px 0px;
    left: 1px;
    top: 5px;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.