如何从Firefox中的选择元素中删除箭头


172

我正在尝试select使用CSS3设置元素的样式。我在WebKit(Chrome / Safari)中获得了想要的结果,但是Firefox的运行效果不佳(我什至不担心IE)。我正在使用CSS3appearance属性,但是由于某些原因,我无法从Firefox中删除下拉图标。

这是我正在做的事的一个例子:http : //jsbin.com/aniyu4/2/edit

#dropdown {
 -moz-appearance: none;
 -webkit-appearance: none;
 appearance: none;
 background: transparent url('example.png') no-repeat right center;
 padding: 2px 30px 2px 2px;
 border: none;
}

如您所见,我并没有尝试任何幻想。我只想删除默认样式并添加我自己的下拉箭头。就像我说的那样,WebKit很棒,而不是Firefox很棒。显然,-moz-appearance: none它不会摆脱下拉菜单项。

有任何想法吗?不,JavaScript不是一种选择


3
现在有关于此的错误报告:bugzilla.mozilla.org/show_bug.cgi?
id=649849

3
Chosen是一个JavaScript库,可为您选择的样式设置样式,并使它们看起来非常精美。可能值得研究,尽管它可能无法解决您的问题。
stephenmurdoch 2011年

您可能会发现此博客文章很有用:red-team-design.com/making-html-dropdowns-not-suck
Rui Marques

1
看起来他们已经添加了-moz-appearanceCSS3属性,我正在使用-moz-appearance: none;它,它似乎在35.0.1版中正常工作。
托尼·M

一个简单的解决方法是使选择元素比容器宽。并包装一个mozilla url前缀,以便这些选项仅在firefox中更宽。@-moz-document url-prefix() { select { width: 105%; overflow: hidden; } }
卢克·费穆尔

Answers:


78

好的,我知道这个问题很旧,但是两年之后,mozilla却什么也没做。

我想出了一个简单的解决方法。

这实际上会剥离firefox中选择框的所有格式,并使用自定义样式在选择框周围包裹一个span元素,但应仅适用于firefox。

说这是您的选择菜单:

<select class='css-select'>
  <option value='1'> First option </option>
  <option value='2'> Second option </option>
</select>

并假设css类“ css-select”为:

.css-select {
   background-image: url('images/select_arrow.gif');
   background-repeat: no-repeat;
   background-position: right center;
   padding-right: 20px;
}

在firefox中,这将与选择菜单一起显示,然后是难看的firefox选择箭头,然后是外观漂亮的自定义箭头。不理想。

现在,要在Firefox中进行此操作,请在类'css-select-moz'周围添加一个span元素:

   <span class='css-select-moz'>
     <select class='css-select'>
       <option value='1'> First option </option>
       <option value='2'> Second option </option>
     </select>
   </span>

然后修复CSS以使用-moz-appearance:window隐藏mozilla的脏箭头,并将自定义箭头扔到span的类'css-select-moz'中,但只能使其显示在mozilla上,如下所示:

.css-select {
   -moz-appearance:window;
   background-image: url('images/select_arrow.gif');
   background-repeat: no-repeat;
   background-position: right center;
   padding-right: 20px;
}

@-moz-document url-prefix() {
.css-select-moz{
     background-image: url('images/select_arrow.gif');
     background-repeat: no-repeat;
     background-position: right center;
     padding-right: 20px;
  }
} 

挺酷的,只在3小时前遇到了这个错误(我是网页设计的新手,完全是自学成才的)。但是,这个社区间接地为我提供了很多帮助,我认为是时候该回馈我了。

我只在firefox(mac)版本18和22(更新后)中对其进行了测试。

欢迎所有反馈。


2
两年后,这是发布最佳效果的最佳答案。我在这里放了一个代码的JSBin:jsbin.com/aniyu4/2440/edit,供其他人查看,并且只进行了1次小的CSS更新。由于右填充,跨度比FF中的选择宽-这意味着单击箭头不会激活下拉菜单。为了对此进行调整,我在选择元素上放置了一个负的右边距,以拉回跨度的宽度,使其与选择的宽度重叠。
RussellUresti

