Wählen Sie die Änderung des Pfeilstils


125

Ich versuche, den Pfeil einer Auswahl durch ein eigenes Bild zu ersetzen. Ich füge die Auswahl in ein Div mit derselben Größe ein, ich setze den Hintergrund der Auswahl als transparent und ich füge ein Bild (mit derselben Größe wie der Pfeil) in die rechte obere Ecke des Div als Hintergrund ein.

Es funktioniert nur in Chrome.

Geben Sie hier die Bildbeschreibung ein

Wie kann ich dafür sorgen, dass es in Firefox und IE9 funktioniert, wo ich Folgendes bekomme:

Geben Sie hier die Bildbeschreibung ein

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

Antworten:


123

Haben Sie so etwas versucht:

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

Nicht getestet, sollte aber funktionieren.

EDIT : Es sieht aus wie Firefox diese Funktion nicht unterstützen , bis Version 35 ( lesen Sie hier mehr )

Es gibt eine Abhilfe hier , werfen Sie einen Blick auf jsfiddleauf diesem Posten.


1
Was ist mit Internet Explorer?
Francisco Corrales Morales

Werfen Sie einen Blick auf @Peter Drinnans Lösung für IE
Morpheus

Ich fand diese Antwort aus einer doppelten Frage, die zeigt, wie man auch eine "Schaltfläche" mit reinem CSS (keine PNGs, JPEGs usw.) hinzufügt. Stackoverflow.com/a/28274325/2098017
Anthony F.

Die jsfiddle aus der 'Workaround'-Frage funktioniert nicht mehr.
Dragos Rizescu

Verwenden Sie für appearance: menulist !important;-moz-appearance: menulist !important;-webkit-appearance: menulist !important;-o-appearance: menulist !important;
Showbirnen Folgendes

60

Ich habe einen selectmit einem benutzerdefinierten Pfeil eingerichtet, der Julios Antwort ähnelt, jedoch keine festgelegte Breite hat und einen svgals Hintergrundbild verwendet. ( arrow_drop_downvon Material-UI-Symbolen)

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

Geben Sie hier die Bildbeschreibung ein

Wenn Sie es auch für den IE benötigen, aktualisieren Sie den SVG-Pfeil auf base64 und fügen Sie Folgendes hinzu:

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

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

Verwenden Sie dieses SVG, um die Größe und den Abstand des Pfeils zu vereinfachen:

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

Es hat keinen Abstand an den Pfeilseiten.


1
Sie könnten den Pfeil genauer positionieren mitbackground-position: top 5px right 4px;
Koen

Reißverschluss: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

Darf ich wissen, warum Sie background-position-y: 5px;anstelle von% (z. B. background-position-y: 50%;) verwenden?
Sam

45

Arbeiten mit nur einer Klasse:

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
Ihre Antwort scheint die direkteste zu sein und verwendet nur CSS.
Austin Lovell

1
Für das, was es wert ist, müssen Sie nicht die Breite des Feldes einstellen und können% auch für die Hintergrundposition verwenden :)
shaneonabike

2
Firefox unterstützt nicht Hintergrundposition-x, aber es unterstützt Hintergrundposition
kriskodzi

2
Schade, dass diese Antwort so viel verbessert werden muss: - / Aber es ist eine gute Startlinie.
Walther

1
Wenn Sie sich nicht darauf verlassen möchten, eine Breite für das Steuerelement background-position-x: calc( 100% - 5px );
festzulegen

29

Hier ist eine elegante Korrektur, die eine Spanne verwendet, um den Wert anzuzeigen.

Das Layout ist wie folgt:

<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 für diese Lösung ist dies die einzige Möglichkeit, die Pfeile in IE9 und älteren Browsern richtig zu formatieren. Es gibt viele Websites, die einfach sagen, dass Sie Auswahlfelder in IE9 und früheren Versionen nicht formatieren können und stattdessen Fallback-Strategien anbieten. Diese Lösung beweist jedoch das Gegenteil.
Jon

Danke, es ist so nützlich.
Schwere Folter

3
Erwähnenswert ist: Für diese Lösung ist Javascript erforderlich , für das diese Antwort nicht gekennzeichnet ist .
random_user_name

20

Dies funktioniert besonders gut, wenn Sie Bootstrap verwenden, das in den neuesten Browserversionen getestet wurde:

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

Überprüfen Sie dieses Es ist hacky, einfach so:

  • Stellen Sie -prefix-appearanceauf nonedie Stile zu entfernen
  • Verwenden Sie text-indentdiese Option , um den Inhalt etwas nach rechts zu "verschieben"
  • Setzen Sie text-overflowschließlich eine leere Zeichenfolge. Alles, was über seine Breite hinausgeht, wird ... nichts! Und dazu gehört auch der Pfeil.

Jetzt kannst du es so stylen, wie du willst :)

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

Ansicht auf JSFiddle


6

Es funktioniert in allen Browsern:

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
Sie betrachten IE nicht als Browser. Ich werde Sie dafür nicht herabstimmen.
user1566694

5

Gestalten Sie die Beschriftung mit CSS und verwenden Sie Zeigerereignisse:

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

und das relative CSS ist

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

Ich habe hier nur einen Abwärtspfeil verwendet, aber Sie können einen Block mit einem Hintergrundbild festlegen. Hier ist ein hässliches Geigenbeispiel: https://jsfiddle.net/1rofzz89/


1

Ich habe auf diesen Beitrag verwiesen , er hat wie ein Zauber funktioniert, außer dass der Pfeil im IE-Browser nicht ausgeblendet wurde.

Wenn Sie jedoch Folgendes hinzufügen, wird der Pfeil im IE ausgeblendet:

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

Komplettlösung (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

Angenommen, selectDrop ist die Klasse, die in Ihrem HTML-Tag vorhanden ist. So viel Code reicht aus, um das Standardpfeilsymbol zu ändern:

.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*/
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.