Làm cách nào để tạo kiểu thả xuống <select> chỉ với CSS?


1333

Có cách nào chỉ dành cho CSS để tạo kiểu <select>thả xuống không?

Tôi cần tạo kiểu cho một <select>biểu mẫu càng nhiều càng tốt, không có JavaScript. Các thuộc tính tôi có thể sử dụng để làm như vậy trong CSS là gì?

Mã này cần phải tương thích với tất cả các trình duyệt chính:

  • Internet Explorer 6, 7 và 8
  • Firefox
  • Safari

Tôi biết tôi có thể làm điều đó với JavaScript: Ví dụ .

Và tôi không nói về kiểu dáng đơn giản. Tôi muốn biết, những gì tốt nhất chúng ta có thể làm chỉ với CSS.

Tôi tìm thấy câu hỏi tương tự trên Stack Overflow.

cái này trên Doctype.com.


1
Không có gì nhiều trên google chỉ có giải pháp js ở đó
Jitendra Vyas

41
Tôi cảm thấy đó là một câu hỏi chính đáng, nhưng câu trả lời là "không, không thực sự" hoặc "không phải theo cách bạn muốn". Nhưng không ai (không phải tôi) chắc chắn 100% về điều đó, cảm giác mơ hồ này bò dưới da người đọc và tính hợp pháp của câu hỏi bị nghi ngờ.
ZJR

1
@Jitendra, tôi biết những gì bạn nhận được tại. Chúng tôi sẽ thích nó nếu bạn làm cho câu hỏi của bạn rõ ràng hơn. Thêm vào đó, tôi nghĩ rằng tôi đã tìm thấy những gì bạn có thể đang tìm kiếm. Đây là thử nghiệm, nhưng hãy kiểm tra xem: cappuccino.org/aristo/showcase
jeremyosborne

1
@jeremyostern - Cảm ơn đã trả lời. Tôi biết tôi có thể làm điều đó với javascript. liên kết eaxmple của bạn dựa trên JS. Tại sao tôi hỏi câu hỏi này bởi vì tôi muốn biết, có ai biết về những gì tốt nhất chúng ta có thể làm chỉ với css không
Jitendra Vyas

@Jitendra Cảm ơn bạn đã cập nhật câu hỏi của bạn. Điều tốt nhất bạn có thể làm một cách đáng tin cậy với các ràng buộc bạn có (chỉ CSS và không có JS) là sửa đổi kiểu chữ (phông chữ), màu nền và tiền cảnh (văn bản), kích thước viền, hình dạng và màu sắc, vị trí và kích thước (thường thông qua loại thiết lập thông qua phông chữ). Thậm chí sau đó, có lẽ bạn sẽ cần phải thực hiện một vài điều chỉnh để đảm bảo mọi thứ trông giống nhau trên tất cả các trình duyệt. Tôi ước tôi biết một câu trả lời tốt hơn thế, và có lẽ có một câu mà tôi đã bỏ lỡ, nhưng tôi không nghĩ vậy.
jeremyosborne

Câu trả lời:


1027

Đâ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: nonetrê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: nonecó 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:

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 selectphần tử trong div với chiều rộng cố địnhoverflow:hidden.

Sau đó cung cấp cho selectphầ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 selectphần tử sẽ bị ẩn (do overflow:hiddentrê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).

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

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


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-eventstà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ó optionyế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 commentsnữ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 .


1
Cái nào là tốt nhất theo bạn từ 2 phương pháp này?
Jitendra Vyas

3
Nó phụ thuộc vào yêu cầu thiết kế. Nếu bạn đồng ý với trình đơn thả xuống - thì đó là điều tốt nhất bởi vì đó là trình duyệt chéo (tất cả các trình duyệt IMO + IE8 + có thể được coi là trình duyệt chéo) nhưng tôi nghĩ với nhiều người - điều này sẽ không xảy ra. Vì vậy, thực sự trong tuyên bố của tôi ở trên tôi có nghĩa là aprroach # 2 là tốt nhất.
Danield

4
Ngoài ra, fiddle mà tôi đã đăng sử dụng cách tiếp cận # 2 với các câu lệnh có điều kiện để cho phép IE sử dụng mũi tên mặc định của nó.
Danield

3
@AlexisLeclerc Sửa lỗi div và chọn cùng chiều rộng chỉ hoạt động trong các trình duyệt -webkit như Chrome. (vì tôi đã bao gồm quy tắc - webkit-ngoại hình: none; ) Tuy nhiên, điều này không hoạt động trong các trình duyệt khác như firefox
Danield

4
Nếu tôi có thể đề xuất một cải tiến cho Cách tiếp cận số 1, cá nhân tôi thấy việc thiếu đường viền hoặc thiếu hào quang lựa chọn ở phía bên phải rất khó chịu. Tôi đã cập nhật fiddle của bạn với một cái gì đó tôi đã sử dụng trong dự án hiện tại của mình: jsfiddle.net/YvCHW/1745 . Nói cho tôi biết bạn nghĩ gì!
Alexis Leclerc

233

