Ok stili değişikliğini seçin


125

Bir seçimin okunu kendi resmimle değiştirmeye çalışıyorum. Seçimi aynı boyuttaki bir div içine ekliyorum, seçimin arka planını şeffaf olarak ayarlıyorum ve div'in sağ üst köşesine arka plan olarak bir resim (okla aynı boyutta) ekliyorum.

Yalnızca Chrome'da çalışır.

görüntü açıklamasını buraya girin

Bunu aldığım Firefox ve IE9'da nasıl çalıştırabilirim:

görüntü açıklamasını buraya girin

.styled-select {
  width: 100px;
  height: 17px;
  overflow: hidden;
  overflow: -moz-hidden-unscrollable;
  background: url(images/downarrow_blue.png) no-repeat right white;
  border: 2px double red;
  display: inline-block;
  position: relative;
}

.styled-select select {
  background: transparent;
  -webkit-appearance: none;
  width: 100px;
  font-size: 11px;
  border: 0;
  height: 17px;
  position: absolute;
  left: 0;
  top: 0;
}

body {
  background-color: #333333;
  color: #FFFFFF;
}

.block label {
  color: white;
}
<HTML>

<HEAD>
</HEAD>

<BODY>
  <p/>
  <form action="/prepareUpdateCategoryList.do?forwardto=search">

    <fieldset class="block" id="searchBlock">
      <p>
        <label style="width:80px">Class</label>
        <div class="styled-select">
          <select property="voucherCategoryClass">
    		<option value="0">Select </option>
    		<option value="7382">steam </option>
    	</select>
        </div>

      </p>
    </fieldset>
  </form>
</BODY>

</HTML>

Yanıtlar:


123

Böyle bir şey denediniz mi:

.styled-select select {
    -moz-appearance:none; /* Firefox */
    -webkit-appearance:none; /* Safari and Chrome */
    appearance:none;
}

Test etmedim ama çalışmalı.

DÜZENLEME : Görünüşe göre Firefox bu özelliği sürüm 35'e kadar desteklemiyor ( buradan daha fazlasını okuyun )

Burada bir çözüm var , o gönderiye bir göz atın jsfiddle.


1
peki ya Internet Explorer?
Francisco Corrales Morales

@Peter Drinnan'ın IE için çözümüne bir göz atın
Morpheus

Bu yanıtı, saf CSS (pngs, jpeg vb. Yok) kullanarak aslında bir "düğmenin" nasıl ekleneceğini gösteren yinelenen bir sorudan buldum stackoverflow.com/a/28274325/2098017
Anthony F.

"Geçici çözüm" sorusundaki jsfiddle artık çalışmıyor.
Dragos Rizescu

Gösteri ampulleri için şunu kullanın:appearance: menulist !important;-moz-appearance: menulist !important;-webkit-appearance: menulist !important;-o-appearance: menulist !important;
mghhgm

61

selectJulio'nun cevabına benzer özel bir ok içeren bir ayarladım , ancak belirli bir genişliği yok ve svgarka plan görüntüsü olarak bir kullanıyor . ( arrow_drop_downmaterial-ui simgelerinden)

select {
  -webkit-appearance: none;
  -moz-appearance: none;
  background: transparent;
  background-image: url("data:image/svg+xml;utf8,<svg fill='black' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>");
  background-repeat: no-repeat;
  background-position-x: 100%;
  background-position-y: 5px;
  border: 1px solid #dfdfdf;
  border-radius: 2px;
  margin-right: 2rem;
  padding: 1rem;
  padding-right: 2rem;
}

görüntü açıklamasını buraya girin

IE'de de çalışması gerekiyorsa, svg okunu base64'e güncelleyin ve aşağıdakileri ekleyin:

select::-ms-expand { display: none; }

background-image: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSdibGFjaycgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyB3aWR0aD0nMjQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nTTcgMTBsNSA1IDUtNXonLz48cGF0aCBkPSdNMCAwaDI0djI0SDB6JyBmaWxsPSdub25lJy8+PC9zdmc+);

Oku daha kolay boyutlandırmak ve yerleştirmek için şu svg'yi kullanın:

url("data:image/svg+xml,<svg width='24' height='24' xmlns='http://www.w3.org/2000/svg'><path d='m0,6l12,12l12,-12l-24,0z'/><path fill='none' d='m0,0l24,0l0,24l-24,0l0,-24z'/></svg>");

