如何仅使用CSS设置<选择>下拉列表的样式?

是否有一种仅限CSS的方法来设置<select>下拉列表的样式?

我需要尽可能人性化地设计<select>表单,没有任何JavaScript。我可以在CSS中使用哪些属性来执行此操作?

此代码需要与所有主要浏览器兼容:

  • Internet Explorer 6、7和8
  • Firefox
  • Safari

我知道我可以使用JavaScript:示例

我不是在谈论简单的样式。我想知道,我们只能用CSS做什么。

我在Stack Overflow上找到了类似的问题

这一个Doctype.com.

2069064 次浏览

可以。您可以通过标记名称设置任何超文本标记语言元素的样式,如下所示:

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>

选择元素及其下拉功能难以样式化。

选择元素的样式属性 by Chris Heilmann证实了Ryan Dohery在对第一个答案的评论中所说的话:

"选择元素是操作系统,而不是浏览器chrome。因此,它非常风格不可靠,尝试也不一定有意义“不管怎样”

<select>标签可以通过CSS设置样式,就像浏览器中呈现的超文本标记语言页面上的任何其他超文本标记语言元素一样。下面是一个(非常简单的)示例,它将在页面上定位一个选择元素并将选项的文本呈现为蓝色。

示例超文本标记语言文件(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;}
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;}

博客文章如何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>

当样式选择下拉列表时,我注意到的最大的不一致是SafariGoogleChrome渲染(Firefox可以通过CSS完全自定义)。在互联网的一些模糊深度搜索后,我遇到了以下内容,这几乎完全解决了我对WebKit的疑虑:

Safari和GoogleChrome修复

select {-webkit-appearance: none;}

但是,这确实会删除下拉箭头。您可以使用附近的div添加下拉箭头,该div带有背景、负边距或绝对位于选择下拉列表上方。

*更多信息和其他变量在CSS属性中可用。

这是可能的,但不幸的是,根据开发人员的要求,主要在基于WebKit的浏览器中。这是通过内置开发人员工具检查器从Chrome选项面板收集的CSS样式示例,改进以匹配大多数现代浏览器中当前支持的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的浏览器中的任何页面上运行此代码时,它应该更改选择框的外观,删除标准的OS箭头并添加PNG箭头,在标签前后放置一些行间距,几乎任何您想要的。

最重要的部分是appearance属性,它改变了元素的行为方式。

它几乎可以在所有基于WebKit的浏览器中完美运行,包括移动浏览器,尽管Gecko似乎不支持appearance以及WebKit。

使用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查询可以涵盖这一点。

参考文献

你绝对应该像使用CSS样式化选择、optgroup和选项那样做。在许多方面,背景色和颜色只是你通常需要的样式选项,而不是整个选择。

不建议编辑此元素,但如果您想尝试它就像任何其他超文本标记语言元素一样。

编辑示例:

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

这里有三种解决方案:

解决方案#1-外观:无-使用Internet Explorer 10-11解决方案(Demo

--

要隐藏选择元素上的默认箭头集appearance: none,请使用background-image添加您自己的自定义箭头

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

浏览器支持:

appearance: none具有非常好的浏览器支持(caniuse)-除了Internet Explorer。

我们可以改进此技术并添加对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;}}