Có thể, nhưng thật không may, chủ yếu là trong các trình duyệt dựa trên WebKit đến mức mà chúng tôi, với tư cách là nhà phát triển, yêu cầu. Dưới đây là ví dụ về kiểu dáng CSS được thu thập từ bảng tùy chọn Chrome thông qua trình kiểm tra công cụ dành cho nhà phát triển tích hợp, được cải tiến để phù hợp với các thuộc tính CSS hiện được hỗ trợ trong hầu hết các trình duyệt hiện đại:

select {
    -webkit-appearance: button;
    -moz-appearance: button;
    -webkit-user-select: none;
    -moz-user-select: none;
    -webkit-padding-end: 20px;
    -moz-padding-end: 20px;
    -webkit-padding-start: 2px;
    -moz-padding-start: 2px;
    background-color: #F07575; /* Fallback color if gradients are not supported */
    background-image: url(../images/select-arrow.png), -webkit-linear-gradient(top, #E5E5E5, #F4F4F4); /* For Chrome and Safari */
    background-image: url(../images/select-arrow.png), -moz-linear-gradient(top, #E5E5E5, #F4F4F4); /* For old Firefox (3.6 to 15) */
    background-image: url(../images/select-arrow.png), -ms-linear-gradient(top, #E5E5E5, #F4F4F4); /* For pre-releases of Internet Explorer  10*/
    background-image: url(../images/select-arrow.png), -o-linear-gradient(top, #E5E5E5, #F4F4F4); /* For old Opera (11.1 to 12.0) */
    background-image: url(../images/select-arrow.png), linear-gradient(to bottom, #E5E5E5, #F4F4F4); /* Standard syntax; must be last */
    background-position: center right;
    background-repeat: no-repeat;
    border: 1px solid #AAA;
    border-radius: 2px;
    box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);
    color: #555;
    font-size: inherit;
    margin: 0;
    overflow: hidden;
    padding-top: 2px;
    padding-bottom: 2px;
    text-overflow: ellipsis;
    white-space: nowrap;
}

Khi bạn chạy mã này trên bất kỳ trang nào trong trình duyệt dựa trên WebKit, nó sẽ thay đổi giao diện của hộp chọn, xóa mũi tên OS tiêu chuẩn và thêm mũi tên PNG, đặt một khoảng cách trước và sau nhãn, gần như mọi thứ bạn muốn.

Phần quan trọng nhất là appearancetài sản, thay đổi cách hành xử của phần tử.

Nó hoạt động hoàn hảo trong hầu hết tất cả các trình duyệt dựa trên WebKit, bao gồm cả trình duyệt trên thiết bị di động, mặc dù Gecko không hỗ trợ appearancecũng như WebKit.


4
Xin chào, tôi nhận thấy rằng các hộp chọn bắt đầu trông rất khác so với Firefox 12 (trông rất giống với Chrome (tôi có máy Mac)) và có vẻ như FF 12 hỗ trợ nhiều thuộc tính ngoại hình hơn.
CWSpear

3
một giải pháp chỉ dành cho chrome ... Tôi sẽ không trả tiền cho điều này, cũng như khách hàng của tôi. xem câu trả lời của @ Dianeld cho một giải pháp trình duyệt x.
Adrien Be

41
@AdrienBe Giải pháp của tôi đã được đề xuất gần 3 năm trước; tại thời điểm đó là cách hợp lý duy nhất để sắp xếp lại các hộp chọn mà không liên quan đến các lib hoặc plugin JavaScript. Sẽ vẫn khả thi nếu bạn quyết định bỏ các thuộc tính có tiền tố, nhưng nó chỉ hoạt động đáng tin cậy trong các trình duyệt dựa trên Webkit (vì vậy Safari, Opera + Android mới cũng vậy). Ngay bây giờ, có thể có các giải pháp tốt hơn, vì vậy thay vì thêm các bình luận vô nghĩa, chỉ cần bỏ phiếu cho giải pháp mà bạn thấy là tốt hơn và trong tương lai, hãy kiểm tra ngày "đã trả lời". Cảm ơn.
Matthew Morek

4
@MatthewMorek: đã có một giải pháp tốt hơn, thậm chí 3 năm trước. Câu trả lời của Daniel tốt hơn nhiều về hỗ trợ nhiều trình duyệt (nó hỗ trợ IE8 trở lên, WebKit và Gecko). Câu hỏi đã đặt ra là "mã cần phải tương thích với tất cả các trình duyệt chính: Internet Explorer 6,7 và 8, Firefox & Safari". Yêu cầu trình duyệt x này có thể đã được Paul Sweatte thêm vào năm 2013 mặc dù ... xin lỗi nếu đó là trường hợp.
Adrien Be

3
Nếu bạn thêm text-indent: 0.01px; text-overflow: "";nó sẽ hoạt động tốt hơn nữa
Ivan

64

Phần tử chọn và tính năng thả xuống của nó rất khó tạo kiểu.

thuộc tính phong cách cho yếu tố được chọn bởi Chris Heilmann xác nhận những gì Ryan Dohery đã nói trong một nhận xét cho câu trả lời đầu tiên:

"Phần tử chọn là một phần của hệ điều hành, không phải chrome trình duyệt. Do đó, nó rất không đáng tin cậy về kiểu dáng và dù sao cũng không nhất thiết phải thử."


47

Tôi đã có vấn đề chính xác này, ngoại trừ tôi không thể sử dụng hình ảnh và không bị giới hạn bởi hỗ trợ trình duyệt. Điều này nên là «trên spec» và cuối cùng may mắn bắt đầu làm việc ở mọi nơi .

Nó sử dụng các lớp nền xoay được xếp lớp để «cắt ra» một mũi tên thả xuống, vì các phần tử giả sẽ không hoạt động cho phần tử được chọn.

Chỉnh sửa: Trong phiên bản cập nhật này, tôi đang sử dụng các biến CSS và một hệ thống theo chủ đề nhỏ.

:root {
  --radius: 2px;
  --baseFg: dimgray;
  --baseBg: white;
  --accentFg: #006fc2;
  --accentBg: #bae1ff;
}

.theme-pink {
  --radius: 2em;
  --baseFg: #c70062;
  --baseBg: #ffe3f1;
  --accentFg: #c70062;
  --accentBg: #ffaad4;
}

.theme-construction {
  --radius: 0;
  --baseFg: white;
  --baseBg: black;
  --accentFg: black;
  --accentBg: orange;
}

select {
  font: 400 12px/1.3 sans-serif;
  -webkit-appearance: none;
  appearance: none;
  color: var(--baseFg);
  border: 1px solid var(--baseFg);
  line-height: 1;
  outline: 0;
  padding: 0.65em 2.5em 0.55em 0.75em;
  border-radius: var(--radius);
  background-color: var(--baseBg);
  background-image: linear-gradient(var(--baseFg), var(--baseFg)),
    linear-gradient(-135deg, transparent 50%, var(--accentBg) 50%),
    linear-gradient(-225deg, transparent 50%, var(--accentBg) 50%),
    linear-gradient(var(--accentBg) 42%, var(--accentFg) 42%);
  background-repeat: no-repeat, no-repeat, no-repeat, no-repeat;
  background-size: 1px 100%, 20px 22px, 20px 22px, 20px 100%;
  background-position: right 20px center, right bottom, right bottom, right bottom;   
}

select:hover {
  background-image: linear-gradient(var(--accentFg), var(--accentFg)),
    linear-gradient(-135deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(-225deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(var(--accentFg) 42%, var(--accentBg) 42%);
}

select:active {
  background-image: linear-gradient(var(--accentFg), var(--accentFg)),
    linear-gradient(-135deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(-225deg, transparent 50%, var(--accentFg) 50%),
    linear-gradient(var(--accentFg) 42%, var(--accentBg) 42%);
  color: var(--accentBg);
  border-color: var(--accentFg);
  background-color: var(--accentFg);
}
<select>
  <option>So many options</option>
  <option>...</option>
</select>

<select class="theme-pink">
  <option>So many options</option>
  <option>...</option>
</select>

<select class="theme-construction">
  <option>So many options</option>
  <option>...</option>
</select>


5
Wow, đây là một trong những giải pháp tuyệt vời nhất mà tôi đã thấy. Nó hoạt động với tôi trong các phiên bản Chrome và Safari mới nhất trên Mac. Còn các trình duyệt khác thì sao?
Tintin81

2
Hoạt động với tôi trong firefox với việc bổ sung-moz-appearance: none;
Zac

45

Sự không nhất quán lớn nhất mà tôi nhận thấy khi thả xuống chọn kiểu là Safari và kết xuất Google Chrome (Firefox hoàn toàn có thể tùy chỉnh thông qua CSS). Sau một số tìm kiếm thông qua độ sâu tối nghĩa của Internet, tôi đã tìm thấy những điều sau đây, điều này gần như giải quyết hoàn toàn các vấn đề của tôi với WebKit:

Sửa lỗi Safari và Google Chrome :

select {
  -webkit-appearance: none;
}

Điều này, tuy nhiên, loại bỏ mũi tên thả xuống. Bạn có thể thêm một mũi tên thả xuống bằng cách sử dụng gần đó divvới nền, lề âm hoặc được định vị tuyệt đối trên danh sách thả xuống được chọn.

* Thêm thông tin và các biến khác có sẵn trong thuộc tính CSS: -webkit-ngoại hình .


1
Đừng quên thêm kiểu dáng của bạn sau đó;) Nhưng tôi rất vui vì tôi đã đọc bình luận này ngày hôm nay.
teewuane

1
bạn có thể giải thích rõ hơn về tuyên bố của mình: "Firefox hoàn toàn có thể tùy chỉnh thông qua CSS" với tôi có vẻ như firefox không hỗ trợ thuộc tính xuất hiện ... vậy làm thế nào điều này sẽ được thực hiện trong firefox?
Danield

36

<select>các thẻ có thể được tạo kiểu thông qua CSS giống như bất kỳ thành phần HTML nào khác trên trang HTML được hiển thị trong trình duyệt. Dưới đây là một ví dụ (quá đơn giản) sẽ định vị một yếu tố được chọn trên trang và hiển thị văn bản của các tùy chọn màu xanh lam.

Ví dụ tệp HTML (selectExample.html):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <title>Select Styling</title>
  <link href="selectExample.css" rel="stylesheet">
</head>
<body>
<select id="styledSelect" class="blueText">
  <option value="apple">Apple</option>
  <option value="orange">Orange</option>
  <option value="cherry">Cherry</option>
</select>
</body>
</html>

Ví dụ tệp CSS (selectExample.css):

/* All select elements on page */
select {
  position: relative;
}

/* Style by class. Effects the text of the contained options. */
.blueText {
  color: #0000FF;
}

/* Style by id. Effects position of the select drop down. */
#styledSelect {
  left: 100px;
}

30
Thật tuyệt vời, lần đầu tiên tôi thấy "các bà mẹ" tham gia vào Internet mà không hề thô lỗ. +1 cho điều đó!
BaL

34
Câu trả lời này không giải quyết được câu hỏi này. Nó chỉ chọn kiểu đầu vào chứ không chọn kiểu thả xuống
Kyborek

14
Câu trả lời này hoàn toàn bỏ qua những thách thức trong việc tạo kiểu danh sách thả xuống cho tính nhất quán của trình duyệt chéo. Đây là một câu trả lời nỗ lực rất thấp.
BentOnCoding

18

Bài đăng trên blog Cách thả xuống biểu mẫu CSS không có JavaScript nào phù hợp với tôi, nhưng nó không thành công trong Opera :

select {
  border: 0 none;
  color: #FFFFFF;
  background: transparent;
  font-size: 20px;
  font-weight: bold;
  padding: 2px 10px;
  width: 378px;
  *width: 350px;
  *background: #58B14C;
}

#mainselection {
  overflow: hidden;
  width: 350px;
  -moz-border-radius: 9px 9px 9px 9px;
  -webkit-border-radius: 9px 9px 9px 9px;
  border-radius: 9px 9px 9px 9px;
  box-shadow: 1px 1px 11px #330033;
  background: url("arrow.gif") no-repeat scroll 319px 5px #58B14C;
}
<div id="mainselection">
  <select>
    <option>Select an Option</option>
    <option>Option 1</option>
    <option>Option 2</option>
  </select>
</div>


17

Đây là một phiên bản hoạt động trong tất cả các trình duyệt hiện đại. Khóa này đang sử dụng appearance:noneloại bỏ định dạng mặc định. Vì tất cả các định dạng đã biến mất, bạn phải thêm lại vào mũi tên phân biệt trực quan lựa chọn từ đầu vào.

Ví dụ hoạt động: https://jsfiddle.net/gs2q1c7p/

select:not([multiple]) {
    -webkit-appearance: none;
    -moz-appearance: none;
    background-position: right 50%;
    background-repeat: no-repeat;
    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAMCAYAAABSgIzaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDZFNDEwNjlGNzFEMTFFMkJEQ0VDRTM1N0RCMzMyMkIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDZFNDEwNkFGNzFEMTFFMkJEQ0VDRTM1N0RCMzMyMkIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NkU0MTA2N0Y3MUQxMUUyQkRDRUNFMzU3REIzMzIyQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NkU0MTA2OEY3MUQxMUUyQkRDRUNFMzU3REIzMzIyQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuGsgwQAAAA5SURBVHjaYvz//z8DOYCJgUxAf42MQIzTk0D/M+KzkRGPoQSdykiKJrBGpOhgJFYTWNEIiEeAAAMAzNENEOH+do8AAAAASUVORK5CYII=);
    padding: .5em;
    padding-right: 1.5em
}

#mySelect {
    border-radius: 0
}
<select id="mySelect">
    <option>Option 1</option>
    <option>Option 2</option>
</select>


16

Tôi đã đến trường hợp của bạn bằng cách sử dụng Bootstrap . Đây là giải pháp đơn giản nhất có hiệu quả:

select.form-control {
    -moz-appearance: none;
    -webkit-appearance: none;
    appearance: none;
    background-position: right center;
    background-repeat: no-repeat;
    background-size: 1ex;
    background-origin: content-box;
    background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDM1Ljk3MDk4MyAyMy4wOTE1MTgiCiAgIGhlaWdodD0iNi41MTY5Mzk2bW0iCiAgIHdpZHRoPSIxMC4xNTE4MTFtbSI+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAyLjAxNDUxLC00MDcuMTIyMjUpIgogICAgIGlkPSJsYXllcjEiPgogICAgPHRleHQKICAgICAgIGlkPSJ0ZXh0MzMzNiIKICAgICAgIHk9IjYyOS41MDUwNyIKICAgICAgIHg9IjI5MS40Mjg1NiIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjQwcHg7bGluZS1oZWlnaHQ6MTI1JTtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIj48dHNwYW4KICAgICAgICAgeT0iNjI5LjUwNTA3IgogICAgICAgICB4PSIyOTEuNDI4NTYiCiAgICAgICAgIGlkPSJ0c3BhbjMzMzgiPjwvdHNwYW4+PC90ZXh0PgogICAgPGcKICAgICAgIGlkPSJ0ZXh0MzM0MCIKICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo0MHB4O2xpbmUtaGVpZ2h0OjEyNSU7Zm9udC1mYW1pbHk6Rm9udEF3ZXNvbWU7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpGb250QXdlc29tZTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIj4KICAgICAgPHBhdGgKICAgICAgICAgaWQ9InBhdGgzMzQ1IgogICAgICAgICBzdHlsZT0iZmlsbDojMzMzMzMzO2ZpbGwtb3BhY2l0eToxIgogICAgICAgICBkPSJtIDIzNy41NjY5Niw0MTMuMjU1MDcgYyAwLjU1ODA0LC0wLjU1ODA0IDAuNTU4MDQsLTEuNDczMjIgMCwtMi4wMzEyNSBsIC0zLjcwNTM1LC0zLjY4MzA0IGMgLTAuNTU4MDQsLTAuNTU4MDQgLTEuNDUwOSwtMC41NTgwNCAtMi4wMDg5MywwIEwgMjIwLDQxOS4zOTM0NiAyMDguMTQ3MzIsNDA3LjU0MDc4IGMgLTAuNTU4MDMsLTAuNTU4MDQgLTEuNDUwODksLTAuNTU4MDQgLTIuMDA4OTMsMCBsIC0zLjcwNTM1LDMuNjgzMDQgYyAtMC41NTgwNCwwLjU1ODAzIC0wLjU1ODA0LDEuNDczMjEgMCwyLjAzMTI1IGwgMTYuNTYyNSwxNi41NDAxNyBjIDAuNTU4MDMsMC41NTgwNCAxLjQ1MDg5LDAuNTU4MDQgMi4wMDg5MiwwIGwgMTYuNTYyNSwtMTYuNTQwMTcgeiIgLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=");
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
<section class="container">
  <form class="form-horizontal">
    <select class="form-control">
      <option>One</option>
      <option>Two</option>
    </select>
  </form>
</section>

Lưu ý: công cụ base64 có fa-chevron-downtrong SVG.


12

Trong các trình duyệt hiện đại, việc tạo kiểu <select>trong CSS là tương đối không đau . Với appearance: nonephần khó khăn duy nhất là thay thế mũi tên (nếu đó là điều bạn muốn). Đây là một giải pháp sử dụng data:URI nội tuyến với SVG văn bản thuần túy:

select {
  -moz-appearance: none;
  -webkit-appearance: none;
  appearance: none;
  
  background-repeat: no-repeat;
  background-size: 0.5em auto;
  background-position: right 0.25em center;
  padding-right: 1em;
  
  background-image: url("data:image/svg+xml;charset=utf-8, \
    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60 40'> \
      <polygon points='0,0 60,0 30,40' style='fill:black;'/> \
    </svg>");
}
<select>
  <option>Option 1</option>
  <option>Option 2</option>
</select>

<select style="font-size: 2rem;">
  <option>Option 1</option>
  <option>Option 2</option>
</select>

Phần còn lại của kiểu dáng (viền, đệm, màu sắc, v.v.) khá đơn giản.

Điều này hoạt động trong tất cả các trình duyệt tôi vừa thử (Firefox 50, Chrome 55, Edge 38 và Safari 10). Một lưu ý về Firefox là nếu bạn muốn sử dụng #ký tự trong URI dữ liệu (ví dụ fill: #000), bạn cần phải thoát nó ( fill: %23000).


1
Bạn cũng có thể kích thước SVG bằng thuộc tính heightvà / hoặc widthtrên <svg>thẻ, thay vì thuộc tính CSS background-size.
gitaarik

10
select  {
    outline: 0;
    overflow: hidden;
    height: 30px;
    background: #2c343c;
    color: #747a80;
    border: #2c343c;
    padding: 5px 3px 5px 10px;
    -moz-border-radius: 6px;
    -webkit-border-radius: 6px;
    border-radius: 10px;
}

select option {border: 1px solid #000; background: #010;}

Không thể chọn bất cứ thứ gì với Chrome hiện tại.
Vitaly Zdanevich

9

Tùy chỉnh Chọn kiểu CSS

Đã thử nghiệm trong Internet Explorer (10 và 11), Edge, Firefox và Chrome

select::-ms-expand {
  display: none;
}
select {
  display: inline-block;
  box-sizing: border-box;
  padding: 0.5em 2em 0.5em 0.5em;
  border: 1px solid #eee;
  font: inherit;
  line-height: inherit;
  -webkit-appearance: none;
  -moz-appearance: none;
  -ms-appearance: none;
  appearance: none;
  background-repeat: no-repeat;
  background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: right 15px top 1em, right 10px top 1em;
  background-size: 5px 5px, 5px 5px;
}
<select name="">
  <option value="">Lorem</option>
  <option value="">Lorem Ipsum</option>
</select>

<select name="" disabled>
  <option value="">Disabled</option>
</select>

<select name="" style="color:red;">
  <option value="">Color!</option>
  <option value="">Lorem Ipsum</option>
</select>


Thích nghi hơn một chút (nhưng chưa được thử nghiệm trong tất cả các trình duyệt):background-position: right 15px center, right 10px center;
Robin Stewart

8

Sử dụng thuộc cliptính để cắt các đường viền và mũi tên của selectphần tử, sau đó thêm các kiểu thay thế của riêng bạn vào trình bao bọc:

    <!DOCTYPE html>
    <html>
      <head>
        <style>
          select { position: absolute; clip:rect(2px 49px 19px 2px); z-index:2; }
          body > span { display:block; position: relative; width: 64px; height: 21px; border: 2px solid green;  background: url(http://www.stackoverflow.com/favicon.ico) right 1px no-repeat; }
        </style>
      </head>
      <span>
        <select>
          <option value="">Alpha</option>
          <option value="">Beta</option>
          <option value="">Charlie</option>
        </select>
      </span>
    </html>

Sử dụng lựa chọn thứ hai với độ mờ bằng 0 để làm cho nút có thể nhấp:

    <!DOCTYPE html>
    <html>
      <head>
        <style>
          #real { position: absolute; clip:rect(2px 51px 19px 2px); z-index:2; }
          #fake { position: absolute; opacity: 0; }
    
          body > span { display:block; position: relative; width: 64px; height: 21px; background: url(http://www.stackoverflow.com/favicon.ico) right 1px no-repeat; }
        </style>
      </head>
      <span>
        <select id="real">
          <option value="">Alpha</option>
          <option value="">Beta</option>
          <option value="">Charlie</option>
        </select>
        <select id="fake">
          <option value="">Alpha</option>
          <option value="">Beta</option>
          <option value="">Charlie</option>
        </select>
      </span>
    </html>

Các tọa độ khác nhau giữa Webkit và các trình duyệt khác, nhưng truy vấn @media có thể bao gồm điều đó.

Người giới thiệu


1
Làm việc tốt cho tôi, ít nhất là trong chrome: vị trí: tuyệt đối; clip: orth (2px 85px 128px 2px); chỉ số z: 2; đệm-trái: 18px; đệm-phải: 18px; lề: tự động 7px; màu: # 555; cỡ chữ: kế thừa; màu nền: trong suốt;
BrianFreud

1
Tôi thấy việc cắt bỏ mũi tên chỉ hoạt động một nửa trong IE7 vì bạn không có quyền kiểm soát đối với đường viền của vùng chọn.
CpILL

1
Đã thêm chức năng nhấp chuột như một phần của câu hỏi liên quan
Paul Sweatte

1
@PaulSweatte, wow, đây là người yêu thích thứ 20 của bạn ! Chúc mừng. Bạn cũng đứng đầu tất cả các truy vấn của tôi cho một huy hiệu necromancer vàng .
Nemo

5

Một ví dụ rất hay sử dụng :after:befoređể thực hiện thủ thuật là trong Hộp chọn kiểu với CSS3 | CSSDeck


1
Có nhưng yêu cầu trong câu hỏi phải tương thích với Internet Explorer 6,7 và 8
Jitendra Vyas

2
Có Nó không tương thích với IE nhưng tôi thích chia sẻ cho bất kỳ ai đang tìm kiếm một giải pháp hiện đại như tôi đang tìm kiếm.
Ahmad Ajmi

5

Chỉnh sửa phần tử này không được khuyến nghị, nhưng nếu bạn muốn thử nó giống như bất kỳ phần tử HTML nào khác.

Chỉnh sửa ví dụ:

/* Edit select */
select {
    /* CSS style here */
}

/* Edit option */
option {
    /* CSS style here */
}

/* Edit selected option */
/* element  attr    attr value */
option[selected="selected"] {
    /* CSS style here */
}
<select>
    <option >Something #1</option>
    <option selected="selected">Something #2</option>
    <option >Something #3</option>
</select>

2
@MikkoP: khi đề xuất các chỉnh sửa, bạn có thể cung cấp một bản tóm tắt chỉnh sửa mô tả hơn không? "Cải thiện thông điệp" không hữu ích như một bản tóm tắt cấp cao cho những người đánh giá chúng tôi. Cảm ơn.
Jean-François Corbett

1
@ Jean-FrançoisCorbett Tôi sẽ cố gắng cụ thể hơn :)
MikkoP

1
bạn không thể tạo kiểu cho các thành phần tùy chọn (xem câu trả lời SO này: stackoverflow.com/a/7208814/703717 )
Danield

4
label {
    position: relative;
    display: inline-block;
}
select {
    display: inline-block;
    padding: 4px 3px 5px 5px;
    width: 150px;
    outline: none;
    color: black;
    border: 1px solid #C8BFC4;
    border-radius: 4px;
    box-shadow: inset 1px 1px 2px #ddd8dc;
    background-color: lightblue;
}

Điều này sử dụng màu nền cho các thành phần được chọn và tôi đã xóa hình ảnh ..


4

Đúng. Bạn có thể định kiểu bất kỳ phần tử HTML nào bằng tên thẻ của nó, như thế này:

select {
  font-weight: bold;
}

Tất nhiên, bạn cũng có thể sử dụng một lớp CSS để tạo kiểu cho nó, giống như bất kỳ phần tử nào khác:

<select class="important">
  <option>Important Option</option>
  <option>Another Important Option</option>
</select>

<style type="text/css">
  .important {
    font-weight: bold;
  }
</style>

6
Tôi không nói về điều này, tôi muốn thay đổi mũi tên thả xuống thành thứ khác
Jitendra Vyas

5
Bạn không thể định kiểu mũi tên thả xuống sang hình ảnh khác, nó được điều khiển bởi HĐH. Nếu bạn thực sự cần, cách tốt nhất của bạn là sử dụng tiện ích thả xuống DHTML.
Ryan Doherty

3
Bạn chỉ có thể thay đổi các thuộc tính CSS thông qua CSS. Bạn có thể thay đổi lề, phần đệm, thuộc tính phông chữ, màu nền, v.v. Nếu bạn muốn làm cho nó trông hoàn toàn khác, về cơ bản bạn phải thay thế nó bằng đồ họa khi chạy qua JavaScript (không phải là một giải pháp tồi tệ nếu được thực hiện tốt ).
Dave Ward

4

Đây là một giải pháp dựa trên những ý tưởng yêu thích của tôi từ cuộc thảo luận này. Điều này cho phép tạo kiểu một phần tử <select> trực tiếp mà không cần thêm bất kỳ đánh dấu nào.

Nó hoạt động Internet Explorer 10 (và mới hơn) với dự phòng an toàn cho Internet Explorer 8/9. Một lưu ý cho các trình duyệt này là hình nền phải được định vị và đủ nhỏ để ẩn đằng sau điều khiển mở rộng gốc.

HTML

<select name='options'>
  <option value='option-1'>Option 1</option>
  <option value='option-2'>Option 2</option>
  <option value='option-3'>Option 3</option>
</select>

SCSS

body {
  padding: 4em 40%;
  text-align: center;
}

select {
  $bg-color: lightcyan;
  $text-color: black;
  appearance: none; // Using -prefix-free http://leaverou.github.io/prefixfree/
  background: {
    color: $bg-color;
    image: url("https://s3-us-west-2.amazonaws.com/s.cdpn.io/1255/caret--down-15.png");
    position: right;
    repeat: no-repeat;
  }
  border: {
    color: mix($bg-color, black, 80%);
    radius: .2em;
    style: solid;
    width: 1px;
    right-color: mix($bg-color, black, 60%);
    bottom-color: mix($bg-color, black, 60%);
  }
  color: $text-color;
  padding: .33em .5em;
  width: 100%;
}

// Removes default arrow for Internet Explorer 10 (and later)
// Internet Explorer 8/9 gets the default arrow which covers the caret
// image as long as the caret image is smaller than and positioned
// behind the default arrow
select::-ms-expand {
    display: none;
}

CodePen

http://codepen.io/ralgh/pen/gpgbGx



3

Có một cách dễ dàng.

Kiểm tra câu đố này và tha thứ cho tôi về sự quá khích: https://jsfiddle.net/dkellner/7ac9us70/

Thủ thuật đằng sau: ngay khi thẻ <select> nhận được một thuộc tính có tên là "kích thước", nó sẽ hoạt động như một danh sách chiều cao cố định, và, đột nhiên, vì một số lý do, cho phép bạn tạo kiểu cho nó. Bây giờ, nói đúng ra, danh sách cố định là một tác dụng phụ - nhưng nó chỉ giúp chúng tôi nhiều hơn vì chúng tôi sử dụng nó cho "giao diện thả xuống".

Một ví dụ tối thiểu:

<style>

    .stylish span   {position:relative;}
    .stylish select {position:absolute;left:0px;display:none}

</style>
...
<div class="stylish">
    <label> Choose your superhero: </label>
    <span>
        <input onclick="$(this).closest('div').find('select').slideToggle(110)"><br>
        <select size=15 onclick="$(this).hide().closest('div').find('input').val($(this).find('option:selected').text());">

            <optgroup label="Fantasy"></optgroup>
            <option value="1">  Gandalf        </option>
            <option value="2">  Harry Potter   </option>
            <option value="3">  Jon Snow       </option>

            <!-- ... and so on -->

        </select>
    </span>
</div>

(để đơn giản, tôi đã làm nó với jQuery - nhưng bạn có thể làm tương tự mà không cần nó)

Ghi chú bên

  • Giải pháp này cung cấp cho bạn nhiều hơn chỉ là một lựa chọn: giá trị cũng có thể chỉnh sửa theo cách thủ công. Sử dụng thuộc tính chỉ đọc nếu bạn thích cách hạn chế chọn mặc định.

  • Để tối đa hóa khả năng tạo kiểu, các thẻ <optgroup> không ở xung quanh con cái của chúng, chúng được di chuyển trước chúng. Đó là chủ ý, nó rõ ràng hơn và họ rất vui khi làm việc như thế này, đừng lo lắng.

  • Javascripts: vâng tôi biết OP đã nói "không có Javascript" nhưng tôi hiểu nó là làm ơn đừng bận tâm đến các plugin , điều này rất tốt. Bạn không cần bất kỳ thư viện cho cái này. Ngay cả jQuery, như tôi đã nói, nó chỉ cho sự rõ ràng của ví dụ.



2

Bạn cũng có thể thêm kiểu di chuột vào danh sách thả xuống.

select {position:relative; float:left; width:21.4%; height:34px; background:#f9f9e0; border:1px solid #41533f; padding:0px 10px 0px 10px; color:#41533f; margin:-10px 0px 0px 20px; background: transparent; font-size: 12px; -webkit-appearance: none; -moz-appearance: none; appearance: none; background: url(https://alt-fit.com/images/global/select-button.png) 100% / 15% no-repeat #f9f9e0;}
select:hover {background: url(https://alt-fit.com/images/global/select-button.png) 100% / 15% no-repeat #fff;}
<html>
<head>
</head>
<body>
<select name="type" class="select"><option style="color:#41533f;" value="Select option">Select option</option>
<option value="Option 1">Option 1</option>
<option value="Option 2">Option 2</option>
<option value="Option 3">Option 3</option>
</select>
</body>
</html>


2

Phương pháp thứ ba trong câu trả lời của Danield có thể được cải thiện để hoạt động với hiệu ứng di chuột và các sự kiện chuột khác. Chỉ cần đảm bảo rằng phần "nút" xuất hiện ngay sau phần tử chọn trong đánh dấu. Sau đó, nhắm mục tiêu nó bằng cách sử dụng bộ chọn + CSS:

HTML:

<select class="select-input">...</select>
<div class="select-button"></div>

CSS:

.select-input:hover+.select-button {
    <Hover styles here>
}

Tuy nhiên, điều này sẽ hiển thị hiệu ứng di chuột khi di chuột ở bất cứ đâu trên phần tử chọn, không chỉ trên "nút".

Tôi đang sử dụng phương pháp này kết hợp với Angular (vì dù sao dự án của tôi cũng là ứng dụng Angular), để bao quát toàn bộ phần tử chọn và để Angular hiển thị văn bản của tùy chọn đã chọn trong phần "nút". Trong trường hợp này, sẽ có ý nghĩa hoàn hảo rằng hiệu ứng di chuột được áp dụng khi di chuột ở bất cứ đâu trên vùng chọn.

Mặc dù vậy, nó không hoạt động mà không có JavaScript, vì vậy nếu bạn muốn làm điều này và trang web của bạn phải hoạt động mà không có JavaScript, bạn nên đảm bảo rằng tập lệnh của bạn thêm các thành phần và lớp cần thiết cho việc nâng cao. Theo cách đó, một trình duyệt không có JavaScript sẽ chỉ nhận được một biểu tượng bình thường, không bị thay đổi, thay vì một huy hiệu theo kiểu không cập nhật chính xác.


1
Tôi muốn biết lý do cho bất kỳ downvote nào, vì vậy tôi có thể biết cách cải thiện! 🙂
Adrian Schmidt

1

Một giải pháp chỉ CSS và HTML

Nó có vẻ tương thích với Chrome, Firefox và Internet Explorer 11. Nhưng vui lòng để lại phản hồi của bạn về các trình duyệt web khác.

Theo đề xuất của câu trả lời của Danield , tôi bọc lựa chọn của mình trong một div (thậm chí hai div cho khả năng tương thích trình duyệt x) để có được hành vi mong đợi.

Xem http://jsfiddle.net/bjap2/

HTML:

<div class="sort-options-wrapper">
    <div class="sort-options-wrapper-2">
        <select class="sort-options">
                <option value="choiceOne">choiceOne</option>
                <option value="choiceOne">choiceThree</option>
                <option value="choiceOne">choiceFour</option>
                <option value="choiceFiveLongTestPurpose">choiceFiveLongTestPurpose</option>
        </select>
    </div>
    <div class="search-select-arrow-down"></div>
</div>

Chú ý hai hàm div.

Cũng lưu ý thêm div được thêm vào để đặt nút mũi tên xuống bất cứ nơi nào bạn thích (vị trí hoàn toàn), ở đây chúng tôi đặt nó ở bên trái.

CSS

.sort-options-wrapper {
    display: inline-block;
    position: relative;
    border: 1px solid #83837F;
}

/* This second wrapper is needed for x-browser compatibility */
.sort-options-wrapper-2 {
    overflow: hidden;
}

select {
    margin-right: -19px; /* That's what is hiding the default-provided browser arrow */
    padding-left: 13px;
    margin-left: 0;
    border: none;
    background: none;

    /* margin-top & margin-bottom must be set since some
       browsers have default values for select elements */
    margin-bottom: 1px;
    margin-top: 1px;
}

select:focus {
    outline: none; /* Removing default browsers outline on focus */
}
.search-select-arrow-down {
    position: absolute;
    height: 10px;
    width: 12px;
    background: url(http://i.imgur.com/pHIYN06.png) scroll no-repeat 2px 0px;
    left: 1px;
    top: 5px;
}
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.