哦,当然!非常感谢,罗素。真的很高兴这有所帮助。
约旦·杨

5
在Windows的FF 23-24上对我不起作用(我在注释中尝试了jsbin)。结束了使用TIS解决方法stackoverflow.com/questions/6787667/...
埃斯特班

4
它不再适用于FF 30。请继续并在Mozilla的网站上提交票证:bugzilla.mozilla.org/show_bug.cgi?id=649849。人们抱怨的越多,我们修复它的机会就越大。
斯坦(Stan)

1
仅适用于Mac上的FF 31。
Erwin Wessels 2014年

165

更新:在Firefox v35中已修复。有关详细信息,请参见完整要点


刚刚想出了如何从Firefox中删除选择箭头。诀窍是使用的混合-prefix-appearancetext-indenttext-overflow。它是纯CSS,不需要额外的标记。

select {
    -moz-appearance: none;
    text-indent: 0.01px;
    text-overflow: '';
}

在Windows 8,Ubuntu和Mac(最新版本的Firefox)上进行了测试。

实时示例:http//jsfiddle.net/joaocunha/RUEbp/1/

有关此主题的更多信息:https : //gist.github.com/joaocunha/6273016


1
我通常在冷漠的心中有一个特殊的位置,可以进行此类黑客修复。真是太好了。唯一的缺点是FF在下拉文本区域的末尾(在实际文本和选择框的末尾之间)留了一个空格,这在FF与其他浏览器之间造成了不一致的间距,但这只是一个小问题。好发现。
RussellUresti

不错,@ RussellUresti。但是考虑到整个想法可能是提供一个经过修改的箭头,该空间实际上证明了自己是有用的。我玩了一点,然后padding-right:10px;<select>遗嘱中向左侧“推”现在不可见的箭头。底线:Firefox隐藏箭头,Chrome删除箭头。将会相应地更新我的著作,谢谢。
若昂·库尼亚

我添加了一个跨浏览器的一个位作为一个答案(在旧版本的IE浏览器没有测试),所以你可以更新你的
丹尼尔TULP

2
对我来说是最好的解决方案,因为-moz-appearence: window它不适用于透明背景(至少在firefox linux上绘制了一个丑陋的bg)
kik

因为这完全删除了箭头,所以生成的<select>看起来像一个文本框,非常难看。因此,您可以重新添加背景图像,使其看起来像下拉菜单:codepen.io/anon/pen/nvfCq
thom_nic 2014年

59

对我有用的技巧是使选择宽度大于100%并应用溢出:隐藏

select {
    overflow:hidden;
    width: 120%;
}

这是目前隐藏FF中的下拉箭头的唯一方法。

顺便说一句。如果您想获得漂亮的下拉菜单,请使用http://harvesthq.github.com/chosen/


6
这对我没有影响。FF 6.0.2
Charlie Schliesser

1
IE的好解决方案。在我的解决方案中,我将包含div元素设置为overflow:隐藏,然后使select的宽度变大。效果很好。
Mike

@Charlie S:尝试将overflow:hidden隐藏在包含的div上。它对我
有用吗

1
当您展开下拉菜单时,overflow:hidden不起作用
Marc 2013年

对我来说效果很好。它使下拉列表比顶部的列表稍宽,但这是我愿意支付的价格。
Jimbali 2014年

26

重要更新:

从Firefox V35开始,外观属性现在可用!

firefox在V35上的正式发行说明中

使用-moz-appearancenone上一个组合框的值现在删除的下拉按钮(缺陷649849)。

现在,为了隐藏默认箭头,就像在我们的select元素上添加以下规则一样简单:

select {
   -webkit-appearance: none;
   -moz-appearance: none;
   appearance: none;
}

演示

