Chọn thay đổi kiểu mũi tên


125

Tôi đang cố gắng thay thế mũi tên của một lựa chọn bằng một hình ảnh của riêng tôi. Tôi đang bao gồm vùng chọn trong một div có cùng kích thước, tôi đặt nền của vùng chọn là trong suốt và tôi đưa một hình ảnh (có cùng kích thước với mũi tên) ở góc trên cùng bên phải của div làm nền.

Nó chỉ hoạt động trong Chrome.

nhập mô tả hình ảnh ở đây

Làm cách nào tôi có thể làm cho nó hoạt động trong Firefox và IE9 khi tôi nhận được điều này:

nhập mô tả hình ảnh ở đây

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

Câu trả lời:


123

Bạn đã thử một cái gì đó như thế này chưa:

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

Chưa được thử nghiệm, nhưng sẽ hoạt động.

CHỈNH SỬA : Có vẻ như Firefox không hỗ trợ tính năng này cho đến phiên bản 35 ( đọc thêm tại đây )

Có một cách giải quyết ở đây , hãy xem jsfiddlebài đăng đó.


1
Internet Explorer thì sao?
Francisco Corrales Morales

Hãy xem giải pháp của @Peter Drinnan cho IE
Morpheus

Tôi tìm thấy câu trả lời này từ một câu hỏi trùng lặp cho biết cách thực sự thêm một "nút", bằng cách sử dụng CSS thuần túy (không có pngs, jpegs, v.v.) stackoverflow.com/a/28274325/2098017
Anthony F.

Câu hỏi jsfiddle từ câu hỏi 'giải pháp thay thế' không còn hoạt động nữa.
Dragos Rizescu

Đối với chương trình củ, sử dụng này:appearance: menulist !important;-moz-appearance: menulist !important;-webkit-appearance: menulist !important;-o-appearance: menulist !important;
mghhgm

61

Tôi đã thiết lập một selectvới một mũi tên tùy chỉnh tương tự như câu trả lời của Julio, tuy nhiên, nó không có chiều rộng đã đặt và sử dụng svgmột hình nền làm hình nền. ( arrow_drop_downtừ các biểu tượng 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;
}

nhập mô tả hình ảnh ở đây

Nếu bạn cần nó hoạt động trong IE, hãy cập nhật mũi tên svg thành base64 và thêm những thứ sau:

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

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

Để tạo kích thước và khoảng cách cho mũi tên dễ dàng hơn, hãy sử dụng svg này:

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

Nó không có bất kỳ khoảng cách nào trên các cạnh của mũi tên.


1
bạn có thể xác định vị trí các mũi tên chính xác hơn sử dụngbackground-position: top 5px right 4px;
Koen

Đã nén: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

Tôi có thể biết tại sao bạn sử dụng background-position-y: 5px;thay vì% (ví dụ. background-position-y: 50%;)?
Sam

45

Làm việc chỉ với một lớp:

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
Câu trả lời của bạn có vẻ là đơn giản nhất và chỉ sử dụng css.
Austin Lovell

1
Đối với những gì nó có giá trị bạn không cần phải thiết lập độ rộng của lĩnh vực này và có thể sử dụng% cho vị trí nền cũng :)
shaneonabike

2
Firefox không hỗ trợ background-position-x, nhưng nó hỗ trợ background-position
kriskodzi

2
Câu trả lời đáng xấu hổ này cần phải điều chỉnh rất nhiều: - / Nhưng đó là một điểm khởi đầu tốt.
walther

1
Nếu bạn không muốn dựa vào thiết lập chiều rộng cho việc kiểm soát, nhưng vẫn muốn pad hình ảnh trở lại từ phía bên tay phải, bạn có thể sử dụng calc: ví dụbackground-position-x: calc( 100% - 5px );
Bhu Boue vidya

29

Đây là một bản sửa lỗi thanh lịch sử dụng một khoảng để hiển thị giá trị.

Bố cục như thế này:

<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 cho giải pháp này, đó là cách duy nhất tôi tìm thấy để tạo kiểu mũi tên đúng cách trên IE9 và các trình duyệt cũ hơn. Có rất nhiều trang web chỉ đơn giản nói rằng bạn không thể tạo kiểu cho các hộp chọn trên IE9 và phiên bản trước đó và thay vào đó đưa ra các chiến lược dự phòng, nhưng giải pháp này đã chứng minh điều ngược lại.
Jon

Cảm ơn nó rất hữu ích.
Tra tấn nghiêm trọng vào

3
Điều đáng nói là: giải pháp này yêu cầu javascript , mà câu trả lời này không được gắn thẻ .
random_user_name

21

Điều này sẽ hoạt động tốt, đặc biệt đối với những người sử dụng Bootstrap, được thử nghiệm trong các phiên bản trình duyệt mới nhất:

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

Kiểm tra cái này Nó hacky, đơn giản như vậy:

  • Đặt -prefix-appearanceđể nonexóa các kiểu
  • Sử dụng text-indentđể "đẩy" nội dung sang bên phải một chút
  • Cuối cùng, đặt text-overflowthành một chuỗi trống. Mọi thứ vượt quá chiều rộng của nó sẽ trở thành ... không có gì! Và điều đó bao gồm cả mũi tên.

Bây giờ bạn có thể tự do tạo kiểu theo bất kỳ cách nào bạn muốn :)

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

Xem trên JSFiddle


6

Nó hoạt động trên tất cả các trình duyệt:

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
Bạn không coi IE là một trình duyệt. Tôi sẽ không bỏ phiếu cho bạn cho điều đó.
dùng1566694

5

Tạo kiểu cho nhãn bằng CSS và sử dụng các sự kiện con trỏ:

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

và CSS tương đối là

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

Tôi vừa sử dụng một mũi tên xuống ở đây, nhưng bạn có thể đặt một khối có hình nền. Đây là một mẫu fiddle xấu xí: https://jsfiddle.net/1rofzz89/


1

Tôi đã giới thiệu bài đăng này , nó hoạt động như một sự quyến rũ, ngoại trừ nó không ẩn mũi tên trong trình duyệt IE.

Tuy nhiên, việc thêm sau sẽ ẩn mũi tên trong IE:

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

Giải pháp hoàn chỉnh (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

Giả sử selectDrop là lớp có trong thẻ HTML của bạn. Vì vậy, quá nhiều mã này là đủ để thay đổi biểu tượng mũi tên mặc định:

.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*/
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.