Làm cách nào để tạo kiểu cho <option> chỉ với CSS?


102

Lưu ý: Câu hỏi này không phải về việc tạo một menu thả xuống tùy chỉnh. Nó chỉ về khả năng tạo kiểu của <option>các phần tử trong phần tử được chọn trong CSS

Làm cách nào để tạo kiểu <option>cho một <select>phần tử có khả năng tương thích trên nhiều trình duyệt? Tôi biết nhiều cách JavaScript tùy chỉnh trình đơn thả xuống để chuyển đổi thành <li>, điều mà tôi không hỏi về nó.

<select class="select">
    <option selected>Select</option>
    <option>Blue</option>
    <option >Red</option>
    <option>Green</option>
    <option>Yellow</option>
    <option>Brown</option>
</select>

Tôi đang hỏi điều gì có thể làm được chỉ với CSS, với khả năng tương thích cho IE9 +, Firefox và Chrome.

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

Tôi muốn tạo kiểu như thế này hoặc càng gần càng tốt.

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

Tôi đã thử tại đây http://jsfiddle.net/jitendravyas/juwz3/3/ , nhưng Chrome không hiển thị bất kỳ kiểu nào ngoại trừ màu phông chữ, trong khi Firefox hiển thị một số kiểu khác. Làm cách nào để đường viền và phần đệm cũng hoạt động trong Chrome?


@ManseUK - Nó chỉ <option>không phải là toàn bộ danh sách thả xuống
Jitendra Vyas,

2
@ManseUK: Tôi không chắc điều đó giống nhau. Câu hỏi đó hỏi liệu bạn có thể tạo kiểu cho <select>phần tử xuất hiện trên trang hay không. Câu hỏi này hỏi liệu bạn có thể tạo kiểu cho danh sách các <option>phần tử.
Andy E

13
Vì Chúa, đây KHÔNG PHẢI là bản sao của BẤT KỲ trong số hai câu hỏi được liên kết (nhân tiện là khác nhau). Một là chỉ về tạo kiểu cho lựa chọn chứ không phải tùy chọn, trong khi câu này hỏi về việc tạo kiểu cho các tùy chọn và câu kia không có yêu cầu duy nhất về css / no-js.
matteo

12
Tôi phát ngán khi thấy các câu hỏi bị đánh dấu sai là trùng lặp hoặc bị đóng sai, vẫn như vậy trong nhiều năm mặc dù đã được chứng minh là sai.
matteo

Câu trả lời:


70

EDIT 2015 tháng 5

Tuyên bố từ chối trách nhiệm: Tôi đã lấy đoạn mã từ câu trả lời được liên kết bên dưới:

Cập nhật quan trọng!

Ngoài WebKit, kể từ Firefox 35, chúng tôi sẽ có thể sử dụng thuộc appearancetính:

Sử dụng -moz-appearancevới nonegiá trị trên hộp kết hợp bây giờ loại bỏ nút thả xuống

Vì vậy, bây giờ để ẩn kiểu mặc định, thật dễ dàng bằng cách thêm các quy tắc sau vào phần tử chọn của chúng tôi:

select {
   -webkit-appearance: none;
   -moz-appearance: none;
   appearance: none;
}

Để được hỗ trợ IE 11, bạn có thể sử dụng [ ::-ms-expand] [15].

select::-ms-expand { /* for IE 11 */
    display: none;
}

Câu trả lời cũ

Thật không may, những gì bạn yêu cầu không thể thực hiện được bằng cách sử dụng CSS thuần túy. Tuy nhiên, đây là một cái gì đó tương tự mà bạn có thể chọn làm công việc xung quanh. Kiểm tra mã trực tiếp bên dưới.

div { 
  margin: 10px;
  padding: 10px; 
  border: 2px solid purple; 
  width: 200px;
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
  border-radius: 5px;
}
div > ul { display: none; }
div:hover > ul {display: block; background: #f9f9f9; border-top: 1px solid purple;}
div:hover > ul > li { padding: 5px; border-bottom: 1px solid #4f4f4f;}
div:hover > ul > li:hover { background: white;}
div:hover > ul > li:hover > a { color: red; }
<div>
  Select
  <ul>
    <li><a href="#">Item 1</a></li>
    <li><a href="#">Item 2</a></li>
    <li><a href="#">Item 3</a></li>
  </ul>
</div>

BIÊN TẬP

Đây là câu hỏi mà bạn đã hỏi một thời gian trước. Làm cách nào để tạo kiểu trình đơn thả xuống <select> chỉ với CSS mà không có JavaScript? Như nó nói ở đó, chỉ trong Chrome và ở một mức độ nào đó trong Firefox, bạn mới có thể đạt được những gì mình muốn. Nếu không, thật không may, không có giải pháp CSS thuần túy trình duyệt chéo nào để tạo kiểu cho một lựa chọn.


3
+1 cảm ơn nó là mã tốt. nhưng trong trường hợp của tôi, tôi muốn làm với <select>. sử dụng <div>không đúng về mặt ngữ nghĩa.
Jitendra Vyas

2
@JitendraVyas, tôi biết, nhưng như tôi đã trả lời, điều đó là không thể. Những gì bạn đạt được trong bức tranh đầu tiên là những gì bạn có thể làm được. Xem chỉnh sửa th. Nhân tiện, tôi cũng đã trả lời câu hỏi trước của bạn, hãy xem nó.
Savas Vedova

Phần 'cập nhật quan trọng' cho rằng bạn có thể tạo kiểu optionthẻ bằng css, nhưng bạn không thể, bạn chỉ có thể tạo kiểu cho selectthẻ. Được thể hiện trong câu trả lời này
svnm

Dưới đây là một phiên bản JavaScript của ví dụ trên cho biết thêm rằng callback và một số tính năng hữu ích khác: dynamicdrive.com/dynamicindex1/ergodropdown.htm
nhát dừa

4

Không có cách trình duyệt chéo nào về các yếu tố tùy chọn tạo kiểu, chắc chắn không ở phạm vi ảnh chụp màn hình thứ hai của bạn. Bạn có thể làm cho chúng in đậm và đặt kích thước phông chữ, nhưng đó sẽ là vấn đề ...


2

Tôi đã chơi xung quanh với các mục được chọn trước đây và không ghi đè chức năng bằng JavaScript, tôi không nghĩ điều đó có thể thực hiện được trong Chrome. Cho dù bạn sử dụng một plugin hay viết mã của riêng mình, CSS chỉ không phù hợp với Chrome / Safari và như bạn đã nói, Firefox xử lý nó tốt hơn.


Vui lòng xóa đoạn cuối cùng - URL không thể truy cập trực tuyến.
kumarharsh
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.