select {
  margin: 50px;
  border: 1px solid #111;
  background: transparent;
  width: 150px;
  padding: 5px;
  font-size: 16px;
  border: 1px solid #ccc;
  height: 34px;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
}
<select>
  <option>Apples</option>
  <option selected>Pineapples</option>
  <option>Chocklate</option>
  <option>Pancakes</option>
</select>


20

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

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

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

因此,您仍然可以单击它

然后使div具有与选择框相同的尺寸。div应该位于选择框下方作为背景。使用{ position: absolute }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;}。浏览器最多应该执行的操作是与表单元素进行交互,但绝不决定它们最初如何显示在页面上,因为这会破坏网站设计。


6
这不是一个不好的解决方案,类似于我在样式化文件上传输入元素时看到的一种模式,但是有一些缺点。首先,它依赖于JS,这并不理想。其次,如果表单具有重置按钮,那么您还必须编写该功能的脚本(现在,JS仅侦听select元素的单击,但不响应form.reset事件)。用div替换select元素将起作用,但是,理想情况下,我们可以仅对form元素的外观进行样式设置。JS和默认表单行为也存在可访问性问题。
拉塞尔·乌雷斯蒂(RussellUresti)2012年

14

尝试这种方式:

-webkit-appearance: button;
-moz-appearance: button;

然后,您可以使用其他图像作为背景并将其放置:

background-image: url(images/select-arrow.png);
background-position: center right;
background-repeat: no-repeat;

Moz浏览器还有另一种方法:

text-indent:10px;

如果定义了宽度,此属性将在选择区域下按下默认的保管箱按钮。

这个对我有用!;)


6

虽然不是完整的解决方案,但我发现……

-moz-appearance: window;

…在某种程度上起作用。您无法更改背景(-color或-image),但可以使用以下颜色将元素渲染为不可见:透明。虽然不完美,但这只是一个开始,您不需要用js替换系统级元素。


是的,很window遗憾,我注意到这种效果,我需要设置背景图像。不幸的是,这在Firefox中不是很好。
RussellUresti 2011年

不幸的是,您无法对元素进行完全重置。您总是可以通过在<select>下面放置一个元素来伪造背景,这当然不理想。
斯图尔特·羽毛球

1
这是完美的打印!只需使用设置一个media="print"CSS块,select {-moz-appearance: window;}并会删除FF上所有选择的箭头和背景(对于其他浏览器,请尝试使用外观或-webkit-appearance),使其看起来像纯文本或标题
FrancescoMM

4

我想我找到了与FF31兼容的解决方案!!!
以下是此链接对此选项进行了很好解释的两个选项:
http

://www.currelis.com/hiding-select-arrow-firefox-30.html我使用了选项1:Rodrigo-Ludgero在Github上发布了此修复程序,包括在线演示 我在Firefox 31.0上测试了此演示,它似乎工作正常。在Chrome和IE上也进行了测试。这是html代码:

<!DOCTYPE html>
<html>
    <head>
    <meta charset="utf-8">
    <title>Custom Select</title>
    <link href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <div class="custom-select fa-caret-down">
            <select name="" id="">
                <option value="">Custom Select</option>
                <option value="">Custom Select</option>
                <option value="">Custom Select</option>
            </select>
        </div>
    </body>
</html>

和CSS:

.custom-select {
    background-color: #fff;
    border: 1px solid #ccc;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    margin: 0 0 2em;
    padding: 0;
    position: relative;
    width: 100%;
    z-index: 1;
}

.custom-select:hover {
    border-color: #999;
}

.custom-select:before {
    color: #333;
    display: block;
    font-family: 'FontAwesome';
    font-size: 1em;
    height: 100%;
    line-height: 2.5em;
    padding: 0 0.625em;
    position: absolute;
    top: 0;
    right: 0;
    text-align: center;
    width: 1em;
    z-index: -1;
}