Okun yanlarında boşluk yok.


1
oku kullanarak daha hassas bir şekilde konumlandırabilirsinizbackground-position: top 5px right 4px;
Koen

Fermuarlı:background: url('data:image/svg+xml;utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M7 10l5 5 5-5z"/><path d="M0 0h24v24H0z" fill="none"/></svg>') 100% 50% no-repeat transparent;
K-Gun

background-position-y: 5px;% yerine neden kullandığınızı öğrenebilir miyim (örn. background-position-y: 50%;)?
Sam

45

Tek bir sınıfla çalışmak:

select {
    width: 268px;
    padding: 5px;
    font-size: 16px;
    line-height: 1;
    border: 0;
    border-radius: 5px;
    height: 34px;
    background: url(http://cdn1.iconfinder.com/data/icons/cc_mono_icon_set/blacks/16x16/br_down.png) no-repeat right #ddd;
    -webkit-appearance: none;
    background-position-x: 244px;
}

http://jsfiddle.net/qhCsJ/4120/


1
Cevabınız en basit gibi görünüyor ve sadece css kullanıyor.
Austin Lovell

1
Ne olursa olsun, alanın genişliğini ayarlamak zorunda değilsiniz ve arka plan konumu için%
değerini

2
Firefox, background-position-x'i desteklemiyor, ancak arka plan konumunu destekliyor
kriskodzi

2
Bu cevabın bu kadar ince ayar gerektirmesi ne yazık: - / Ama bu iyi bir başlangıç ​​çizgisi.
walther

1
Kontrol için bir genişlik ayarlamaya güvenmek istemiyor ancak yine de görüntüyü sağ taraftan geri doldurmak istiyorsanız, calc kullanabilirsiniz: ör. background-position-x: calc( 100% - 5px );
calc'ı

29

İşte değeri göstermek için bir aralık kullanan zarif bir düzeltme.

Düzen şu şekildedir:

<div class="selectDiv">
   <span class="selectDefault"></span>
   <select name="txtCountry" class="selectBox">
      <option class="defualt-text">-- Select Country --</option>
      <option value="1">Abkhazia</option>
      <option value="2">Afghanistan</option>
   </select>
</div>

JsFiddle


5
Bu çözüm için +1, okları IE9 ve eski tarayıcılarda düzgün bir şekilde biçimlendirmenin tek yolu bu. Basitçe IE9 ve önceki sürümlerde seçim kutularının stilini belirleyemeyeceğinizi söyleyen ve bunun yerine geri dönüş stratejileri sunan birçok site var, ancak bu çözüm aksini kanıtlıyor.
Jon

Teşekkürler çok kullanışlı.
Ağır İşkence

3
Bahsetmeye değer: Bu çözüm , bu yanıt için etiketlenmemiş javascript gerektirir .
random_user_name

21

Bu, özellikle en son tarayıcı sürümlerinde test edilen Bootstrap kullananlar için iyi sonuç verir:

select {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  /* Some browsers will not display the caret when using calc, so we put the fallback first */ 
  background: url("http://cdn1.iconfinder.com/data/icons/cc_mono_icon_set/blacks/16x16/br_down.png") white no-repeat 98.5% !important; /* !important used for overriding all other customisations */
  background: url("http://cdn1.iconfinder.com/data/icons/cc_mono_icon_set/blacks/16x16/br_down.png") white no-repeat calc(100% - 10px) !important; /* Better placement regardless of input width */
}
/*For IE*/
select::-ms-expand { display: none; }
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css" rel="stylesheet"/>

<div class="container">
  <div class="row">
    <div class="col-xs-6">
      <select class="form-control">
       <option>Option 1</option>
       <option>Option 2</option>
       <option>Option 3</option>
      </select>
    </div>
  </div>
</div>


9

Şunu kontrol et Bu hacky, bu kadar basit:

  • Set -prefix-appearanceiçin nonestilleri kaldırmak için
  • text-indentİçeriği biraz sağa "itmek" için kullanın
  • Son olarak, text-overflowboş bir dizeye ayarlayın. Genişliğini aşan her şey ... hiçbir şey olacak! Ve buna ok dahildir.

Artık istediğiniz gibi şekillendirmekte özgürsünüz :)

.selectParent {
  width: 80px;
  overflow: hidden;
}

