是否可以为选择框设置样式?[关闭]


145

我有一个需要设置样式的HTML选择框。我宁愿只使用CSS,但是如果需要的话,我将使用jQuery填补空白。

谁能推荐一个好的教程或插件?

我知道,Google,但是我一直在搜索过去两个小时,但找不到符合我需要的内容。

它必须是:

  • 与jQuery 1.3.2兼容
  • 无障碍
  • 不打扰
  • 可以根据样式选择框的各个方面进行完全自定义

有人知道什么可以满足我的需求吗?


6
您的意思是您想要一个可定制的下拉列表(内置于jquery中),对吗?因为选择框甚至不是浏览器对象(它们是平台对象),非常简单,非常原始,并且您无法对其进行样式设置(例如,不能对边框进行样式设置)
Ayyash

+1很好的解释和格式化!
Manish

6
选择是值得一提的,但不是非常可定制的,并且有很多未解决的问题。很好看和使用。
的付费书呆子

1
@Ayyash您所说的内容在某些系统(某些情况下为Mac OS)上适用于MSHTML(Internet Explorer和朋友)和WebCore(Safari)。对于Gecko(Firefox和朋友)而言并非如此。因此,实际的问题是您无法select跨浏览器设置元素样式。但是,如果人们愿意忍受差异,则可以对它们进行样式设置- 包括边框。
PointedEars 2012年

1
@PointedEras是的,2012年他们可以,但是我想那是3年前,我说了我的话,我很确定我当时开了一枪,但没有成功
Ayyash 2012年

Answers:


45

我已经看到了一些jQuery插件,在那里,转换<select>的到<ol>的和<option>的来<li>的,这样就可以用CSS样式。推出自己的作品不会太难。

这是一个:https : //gist.github.com/1139558(曾经在这里使用,但看起来该站点已关闭。)

像这样使用它:

$('#myselectbox').selectbox();

样式如下:

div.selectbox-wrapper ul {
  list-style-type:none;
  margin:0px;
  padding:0px;
}
div.selectbox-wrapper ul li.selected { 
  background-color: #EAF2FB;
}
div.selectbox-wrapper ul li.current { 
  background-color: #CDD8E4;
}
div.selectbox-wrapper ul li {
  list-style-type:none;
  display:block;
  margin:0;
  padding:2px;
  cursor:pointer;
}

我最初尝试了此版本,但DIV相对于选择框的位置未定位。相反,它位于左侧的硬位置。

我自己没有用过。演示示例(brainfault.com/demo/selectbox/0.5)看起来不错。看看其他实现。我知道我已经看到了其他几个可以做到这一点的插件。
Mark A. Nicolosi's

1
我尝试了一下,但它工作了一段时间,直到不得不在页面上放置多个。现在很难进行样式设置,因为出于某种愚蠢的原因,作者认为可以对所有元素使用相同的ID,而不是唯一的ID或类。现在我正在考虑写自己的...
乔纳森(Jonathan)2010年

19
404-有镜子的地方有什么想法吗?
Moak 2010年

2
请注意,屏幕阅读器无法访问大多数选择菜单插件。尚未找到有效的方法。
马西·萨顿

18

更新:截至2013年,我看到的两个值得检查的是:

  • 选择 -大量有趣的东西,github上的7k +观看者。(在评论中由“付费书呆子”提及)
  • Select2-受选择的启发,它是Angular-UI的一部分,并在选择上做了一些有用的调整。

是的


截至2012年,我发现的最轻便,灵活的解决方案之一是ddSlick。来自网站的相关(编辑)信息:

  • 将图像和文本添加到 select options
  • 可以使用JSON填充选项
  • 支持选择时的回调函数

以下是各种模式的预览:

在此处输入图片说明


14

至于CSS,Mozilla似乎是最友好的,尤其是从FF 3.5+开始。Webkit浏览器大多只是做自己的事情,而忽略任何样式。IE非常有限,尽管IE8至少可以让您设置样式边框的颜色/宽度。

实际上,以下内容在FF 3.5+中看起来相当不错(当然是选择您的颜色偏好):

select {
    -moz-border-radius: 4px;
    -moz-box-shadow: 1px 1px 5px #cfcfcf inset;
    border: 1px solid #cfcfcf;
    vertical-align: middle;
    background-color: transparent;
}
option {
    background-color: #fef5e6;
    border-bottom: 1px solid #ebdac0;
    border-right: 1px solid #d6bb86;
    border-left: 1px solid #d6bb86;
}
option:hover {
    cursor: pointer;
}

但是当涉及到IE时,如果不想在未下拉选项菜单时显示该背景色,则必须禁用该选项的背景色。而且,正如我所说的,webkit会做自己的事情。


11

我们找到了一种简单而又体面的方法来做到这一点。它是跨浏览器的,可降解的,并且不会破坏表单发布。首先将选择框的不透明度设置为0。

.select { 
    opacity : 0;
    width: 200px;
    height: 15px;
}

<select class='select'>
    <option value='foo'>bar</option>    
</select>

因此,您仍然可以单击它

然后使div具有与选择框相同的尺寸。div应该位于选择框下面作为背景。使用{位置:绝对}和z-index来实现。

.div {
    width: 200px;
    height: 15px;
    position: absolute;
    z-index: 0;
}

