Webkit中CSS的<select>和:after问题


123

我想在伪造的选择框上添加一些样式:after(以对具有2个部分且没有图像的选择框进行样式设置)。这是HTML:

<select name="">
  <option value="">Test</option>
</select>

而且它不起作用。我不知道为什么,我也没有在W3C规范中找到答案。这是CSS:

select {
  -webkit-appearance: none;
  background: black;
  border: none;
  border-radius: 0;
  color: white;
}

select:after {
  content: " ";
  display: inline-block;
  width: 24px; height: 24px;
  background: blue;
}

那么这是正常的还是有把戏?


我想,这不会,不应该是可能的,否则会弄得太容易改变形式的内容。想象一下简单的CSS更改某些商品的显示价格。它可能比实际价格便宜,诱使人们以超出预期的价格购买东西。(或者,当然,如果有人可以访问页面/用户样式表的CSS,那么他们可能可以通过其他方式来做同样的事情……)
Synetech

22
@Synetech-这是不正确的,页面的作者应该完全控制页面样式的各个方面。浏览器制造商试图阻止某些元素的样式,因为它们可能被用来误导用户,但这种方法将无效,因为几乎有无数种欺骗系统或产生误报的方法。
乔纳森·克罗斯

Answers:


132

我没有对此进行广泛检查,但是我觉得这还不可能(由于?)是由于select运行浏览器的操作系统(而不是浏览器本身)生成元素的方式。


62
现在是2019年,而且仍然不变
Placido

40
现在是2020年,而且仍然不变
Joeri Minnekeer

3
如果一个小时前看到您对这个10岁帖子的评论,那么我会节省一个小时的时间。:C
ericek111

66

我一直在寻找相同的东西,因为我选择的背景与箭头颜色相同。如前所述,尚不可能在select元素上使用:before或:after添加任何内容。我的解决方案是创建一个包装器元素,在其上添加以下代码:before。

.select-wrapper {
    position: relative;
}

.select-wrapper:before {
    content: '\f0d7';
    font-family: FontAwesome;
    color: #fff;
    display: inline-block;
    position: absolute;
    right: 20px;
    top: 15px;
    pointer-events: none;
}

这是我的选择

select {
    box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    width: 100%;
    padding: 10px 20px;
    background: #000;
    color: #fff;
    border: none;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
}

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

我已经为新箭头使用了FontAwesome.io,但是您可以使用任何其他想要的东西。显然,这不是一个完美的解决方案,但是根据您的需求,可能就足够了。


4
这在视觉上是完美的。但是,您无法单击该图标并选择无法打开的元素:/有任何建议吗?
Schovi

11
指针事件:无;应该注意这一点。我上面的代码有问题。我将上面的所有sass更改为css,以消除任何混乱。
sroy 2015年

使用哪个伪选择器(前后)是否有关系?
eddiegroves 2015年

您可以使用一个或其他
sroy

2
这是一个很好的解决方案,但是在实现它时,我发现由于某种原因:工作之前而不是之后。我不知道为什么
李·普罗伯特

31

以我的经验,除非您愿意将其包装<select>在包装纸中,否则它根本无法工作。但是,您可以做的是使用背景图像SVG。例如

    .archive .options select.opt {
    -moz-appearance: none;
    -webkit-appearance: none;
    padding-right: 1.25EM;
    appearance: none;
    position: relative;
    background-color: transparent;
    background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' height='10px' width='15px'%3E%3Ctext x='0' y='10' fill='gray'%3E%E2%96%BE%3C/text%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-size: 1.5EM 1EM;
    background-position: right center;
    background-clip: border-box;
    -moz-background-clip: border-box;
    -webkit-background-clip: border-box;
}

    .archive .options select.opt::-ms-expand {
        display: none;
    }

由于IE,请谨慎使用正确的URL编码。您必须使用charset=utf8(而不仅仅是utf8),不要使用双引号(“)来分隔SVG属性值,而应使用撇号(')来简化您的工作。URL编码(%3E)。如果您必须打印您必须获取任何非ASCII字符的UTF-8表示形式(例如BabelMap可以帮助您),然后以URL编码形式提供该表示形式-例如,对于▾(U+25BE黑点向下的小三角)UTF-8表示形式为\xE2\x96\xBE这是%E2%96%BE当URL编码。


1
这是一个很好的解决方案
JosFabre

1
这是一个梦幻般的,简单而优雅的解决方案,不需要我想要的额外HTML!谢谢!这应该是IMO的选择答案。
KyleFarris '18


13

面临同样的问题。可能是一个解决方案:

<select id="select-1">
    <option>One</option>
    <option>Two</option>
    <option>Three</option>
</select>
<label for="select-1"></label>

#select-1 {
    ...
}