.custom-select select {
    background-color: transparent;
    border: 0 none;
    box-shadow: none;
    color: #333;
    display: block;
    font-size: 100%;
    line-height: normal;
    margin: 0;
    padding: .5em;
    width: 100%;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
}

.custom-select select::-ms-expand {
    display: none; /* to ie 10 */
}

.custom-select select:focus {
    outline: none;
}
/* little trick for custom select elements in mozilla firefox  17/06/2014 @rodrigoludgero */
:-moz-any(.custom-select):before {
    background-color: #fff; /* this is necessary for overcome the caret default browser */
    pointer-events: none; 
    z-index: 1; /* this is necessary for overcome the pseudo element */
}

http://jsbin.com/pozomu/4/edit

对我来说很好!


2
鼓励链接到外部资源,但是请在链接周围添加上下文,以便您的其他用户会知道它是什么以及为什么在那里。如果目标站点无法访问或永久离线,请始终引用重要链接中最相关的部分。
Andrew Stubbs 2014年

谢谢你的建议!对不起,我的错!
ferocesalatino 2014年

感谢编辑的问题,但是它仍然没有真正回答这个问题本身。请复制那些有助于提问者的链接部分,以便他们只需阅读您的答案就能解决问题。
Andrew Stubbs 2014年

2

对您来说不幸的是,这“奇特”。通常,Web设计人员不是重新设计表单元素的地方。许多浏览器故意不允许您设置其样式,以使用户看到他们习惯的OS控件。

在浏览器和操作系统上一致地执行此操作的唯一方法是使用JavaScript并将select元素替换为“ DHTML”元素。

下一篇文章显示了三个基于jQuery的插件,可以让您做到这一点(虽然有点旧,但我现在找不到最新的东西)

http://www.queness.com/post/204/25-jquery-plugins-that-enhance-and-beautify-html-form-elements#1


8
我不同意这是一种幻想,尽管这是试验性的。该appearance属性的全部目的是使开发人员可以控制表单元素的外观,因为为此使用JavaScript是一个可怕的解决方案。浏览器不应就页面中的外观做出决定,这是用户体验决定,而不是浏览器供应商决定。不幸的是,它还没有得到很好的支持。也许再过一年。
罗素·乌雷斯蒂(RussellUresti)2011年

如果您希望在打印页面时所有选择看起来都像没有箭头的字段,那么我不认为是“花哨的”。那应该是我的选择,而不是浏览器或os的选择。我有几个月的选择权,并且在打印页面时,我有一个特殊的CSS打印页面,该CSS删除了打印页面上的箭头,因此看起来就像标题“ March”,而没有箭头在打印页面上没有意义。
FrancescoMM

2
/* Try this in FF30+ Covers up the arrow, turns off the background */ 
/* still lets you style the border around the image and allows selection on the arrow */


@-moz-document url-prefix() {

    .yourClass select {
        text-overflow: '';
        text-indent: -1px;
        -moz-appearance: none;
        background: none;

    }

    /*fix for popup in FF30 */
    .yourClass:after {
        position: absolute;
        margin-left: -27px;
        height: 22px;
        border-top-right-radius: 6px;
        border-bottom-right-radius: 6px;
        content: url('../images/yourArrow.svg');
        pointer-events: none;
        overflow: hidden;
        border-right: 1px solid #yourBorderColour;
        border-top: 1px solid #yourBorderColour;
        border-bottom: 1px solid #yourBorderColour; 
    }
}

+20建议使用伪元素
Zach Saucier 2014年

2

我喜欢这样的选择

<select style="     -moz-appearance: radio-container;
                -webkit-appearance: none;
                 appearance: none;
">

在我测试过的所有版本中,它都适用于FF,Safari和Chrome。

在IE中,我输入:

 select::-ms-expand {
 display: none;
}
/*to remove in all selects*/

您还可以:.yourclass ::-ms-expand {display:none; } .yourid ::-ms-exapan {display:none; }


1

我知道这个问题有点老了,但是由于它出现在Google上,所以这是一个“新”解决方案:

appearance: normal对于我来说,似乎在Firefox中工作正常(现在是第5版)。但不适用于Opera和IE8 / 9

作为Opera和IE9的一种解决方法,我使用了:before伪选择器来创建一个新的白框,并将其放在箭头上方。

不幸的是,在IE8中这行不通的。该框已正确呈现,但是箭头仍然伸出来...:-/

使用select:before可以在Opera中正常工作,但不能在IE中工作。如果我查看开发人员工具,就会发现它正在正确阅读规则,然后忽略它们(它们被划掉了)。所以我用一个<span class="selectwrap">实际的<select>

select {
  -webkit-appearance: normal;
  -moz-appearance: normal;
  appearance: normal;
}
.selectwrap { position: relative; }
.selectwrap:before {
  content: "";
  height: 0;
  width: 0;
  border: .9em solid red;
  background-color: red;
  position: absolute;
  right: -.1em;
  z-index: 42;
}

您可能需要稍微调整一下,但这对我有用!

免责声明: 我正在使用它来获取带有表单的网页的美观印刷版,因此不需要创建第二页。我不是要使用红色滚动条,<marquee>标签和其他工具的1337 haxx0r :-)除非您有充分的理由,否则请不要对表单应用过多的样式。


3
-moz-appearance: normal在Fx 9中似乎不是有效的选项,并且-moz-appearance: none(有效)不会删除向下箭头。
罗宾·温斯洛

您的重叠跨度解决方案可在IE和FF中使用,但不适用于Chrome。
vulcan raven 2013年

:before和:after伪元素仅在接受内部内容的元素上起作用。选择,输入,fileuploader等都不是这种情况。它们对于div,链接,段落等非常有用。其原因是它们不是在ELEMENT本身之前/之后,而是在IT之前添加内容。内容。而select元素不支持<select> hi
若昂·库尼亚

1

使用该pointer-events属性。

这里的想法是在本地下拉箭头上覆盖一个元素(以创建我们的自定义箭头),然后在其上禁止指针事件。[请参阅这篇文章]

这是使用此方法的有效FIDDLE

同样,在这个SO答案中,我更详细地讨论了此方法和另一种方法。


1

这有效(在Firefox 23.0.1上测试):

select {
    -moz-appearance: radio-container;
}

为我工作,但我不喜欢radio-container选择对象的价值。浏览-moz-appearance mozilla引用以获取适当的值(我使用menulist-text它在FF 31中隐藏了选择的箭头)
sglessard 2014年

1

以@JoãoCunha的答案为基础,一种css样式对一种以上的浏览器有用

select {
    /*for firefox*/
    -moz-appearance: none;
    /*for chrome*/
    -webkit-appearance:none;
    text-indent: 0.01px;
    text-overflow: '';
}
/*for IE10*/
select::-ms-expand {
    display: none;
}

1

除了Joao Cunha的回答,此问题现在已列在Mozilla的“待办事项列表”中,并针对35版。

对于那些想要的人,这是Todd Parker的变通方法,在Cunha的博客上引用了该变通方法,该变通方法现在可以使用:

http://jsfiddle.net/xvushd7x/

HTML:

<label class="wrapper">This label wraps the select
    <div class="button custom-select ff-hack">
        <select>
            <option>Apples</option>
            <option>Bananas</option>
            <option>Grapes</option>
            <option>Oranges</option>
            <option>A very long option name to test wrapping</option>
        </select>
    </div>
</label>

CSS:

/* Label styles: style as needed */
label {
  display:block;
  margin-top:2em;
  font-size: 0.9em;
  color:#777;
}

/* Container used for styling the custom select, the buttom class below adds the bg gradient, corners, etc. */
.custom-select {
  position: relative;
  display:block;
  margin-top:0.5em;
  padding:0;
}

