<select>和:在WebKit中使用CSS后出现问题

Nic*_*uze 106 html css select

我想在一个选择框中添加一些样式,其中包含伪:after(用于选择包含2个部分且没有图像的选择框).这是HTML:

<select name="">
  <option value="">Test</option>
</select>
Run Code Online (Sandbox Code Playgroud)

它不起作用.我不知道为什么,我没有在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;
}
Run Code Online (Sandbox Code Playgroud)

这是正常还是有诀窍?

Dav*_*mas 115

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

  • 现在都2020年了还是一样 (82认同)
  • 现在都2021年了还是一样 (47认同)
  • 现在是2019年,它仍然是一样的 (41认同)
  • 强制性的“现在已经是 2022 年了,还是一样”...... (35认同)
  • (预测)现在已经是2083年了,还是一样 (31认同)
  • 现在都2023年了还是一样 (22认同)
  • 现在都2024年了还是一样 (6认同)

sro*_*roy 60

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

.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;
}
Run Code Online (Sandbox Code Playgroud)

这是我的选择

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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • pointer-events:none; 应该照顾好.上面的代码出现问题.我将上面的任何sass更改为css以消除任何混淆. (11认同)
  • 这在视觉上是完美的.但你无法点击该图标并选择元素不会打开:/任何建议? (4认同)
  • 这是一个很好的解决方案,但是在实现它时,由于某种原因,我发现:before工作,而不是:after。我不知道为什么 (2认同)

Đon*_*nny 28

根据我的经验,它根本不起作用,除非你愿意<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;
    }
Run Code Online (Sandbox Code Playgroud)

因为IE,请注意正确的URL编码.您必须使用charset=utf8(不仅仅是utf8),不要使用双引号(")来分隔SVG属性值,而是使用撇号(')来简化您的生活.URL-encode s(%3E).如果您需要打印您必须获取UTF-8表示的任何非ASCII字符(例如BabelMap可以帮助您),然后以URL编码形式提供该表示 - 例如,对于▾(U+25BEBLACK DOWN-POINTING SMALL TRIANGLE),UTF-8表示是\xE2\x96\xBE这是%E2%96%BEURL编码时.


Gla*_*mos 15

这篇文章可能有所帮助http://bavotasan.com/2011/style-select-box-using-only-css/

他正在使用一个带有类的外部div来解决这个问题.

<div class="styled-select">
  <select>
    <option>Here is the first option</option>
    <option>The second option</option>
  </select>
</div>
Run Code Online (Sandbox Code Playgroud)


Dom*_*urr 14

如果修改标记不是一种选择怎么办?

这是一个对包装器没有要求的解决方案:它在背景图像中使用 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;
Run Code Online (Sandbox Code Playgroud)

来自CSS-Tricks


Iva*_*van 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 {
    ...
}
Run Code Online (Sandbox Code Playgroud)


Lar*_*arS 6

此解决方案类似于sroy中的解决方案,但使用css三角形而不是web字体:

.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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


Tes*_*ssa 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>
Run Code Online (Sandbox Code Playgroud)

SCSS

fieldset {
    .select-wrapper {
        position: relative;

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

            + i {
                position: absolute;
                top: 40%;
                right: 15px;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果您的选择元素具有已定义的背景颜色,则此操作无效,因为此片段实际上将Chevron图标放在选择元素后面(允许单击图标顶部以仍然启动选择操作).

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

查看我的CodePen是否有一个工作演示,它使用常规标签和"占位符"标签以及其他清理后的样式(如边框和宽度)在黑暗和明亮的主题选择框中显示此代码.

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