เลือกการเปลี่ยนแปลงลักษณะลูกศร


125

ฉันพยายามแทนที่ลูกศรของการเลือกด้วยรูปภาพของฉันเอง ฉันรวมการเลือกไว้ใน div ที่มีขนาดเท่ากันฉันตั้งค่าพื้นหลังของการเลือกเป็นแบบโปร่งใสและฉันรวมรูปภาพ (ที่มีขนาดเท่ากับลูกศร) ที่มุมบนขวาของ div เป็นพื้นหลัง

ใช้งานได้ใน Chrome เท่านั้น

ใส่คำอธิบายภาพที่นี่

ฉันจะทำให้มันทำงานใน Firefox และ IE9 ได้อย่างไรโดยที่ฉันได้รับสิ่งนี้:

ใส่คำอธิบายภาพที่นี่

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

คำตอบ:


124

คุณได้ลองทำสิ่งนี้แล้วหรือยัง:

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

ยังไม่ได้ทดสอบ แต่ควรใช้งานได้

แก้ไข : ดูเหมือนว่า Firefox จะไม่รองรับฟีเจอร์นี้จนถึงเวอร์ชัน 35 ( อ่านเพิ่มเติมที่นี่ )

มีวิธีแก้ปัญหาอยู่ที่นี่โปรดดูที่jsfiddleโพสต์นั้น


1
แล้ว Internet Explorer ล่ะ
Francisco Corrales Morales

ดูวิธีแก้ปัญหาของ @Peter Drinnan สำหรับ IE
Morpheus

ฉันพบคำตอบนี้จากคำถามที่ซ้ำกันซึ่งแสดงวิธีการเพิ่ม "ปุ่ม" จริง ๆ เช่นกันโดยใช้ CSS แท้ (ไม่มี pngs, jpegs ฯลฯ ) stackoverflow.com/a/28274325/2098017
Anthony F.

jsfiddle จากคำถาม 'วิธีแก้ปัญหา' ใช้ไม่ได้อีกต่อไป
Dragos Rizescu

สำหรับการแสดงหลอดไฟให้ใช้สิ่งนี้:appearance: menulist !important;-moz-appearance: menulist !important;-webkit-appearance: menulist !important;-o-appearance: menulist !important;
mghhgm

61

ฉันได้ตั้งค่าselectลูกศรที่กำหนดเองคล้ายกับคำตอบของ Julio แต่ไม่มีความกว้างที่กำหนดและใช้svgเป็นภาพพื้นหลัง ( arrow_drop_downจากไอคอน 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;
}

ใส่คำอธิบายภาพที่นี่

หากคุณต้องการใช้งานใน IE ให้อัปเดตลูกศร svg เป็น base64 และเพิ่มสิ่งต่อไปนี้:

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

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

เพื่อให้ง่ายต่อการปรับขนาดและเว้นวรรคลูกศรให้ใช้ 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>");

ไม่มีระยะห่างใด ๆ ที่ด้านข้างของลูกศร


1
คุณสามารถวางตำแหน่งลูกศรได้อย่างแม่นยำยิ่งขึ้นโดยใช้background-position: top 5px right 4px;
Koen

Zipped: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;แทน% (เช่นbackground-position-y: 50%;)
แซม

45

การทำงานกับคลาสเดียว:

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
คำตอบของคุณดูเหมือนจะตรงไปตรงมาที่สุดและใช้ css เท่านั้น
Austin Lovell

1
เพื่อสิ่งที่คุ้มค่าคุณไม่ต้องกำหนดความกว้างของฟิลด์และสามารถใช้% สำหรับตำแหน่งพื้นหลังได้ด้วย :)
shaneonabike

2
Firefox ไม่รองรับ background-position-x แต่รองรับ background-position
kriskodzi

2
ความอัปยศคำตอบนี้ต้องการการปรับแต่งมาก: - / แต่มันเป็นเส้นเริ่มต้นที่ดี
walther

1
หากคุณไม่ต้องการพึ่งพาการตั้งค่าความกว้างของตัวควบคุม แต่ยังต้องการเพิ่มรูปภาพกลับจากด้านขวามือคุณสามารถใช้ calc: เช่นbackground-position-x: calc( 100% - 5px );
bhu Boue vidya

29

นี่คือการแก้ไขที่สวยงามที่ใช้ช่วงเพื่อแสดงค่า

เค้าโครงเป็นดังนี้:

<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 สำหรับโซลูชันนี้เป็นวิธีเดียวที่ฉันพบว่าสามารถจัดรูปแบบลูกศรได้อย่างถูกต้องใน IE9 และเบราว์เซอร์รุ่นเก่า มีไซต์จำนวนมากที่บอกว่าคุณไม่สามารถจัดรูปแบบกล่องเลือกบน IE9 และรุ่นก่อนหน้าได้และเสนอกลยุทธ์ทางเลือกแทน แต่โซลูชันนี้พิสูจน์ได้เป็นอย่างอื่น
จอน

ขอบคุณมันมีประโยชน์มาก
ทรมานอย่างรุนแรง

3
มันเป็นมูลค่าการกล่าวขวัญ: การแก้ปัญหานี้ต้องการ JavaScriptซึ่งคำตอบนี้ไม่ได้ติดแท็กสำหรับ
random_user_name

21

สิ่งนี้จะทำงานได้ดีโดยเฉพาะสำหรับผู้ที่ใช้ Bootstrap ซึ่งทดสอบในเบราว์เซอร์เวอร์ชันล่าสุด:

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

ตรวจสอบสิ่งนี้มันแฮ็คง่ายอย่างนั้น:

  • ตั้งค่า-prefix-appearanceเพื่อnoneลบสไตล์
  • ใช้ text-indentเพื่อ "ดัน" เนื้อหาไปทางขวาเล็กน้อย
  • สุดท้ายตั้งค่าtext-overflowเป็นสตริงว่าง ทุกสิ่งที่ขยายเกินความกว้างจะกลายเป็น ... ไม่มีอะไร! และรวมถึงลูกศรด้วย

ตอนนี้คุณมีอิสระในการจัดแต่งทรงผมในแบบที่คุณต้องการ :)

.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


6

มันใช้งานได้ในทุกเบราว์เซอร์:

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 เป็นเบราว์เซอร์ ฉันจะไม่ลงคะแนนให้คุณสำหรับสิ่งนั้น
user1566694

5

จัดรูปแบบป้ายกำกับด้วย CSS และใช้เหตุการณ์ตัวชี้:

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

และ 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 */
}

ฉันเพิ่งใช้ลูกศรลงที่นี่ แต่คุณสามารถตั้งค่าบล็อกด้วยภาพพื้นหลังได้ นี่คือตัวอย่างซอที่น่าเกลียด: https://jsfiddle.net/1rofzz89/


1

ฉันอ้างถึงโพสต์นี้มันใช้งานได้เหมือนมีเสน่ห์ยกเว้นว่ามันไม่ได้ซ่อนลูกศรในเบราว์เซอร์ IE

อย่างไรก็ตามการเพิ่มสิ่งต่อไปนี้จะซ่อนลูกศรใน IE:

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

โซลูชั่นที่สมบูรณ์ (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 เป็นคลาสที่มีอยู่ในแท็ก HTML ของคุณดังนั้นโค้ดส่วนใหญ่นี้ก็เพียงพอที่จะเปลี่ยนไอคอนลูกศรเริ่มต้น:

.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*/
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.