在OS X上的Firefox中,Bootstrap 3 Styled Select下拉菜单看起来很难看


71

<select>在Bootstrap 3中设置表单元素的样式时,它将在OS X的Firefox中呈现一个难看的按钮:

在OS X的Firefox中难以选择

http://bootply.com/98385

显然,这已经是一段时间以来的已知问题了,并且有许多hack和变通办法,但没有一个很干净( https://github.com/twbs/bootstrap/issues/765)。我想知道是否有人使用Bootstrap下拉列表或其他插件找到了解决此问题的好方法。我故意选择使用HTML<select>而不是Bootstrap下拉列表,因为在移动设备上使用长列表时,可用性更好。

这是Firefox问题还是Bootstrap问题?

详细信息:Mac OS X 10.9,Firefox 25.0.1

更新12/4/13:我对每种浏览器如何<select>使用Firefox,Chrome和Safari在OS X 10.9上呈现的进行了并排比较,以响应@zessx(使用http://bootply.com / 98425)。显然,<select>表单元素在浏览器和操作系统之间的呈现方式之间存在很大差异:

每个浏览器呈现的select元素都大不相同

我了解,<select>根据您使用的操作系统,对标签的处理方式有所不同,因为存在基于操作系统的本机控件来指示样式和行为。但是,class="form-control"导致Bootstrap的<select>表单元素在Firefox中看起来与众不同的原因是什么?为什么<select>Firefox中默认的未设置样式的样式看起来可以,但是一旦被设置样式,则看起来很难看?


2
对于FireFox用户而言,这是正常现象,并不难看。Bootstrap仅使用CSS进行样式设置,并且不会使用脚本将选择内容转换为列表项,我相信Foundation会这样做。还要在IE中查看,看看那里会发生什么。不同的浏览器不会以相同的方式呈现表单元素。Chrome看起来最好。
克里斯蒂娜

如果调整大小,FireFox的本机选择会变得模糊,但这是它们的外观:jsbin.com/amimUhUg/1
Christina

谢谢克里斯蒂娜。我可以<select>接受适用于Firefox的自定义样式,即使它确实有点模糊。唯一的问题是,在Chrome和Safari中,它仍然看起来像是默认<select>元素-换句话说,自定义样式似乎仅适用于Firefox。(使用jsbin.com/amimUhUg/1
bhall

好吧,您可以将select css放到仅webkit的媒体查询(atsign)媒体屏幕中,然后(-webkit-min-device-pixel-ratio:0){}然后在select之外不放置任何样式,那样,firefox和即和所有其他人都不会接他们。在选择框上粘贴边框后,firefox只会在图像中为BS3做第一列。
克里斯蒂娜(Christina)

2
@ChristinaArasmoBeymer作为Firefox用户,我发现OS X上的这些下拉按钮非常糟糕。他们看上去直截了当Win95
Daniel Serodio

Answers:



24

实际上,您可以使用下拉字段执行几乎所有操作,并且在每个浏览器上看起来都一样,请查看代码示例

select.custom {
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20fill%3D%22%23555555%22%20%0A%09%20width%3D%2224px%22%20height%3D%2224px%22%20viewBox%3D%22-261%20145.2%2024%2024%22%20style%3D%22enable-background%3Anew%20-261%20145.2%2024%2024%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cpath%20d%3D%22M-245.3%2C156.1l-3.6-6.5l-3.7%2C6.5%20M-252.7%2C159l3.7%2C6.5l3.6-6.5%22%2F%3E%0A%3C%2Fsvg%3E");
  padding-right: 25px;
  background-repeat: no-repeat;
  background-position: right center;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
}

select.custom::-ms-expand {
  display: none;
}

https://jsfiddle.net/x76j455z/10/


对于任何想使用此解决方案的人,%3 ...是<svg> xml内容的ulr编码。
胡安

确实,我正在使用一个简单的Sass mixin管理此svg,并可能更改箭头颜色。这是它的来源:github.com/r4fx/mate/blob/master/src/styles/scss / ... 要对<svg> xml进行编码,您可以使用pressbin.com/tools/urlencode_urldecode
rafx

检查这个用于svg图标的出色的新工具URL编码器yoksel.github.io/url-encoder
rafx 17-10-26

24

rafxSina的出色回答的基础上,这是一个仅针对Firefox的代码段,并将默认按钮替换为从Bootstrap图标主题复制的下箭头

之前:

default select

后:

styled select

@-moz-document url-prefix() {
  select.form-control {
    padding-right: 25px;
    background-image: url("data:image/svg+xml,\
      <svg version='1.1' xmlns='http://www.w3.org/2000/svg' width='14px'\
           height='14px' viewBox='0 0 1200 1000' fill='rgb(51,51,51)'>\
        <path d='M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z'/>\
      </svg>");
    background-repeat: no-repeat;
    background-position: calc(100% - 7px) 50%;
    -moz-appearance: none;
    appearance: none;
  }
}

(内联SVG具有反斜杠和换行符,以提高可读性。如果它们在您的资产管道中造成麻烦,请将其删除。)

这是JSFiddle


我选择了此解决方案,我认为是最好的看法
yussan

1
更改此svg元素颜色的最佳方法是什么?编辑:通过调整fillrgb值成功更改了下拉箭头的颜色。感谢您的回答@Tobia
kjones

1
@-moz-document url-prefix()已停止工作,请参阅fxsitecompat.com/en-CA/docs/2018/…了解详细信息。我的替换选择器很幸运,_:-moz-tree-row(hover), select.form-control但是我还不知道它是如何工作的。
戴夫·莫尔斯

1
@DaveMorse您可能会认为,到目前为止,浏览器供应商已经了解到有时您需要针对特定​​的平台或引擎...但是@browser (engine="Gecko") { ... },出于“纯净”的原因,他们拒绝向CSS添加类似内容。嗯
Tobia '18

8

有一个外观漂亮的jQuery插件,它显然与名为SelectBoxIt(http://gregfranko.com/jquery.selectBoxIt.js/)的Bootstrap兼容。我喜欢它的地方是,它可以让您在所使用的任何操作系统上触发本机选择框,同时仍保持一致的样式(http://gregfranko.com/jquery.selectBoxIt.js/#TriggertheNativeSelectBox)。哦,我希望Bootstrap提供此选项!

唯一的缺点是,它在解决方案中增加了另一层复杂性,并且需要进行额外的工作以确保与所有其他插件随时间的升级/修补而兼容。我也不确定Bootstrap 3的兼容性。但是,这可能是一个很好的解决方案,可确保浏览器和操作系统之间的外观保持一致。


最初的问题询问如何在不使用其他插件的情况下执行此操作。

问题是关于避免使用插件
Tim Nguyen

7

这是正常现象,这是由<select>Firefox下的默认样式引起的:您无法设置line-height,那么padding当您需要自定义时需要继续玩<select>

示例,结果在Firefox 25 / Chrome 31 / IE 10下:

<select>
  <option>Default</option>
  <option>Default</option>
  <option>Default</option>
</select>

<select class="form-control">
  <option>Bootstrap</option>
  <option>Bootstrap</option>
  <option>Bootstrap</option>
</select>

<select class="form-control custom">
  <option>Custom</option>
  <option>Custom</option>
  <option>Custom</option>
</select>
select.custom {
  padding: 0px;
}

自举

在此处输入图片说明


感谢@zessx的回复!在Windows上,<select>显然在不同浏览器之间呈现的差异很小。我可以忍受 但是,在OS X上,<select>Firefox中的默认设置与Bootstrap样式或自定义样式之间的差异<select>非常大。在OS X上的Firefox中,选择选项右侧的灰色扁平按钮对于该项目是完全不可接受的。每个像素都很重要。我意识到OS X上的Firefox用户可能只占很小的比例。但是,我需要一个在所有浏览器和OS上都具有一致外观的解决方案。
将于

7

我敢肯定-webkit-appearance:none,Chrome和Safari的窍门不多。

编辑:-moz-appearance: none现在应该可以在Firefox上正常工作。


3

这很简单。您只需要放入.form-control以下内容:

.form-control{
        -webkit-appearance:none;
        -moz-appearance: none;
        -ms-appearance: none;
        -o-appearance: none;
        appearance: none;
}

这将删除浏览器的外观并允许使用CSS。



1

我发现了解决此特定问题的两种潜在方法:

  1. 使用选择

  2. 使用以下方式定位mozilla浏览器@-moz-document url-prefix()

@-moz-document url-prefix() {
  select {
    padding: 5px;
  }
}



-2

您可以使用jquery.chosen或bootstrap-select为按钮添加样式。两者都很好用。使用选择或引导选择的注意事项:它们都隐藏原始选择,并使用自己的ID添加到自己的div中。例如,如果您同时使用jquery.validate,它将不会找到要对其进行验证的原始选择,因为它已被重命名。

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.