Як я можу створити спадне меню <select> лише за допомогою CSS?


1333

Чи є єдиний CSS спосіб стилізувати <select>спадне меню?

Мені потрібно стилізувати <select>форму якомога по-людськи, без JavaScript. Які властивості я можу використовувати для цього в CSS?

Цей код повинен бути сумісним з усіма основними браузерами:

  • Internet Explorer 6, 7 і 8
  • Firefox
  • Сафарі

Я знаю, що можу це зробити за допомогою JavaScript: Приклад .

І я не кажу про просту укладку. Хочу знати, що найкраще ми можемо зробити лише з CSS.

Я знайшов подібні запитання щодо Stack Overflow.

І це на Doctype.com.


1
нічого не знайдено в google, тільки js рішення є
Jitendra Vyas

41
Я вважаю, що це законне запитання, але відповідь - «ні, не дуже» чи «не так, як ви цього хочете». Але ніхто (і я) не впевнений у цьому на 100%, це почуття неоднозначності повзе під шкіру читача, і законність питання ставить під сумнів.
ZJR

1
@Jitendra, я знаю, до чого ти потрапляєш. Нам дуже сподобається, якщо ви зробите своє запитання більш чітким. Плюс, я думаю, я знайшов те, що ви можете шукати. Це експериментально, але перевірте це: cappuccino.org/aristo/showcase
jeremyosborne

1
@jeremyosborne - Дякую за відповідь. Я знаю, що можу це зробити за допомогою JavaScript. ваше посилання на eaxmple базується на JS. Чому я задав це питання , тому що я хотів би знати, хто - небудь там знає про те, що ми можемо зробити тільки з допомогою CSS
Jitendra Vyas

@Jitendra Дякуємо за оновлення вашого питання. Найкраще, що ви можете надійно зробити з обмеженнями (лише для CSS та без JS) - це зміни кольору шрифту (шрифту), кольорів фону та переднього плану (тексту), розміру рамки, зовнішнього вигляду та кольорів, розміщення та розміру (як правило, за допомогою типу налаштування через шрифт). Навіть тоді вам, ймовірно, доведеться зробити кілька перетворень, щоб переконатися, що речі виглядають однаково у всіх браузерах. Я б хотів, щоб я знав кращу відповідь, ніж це, і, можливо, є такий, який я пропустив, але я не думаю, що так.
jeremyosborne

Відповіді:


1027

Ось три рішення:

Рішення №1 - зовнішній вигляд: немає - із вирішенням Internet Explorer 10 - 11 ( демонстрація )

-

Щоб приховати стрілку за замовчуванням, встановлену appearance: noneна елементі вибору, а потім додайте власну спеціальну стрілку за допомогоюbackground-image

select {
   -webkit-appearance: none;
   -moz-appearance: none;
   appearance: none;       /* Remove default arrow */
   background-image: url(...);   /* Add custom arrow */
}

Підтримка браузера:

appearance: noneмає дуже гарну підтримку браузера ( канюза ) - за винятком Internet Explorer 11 (і пізнішої версії) та Firefox 34 (і пізніших версій).

Ми можемо вдосконалити цю техніку та додати підтримку Internet Explorer 10 та Internet Explorer 11 шляхом додавання

select::-ms-expand {
    display: none; /* Hide the default arrow in Internet Explorer 10 and Internet Explorer 11 */
}

Якщо Internet Explorer 9 викликає занепокоєння, у нас немає способу видалити стрілку за замовчуванням (це означало б, що зараз у нас буде дві стрілки), але ми можемо використовувати прикольний селектор Internet Explorer 9.

Щоб принаймні скасувати нашу власну стрілку - залишивши стрілку вибору за замовчуванням недоторканою.

/* Target Internet Explorer 9 to undo the custom arrow */
@media screen and (min-width:0\0) {
    select {
        background-image:none\9;
        padding: 5px\9;
    }
}

Всі разом:

Це рішення просте і має хорошу підтримку браузера - його взагалі повинно вистачити.


Якщо потрібна підтримка браузера для Internet Explorer 9 (і пізнішої версії) та Firefox 34 (і пізнішої версії), продовжуйте читати ...

Рішення №2 Обріжте елемент вибору, щоб приховати стрілку за замовчуванням ( демонстрація )

-

(Детальніше тут)

Оберніть selectелемент у діву з фіксованою шириною та overflow:hidden.

Потім надайте selectелементу ширину приблизно на 20 пікселів, ніж div .

