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>

user1802439
quelle

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.

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

svnm
quelle
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/

Julio Marins
quelle
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

Peter Drinnan
quelle
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>

Siavas
quelle
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

sunilkjt
quelle
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;

}
Kishan Radadiya
quelle
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/

Dario Corno
quelle
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;
    }
  }

Maverick09
quelle
-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*/
    }
AdroitSJ
quelle