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

Jit*_*yas 1258 html css combobox cross-browser skinning

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

我需要<select>尽可能多地为一个表单设置样式,而不需要任何JavaScript.我可以在CSS中使用哪些属性?

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

  • Internet Explorer 6,7和8
  • 火狐
  • 苹果浏览器

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

我不是在谈论简单的造型.我想知道,只有CSS才能做到最好.

我在Stack Overflow上发现了类似的问题.

这一次在Doctype.com.

Dan*_*eld 979

这里有3个解决方案:

解决方案#1 - 外观:无 - 使用ie10-11解决方法(演示)

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

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

浏览器支持:

appearance: none有非常好的浏览器支持(caniuse) - 除了ie11-和firefox 34-

我们可以通过添加来改进这种技术并添加对ie10和ie11的支持

select::-ms-expand {
    display: none; /* Hide the default arrow in Internet Explorer 10 and Internet Explorer 11 */
}
Run Code Online (Sandbox Code Playgroud)

如果ie9是一个问题 - 我们无法删除默认箭头(这意味着我们现在有两个箭头),但是,我们可以使用一个时髦的ie9选择器来至少撤消我们的自定义箭头 - 保留默认的选择箭头完整.

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

全部一起:

select {
  margin: 50px;
  width: 150px;
  padding: 5px 35px 5px 5px;
  font-size: 16px;
  border: 1px solid #CCC;
  height: 34px;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  background: url(http://www.stackoverflow.com/favicon.ico) 96% / 15% no-repeat #EEE;
}


/* CAUTION: Internet Explorer hackery ahead */


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

/* Target Internet Explorer 9 to undo the custom arrow */
@media screen and (min-width:0\0) {
    select {
        background: none\9;
        padding: 5px\9;
    }
}
Run Code Online (Sandbox Code Playgroud)
<select>
  <option>Apples</option>
  <option selected>Pineapples</option>
  <option>Chocklate</option>
  <option>Pancakes</option>
</select>
Run Code Online (Sandbox Code Playgroud)

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


如果需要浏览器支持ie9-和firefox 34-那么请继续阅读......

解决方案#2截断select元素以隐藏默认箭头(Demo)

(在这里阅读更多)

包裹select具有在一个div元件固定的宽度overflow:hidden.

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

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

这种方法的优点是它是跨浏览器(Internet Explorer 8及更高版本,WebKitGecko).然而,这种方法的缺点是选项下拉突出在右侧(由我们隐藏的20个像素...因为选项元素占用了选择元素的宽度).

在此输入图像描述

[但是,应该注意的是,如果仅对MOBILE设备需要自定义选择元素- 则上述问题不适用 - 因为每个手机本身打开select元素的方式.所以对于移动设备,这可能是最好的解决方案.]

.styled select {
  background: transparent;
  width: 150px;
  font-size: 16px;
  border: 1px solid #CCC;
  height: 34px;
}
.styled {
  margin: 50px;
  width: 120px;
  height: 34px;
  border: 1px solid #111;
  border-radius: 3px;
  overflow: hidden;
  background: url(http://www.stackoverflow.com/favicon.ico) 96% / 20% no-repeat #EEE;
}
Run Code Online (Sandbox Code Playgroud)
<div class="styled">
  <select>
    <option>Pineapples</option>
    <option selected>Apples</option>
    <option>Chocklate</option>
    <option>Pancakes</option>
  </select>
</div>
Run Code Online (Sandbox Code Playgroud)


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

解决方案#3 - 使用pointer-events属性(演示)

(在这里阅读更多)

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

优点:在WebKit和Gecko中运行良好.它看起来也很好(没有突出的option元素)

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

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

注意:因为Internet Explorer 10不再支持conditional comments:如果你想使用这种方法,你应该使用Modernizr.但是,仍然可以使用此处描述的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(http://www.stackoverflow.com/favicon.ico) right / 90% no-repeat #FFF;
  pointer-events: none;
}
/*target Internet Explorer 9 and Internet Explorer 10:*/

@media screen and (min-width: 0\0) {
  .notIE .fancyArrow {
    display: none;
  }
}
Run Code Online (Sandbox Code Playgroud)
<!--[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]-->
Run Code Online (Sandbox Code Playgroud)

  • 此外,我发布的小提琴使用方法#2的方法来允许IE使用其默认箭头. (4认同)
  • 如果我可以提出方法#1的改进,我个人发现右侧缺乏边界或缺乏选择光环非常烦人.我用我当前项目中使用的东西更新了你的小提琴:http://jsfiddle.net/YvCHW/1745/.告诉我你的想法! (4认同)
  • 这取决于设计要求.如果你对下拉突出显示没问题 - 那么这是最好的,因为它是跨浏览器(IMO allbrowsers + IE8 +可以被认为是跨浏览器)但我认为对很多人来说 - 这是不行的.所以实际上在我上面的陈述中,我的意思是#2是最好的. (3认同)
  • @AlexisLeclerc修复div并选择相同的宽度仅适用于像Chrome这样的-webkit浏览器.(因为我包含了规则 - **webkit-appearance:none;**)但是这不适用于其他浏览器,如firefox (3认同)

Mat*_*rek 230

这是可能的,但不幸的是,在我们作为开发人员需要的程度上,主要是基于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;
}
Run Code Online (Sandbox Code Playgroud)

当您在基于Webkit的浏览器中的任何页面上运行此代码时,它应该更改选择框的外观,删除标准OS箭头并添加PNG箭头,在标签之前和之后放置一些间距,几乎任何您想要的.

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

它几乎可以在所有基于Webkit的浏览器中运行,包括移动浏览器,但Gecko似乎不支持appearanceWebkit.

  • @AdrienBe我的解决方案是在大约3年前提出的; 当时它是重新选择框而不涉及JavaScript库或插件的唯一合理方法.如果您决定删除带前缀的属性,它仍然可行,但它仅在基于Webkit的浏览器中可靠地运行(因此Safari,新的Opera + Android也是如此).现在,可能有更好的解决方案,所以不要添加毫无意义的评论,只需投票选择您认为更好的解决方案,并在将来检查"已回答"日期.谢谢. (39认同)
  • 嘿,我注意到Firefox 12中的选择框看起来非常不同(它看起来很像Chrome(我有一台Mac)),似乎FF 12支持更多外观属性. (4认同)
  • 一个纯粹的解决方案...我不会为此付出代价,也不会为我的客户付费.请参阅@Dianeld对x-browser解决方案的回答. (3认同)
  • @MatthewMorek:即使是3年前,也有更好的解决方案.关于跨浏览器支持,Daniel的答案要好得多(它支持IE8及更高版本,WebKit和Gecko).问题确实是"代码需要与所有主流浏览器兼容:Internet Explorer 6,7和8,Firefox和Safari".这个x浏览器的要求可能是由Paul Sweatte在2013年添加的......但是如果是这样的话,很抱歉. (3认同)
  • 如果您添加`text-indent:0.01px; text-overflow:“”;`效果更好 (3认同)

pav*_*ium 62

选择元素及其下拉功能很难的风格.

Chris Heilmann对选择元素风格属性证实了Ryan Dohery在对第一个答案的评论中所说的内容:

"select元素是操作系统的一部分,而不是浏览器chrome.因此,它的风格非常不可靠,无论如何都不一定有意义."


ioT*_*Tus 42

在设计选择下拉列表时我注意到的最大不一致是Safari谷歌Chrome渲染(Firefox可以通过CSS完全自定义).在通过互联网的晦涩深度搜索之后,我遇到了以下内容,几乎完全解决了我对WebKit的疑虑:

Safari和Google Chrome修复:

select {
  -webkit-appearance: none;
}
Run Code Online (Sandbox Code Playgroud)

但是,这会删除下拉箭头.您可以使用附近div的背景,负边距或绝对定位在选择下拉列表上添加下拉箭头.

*CSS属性中提供了更多信息和其他变量:-webkit-appearance.

  • +1,用于确定FF可通过CSS完全自定义 (2认同)

Hen*_*rik 36

我有这个确切的问题,除了我不能使用图像,并不受浏览器支持的限制.这应该是"规范",并且运气最终开始在各地工作.

它使用分层旋转的背景图层来"剪切"下拉箭头,因为伪元素不适用于select元素.

编辑:在这个更新版本中,我使用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);
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • 哇,这是我见过的最酷的解决方案之一.它适用于Mac上最新版本的Chrome和Safari.其他浏览器怎么样? (4认同)
  • 在firefox中为我工作,并附加了`-moz-appearance:none;`。 (2认同)