Результат полягає в тому, що стрілка випадаючого selectелемента за замовчуванням буде прихована (завдяки overflow:hiddenконтейнеру), і ви можете розмістити будь-яке фонове зображення, яке ви хочете, на правій частині розділу.

Перевага цього підходу полягає в тому, що він є крос-браузер (Internet Explorer 8 , а потім, WebKit і Gecko ). Однак недоліком такого підходу є те, що випадаючі параметри вискакують з правого боку (на 20 пікселів, які ми приховали ..., оскільки елементи опції приймають ширину елемента вибору).

Введіть тут опис зображення

[Однак слід зазначити, що якщо користувацький елемент вибору необхідний лише для мобільних пристроїв, то зазначена вище проблема не застосовується - через те, як кожен телефон власним чином відкриває елемент вибору. Тож для мобільних пристроїв це може бути найкращим рішенням.]


Якщо на Firefox - до версії 35 - потрібна спеціальна стрілка, але вам не потрібно підтримувати старі версії Internet Explorer - продовжуйте читати ...

Рішення №3 - Використовуйте pointer-eventsвластивість ( демонстраційна версія )

-

(Детальніше тут)

Ідея тут полягає в накладенні елемента на натиснуту стрілку вниз (щоб створити нашу власну), а потім заборонити на ній події вказівника.

Перевага: Він добре працює в WebKit та Gecko. Це також добре виглядає (ніяких optionелементів, що випинаються ).

Недолік: Internet Explorer (Internet Explorer 10 і нижче) не підтримує pointer-events, а це означає, що ви не можете натиснути спеціальну стрілку. Крім того, ще одним (очевидним) недоліком цього методу є те, що ви не можете орієнтуватися на ваше нове зображення стрілки за допомогою ефекту наведення курсору чи курсору руки, тому що ми лише відключили події вказівника на них!

Однак за допомогою цього методу ви можете використовувати Модернізатор або умовні коментарі, щоб змусити Internet Explorer повернутися до стандартної вбудованої стрілки.

NB: Оскільки Internet Explorer 10 вже не підтримує conditional comments: Якщо ви хочете використовувати цей підхід, ви, ймовірно, повинні використовувати Modernizr . Однак, все ще можливо виключити CSS-покажчик подій з Internet Explorer 10 з описаним тут хакетом CSS .


1
Що найкраще за вами з цих двох методів?
Джітендра Вяс

3
Це залежить від проектних вимог. Якщо ви все в порядку з випадаючим списком - тоді це найкраще, оскільки це крос-браузер (IMO allbrowsers + IE8 + можна вважати крос-браузером), але я думаю, що для багатьох - це не зробить. Тож власне у своїй заяві я мав на увазі, що підступ №2 був найкращим.
Даніель

4
Крім того, скрипка, яку я розмістив, використовує підхід №2 із умовними заявами, щоб IE могла використовувати стрілку за замовчуванням.
Даніелд

3
@AlexisLeclerc Виправлення ключа та вибору на однакову ширину працює лише у веб-браузерах, таких як Chrome. (тому що я включив правило - webkit-izgled: none; ) Однак це не працює в інших браузерах, як firefox
Danield

4
Якщо я можу запропонувати вдосконалення для Підходу №1, я особисто вважаю відсутність кордону або відсутність ореолу вибору для правого боку дуже дратівливим. Я оновив вашу загадку тим, що я використав у своєму поточному проекті: jsfiddle.net/YvCHW/1745 . Скажи мені, що ти думаєш!
Алексіс Леклерк

233

Це можливо, але, на жаль, здебільшого в браузерах на основі WebKit, настільки, наскільки ми, як розробники, вимагаємо. Ось приклад стилю CSS, зібраного з панелі параметрів Chrome через вбудований інспектор інструментів для розробників, удосконалений для відповідності підтримуваних на даний момент властивостей CSS у більшості сучасних браузерів:

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;
}

Коли ви запускаєте цей код на будь-якій сторінці веб-переглядача WebKit, він повинен змінити зовнішній вигляд поля вибору, видалити стандартну стрілку ОС та додати стрілку PNG, покласти пробіли до та після мітки, майже все, що вам потрібно.

Найважливіша частина - це appearanceвластивість, яка змінює поведінку елемента.

Він прекрасно працює майже у всіх веб-браузерах, що базується на WebKit, включаючи мобільні, хоча Gecko підтримує не appearanceтак добре, як WebKit.