#select-1 + label:after {
    ...
}

您可以添加使标签位于select元素上方所需的样式吗?
bafromca 2014年

7

此解决方案与sroy的解决方案相似,但使用的是CSS三角形而不是网络字体:

.select-wrapper {
  position: relative;
  width: 200px;
}
.select-wrapper:after {
  content: "";
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  border-top: 6px solid #666;
  position: absolute;
  right: 8px;
  top: 8px;
  pointer-events: none;
}
select {
  background: #eee;
  border: 0 !important;
  border-radius: 0;
  -webkit-appearance:none;
  -moz-appearance:none;
  appearance:none;
  text-indent: 0.01px;
  text-overflow: "";
  font-size: inherit;
  line-height: inherit;
  width: 100%;
}
select::-ms-expand {
  display: none;
}
<div class="select-wrapper">
  <select>
    <option value="1">option 1</option>
    <option value="2">option 2</option>
    <option value="3">option 3</option>
  </select>
</div>


6

如果无法修改标记怎么办?

这是一个不需要包装的解决方案:它在背景图像中使用SVG。您可能需要使用HTML实体解码器来了解如何更改填充颜色。

-moz-appearance: none;
-webkit-appearance: none;
appearance: none;

background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23000000%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
background-repeat: no-repeat;
background-position: right .7em top 50%;
background-size: .65em auto;

CSS-Tricks捏起


这是一个很好的把戏。超级恼人的是,我们仍然无法在2020
。– ramijames

5

这是我使用font-awesome编写的现代解决方案。为简便起见,已省略了供应商扩展。

的HTML

<fieldset>
    <label for="color">Select Color</label>
    <div class="select-wrapper">
        <select id="color">
            <option>Red</option>
            <option>Blue</option>
            <option>Yellow</option>
        </select>
        <i class="fa fa-chevron-down"></i>
    </div>
</fieldset>

SCSS

fieldset {
    .select-wrapper {
        position: relative;

        select {
            appearance: none;
            position: relative;
            z-index: 1;
            background: transparent;

            + i {
                position: absolute;
                top: 40%;
                right: 15px;
            }
        }
    }

如果您的选择元素具有定义的背景颜色,则此代码将不起作用,因为此代码段实质上将人字形图标放置在选择元素后面(允许单击图标顶部以仍然启动选择操作)。

但是,您可以将select-wrapper的样式设置为与select元素相同的大小,并设置其背景的样式以实现相同的效果。

请查看我的CodePen,以获取演示示例,该演示使用常规标签和“占位符”标签以及其他清理样式(如边框和宽度)在深色和浅色主题选择框上显示以下代码。

PS:这是我在今年早些时候发布给另一个重复问题的答案。


1
<div class="select">
<select name="you_are" id="dropdown" class="selection">
<option value="0" disabled selected>Select</option>
<option value="1">Student</option>
<option value="2">Full-time Job</option>
<option value="2">Part-time Job</option>
<option value="3">Job-Seeker</option>
<option value="4">Nothing Yet</option>
</select>
</div>

安装样式的选择,为什么不在选择之外添加div。

和样式,然后在CSS中

.select{
    width: 100%;
    height: 45px;
    position: relative;
}
.select::after{
    content: '\f0d7';
    position: absolute;
    top: 0px;
    right: 10px;
    font-family: 'Font Awesome 5 Free';
    font-weight: 900;
    color: #0b660b;
    font-size: 45px;
    z-index: 2;

}
#dropdown{
    -webkit-appearance: button;
       -moz-appearance: button;
            appearance: button;
            height: 45px;
            width: 100%;
        outline: none;
        border: none;
        border-bottom: 2px solid #0b660b;
        font-size: 20px;
        background-color: #0b660b23;
        box-sizing: border-box;
        padding-left: 10px;
        padding-right: 10px;
}
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.