jer*_*rne 35

<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>
Run Code Online (Sandbox Code Playgroud)

示例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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案没有解决这个问题.它只为选择输入设置样式,但不设置下拉列表 (33认同)
  • 令人惊讶的是,我第一次看到互联网上的"母亲",而不是粗鲁.为此+1! (30认同)
  • 这个答案完全忽略了为跨浏览器一致性设置下拉列表样式的挑战。这是一个非常省力的答案。 (14认同)

Rok*_*jan 18

自定义选择 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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


Eri*_*ric 16

这是一个适用于所有现代浏览器的版本.关键是使用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
}
Run Code Online (Sandbox Code Playgroud)
<select id="mySelect">
    <option>Option 1</option>
    <option>Option 2</option>
</select>
Run Code Online (Sandbox Code Playgroud)


小智 15

博客文章如何使用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;
}
Run Code Online (Sandbox Code Playgroud)


Yaj*_*ajo 12

我使用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=");
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

注意:base64内容fa-chevron-down在SVG中.


小智 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;}
Run Code Online (Sandbox Code Playgroud)


Kev*_*nry 10

在现代浏览器中,<select>在CSS中设置样式相对轻松.随着appearance: none唯一棘手的部分是替换箭头(如果这就是你想要的).这是一个使用data:带有纯文本SVG 的内联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>");
}
Run Code Online (Sandbox Code Playgroud)
<select>
  <option>Option 1</option>
  <option>Option 2</option>