4
Гей, я помітив, що вибрані поля почали виглядати зовсім інакше, як у Firefox 12 (це виглядає багато, як у Chrome (у мене Mac)), і здається, що FF 12 підтримує ще більше атрибутів зовнішності.
CWSпоказав

3
рішення, яке стосується лише хрому ... Я б не платив за це, ані мій клієнт. див. відповідь @ Діанельда щодо рішення x-браузера.
Адрієн Бе

41
@AdrienBe Моє рішення було запропоновано майже 3 роки тому; на той час це був єдиний розумний спосіб змінити вибрані поля без участі JavaScript або плагінів. Це все ще є життєздатним, якщо ви вирішите скинути префіксні атрибути, але він надійно працює лише в браузерах на базі Webkit (так що Safari, нова Opera + Android). Наразі можливі кращі рішення, тому замість того, щоб додавати безглузді коментарі, просто проголосуйте за рішення, яке ви бачите як краще, і в майбутньому перевірте дату "відповідь". Дякую.
Меттью Морек

4
@MatthewMorek: було краще рішення навіть 3 роки тому. Відповідь Даніеля набагато краща щодо підтримки крос-браузера (вона підтримує IE8 і пізніші версії, WebKit та Gecko). У запитанні "код повинен бути сумісний з усіма основними браузерами: Internet Explorer 6,7 і 8, Firefox & Safari". Ця вимога x-браузера, можливо, була додана Полом Світтом у 2013 році, хоча ... вибачте, якщо це так.
Адрієн Бе

3
Якщо ви додасте, text-indent: 0.01px; text-overflow: "";це працюватиме ще краще
Іван,

64

Виберіть елемент і його випадає особливість є важко стилем.

Атрибути стилю для елемента вибору Кріс Хайльман підтверджують те, що сказав Райан Дохері в коментарі до першої відповіді:

"Елемент вибору є частиною операційної системи, а не хромовим браузером. Тому стиль дуже ненадійний, і це не обов'язково має сенс намагатися все одно."


47

У мене була така точна проблема, за винятком того, що я не міг використовувати зображення та не був обмежений підтримкою браузера. Це повинно бути «навмання» і з початком удачі працювати скрізь в кінці кінців .

Він використовує шаруваті поворотні фонові шари, щоб «вирізати» стрілку, що спадає, оскільки псевдоелементи не працюватимуть для елемента вибору.

Редагувати: У цій оновленій версії я використовую змінні CSS та крихітну тематичну систему.

: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
Ого, це одне з найкрутіших рішень, які я бачив. Для мене це працює в останніх версіях Chrome і Safari на Mac. Як щодо інших браузерів?
Tintin81

2
Для мене працює у firefox з додаванням-moz-appearance: none;
Зак

45

Найбільша непослідовність, яку я помітив, коли стилі вибирати спадні меню, - це Safari та Google Chrome- рендерінг (Firefox повністю настроюється за допомогою CSS). Після деякого пошуку через неясні глибини Інтернету я натрапив на таке, що майже повністю вирішує мої якості з WebKit:

Виправлення Safari та Google Chrome :

select {
  -webkit-appearance: none;
}

Однак це видаляє стрілку, що спадає. Ви можете додати стрілку спадного меню, використовуючи сусіднє divз фоном, негативним полем або абсолютно розміщеним над випадаючим меню.

* Додаткові відомості та інші змінні доступні у властивості CSS: -webkit-вид .


1
Не забудьте додати свій стиль після цього;) Але я дуже радий, що прочитав цей коментар сьогодні.
teewuane

1
ви можете, будь ласка, детальніше пояснити вашу заяву: "Firefox повністю настроюється через CSS", мені здається, що Firefox не підтримує властивість появи ... так як це зробити в Firefox?
Даніед

36

<select>Теги можна стилізувати через CSS, як і будь-який інший HTML-елемент на HTML-сторінці, відображеній у веб-переглядачі. Нижче наведено (надто простий) приклад, який розмістить вибраний елемент на сторінці та візуалізує текст параметрів синім кольором.

Приклад 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>

Приклад 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
Дивовижно, що вперше я побачила "матерів", задіяних в Інтернеті, без того, щоб це було грубо. +1 для цього!
BaL

34
Ця відповідь не вирішує цього питання. Він вибирає лише стилі введення, але не
спадання

14
Ця відповідь повністю ігнорує проблеми стилізації випадаючого списку для крос-консистенції браузера. Це дуже низька відповідь.
BentOnCoding

18

