How to style a
是否有一种仅限CSS的方式来设置
我需要在没有任何JavaScript的情况下尽可能地设置
此代码需要与所有主流浏览器兼容:
- Internet Explorer 6,7和8
- 火狐
- 苹果浏览器
我知道我可以使用JavaScript:示例。
我不是在谈论简单的造型。 我想知道,只有CSS才能做到最好。
我在StackOverflow上发现了类似的问题。
这个在Doctype.com上。
这里有3个解决方案:
解决方案#1 - 外观:无 - 使用ie10-11解决方法(演示)
要隐藏select元素上的默认箭头集
1 2 3 4 5 6 | select { -webkit-appearance: none; -moz-appearance: none; appearance: none; /* remove default arrow */ background-image: url(...); /* add custom arrow */ } |
浏览器支持:
我们可以通过添加来改进这种技术并添加对ie10和ie11的支持
1 2 3 | select::-ms-expand { display: none; /* hide the default arrow in ie10 and ie11 */ } |
如果ie9是一个问题 - 我们无法删除默认箭头(这意味着我们现在将有两个箭头),但是,我们可以使用一个时髦的ie9选择器
至少撤消我们的自定义箭头 - 保持默认选择箭头不变。
1 2 3 4 5 6 7 | /* target Internet Explorer 9 to undo the custom arrow */ @media screen and (min-width:0\0) { select { background-image:none\9; padding: 5px\9; } } |
全部一起:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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: IE hackery ahead */ select::-ms-expand { display: none; /* remove default arrow in IE 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; } } |
1 2 3 4 5 6 | <select> <option>Apples</option> <option selected>Pineapples</option> <option>Chocklate</option> <option>Pancakes</option> </select> |
这个解决方案很简单,并且具有良好的浏览器支持 - 通常应该足够了。
如果需要浏览器支持ie9-和firefox 34-那么请继续阅读......
解决方案#2截断select元素以隐藏默认箭头(Demo)
(在这里阅读更多)
将
然后给
结果是
这种方法的优点是它是跨浏览器(InternetExplorer8及更高版本,WebKit和Gecko)。然而,这种方法的缺点是选项下拉突出在右侧(由我们隐藏的20个像素...因为选项元素占用了选择元素的宽度)。
[但是,应该注意的是,如果仅对MOBILE设备需要自定义选择元素 - 则上述问题不适用 - 因为每个电话本身打开select元素的方式。所以对于移动设备,这可能是最好的解决方案。]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | .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; } |
1 2 3 4 5 6 | <select> <option>Pineapples</option> <option selected>Apples</option> <option>Chocklate</option> <option>Pancakes</option> </select> |
如果在Firefox上需要自定义箭头 - 在版本35之前 - 但您不需要支持旧版本的IE - 那么继续阅读......
解决方案#3 - 使用
(在这里阅读更多)
这里的想法是将一个元素覆盖在原生下拉箭头上(以创建我们的自定义箭头),然后在其上禁止指针事件。
优点:在WebKit和Gecko中运行良好。它看起来也不错(没有突出
缺点:InternetExplorer(IE10及以下版本)不支持
但是,使用此方法,您可以使用Modernizer或条件注释使InternetExplorer恢复为标准内置箭头。
注意:因为InternetExplorer 10不再支持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | .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; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | <!--[if !IE]> --> <!-- <![endif]--> <span class="fancyArrow"></span> <select> <option>Apples</option> <option selected>Pineapples</option> <option>Chocklate</option> <option>Pancakes</option> </select> <!--[if !IE]> --> <!-- <![endif]--> |
这是可能的,但不幸的是,在我们作为开发人员需要的程度上,主要是基于Webkit的浏览器。以下是通过内置开发人员工具检查器从Chrome选项面板收集的CSS样式示例,经过改进以匹配大多数现代浏览器中当前支持的CSS属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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 Fx (3.6 to 15) */ background-image: url(../images/select-arrow.png), -ms-linear-gradient(top, #E5E5E5, #F4F4F4); /* For pre-releases of IE 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箭头,在标签之前和之后放置一些间距,几乎任何您想要的。
最重要的部分是
它几乎适用于所有基于Webkit的浏览器,包括移动浏览器,但Gecko似乎不支持
选择元素及其下拉功能很难设计。
Chris Heilmann对选择元素的风格属性证实了Ryan Dohery在对第一个答案的评论中所说的内容:
"The select element is part of the
operating system, not the browser chrome. Therefore, it is very
unreliable to style, and it does not necessarily make sense to try
anyway."
在设计选择下拉列表时我注意到的最大不一致是Safari和谷歌Chrome渲染(Firefox可以通过CSS完全自定义)。在通过互联网的晦涩深度搜索后,我遇到了以下内容,几乎完全解决了我对WebKit的疑虑:
Safari和Google Chrome修复:
1 2 3 | select { -webkit-appearance: none; } |
但是,这会删除下拉箭头。您可以使用附近的
* CSS属性中提供了更多信息和其他变量:-webkit-appearance。
示例HTML文件(selectExample.html):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> <html> <head> Select Styling <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):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /* 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元素。
编辑:在这个更新版本中,我使用CSS变量和一个微小的主题系统。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | :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); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <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> |
这是一个适用于所有现代浏览器的版本。关键是使用
工作示例:https://jsfiddle.net/gs2q1c7p/
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 } |
1 2 3 4 | <select id="mySelect"> <option>Option 1</option> <option>Option 2</option> </select> |
博客文章如何使用CSS形式下拉样式没有JavaScript适合我,但它在Opera中失败了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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; } |
1 2 3 4 5 | <select> <option>Select an Option</option> <option>Option 1</option> <option>Option 2</option> </select> |
我使用Bootstrap来处理你的情况。这是最简单的解决方案:
1 2 3 4 5 6 7 8 9 10 | 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="); } |
1 2 3 4 5 6 7 8 9 | <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> |
注意:SV64中的base64内容为
在现代浏览器中,在CSS中设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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>"); } |
1 2 3 4 5 6 7 8 9 | <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中使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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;} |
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!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> |
使用零不透明度的第二个选择使按钮可单击:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <!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查询可以涵盖这一点。
参考
- Dojo FX测试:dojox.fx.ext-dojo.complex
- CSS Masking:使用rect函数测试剪辑属性,并将自动值剪辑到边框框
不推荐编辑此元素,但如果您想尝试它,就像任何其他HTML元素一样。
编辑示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /*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> |
是。您可以按标签名称设置任何HTML元素的样式,如下所示:
1 2 3 | select { font-weight: bold; } |
当然,您也可以使用CSS类来设置样式,就像任何其他元素一样:
1 2 3 4 5 6 7 8 9 10 | <select class="important"> <option>Important Option</option> <option>Another Important Option</option> </select> <style type="text/css"> .important { font-weight: bold; } </style> |
使用
你肯定应该像使用CSS选择样式,选择组和选项一样。在许多方面,背景颜色和颜色正是您通常需要的样式选项,而不是整个选择。
从Internet Explorer 10开始,您可以使用
1 2 3 4 | select::-ms-expand { display:none; /* or visibility: hidden; to keep it's space/hitbox */ } |
其余样式应与其他浏览器类似。
这是Danield的jsfiddle的基本分支,它支持IE10
这是基于我在讨论中最喜欢的想法的解决方案。这允许直接样式化元素而无需任何额外的标记。
使IE10 +具有IE8 / 9的安全后备功能。这些浏览器的一个警告是背景图像必须定位并且足够小以隐藏在原生扩展控件之后。
HTML
1 2 3 4 5 | <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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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 IE10+ // IE 8/9 get dafault arrow which covers caret image // as long as caret image is small than and positioned // behind default arrow select::-ms-expand { display: none; } |
Codepen
http://codepen.io/ralgh/pen/gpgbGx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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; } |
这使用选择元素的背景颜色,我删除了图像..
有一种方式来设置SELECT标签的样式。
如果标签中有"size"参数,则几乎所有CSS都适用。使用这个技巧,我创建了一个实际上等同于普通选择标记的小提琴,加上可以像可视语言中的ComboBox一样手动编辑值(除非您将readonly放在输入标记中)。
所以这里有一个最小的例子来看看背后的原理:
(你需要jQuery来实现点击机制):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <style> /* only these 2 lines are truly required */ .stylish span {position:relative;} .stylish select {position:absolute;left:0px;display:none} /* now you can style the hell out of them */ .stylish input { ... } .stylish select { ... } .stylish option { ... } .stylish optgroup { ... } </style> ... <label> Choose your superhero: </label> <span> <input onclick="$(this).closest('div').find('select').slideToggle(110)"> <select size=15 onclick="$(this).hide().closest('div').find('input').val($(this).find('option:selected').text());"> <optgroup label="Fantasy"></optgroup> <option value="gandalf">Gandalf</option> <option value="harry">Harry Potter</option> <option value="jon">Jon Snow</option> <optgroup label="Comics"></optgroup> <option value="tony">Tony Stark</option> <option value="steve">Steven Rogers</option> <option value="natasha">Natasha Romanova</option> </select> </span> |
这是更多风格的小提琴:
https://jsfiddle.net/dkellner/7ac9us70/
(当然,这只是为了展示其可能性。)
注意标签如何不像通常那样封装属于它们的选项;是的,这是故意的,它是造型。 (有礼貌的方式可以减少很多样式。)是的,他们确实以这种方式完美地工作。
在任何人指出NO-JS部分之前:我知道问题是"没有Javascript"。对我来说,这更像是请不要打扰插件,我知道他们可以做到但我需要原生的方式。理解,没有插件,没有额外的脚本,只有什么适合标签的"onclick"。唯一的依赖是jQuery,以避免原生的"document.parentNode.getElementsByTagName"疯狂。但它可以这样工作。所以是的,这是一个带有原生样式和一些onclick处理程序的原生选择标记。它显然不是"Javascript解决方案"。
请享用!
自定义选择CSS样式
在IE(10,11),Edge,FF,Chrome中测试过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | <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> |
仅限CSS和HTML的解决方案
我似乎与Chrome,Firefox和IE11兼容。但请留下您对其他网络浏览器的反馈。
正如@Danield回答所建议的那样,我将select包装在一个div中(甚至两个div用于x-browser兼容性)以获得预期的行为。
见http://jsfiddle.net/bjap2/
HTML:
1 2 3 4 5 6 | <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> |
注意2 div包装器。
还要注意添加额外的div以将箭头按钮放在任何你喜欢的位置(绝对定位),这里我们把它放在左边。
CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | .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 hidding the default-provided browser arrow */ padding-left: 13px; margin-left: 0; border: none; background: none; /* margin-top & margin-bottom must be set since some browser 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; } |
Danield的答案(https://stackoverflow.com/a/13968900/280972)中的第三种方法可以改进,以处理悬停效果和其他鼠标事件。只需确保"按钮"元素紧跟在标记中的select元素之后。然后使用+ css-selector定位它:
HTML:
1 | <select class="select-input">...</select> |
CSS:
1 2 3 | .select-input:hover+.select-button { [hover styles here] } |
但是,这将显示悬停在select元素上方的任何位置时的悬停效果,而不仅仅是"按钮"。
我将此方法与Angular结合使用(因为我的项目恰好是Angular-app),覆盖整个select元素,让Angular在"button"元素中显示所选选项的文本。在这种情况下,将鼠标悬停在选择范围内的任何位置时都适用悬浮效果。但是如果没有javascript它就无法工作,所以如果你想这样做,并且你的网站必须在没有javascript的情况下工作,你应该确保你的脚本添加了增强所需的元素和类。这样,没有javascript的浏览器只会获得正常的,没有样式的选择,而不是没有正确更新的样式徽章。
您还可以在下拉列表中添加悬停样式。
1 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;} |
1 2 3 4 5 6 7 8 9 10 11 | <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> |