Seleziona la modifica dello stile della freccia


125

Sto cercando di sostituire la freccia di una selezione con una mia foto. Sto includendo la selezione in un div con le stesse dimensioni, ho impostato lo sfondo della selezione come trasparente e sto includendo un'immagine (con le stesse dimensioni della freccia) nell'angolo in alto a destra del div come sfondo.

Funziona solo in Chrome.

inserisci qui la descrizione dell'immagine

Come posso farlo funzionare in Firefox e IE9 dove ottengo questo:

inserisci qui la descrizione dell'immagine

.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>

Risposte:


123

Hai provato qualcosa di simile:

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

Non sono stati testati, ma dovrebbero funzionare.

EDIT : Sembra che Firefox non supporti questa funzione fino alla versione 35 ( leggi di più qui )

C'è una soluzione alternativa qui , dai un'occhiata a jsfiddlequel post.


1
che dire di Internet Explorer?
Francisco Corrales Morales

Dai un'occhiata alla soluzione di @Peter Drinnan per IE
Morpheus

Ho trovato questa risposta da una domanda duplicato che mostra come aggiungere in realtà un "bottone", così, usando CSS puro (non PNG, JPEG, ecc) stackoverflow.com/a/28274325/2098017
Anthony F.

Il jsfiddle dalla domanda "workaround" non funziona più.
Dragos Rizescu

Per le lampadine da spettacolo, utilizzare questo:appearance: menulist !important;-moz-appearance: menulist !important;-webkit-appearance: menulist !important;-o-appearance: menulist !important;
mghhgm

61

Ho impostato un selectcon una freccia personalizzata simile alla risposta di Julio, tuttavia non ha una larghezza impostata e utilizza un'immagine svgcome sfondo. ( arrow_drop_downdalle icone material-ui)

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;
}

inserisci qui la descrizione dell'immagine

Se hai bisogno che funzioni anche in IE, aggiorna la freccia svg a base64 e aggiungi quanto segue:

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

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

Per semplificare la dimensione e lo spazio della freccia, usa questo svg:

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>");

Non ha alcuna spaziatura sui lati della freccia.


1
potresti posizionare la freccia in modo più preciso usandobackground-position: top 5px right 4px;
Koen

Zip: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

posso sapere perché usi background-position-y: 5px;invece di% (es. background-position-y: 50%;)?
Sam

45

Lavorare con una sola classe:

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
La tua risposta sembra essere la più semplice e utilizza solo css.
Austin Lovell

1
Per quello che vale non devi impostare la larghezza del campo e puoi usare% anche per la posizione dello sfondo :)
shaneonabike

2
Firefox non supporta background-position-x, ma supporta background-position
kriskodzi

2
Peccato che questa risposta abbia bisogno di così tanti ritocchi: - / Ma è una buona linea di partenza.
walther

1
Se non vuoi fare affidamento sull'impostazione di una larghezza per il controllo, ma vuoi comunque riempire l'immagine dal lato destro, puoi usare calc: egbackground-position-x: calc( 100% - 5px );
bhu Boue vidya

29

Ecco un'elegante correzione che utilizza un intervallo per mostrare il valore.

Il layout è così:

<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
+1 per questa soluzione, è l'unico modo che ho trovato per modellare correttamente le frecce su IE9 e browser precedenti. Ci sono molti siti che dicono semplicemente che non puoi modellare le caselle di selezione su IE9 e precedenti e invece offrono strategie di fallback, ma questa soluzione dimostra il contrario.
Jon

Grazie è così utile.
Grave tortura

3
Vale la pena ricordare: questa soluzione richiede javascript , per il quale questa risposta non è contrassegnata .
random_user_name

21

Funzionerebbe bene soprattutto per coloro che utilizzano Bootstrap, testato nelle ultime versioni del browser:

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

Controlla questo È hacky, semplice come quello:

  • Impostare -prefix-appearancesu noneper rimuovere gli stili
  • Uso text-indent per "spingere" il contenuto un po 'a destra
  • Infine, imposta text-overflowuna stringa vuota. Tutto ciò che si estende oltre la sua larghezza diventerà ... niente! E questo include la freccia.

Ora sei libero di modellarlo come preferisci :)

.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>

Visualizza su JSFiddle


6

Funziona in tutti i browser:

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
Non consideri IE un browser. Non ti voterò per questo.
user1566694

5

Definisci lo stile dell'etichetta con CSS e utilizza gli eventi del puntatore:

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

e il relativo 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 */
}

Ho appena usato una freccia in giù qui, ma puoi impostare un blocco con un'immagine di sfondo. Ecco un brutto esempio di violino: https://jsfiddle.net/1rofzz89/


1

Ho fatto riferimento a questo post , ha funzionato alla perfezione, tranne per il fatto che non nascondeva la freccia nel browser IE.

Tuttavia, l'aggiunta di quanto segue nasconde la freccia in IE:

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

Soluzione completa (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

Supponiamo che selectDrop sia la classe presente nel tuo tag HTML, quindi questo molto di codice è sufficiente per cambiare l'icona della freccia predefinita:

.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*/
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.