Повідомлення в блозі Як у стилі випадаючої форми CSS жоден JavaScript не працює для мене, але він не працює в 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

Ось версія, яка працює у всіх сучасних браузерах. Ключ використовуєтьсяappearance:none який видаляє форматування за замовчуванням. Оскільки все форматування відсутнє, вам потрібно додати назад у стрілку, яка візуально відрізняє вибір від введення.

Приклад роботи: 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

Я потрапив до вашої справи за допомогою Bootstrap . Це найпростіше рішення, яке працює:

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>

Примітка. Базовий матеріал знаходиться fa-chevron-downу SVG.


12

У сучасних веб-переглядачах стилістично використовувати <select>CSS. З appearance: noneєдиною хитрою частиною є заміна стрілки (якщо це те, що ти хочеш). Ось рішення, яке використовує вбудований data:URI з простим текстом SVG:

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>

Решта стилів (бордюри, підкладки, кольори тощо) досить відверта.

Це працює у всіх браузерах, які я тільки що спробував (Firefox 50, Chrome 55, Edge 38 та Safari 10). Одне зауваження про Firefox полягає в тому, що якщо ви хочете використовувати #символ в URI даних (наприклад fill: #000), вам потрібно уникнути цього ( fill: %23000).


1
Ви також можете розмістити SVG за допомогою тегу heightта / або widthатрибуту <svg>замість властивості 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;}

Неможливо вибрати щось із цим у поточному Chrome.
Віталій Зданевич,

9

Спеціальні стилі CSS для вибору

Тестується в Internet Explorer (10 і 11), Edge, Firefox та 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>


Трохи більш пристосований (але не пройшов тестування у всіх браузерах):background-position: right 15px center, right 10px center;
Робін Стюарт

8

Використовуйте clipвластивість, щоб обрізати межі та стрілку selectелемента, а потім додати до обгортки власні стилі заміни:

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

Використовуйте другий вибір з нульовою непрозорістю, щоб зробити кнопку натиснутою:

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

Координати відрізняються між Webkit та іншими браузерами, але @media запит може охопити це.

Список літератури


1
Добре працює для мене, принаймні, в хромі: позиція: абсолютна; кліп: rect (2px 85px 128px 2px); z-індекс: 2; підкладка-зліва: 18px; підкладка-права: 18px; маржа: 7px автоматична; колір: # 555; розмір шрифту: успадковувати; колір фону: прозорий;
BrianFreud

1
Я виявив, що обрізання стрілки лише наполовину працює в IE7, оскільки ви не маєте контролю над кордоном вибору.
CpILL

1
Додано функцію натискання як частину пов’язаного питання
Пол Sweatte

1
@PaulSweatte, ух, це твій 20-й некромант ! Поздоровлення Ви також додали всі мої запити щодо значка золотого некроманта .
Немо

5

Дуже приємний приклад, який використовує :afterта :beforeвиконувати трюк - це у стилі Select Box з CSS3 | CSSDeck


1
Так, але вимога, про яку йдеться, повинна бути сумісною з Internet Explorer 6,7 та 8
Jitendra Vyas

2
Так, це не сумісно з IE, але я любив ділитися для тих, хто шукає сучасне рішення, як я шукав.
Ахмад Аджі

5

Редагувати цей елемент не рекомендується, але якщо ви хочете спробувати, це як і будь-який інший HTML-елемент.

Редагувати приклад:

/* 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: пропонуючи зміни, будь ласка, надайте детальніше опис редагування? "Поліпшене повідомлення" не дуже корисне як резюме високого рівня для нас, рецензентів. Дякую.
Жан-Франсуа Корбетт

1
@ Jean-FrançoisCorbett Я спробую бути більш конкретним :)
MikkoP

1
Ви не можете стиль елементів варіанту (див цього SO відповіді: 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;
}

Для цього використовується колір фону для вибраних елементів, і я видалив зображення ..


4

Так. Ви можете стилізувати будь-який елемент HTML за його ім'ям тегу, наприклад:

select {
  font-weight: bold;
}

Звичайно, ви також можете використовувати клас CSS, щоб стилювати його, як і будь-який інший елемент:

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

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

6
Я не говорю про це, я хочу змінити стрілку спадного меню на щось інше
Jitendra Vyas

5
Ви не можете стилізувати стрілку, що випадає, на інше зображення, це контролюється ОС. Якщо вам дійсно потрібно, найкраще скористатися віджетом, що випадає DHTML.
Райан Догерті

3
Ви можете змінити властивості CSS лише через CSS. Ви можете змінити його поля, властивості шрифту, властивості шрифту, колір тла тощо. Якщо ви хочете, щоб він виглядав зовсім інакше, вам в основному потрібно замінити його графікою під час виконання через JavaScript (що не є страшним рішенням, якщо зробити все добре ).
Дейв Уорд

4

Ось рішення, засноване на моїх улюблених ідеях з цієї дискусії. Це дозволяє стилізувати елемент <select> безпосередньо без додаткової розмітки.

Він працює в Internet Explorer 10 (і пізніших версіях) із безпечною резервною копією для Internet Explorer 8/9. Одне застереження для цих браузерів полягає в тому, що фонове зображення має бути розміщене та бути достатньо маленьким, щоб ховатися за нативним контролем розширення.

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

Як і в Internet Explorer 10, ви можете використовувати ::-ms-expandселектор елементів псевдо для стилювання та приховування елемента стрілки вниз.

select::-ms-expand {
    display:none;
    /* or visibility: hidden; to keep it's space/hitbox */
}

