Đây là ba giải pháp:
Giải pháp số 1 - xuất hiện: không có - với Internet Explorer 10 - 11 cách giải quyết ( Bản trình diễn )
-
Để ẩn mũi tên mặc định được đặt appearance: none
trên thành phần chọn, sau đó thêm mũi tên tùy chỉnh của riêng bạn vớibackground-image
select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none; /* Remove default arrow */
background-image: url(...); /* Add custom arrow */
}
Hỗ trợ trình duyệt:
appearance: none
có hỗ trợ trình duyệt rất tốt ( caniuse ) - ngoại trừ Internet Explorer 11 (và phiên bản mới hơn) và Firefox 34 (và phiên bản mới hơn).
Chúng tôi có thể cải thiện kỹ thuật này và thêm hỗ trợ cho Internet Explorer 10 và Internet Explorer 11 bằng cách thêm
select::-ms-expand {
display: none; /* Hide the default arrow in Internet Explorer 10 and Internet Explorer 11 */
}
Nếu Internet Explorer 9 là một mối quan tâm, chúng tôi không có cách nào để loại bỏ mũi tên mặc định (điều đó có nghĩa là bây giờ chúng tôi sẽ có hai mũi tên), nhưng, chúng tôi có thể sử dụng bộ chọn Internet Explorer 9 thú vị.
Để ít nhất hoàn tác mũi tên tùy chỉnh của chúng tôi - giữ nguyên mũi tên chọn mặc định.
/* Target Internet Explorer 9 to undo the custom arrow */
@media screen and (min-width:0\0) {
select {
background-image:none\9;
padding: 5px\9;
}
}
Tất cả cùng nhau:
select {
margin: 50px;
width: 150px;
padding: 5px 35px 5px 5px;
font-size: 16px;
border: 1px solid #CCC;
height: 34px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: url(http://www.stackoverflow.com/favicon.ico) 96% / 15% no-repeat #EEE;
}
/* CAUTION: Internet Explorer hackery ahead */
select::-ms-expand {
display: none; /* Remove default arrow in Internet Explorer 10 and 11 */
}
/* Target Internet Explorer 9 to undo the custom arrow */
@media screen and (min-width:0\0) {
select {
background: none\9;
padding: 5px\9;
}
}
<select>
<option>Apples</option>
<option selected>Pineapples</option>
<option>Chocklate</option>
<option>Pancakes</option>
</select>
Giải pháp này rất dễ dàng và có hỗ trợ trình duyệt tốt - thường là đủ.
Nếu trình duyệt hỗ trợ cho Internet Explorer 9 (và phiên bản mới hơn) và Firefox 34 (và phiên bản mới hơn) là cần thiết thì hãy tiếp tục đọc ...
Giải pháp # 2 Cắt bớt phần tử chọn để ẩn mũi tên mặc định ( bản demo )
-
(Đọc thêm tại đây)
Bọc select
phần tử trong div với chiều rộng cố định và overflow:hidden
.
Sau đó cung cấp cho select
phần tử chiều rộng lớn hơn khoảng 20 pixel so với div .
Kết quả là mũi tên thả xuống mặc định của select
phần tử sẽ bị ẩn (do overflow:hidden
trên hộp chứa) và bạn có thể đặt bất kỳ hình nền nào bạn muốn ở phía bên phải của div.
Các lợi thế của phương pháp này là nó là qua trình duyệt (Internet Explorer 8 và sau đó, WebKit , và Gecko ). Tuy nhiên, nhược điểm của phương pháp này là các tùy chọn thả xuống nhô ra ở phía bên tay phải (bằng 20 pixel mà chúng tôi ẩn ... vì các phần tử tùy chọn lấy chiều rộng của phần tử chọn).
[Tuy nhiên, cần lưu ý rằng nếu phần tử chọn tùy chỉnh chỉ cần thiết cho thiết bị di động - thì vấn đề trên không được áp dụng - do cách mỗi điện thoại thường mở phần tử chọn. Vì vậy, đối với thiết bị di động, đây có thể là giải pháp tốt nhất.]
.styled select {
background: transparent;
width: 150px;
font-size: 16px;
border: 1px solid #CCC;
height: 34px;
}
.styled {
margin: 50px;
width: 120px;
height: 34px;
border: 1px solid #111;
border-radius: 3px;
overflow: hidden;
background: url(http://www.stackoverflow.com/favicon.ico) 96% / 20% no-repeat #EEE;
}
<div class="styled">
<select>
<option>Pineapples</option>
<option selected>Apples</option>
<option>Chocklate</option>
<option>Pancakes</option>
</select>
</div>
Nếu mũi tên tùy chỉnh là cần thiết trên Firefox - trước Phiên bản 35 - nhưng bạn không cần hỗ trợ các phiên bản Internet Explorer cũ - thì hãy tiếp tục đọc ...
Giải pháp số 3 - Sử dụng pointer-events
tài sản ( bản demo )
-
(Đọc thêm tại đây)
Ý tưởng ở đây là phủ một phần tử lên trên mũi tên thả xuống gốc (để tạo phần tử tùy chỉnh của chúng ta) và sau đó không cho phép các sự kiện con trỏ trên đó.
Ưu điểm: Nó hoạt động tốt trong WebKit và Gecko. Nó trông cũng tốt (không có option
yếu tố nhô ra ).
Nhược điểm: Internet Explorer (Internet Explorer 10 trở xuống) không hỗ trợ pointer-events
, có nghĩa là bạn không thể nhấp vào mũi tên tùy chỉnh. Ngoài ra, một nhược điểm (rõ ràng) khác với phương pháp này là bạn không thể nhắm mục tiêu hình ảnh mũi tên mới của mình bằng hiệu ứng di chuột hoặc con trỏ tay, bởi vì chúng tôi vừa vô hiệu hóa các sự kiện con trỏ trên chúng!
Tuy nhiên, với phương pháp này, bạn có thể sử dụng Modernizer hoặc các nhận xét có điều kiện để làm cho Internet Explorer trở lại tiêu chuẩn được xây dựng trong mũi tên.
Lưu ý: Do Internet Explorer 10 không hỗ trợ conditional comments
nữa: Nếu bạn muốn sử dụng phương pháp này, có lẽ bạn nên sử dụng Modernizr . Tuy nhiên, vẫn có thể loại trừ CSS các sự kiện con trỏ khỏi Internet Explorer 10 bằng cách hack CSS được mô tả ở đây .
.notIE {
position: relative;
display: inline-block;
}
select {
display: inline-block;
height: 30px;
width: 150px;
outline: none;
color: #74646E;
border: 1px solid #C8BFC4;
border-radius: 4px;
box-shadow: inset 1px 1px 2px #DDD8DC;
background: #FFF;
}
/* Select arrow styling */
.notIE .fancyArrow {
width: 23px;
height: 28px;
position: absolute;
display: inline-block;
top: 1px;
right: 3px;
background: url(http://www.stackoverflow.com/favicon.ico) right / 90% no-repeat #FFF;
pointer-events: none;
}
/*target Internet Explorer 9 and Internet Explorer 10:*/
@media screen and (min-width: 0\0) {
.notIE .fancyArrow {
display: none;
}
}
<!--[if !IE]> -->
<div class="notIE">
<!-- <![endif]-->
<span class="fancyArrow"></span>
<select>
<option>Apples</option>
<option selected>Pineapples</option>
<option>Chocklate</option>
<option>Pancakes</option>
</select>
<!--[if !IE]> -->
</div>
<!-- <![endif]-->