/* These are the "theme" styles for our button applied via separate button class, style as you like */
.button {
  border: 1px solid #bbb;
  border-radius: .3em;
  box-shadow: 0 1px 0 1px rgba(0,0,0,.04);
  background: #f3f3f3; /* Old browsers */
  background: -moz-linear-gradient(top, #ffffff 0%, #e5e5e5 100%); /* FF3.6+ */
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(100%,#e5e5e5)); /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(top, #ffffff 0%,#e5e5e5 100%); /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(top, #ffffff 0%,#e5e5e5 100%); /* Opera 11.10+ */
  background: -ms-linear-gradient(top, #ffffff 0%,#e5e5e5 100%); /* IE10+ */
  background: linear-gradient(to bottom, #ffffff 0%,#e5e5e5 100%); /* W3C */
}

/* This is the native select, we're making everything but the text invisible so we can see the button styles in the wrapper */
.custom-select select {
  width:100%;
  margin:0;
  background:none;
  border: 1px solid transparent;
  outline: none;
  /* Prefixed box-sizing rules necessary for older browsers */
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  /* Remove select styling */
  appearance: none;
  -webkit-appearance: none;
  /* Font size must the 16px or larger to prevent iOS page zoom on focus */
  font-size:16px;
  /* General select styles: change as needed */
  font-family: helvetica, sans-serif;
  font-weight: bold;
  color: #444;
  padding: .6em 1.9em .5em .8em;
  line-height:1.3;
}


/* Custom arrow sits on top of the select - could be an image, SVG, icon font, etc. or the arrow could just baked into the bg image on the select. Note this si a 2x image so it will look bad in browsers that don't support background-size. In production, you'd handle this resolution switch via media query but this is a demo. */

.custom-select::after {
  content: "";
  position: absolute;
  width: 9px;
  height: 8px;
  top: 50%;
  right: 1em;
  margin-top:-4px;
  background-image: url(http://filamentgroup.com/files/select-arrow.png);
  background-repeat: no-repeat;
  background-size: 100%;
  z-index: 2;
  /* These hacks make the select behind the arrow clickable in some browsers */
  pointer-events:none;
}


/* Hover style */
.custom-select:hover {
  border:1px solid #888;
}

/* Focus style */
.custom-select select:focus {
  outline:none;
  box-shadow: 0 0 1px 3px rgba(180,222,250, 1);
  background-color:transparent;
  color: #222;
  border:1px solid #aaa;
}

/* Set options to normal weight */
.custom-select option {
  font-weight:normal;
}


1

在这里和那里都发生了很多讨论,但是我没有找到解决此问题的适当方法。最后,通过编写一个小的Jquery + CSS代码在IE和Firefox上执行此HACK结束。

使用Jquery计算元素宽度(SELECT元素)。在“选择”元素周围添加包装器,并保持该元素的溢出隐藏。确保此包装器的宽度是适当的。比SELECT元素小25px。这可以通过Jquery轻松完成。所以现在我们的图标消失了!现在是时候在SELECT元素上添加我们的图像图标了!!!!只需添加几行简单的行即可添加背景,您都完成了!!!确保对外部包装使用隐藏的溢出,

这是为Drupal完成的代码示例。但是,也可以通过删除几行特定于Drupal的代码来用于其他人。

/*
 * Jquery Code for Removing Dropdown Arrow.
 * @by: North Web Studio
 */
(function($) {
  Drupal.behaviors.nwsJS = {
    attach: function(context, settings) {
      $('.form-select').once('nws-arrow', function() {
        $wrap_width = $(this).outerWidth();
        $element_width = $wrap_width + 20;
        $(this).css('width', $element_width);
        $(this).wrap('<div class="nws-select"></div>');
        $(this).parent('.nws-select').css('width', $wrap_width);
      });
    }
  };
})(jQuery);
/*
 * CSS Code for Removing Dropdown Arrow.
 * @by: North Web Studio
 */

.nws-select {
  border: 1px solid #ccc;
  overflow: hidden;
  background: url('../images/icon.png') no-repeat 95% 50%;
}
.nws-select .form-select {
  border: none;
  background: transparent;
}

该解决方案适用于所有浏览器IE,Chrome和Firefox,无需使用CSS添加固定宽度的Hacks。所有这些都使用JQuery动态处理。

更多说明:-http : //northwebstudio.com/blogs/1/jquery/remove-drop-down-arrow-html-select-element-using-jquery-and-css


1

试试这个CSS

select {
    /*for firefox*/
    -moz-appearance: none;
    /*for chrome*/
    -webkit-appearance:none;
}

它的工作


0

appearanceCSS3中的属性不允许none值。看一下W3C参考。因此,您尝试执行的操作无效(实际上,Chrome也不应接受)。

不幸的是,我们确实没有任何跨浏览器解决方案可以使用纯CSS隐藏该箭头。如前所述,您将需要JavaScript。

我建议您考虑使用selectBox jQuery插件。它非常轻巧并且做得很好。


1
但是noneFirefox声称要支持的IS价值观是:developer.mozilla.org/en/CSS/-moz-appearance虽然样式元素的样式过去只能通过JavaScript完成,但该appearance属性的全部要点是从那开始。浏览器供应商不应为开发人员制定UX决策。不幸的是,这似乎还有些太新而无法有效使用。
罗素·乌雷斯蒂(RussellUresti)

1
@RussellUresti,因此,即使供应商前缀中的描述-moz接受none(即使可行)也无法正确使用。对于像Firefox这样的浏览器,甚至更多的东西,它始终严格遵循标准而自夸。
埃里克·佩特鲁切利



0

或者,您可以裁剪选择。类似于以下内容:

select { width:200px; position:absolute; clip:rect(0, 170px, 50px, 0); }

这应该剪切选择框右侧的30px,去掉箭头。现在提供170像素的背景图片和瞧,样式选择


0

这是一个巨大的hack,但-moz-appearance: menulist-text可能会成功。


这似乎删除选择箭头对我来说,但是作为@dendini指出,它也去掉了元素上的所有其他造型
codestr

0

我有同样的问题。使它在FF和Chrome上运行很容易,但是在IE(我们需要支持的8+)上,事情变得很复杂。我可以找到适用于“我尝试过的所有地方”(包括IE8 )的自定义选择元素的最简单解决方案,就是使用.customSelect()


0

对我来说有用的技巧是将(选择)显示设置为inline-flex。将箭头右移出我的选择按钮。没有所有添加的代码。

  • 仅适用于Fx。-webkit appearanceChrome等仍需要...

2
似乎没有任何效果
克里斯·尼古拉

0

乔丹·扬的答案是最好的。但是,如果您不能或不想更改HTML,则可以考虑只删除适用于Chrome,Safari等的自定义向下箭头,并保留firefox的默认箭头-但不会产生双箭头。这不是理想的方法,但是很好的快速解决方案,它没有添加任何HTML并且不会损害您在其他浏览器中的自定义外观。

<select>
  <option value='1'> First option </option>
  <option value='2'> Second option </option>
</select>

CSS:

select {
   background-image: url('images/select_arrow.gif');
   background-repeat: no-repeat;
   background-position: right center;
   padding-right: 20px;
}

@-moz-document url-prefix() {
  select {
    background-image: none;
  }
}

0

hacky hack ...一种解决方案,可在我测试过的每种浏览器(Safari,Firefox,Chrome)中使用。没有任何IE,所以如果您可以测试和评论,那就太好了:

<div class="wrapper">
  <select>
    <option>123456789</option>
    <option>234567890</option>
  </select>
</div>

CSS,带有url编码的图像:

.wrapper { position:relative; width:200px; }
.wrapper:after {
  content:"";
  display: block;
  position: absolute;
  top:1px; height:28px;
  right:1px; width:16px;
  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAcCAYAAACH81QkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowODgwMTE3NDA3MjA2ODExOEE2RENENTU2MTFGMEQ1RCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGNDE5NDQ3Nzc5ODIxMUU0OEU0M0JFMzgzMkUxOTk3MiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGNDE5NDQ3Njc5ODIxMUU0OEU0M0JFMzgzMkUxOTk3MiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDk4MDExNzQwNzIwNjgxMThBNkRDRDU1NjExRjBENUQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDg4MDExNzQwNzIwNjgxMThBNkRDRDU1NjExRjBENUQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4o7anbAAAAjklEQVR42uzUsQ3EIAwFUPty7MBOsAoVC7EVYgyUSFcdzn0iJYquAZGSLxnLzatsWERWGsvGP0QGkc+LxvN9AqGJTKQJMcYQM/+VtbZdiTGKUgr3cxbmlJI0ZiW83vsbgrkjB5JzFq11BdAxdyNICKEi6J25kFKKOOdq70We+JS2ufYTacjyxrKMLtsuwAAznzqGLHX9BwAAAABJRU5ErkJggg==);

  pointer-events: none;
}

select {
  width: 100%;
  padding:3px;
  margin: 0;
  border-radius: 0;
  border:1px solid black;
  outline:none;
  display: inline-block;
  -webkit-appearance:none;
  -moz-appearance:none;
  appearance:none;
  cursor:pointer;
  float:none!important;
  background:white;

  font-size:13px;
  line-height: 1em;
  height: 30px;
  padding:6px 20px 6px 10px;
}

http://codepen.io/anon/pen/myPEBy

我正在使用:after-element遮住丑陋的箭头。由于select不支持:after,因此我需要一个包装器来使用。现在,如果您单击箭头,则该下拉列表将不会注册...除非您的浏览器支持pointer-events: none,除IE10-以外的每个人都支持: http

所以对我来说,它是完美的-一个不错的,干净的,低头痛的解决方案,至少与包括javascript在内的所有其他选项相比。

tl; dr:

如果IE10(或更低版本)用户单击箭头,它将无法使用。对我来说足够好...


0

如果您不介意JS,我写了一个小jQuery插件来帮助您。有了它,您不必担心供应商前缀。

 $.fn.magicSelectBox = function() {
  var $e = this;

  $e.each(function() {
    var $select = $(this);

    var $magicbox = $('<div></div>').attr('class', $select.attr('class')).attr('style', $select.attr('style')).addClass('magicbox');
    var $innermagicbox = $('<div></div>').css({
      position: 'relative',
      height: '100%'
    });
    var $text = $('<span></span>').css({
      position: 'absolute'
    }).text($select.find("option:selected").text());

    $select.attr('class', null).css({
      width: '100%',
      height: '100%',
      opacity: 0,
      position: 'absolute'
    }).on('change', function() {
      $text.text($select.find("option:selected").text());
    });

    $select.parent().append($magicbox);
    $innermagicbox.append($text, $select);
    $magicbox.append($innermagicbox);
  });

  return $e;
};

在这里摆弄: JS小提琴

条件是您必须从头开始对选择进行样式设置(这意味着设置背景和边框),但是无论如何您可能都想这样做。

同样,由于该函数用div代替了原始的select,因此您将直接在CSS的select选择器上丢失任何样式。因此,为select元素提供一个类并为该类设置样式。

支持大多数现代浏览器,如果要针对较旧的浏览器,则可以尝试使用较旧版本的jQuery,但可能必须在函数中用bind()替换on()(未经测试)


-2

其他答案似乎对我不起作用,但是我发现了这个问题。这对我有用(2014年7月)

select {
-moz-appearance: textfield !important;
    }

就我而言,我也有一个woocommerce输入字段,所以我使用了

.woocommerce .quantity input.qty {
-moz-appearance: textfield !important;
 }

更新了我的答案以显示选择而不是输入


input.input-text?选择选项和提出的问题有什么关系?
dendini 2014年
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.