Sélectionnez le changement de style de flèche

125

J'essaie de remplacer la flèche d'une sélection par une image de ma part. J'inclus la sélection dans un div avec la même taille, je définis l'arrière-plan de la sélection comme transparent et j'inclus une image (avec la même taille que la flèche) dans le coin supérieur droit de la div comme arrière-plan.

Cela ne fonctionne que dans Chrome.

entrez la description de l'image ici

Comment puis-je le faire fonctionner dans Firefox et IE9 où j'obtiens ceci:

entrez la description de l'image ici

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

user1802439
la source

Réponses:

123

Avez-vous essayé quelque chose comme ceci:

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

Je n'ai pas testé, mais devrait fonctionner.

EDIT : Il semble que Firefox ne prend pas en charge cette fonctionnalité jusqu'à la version 35 (en savoir plus ici )

Il existe une solution de contournement ici , jetez un œil à jsfiddlece post.

Morphée
la source
1
qu'en est-il d'Internet Explorer?
Francisco Corrales Morales
Jetez un œil à la solution de @Peter Drinnan pour IE
Morpheus
J'ai trouvé cette réponse à partir d'une question en double qui montre comment ajouter réellement un "bouton", en utilisant du CSS pur (pas de png, jpeg, etc.) stackoverflow.com/a/28274325/2098017
Anthony F.
Le jsfiddle de la question «contournement» ne fonctionne plus.
Dragos Rizescu
Pour les ampoules d'exposition, utilisez ceci:appearance: menulist !important;-moz-appearance: menulist !important;-webkit-appearance: menulist !important;-o-appearance: menulist !important;
mghhgm
61

J'ai configuré un selectavec une flèche personnalisée similaire à la réponse de Julio, mais elle n'a pas de largeur définie et utilise une svgimage de fond. (à arrow_drop_downpartir des icônes 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;
}

entrez la description de l'image ici

Si vous en avez besoin pour fonctionner également dans IE, mettez à jour la flèche svg en base64 et ajoutez ce qui suit:

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

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

Pour faciliter la taille et l'espace de la flèche, utilisez ce 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>");

Il n'a aucun espacement sur les côtés de la flèche.

svnm
la source
1
vous pouvez positionner la flèche plus précisément en utilisantbackground-position: top 5px right 4px;
Koen
Zippé: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
puis-je savoir pourquoi vous utilisez background-position-y: 5px;au lieu de% (par exemple background-position-y: 50%;)?
Sam le
45

Travailler avec une seule 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/

Julio Marins
la source
1
Votre réponse semble être la plus simple et n'utilise que le CSS.
Austin Lovell
1
Pour ce que ça vaut, vous n'avez pas besoin de définir la largeur du champ et pouvez également utiliser% pour la position d'arrière-plan :)
shaneonabike
2
Firefox ne prend pas en charge background-position-x, mais il prend en charge background-position
kriskodzi
2
Dommage que cette réponse ait besoin d'être peaufinée: - / Mais c'est une bonne ligne de départ.
walther
1
Si vous ne voulez pas vous fier à la définition d'une largeur pour le contrôle, mais que vous voulez quand même recadrer l'image à partir du côté droit, vous pouvez utiliser calc: par exemplebackground-position-x: calc( 100% - 5px );
bhu Boue vidya
29

Voici une solution élégante qui utilise une plage pour afficher la valeur.

La mise en page est comme ceci:

<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

Peter Drinnan
la source
5
+1 pour cette solution, c'est le seul moyen que j'ai trouvé pour styliser correctement les flèches sur IE9 et les navigateurs plus anciens. Il existe de nombreux sites qui disent simplement que vous ne pouvez pas styliser les cases de sélection sur IE9 et les versions précédentes, et proposent à la place des stratégies de repli, mais cette solution prouve le contraire.
Jon
Merci c'est tellement utile.
Torture sévère le
3
Il convient de mentionner: cette solution nécessite du javascript , pour lequel cette réponse n'est pas balisée .
random_user_name
21

Cela fonctionnerait bien en particulier pour ceux qui utilisent Bootstrap, testé dans les dernières versions de navigateur:

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>

Siavas
la source
9

Vérifiez celui-ci C'est piraté, aussi simple que cela:

  • Définir -prefix-appearancesur nonepour supprimer les styles
  • Utilisation text-indent pour "pousser" le contenu un peu vers la droite
  • Enfin, définissez text-overflowune chaîne vide. Tout ce qui dépasse sa largeur deviendra ... rien! Et cela inclut la flèche.

Maintenant, vous êtes libre de le styliser comme vous le souhaitez :)

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

Vue sur JSFiddle

sunilkjt
la source
6

Cela fonctionne dans tous les navigateurs:

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;

}
Kishan Radadiya
la source
9
Vous ne considérez pas IE comme un navigateur. Je ne vous voterai pas pour cela.
user1566694
5

Stylisez l'étiquette avec CSS et utilisez des événements de pointeur:

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

et le CSS relatif est

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 */
}

Je viens d'utiliser une flèche vers le bas ici, mais vous pouvez définir un bloc avec une image d'arrière-plan. Voici un exemple de violon laid: https://jsfiddle.net/1rofzz89/

Dario Corno
la source
1

J'ai référé ce post , cela a fonctionné comme du charme, sauf qu'il ne cachait pas la flèche dans le navigateur IE.

Cependant, l'ajout de ce qui suit masque la flèche dans IE:

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

Solution complète (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;
    }
  }

Maverick09
la source
-1

Supposons que selectDrop est la classe présente dans votre balise HTML, donc cette quantité de code suffit pour changer l'icône de flèche par défaut:

.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*/
    }
AdroitSJ
la source