一起来:

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(https://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>

这个解决方案很简单,并且具有良好的浏览器支持-通常应该足够了。


如果需要Internet Explorer的浏览器支持,请提前阅读。

解决方案#2截断选择元素以隐藏默认箭头(demo

--

(阅读更多这里)

select元素包装在带有固定宽度overflow:hidden的div中。

然后给select元素一个大约比div大20像素的宽度。

结果是select元素的默认下拉箭头将被隐藏(由于容器上的overflow:hidden),您可以将任何所需的背景图像放置在div的右侧。

这种方法的优势是跨浏览器的(Internet Explorer 8及更高版本,webkit壁虎)。然而,这种方法的劣势是选项下拉列表在右侧突出(我们隐藏了20个像素…因为选项元素的宽度是选择元素的宽度)。

在此输入图片描述

[然而,应该注意的是,如果自定义选择元素仅对移动设备是必要的——那么上述问题不适用——因为每部手机本身打开选择元素的方式。所以对于移动设备,这可能是最好的解决方案。]

.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(https://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>


如果Firefox上需要自定义箭头-在版本35之前-但您不需要支持旧版本的Internet Explorer-那么请继续阅读…

解决方案#3-使用pointer-events属性(demo

--

(阅读更多这里)

这里的想法是将元素覆盖在本机下拉箭头上(以创建我们的自定义箭头),然后禁止指针事件在其上。

优势:它在WebKit和Gecko中运行良好。它看起来也不错(没有突出option元素)。

缺点: Internet Explorer(Internet Explorer 10及以下版本)不支持pointer-events,这意味着您无法单击自定义箭头。此外,此方法的另一个(明显)缺点是您无法使用悬停效果或手光标定位新箭头图像,因为我们刚刚禁用了它们上的指针事件!

但是,使用此方法,您可以使用Modernizer或条件注释使Internet Explorer恢复为标准的内置箭头。

NB:由于Internet Explorer 10不再支持conditional comments:如果您想使用这种方法,您可能应该使用modnizr。但是,仍然可以使用这里描述的CSS hack从Internet Explorer 10中排除指针事件CSS。

.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(https://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]-->

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

这为选择元素使用背景颜色,我删除了图像。

使用:after:before来做这个技巧的一个非常好的例子是在样式选择框与CSS3|CSSDeck

从Internet Explorer 10开始,您可以使用#0伪元素选择器来样式化和隐藏下拉箭头元素。

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

其余的样式应该类似于其他浏览器。

这是Danield的jsfiddle的一个基本分支,它适用于对IE10的支持

仅限CSS和超文本标记语言的解决方案

它似乎与Chrome,Firefox和Internet Explorer 11兼容。但请留下您对其他Web浏览器的反馈。

正如丹尼尔的回答所建议的,我将我的选择包装在一个div中(甚至两个div以实现x浏览器兼容性)以获得预期的行为。

见http://jsfiddle.net/bjap2/

超文本标记语言:

<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包装器。

还要注意添加的额外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 somebrowsers 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;}

我有这个确切的问题,除了我不能使用图像并且不受浏览器支持的限制。这应该是“规范”,幸运的是开始在任何地方工作最终

它使用分层旋转背景层来“剪切”下拉箭头,因为伪元素不适用于选择元素。

编辑:在这个更新的版本中,我使用了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>

丹尼尔的回答中的第三种方法可以改进以处理悬停效果和其他鼠标事件。只需确保“按钮”元素紧跟标记中的选择元素之后。然后使用+CSS选择器将其定位:

超文本标记语言:

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

css:

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

但是,当将鼠标悬停在选择元素上的任何位置时,这将显示悬停效果,而不仅仅是在“按钮”上。

我将此方法与Angular结合使用(因为我的项目恰好是一个Angular应用程序),以覆盖整个选择元素,并让Angular在“按钮”元素中显示所选选项的文本。在这种情况下,当鼠标悬停在选择的任何位置时,悬停效果都适用是完全合理的。

不过,如果没有JavaScript,它就无法工作,所以如果你想这样做,并且你的网站必须在没有JavaScript的情况下工作,你应该确保你的脚本添加了增强所需的元素和类。这样,没有JavaScript的浏览器只会得到一个正常的、无样式的选择,而不是一个无法正确更新的样式徽章。

这是一个基于我在这次讨论中最喜欢的想法的解决方案。这允许直接样式化<选择>元素,而无需任何额外的标记。

它可以在Internet Explorer 10(及更高版本)中使用Internet Explorer 8/9的安全回退。这些浏览器的一个警告是背景图像必须定位并足够小以隐藏在本机展开控件后面。

超文本标记语言

<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 arrowselect::-ms-expand {display: none;}

代码笔

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

这是一个适用于所有现代浏览器的版本。关键是使用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>

原生解决方案

下面是一个简单的超文本标记语言/CSS示例:
https://jsfiddle.net/dkellner/e1jdspvb/

诀窍:出于某种原因,当您将size属性赋予选择标记时,它会突然理解CSS。通常此属性用于创建始终可见的固定高度列表,但作为副作用,您现在可以对其进行样式设置。因此,我们所做的就是为其提供大小,然后实现显示/隐藏机制以恢复下拉感。

最小版本,不像示例那样时尚,但更容易理解:

<style>
.stylish > span {position:relative;}.stylish select {position:absolute;left:0px;transform:scaleY(0);transform-origin:top center;}.stylish.dropped-down select {transform:scaleY(1);}
</style>...<div class="stylish"><label> Choose your superhero: </label><span><input   onclick  = "this.closest('div').classList.toggle('dropped-down');"><br><select  onclick  = "this.closest('div').classList.remove('dropped-down');"onchange = "this.closest('div').querySelector('input').value=this.value;"size=9><optgroup label="Fantasy"></optgroup>
<option value="gandalf">  Gandalf       </option><option value="harry">    Harry Potter  </option><option value="jon">      Jon Snow      </option>
...            
</select></span></div>

附带说明

  • 这实际上实现了一个可编辑的下拉列表;使用只读来避免编辑
  • <optgroup>标签是空的(不在选项标签周围),这种方式更具风格

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

注意:bas64的东西在SVG中是#0

在现代浏览器中,在CSS中设置<select>的样式相对容易。对于appearance: none,唯一棘手的部分是替换箭头(如果这是您想要的)。这是一个使用带有纯文本SVG的内联data: URI的解决方案:

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、Chrome55、Edge 38和Safari10)。关于Firefox的一个注意事项是,如果您想在数据URI中使用#字符(例如fill: #000),您需要转义它(fill: %23000)。

您还可以在下拉列表中添加悬停样式。

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>

自定义选择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>