</select>

<select style="font-size: 2rem;">
  <option>Option 1</option>
  <option>Option 2</option>
</select>
Run Code Online (Sandbox Code Playgroud)

其余的样式(边框,填充,颜色等)相当简单.

这适用于我刚试过的所有浏览器(Firefox 50,Chrome 55,Edge 38和Safari 10).关于Firefox的一个注意事项是,如果你想使用#数据URI中的字符(例如fill: #000),你需要转义它(fill: %23000).


Pau*_*tte 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>
Run Code Online (Sandbox Code Playgroud)

使用零不透明度的第二个选择使按钮可单击:

    <!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>
Run Code Online (Sandbox Code Playgroud)

Webkit和其他浏览器之间的坐标不同,但@media查询可以涵盖这一点.

参考


dke*_*ner 8

原生解决方案

检查这个小提琴,并原谅我过度设计:https ://jsfiddle.net/dkellner/7ac9us70/

  • 你已经知道所有的元素
  • 你可以用通常的方式来设计它们
  • 很少涉及 JS。

背后的技巧:一旦 <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>
Run Code Online (Sandbox Code Playgroud)

(为了简单起见,我用 jQuery 做到了 - 但没有它你也可以这样做)

旁注

  • 此解决方案为您提供的不仅仅是一个选择:该值还可以手动编辑。如果您更喜欢默认的 select-restricted 方式,请使用 readonly 属性。

  • 为了最大限度地增加样式的可能性,<optgroup> 标签不在它们的孩子周围,而是它们之前移动。这是故意的,视觉上更清晰,他们很乐意这样工作,别担心。

  • Javascripts:是的,我知道 OP 说“没有 Javascript”,但我理解它,因为 请不要打扰插件,这很好。您不需要任何库来实现这一点。甚至不是 jQuery,正如我所说,它只是为了示例的清晰性。


Ahm*_*jmi 7

一个很好的例子,它使用:after:before完成这个技巧是使用 CSS3 的样式选择框 | CSSD甲板

  • 是的,它与 IE 不兼容,但我喜欢与任何人分享我正在寻找的现代解决方案。 (2认同)

Dav*_*ard 5

是。您可以通过其标记名称来设置任何HTML元素的样式,如下所示:

select {
  font-weight: bold;
}
Run Code Online (Sandbox Code Playgroud)

当然,您也可以像其他元素一样使用CSS类对其进行样式设置:

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

<style type="text/css">
  .important {
    font-weight: bold;
  }
</style>
Run Code Online (Sandbox Code Playgroud)

  • 我不是在说这样,我想将下拉箭头更改为其他内容 (6认同)
  • 您无法将下拉箭头设置为其他图像的样式,该图像由操作系统控制。如果确实需要,最好的选择是使用DHTML下拉小部件。 (5认同)
  • 您只能通过CSS更改CSS属性。您可以更改其边距,填充,字体属性,背景颜色等。如果要使其外观完全不同,则基本上必须在运行时通过JavaScript将其替换为图形(如果做得很好,这不是一个糟糕的解决方案) )。 (3认同)

小智 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>
Run Code Online (Sandbox Code Playgroud)

  • @MikkoP:建议编辑时,请提供更具描述性的编辑摘要吗?对于我们的审阅者而言,“改进消息”作为高级摘要并没有很大帮助。谢谢。 (2认同)

Luc*_*cky 5

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;
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

这是一个基于我在这次讨论中最喜欢的想法的解决方案。这允许直接设置 <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>
Run Code Online (Sandbox Code Playgroud)

社会保障局

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;
}
Run Code Online (Sandbox Code Playgroud)

代码笔

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