Решта стилів повинна бути схожа на інші браузери.

Ось основна вилка jsfiddle Danield, яка застосовує підтримку IE10


3

Є простий спосіб.

Перевірте цю скрипку і пробачте мене за надмір: https://jsfiddle.net/dkellner/7ac9us70/

Підступка: як тільки тег <select> отримає властивість під назвою "size", він буде вести себе як список фіксованої висоти і, раптом, чомусь дозволяє вам стилізувати його з пекла. Тепер, строго кажучи, фіксований список є побічним ефектом - але він просто допомагає нам більше, тому що ми використовуємо його для "випадаючого вигляду".

Мінімальний приклад:

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

(щоб це було просто, я робив це з jQuery - але ви можете зробити те ж саме без нього)

Бічні нотатки

  • Це рішення дає вам більше, ніж просто вибір: значення також можна редагувати вручну. Використовуйте властивість readonly, якщо ви віддаєте перевагу способу вибору за замовчуванням.

  • Для того, щоб максимально збільшити можливості укладання, <OPTGROUP> теги не дозволені навколо своїх дітей, вони переїхали , перш вони. Це навмисно, це візуально зрозуміліше, і вони із задоволенням працюють так, не хвилюйтеся.

  • Javascripts: так, я знаю, що ОП сказав "немає Javascript", але я зрозумів це, як будь ласка, не турбуйтеся з плагінами , що добре. Для цього вам не потрібні бібліотеки. Як я вже сказав, навіть jQuery це лише для ясності прикладу.



2

Ви також можете додати стиль вибору курсора до спадного меню.

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

Третій метод у відповіді Даніельда може бути вдосконалений для роботи з ефектами наведення та іншими подіями миші. Просто переконайтесь, що елемент "кнопка" надходить відразу після елемента вибору у розмітці. Потім націліть його за допомогою селектора + CSS:

HTML:

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

CSS:

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

Це, однак, покаже ефект наведення при наведенні миші на елемент вибору, а не лише над «кнопкою».

Я використовую цей метод у поєднанні з Angular (оскільки мій проект так чи інакше є кутовим додатком), щоб охопити весь елемент вибору та дозволити Angular відображати текст вибраної опції в елементі "button". У цьому випадку має ідеальний сенс, що ефект наведення вказівника застосовується під час наведення курсора на будь-яку точку вибору.

Однак це не працює без JavaScript, тому, якщо ви хочете це зробити, а ваш сайт повинен працювати без JavaScript, ви повинні переконатися, що ваш сценарій додає необхідні для вдосконалення елементи та класи. Таким чином, веб-переглядач без JavaScript просто отримає звичайний, стильний, замість стилізованого значка, який не оновлюється належним чином.


1
Я хотів би дізнатися причину будь-яких потоків, тому я можу знати, як покращити! 🙂
Адріан Шмідт

1

Рішення лише для CSS та HTML

Це здається сумісним із Chrome, Firefox та Internet Explorer 11. Але залиште свої відгуки щодо інших веб-браузерів.

Відповідно до відповіді Даніелда , я обертаю свій вибір у div (навіть два діви для сумісності x-браузера), щоб отримати очікувану поведінку.

Дивіться 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>

Помітьте два обгортки діва.

Також зауважте, що додано додатковий div, щоб розмістити кнопку зі стрілкою вниз куди завгодно (розміщується абсолютно), тут ми ставимо її ліворуч.

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.