.selectParent select {
  text-indent: 1px;
  text-overflow: '';
  width: 100px;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  padding: 2px 2px 2px 2px;
  border: none;
  background: transparent url("http://cdn1.iconfinder.com/data/icons/cc_mono_icon_set/blacks/16x16/br_down.png") no-repeat 60px center;
}
<div class="selectParent">
  <select>
    <option value="1">Option 1</option>
    <option value="2">Option 2</option>
  </select>
</div>

JSFiddle'da görüntüle


6

Tüm tarayıcılarda çalışıyor:

select {
    width: 268px;
    padding: 5px;
    font-size: 16px;
    line-height: 1;
    border: 0;
    border-radius: 5px;
    height: 34px;
    background: url(http://cdn1.iconfinder.com/data/icons/cc_mono_icon_set/blacks/16x16/br_down.png) no-repeat right #ddd;
    appearance:none;
    -moz-appearance:none; /* Firefox */
    -webkit-appearance:none; /* Safari and Chrome */
    background-position-x: 244px;

}

9
IE'yi bir tarayıcı olarak görmüyorsunuz. Bunun için size olumsuz oy vermeyeceğim.
user1566694

5

Etiketi CSS ile biçimlendirin ve işaretçi olaylarını kullanın:

<label>
<select>
   <option value="0">Zero</option>
   <option value="1">One</option>
</select>
</label>

ve göreli CSS

label:after {
    content:'\25BC';
    display:inline-block;
    color:#000;
    background-color:#fff;
    margin-left:-17px;   /* remove the damn :after space */
    pointer-events:none; /* let the click pass trough */
}

Burada az önce bir aşağı ok kullandım, ancak arka plan görüntüsü olan bir blok ayarlayabilirsiniz. İşte çirkin bir keman örneği: https://jsfiddle.net/1rofzz89/


1

Bunu atıfta bulunmuşlardır yayını bunun IE tarayıcısında ok gizlenir vermedi dışında bu işe yaradı.

Ancak IE'de aşağıdakileri eklemek oku gizler:

&::-ms-expand {
      display: none;
    }

Tam çözüm (sass)

$select-border-color: #ccc;
$select-focus-color: green;

select {

    cursor: pointer;
    /* styling */
    background-color: white;
    border: 1px solid $select-border-color;
    border-radius: 4px;
    display: inline-block;
    font: inherit;
    line-height: 1.5em;
    padding: 0.5em 3.5em 0.5em 1em;

    /* reset */
    margin: 0;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    -webkit-appearance: none;
    -moz-appearance: none;

    background-image: linear-gradient(45deg, transparent 50%, $select-border-color 50%),
    linear-gradient(135deg, $select-border-color 50%, transparent 50%),
    linear-gradient(to right, $select-border-color, $select-border-color);
    background-position: calc(100% - 20px) calc(1em + 2px),
    calc(100% - 15px) calc(1em + 2px), calc(100% - 2.5em) 0.5em;
    background-size: 5px 5px, 5px 5px, 1px 1.5em;
    background-repeat: no-repeat;

    /* Very imp: hide arrow in IE */
    &::-ms-expand {
      display: none;
    }

    &:-moz-focusring {
      color: transparent;
      text-shadow: none;
    }

    &:focus {
      background-image: linear-gradient(45deg, $select-focus-color 50%, transparent 50%),
      linear-gradient(135deg, transparent 50%, $select-focus-color 50%), linear-gradient(to right, $select-focus-color, $select-focus-color);
      background-position: calc(100% - 15px) 1em, calc(100% - 20px) 1em, calc(100% - 2.5em) 0.5em;
      background-size: 5px 5px, 5px 5px, 1px 1.5em;
      background-repeat: no-repeat;
      border-color: $select-focus-color;
      outline: 0;
    }
  }


-1

SelectDrop'un HTML etiketinizde bulunan sınıf olduğunu varsayalım. Bu nedenle, bu kadar çok kod varsayılan ok simgesini değiştirmek için yeterlidir:

.selectDrop{
      background: url(../images/icn-down-arrow-light.png) no-repeat right #ddd; /*To change default icon with provided image*/
      -webkit-appearance:none; /*For hiding default pointer of drop-down on Chrome*/
      -moz-appearance:none; /*For hiding default pointer of drop-down on Mozilla*/
      background-position-x: 90%; /*Adjust according to width of dropdown*/
    }
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.