<div class='.div'>{the text of the the current selection updated by javascript}</div>
<select class='select'>
    <option value='foo'>bar</option>    
</select>

使用javascript更新div的innerHTML。jQuery的Easypeasy:

$('.select').click(function(event)) { 
    $('.div').html($('.select option:selected').val());
}

而已!只需为div设置样式,而不是选择框即可。我尚未测试以上代码,因此您可能需要对其进行调整。但是希望您能掌握要点。

我认为这种解决方案胜过{-webkit-appearance:none;}。浏览器最多应该执行的操作是与表单元素进行交互,但绝不决定其最初在页面上的显示方式,因为这会破坏网站设计。


10

如果您最想的话,这里有个插头

  • 发疯定制关闭状态一个的select元素
  • 但在打开状态下,您倾向于更好的本机体验来选择选项(滚轮,箭头键,制表符焦点,对Ajax的修改options,正确的zindex等)
  • 不喜欢凌乱ulli生成标记

然后jquery.yaselect.js可能更合适。只是:

$('select').yaselect();

最后的标记是:

<div class="yaselect-wrap">
  <div class="yaselect-current"><!-- current selection --></div>
</div>
<select class="yaselect-select" size="5">
  <!-- your option tags -->
</select>

github.com查看


它很棒,也可以在移动设备上使用:)
飞羊

在IOS上工作。抱歉,我无权访问android等?
choonkeat 2012年

1
这不是问题,是赞美。它确实可以在我的android 正常工作。
飞羊

5

您可以通过CSS本身在某种程度上样式化

select {
    background: red;
    border: 2px solid pink;
}

但这完全取决于浏览器。一些浏览器很固执。

但是,这只会使您步入正轨,而且看起来并不总是那么好。为了进行完全控制,您需要使用自己的小部件来替代通过jQuery进行的选择,该小部件可以模拟选择框的功能。确保禁用JS后,将使用普通选择框。这使更多的用户可以使用您的表单,并有助于辅助功能。




2

如果有没有jQuery的解决方案。您可以在其中看到工作示例的链接:http : //www.letmaier.com/_selectbox/select_general_code.html(样式带有更多CSS)

我的解决方案的样式部分:

<style>
#container { margin: 10px; padding: 5px; background: #E7E7E7; width: 300px; background: #ededed); }
#ul1 { display: none; list-style-type: none; list-style-position: outside; margin: 0px; padding: 0px; }
#container a {  color: #333333; text-decoration: none; }
#container ul li {  padding: 3px;   padding-left: 0px;  border-bottom: 1px solid #aaa;  font-size: 0.8em; cursor: pointer; }
#container ul li:hover { background: #f5f4f4; }
</style>

现在,body标记中的HTML代码为:

<form>
<div id="container" onMouseOver="document.getElementById('ul1').style.display = 'block';" onMouseOut="document.getElementById('ul1').style.display = 'none';">
Select one entry: <input name="entrytext" type="text" disabled readonly>
<ul id="ul1">
    <li onClick="document.forms[0].elements['entrytext'].value='Entry 1'; document.getElementById('ul1').style.display = 'none';"><a href="#">Entry 1</a></li>
    <li onClick="document.forms[0].elements['entrytext'].value='Entry 2'; document.getElementById('ul1').style.display = 'none';"><a href="#">Entry 2</a></li>
    <li onClick="document.forms[0].elements['entrytext'].value='Entry 3'; document.getElementById('ul1').style.display = 'none';"><a href="#">Entry 3</a></li>
</ul>
</div>
</form>

请提供一个示例,而不只是链接到一个示例。
所有工人都

我根据您的要求更改了答案。
Christoph Letmaier 2014年

1
现在看起来好多了。顺便说一句,链接到工作示例或显示示例的源没有错(这可能会很有帮助)。但是随着时间的推移,链接不可避免地变得无效,因此,即使提供了有用的链接,也希望始终在答案本身(您提供的答案)中提供必要的信息。
所有工人都

好吧,明白了... :-)我会尽力使链接保持活动状态
Christoph Letmaier 2014年

2

2014年更新:您不需要jQuery。您可以使用StyleSelect完全样式化选择框而不使用jQuery 。例如,给定以下选择框:

<select class="demo">
  <option value="value1">Label 1</option>
  <option value="value2" selected>Label 2</option>
  <option value="value3">Label 3</option>
</select>

运行styleSelect('select.demo')将创建一个样式选择框,如下所示:

在此处输入图片说明


旁注,不支持IE9及以下版本
Ben Sewards





-1

一种简单的解决方案是在div中扭曲您的选择框,然后对与您的设计匹配的div进行样式设置。将opacity:0设置为选择框,它将使选择框不可见。使用jQuery插入span标记,如果用户更改下拉值,则动态更改其值。本教程中显示的全部演示以及代码说明。希望它能解决您的问题。

jQuery代码看起来与此类似。

 <script>
   $(document).ready(function(){
     $('.dropdown_menu').each(function(){
       var baseData = $(this).find("select option:selected").html();
       $(this).prepend("<span>" + baseData + "</span>");
     });

     $(".dropdown_menu select").change(function(e){
       var nodeOne = $(this).val();
       var currentNode = $(this).find("option[value='"+ nodeOne +"']").text();
       $(this).parents(".dropdown_menu").find("span").text(currentNode);
     });
   });
</script>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.